2016-03-13 6 views
2

При использовании test.check Мне нужен генератор для строк определенной длины. Номера телефонов, почтовые индексы, номера социального страхования - все это примеры такого типа данных. Хотя примеры, по-видимому, являются только номерами, мой вопрос касается строк в целом.test.check генерировать строки определенной длины

ответ

3

Учитывая 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 может быть лучшим выбором, чем вручную объединения официальных генераторов.

+0

Спасибо за указание test.chuck, у которого есть это и другие хорошие функции. –

+0

@MSmith Мне особенно нравится «проверка» ('test' для генеративных) – muhuk

1

Эта функция генерирует строку заданной длины с символами из заданного алфавита (необязательно). Если вы не передадите какой-либо алфавит в качестве аргумента, будет использоваться значение по умолчанию, которое вы, конечно, можете изменить.

(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" 
+1

Хотя это хороший пример создания строк, это не генератор test.check. –

Смежные вопросы