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"
Другие вопросы по тегам