请在2024 Clojure状态调查!分享您的想法。

欢迎!请参阅关于页面获取有关此工作方式的一些更多信息。

0
test.check

有许多生成器会返回一个序列(列表、向量、元组、映射、字符串等)。有时在生成的序列上设置大小限制是很有用的,无论是最小值还是最大值。一个不错的生成器会接受一个序列生成器并确保生成的序列长度是确定的。以下是三个示例:
(of-length min max gen)
(of-max-length max gen) => (of-length 0 max gen)
(of-min-length min gen) => (of-length min nil gen)

of-length 检查生成的序列长度。如果它太小,则使用 (take min (cycle s)) 来扩展序列的长度。
如果它太长,则使用 (take max s) 返回最大长度
需要注意返回与接收相同的类型。
如果不接收序列,则 treatment 看成只有一个元素的序列。
如果 min 不是 0,使用 such-that not nil 确保生成合适的 seq。

22 个答案

0

评论由:m0smith 制作

TCHECK-99-3.patch 更新以支持:sep 选项。此外,它基于新的 'apply-to' 函数,这对 TCHECK-97 也很有用。请参阅请参阅https://github.com/m0smith/test.check/tree/feature/TCHECK-97 获取建议的 Unicode 实现

0

评论由:m0smith 制作

此功能支持后缀和前缀。使用它可以使 HTML 等内容变得更容易

0
_由 m0smith_ 发表评论

以下是如何使用 to-string 函数模拟制表符分隔的文件中的行的示例


(def gen-char-upper (gen/fmap char (gen/choose \A \Z)))
(def gen-char-lower (gen/fmap char (gen/choose \a \z)))
(def gen-char-digit (gen/fmap char (gen/choose \0 \9)))
(def gen-char-postal-format (gen/fmap char (gen/one-of [(gen/return \#)
                                                        gen/return \@)
                                                        gen-char-upper])))

(def gen-iso-2 (gen/to-string gen-char-upper {:num-elements 2}))
(def gen-iso-3 (gen/to-string gen-char-upper {:num-elements 3}))
(def gen-iso-numeric (gen/to-string gen-char-digit {:num-elements 3}))
(def gen-fips (gen/to-string gen-char-upper {:num-elements 2}))
(def gen-country gen/string)
(def gen-capital gen/string)
(def gen-area  (gen/large-integer* {:min 100 :max 999999999}))
(def gen-population (gen/large-integer* {:min 100 :max 999999999}))
(def gen-continent (gen/elements ["AS" "NA" "SA" "EU" "OC" "AF"]))
(def gen-tld (gen/to-string gen-char-lower {:num-elements 2 :prefix "."}))
(def gen-currency-code (gen/to-string gen-char-upper {:num-elements 3}))
(def gen-currency-name gen/string)
(def gen-phone  (gen/large-integer* {:min 1 :max 999}))
(def gen-simple-language (gen/to-string gen-char-lower {:num-elements 2}))
(def gen-language (gen/one-of [gen-simple-language
                               gen/to-string [gen-simple-language (gen/return "-") gen-iso-2])]))
(def gen-languages (gen/to-string gen-language {:sep ","}))
(def gen-geonameid (gen/large-integer* {:min 1 :max 999999999}))
(def gen-neighbors (gen/to-string gen-iso-2 {:sep ","}))
(def gen-equivilent-fips (gen/to-string gen-char-upper {:num-elements 2}))

(defn to-postal-regex [postal-format]
  (str "^" (clojure.string/join (map #(cond (= \# %) "\\d" (= \@ %) "[A-Z]" :default %) postal-format)) "$"))

(def gen-country-line
  (gen/let [postal-format (gen/to-string gen-char-postal-format {:min-elements 2 :max-element 9})]
    (gen/to-string [gen-iso-2 gen-iso-3 gen-iso-numeric gen-fips
                    gen-country gen-capital gen-area gen-population gen-continent
                    gen-tld gen-currency-code gen-currency-name gen-phone
                    (gen/return postal-format) (gen/return (to-postal-regex postal-format))
                    gen-languages gen-geonameid gen-neighbors gen-equivilent-fips
                    ] {:sep \tab})))

0

由 gfredericks 发表评论

如果我要尝试编写一个类似 {{gen-country-line}} 的生成器,我可能会组合 {{gen/tuple}} 和 {{string/join}},例如:

(gen/let [fields (gen/tuple gen-iso-2 gen-iso-3 ... gen-equivilent-fips)] (string/join \tab fields))

你好像写了 gen/to-string 以接受生成器或生成器向量的方式?我一般不喜欢这种模糊性,并且我认为上面提到的 {{gen/let}} 例子表明,不需要这个矢量特性也可以很好地生存。

没有矢量特性,{{:sep}} 特性仍然具有吸引力吗?我在一些情况下有点犹豫是否添加特性,至少在没有强大原因的情况下。

0
_由 m0smith_ 发表评论

我明白了您所说的话,这很有道理。最好把它作为一个例子包含在文档中。

:sep 在结果字段之间使用,无论提供的是单个生成器还是多个生成器。这使得创建逗号分隔的整数列表(to-string int {:sep ","})更加方便。
0

评论由:m0smith 制作

我移除了 to-string 的所有额外选项。我还添加了一个创建 XML 生成器的例子。

0
参考资料:https://clojure.atlassian.net/browse/TCHECK-99(由 m0smith 报告)
...