test.check генерирует строки определенной длины
При использовании test.check мне нужен генератор для строк определенной длины. Номера телефонов, почтовые индексы, номера социального страхования - все это примеры данных такого типа. Хотя примеры кажутся только числами, мой вопрос касается строк в целом.
2 ответа
Дано length
генератор ниже генерирует случайные строки:
(gen/fmap #(apply str %)
(gen/vector gen/char-alpha length))
(gen/vector gen/char-alpha length)
генерирует последовательности символов и fmap
преобразует их в строки:
(apply str [\a \b]) ;; => "ab"
Если обычай alphabet
(сказать [\a \b \c]
) нужно gen/char-alpha
можно заменить на что-то вроде:
(gen/elements alphabet)
Для более сложных генераторов, таких как отформатированные номера телефонов, test.chuck's string-from-regex
может быть лучшим выбором, чем ручное объединение официальных генераторов.
Вы можете использовать более примитивные генераторы, чтобы быстро создать тот, который делает именно это:
Для буквенно-цифровых строк от min до max:
(sgen/fmap str/join (sgen/vector (sgen/char-alphanumeric) min max))
Для буквенно-цифровых строк заданной длины
(sgen/fmap str/join (sgen/vector (sgen/char-alphanumeric) length))
И вы можете изменить (sgen/char-alphanumeric)
в соответствии с тем, каким должен быть ваш диапазон символов, например, строка min / max с буквенно-цифровым символом, а также символом подчеркивания и тире, с разными частотами отображения каждого символа:
(sgen/fmap str/join
(sgen/vector
(sgen/frequency [[99 (sgen/char-alphanumeric)]
[1 (sgen/elements #{"_" "-"})]])
min max))
Эта функция сгенерирует строку заданной длины с символами из заданного алфавита (необязательно). Если вы не передадите алфавит в качестве аргумента, будет использоваться значение по умолчанию, которое вы, конечно, можете изменить.
(defn generate-string
([length]
(generate-string length
(map char (range 49 127))))
([length alphabet]
(apply str (take length (repeatedly #(rand-nth alphabet))))))
Примеры:
(generate-string 7 [\a \b \c])
"bacacbb"
(generate-string 10)
"mxqE<OKH3L"