Rulexec
@Rulexec
Метатеоретик теории типов

Алгоритм генерации перестановок с сохранением порядка элементов в группах

Здравствуйте! Столкнулся с проблемой, что не могу составить необходимый мне алгоритм, поэтому обращаюсь к вам.

Ситуация такая. Есть очень хитрая структура данных, есть три операции:
  • create
  • set
  • delete

Я пишу юнит-тест для этой структуры. Хочется перебрать все возможные варианты последовательностей вызовов этих операций. Но, понятно, что сначала нужно создать запись, затем изменить её, и только потом удалить.

Допустим, количество элементов у нас три (но хотелось бы для произвольного количества). Т.е. возможны какие-нибудь такие перестановки:
  • create1 create2 set1 delete1 create3 set2 set3 delete3 delete 2
  • create1 set1 create2 create3 delete1 set3 delete3 set2 delete 2

И так далее.

Как это реализовать? Язык не важен, хоть в псевдокоде. Я просто не знаю, в каком направлении двигаться.

Заранее спасибо.
  • Вопрос задан
  • 4863 просмотра
Решения вопроса 1
VenomBlood
@VenomBlood
Если я правильно вас понял — можно использовать генератор всех перестановок с повторениями на следующем множестве:
Количество элементов = количеству тестируемых записей (3 в примере у вас)
Количество повторений каждого элемента = 3 (добавить, изменить, удалить).
И потом просто для каждого повторения элемента (их три) слева направо проставить «создать» «изменить» «удалить».

Но тут есть проблема — вы не можете протестировать цепочки «создать» «удалить» — для этого надо генерировать еще кучу возможных перестановок.

А вообще, во первых — вы так тестируете только корректное поведение, не проверяя что будет при ошибочных вызовах.
Второе — ИМХО (исходя из представленной информации) у вас подход не совсем верен, надо разбить код на модули и протестировать все только с одним элементом, и написать тесты на то, что при наличии нескольких элементов не происходит накладок (т.е. работа с ними ведется независимо).
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
А для тестирования «создать»/«удалить» нужно добавить случайное число с вероятностью 1/2, в зависимости от значения которого либо использовать «set» либо выбрасывать второе из вхождений вообще.
Ответ написан
Комментировать
@lightcaster
Крутая задачка :). Похоже вы привели пример контекстно-зависимого языка (если взять в общем виде). Комбинаций будет очень много. Если не ошибаюсь (k*n)!/ (k!)^n где n — кол-во групп, k — кол-во элементов в каждой группе. К примеру, для трех групп с тремя элементами <c1, s1, d1>, <c2,s2,d2> <c3, s3, d3> комбинаций будет 9!/3!3!3! = 1680.0
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы