2024 状态 Clojure 问卷调查! 中分享您的想法。

欢迎!请参阅 关于 页面以了解更多有关此信息。

0
test.check

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

of-length 会检查生成的序列长度。如果长度太小,使用 (take 最小 (cycle 序列)) 来扩展序列长度。
如果长度太长,使用 (take 最大 序列) 来返回最大长度。
需要小心返回与接收到的类型相同的类型。
如果没有收到序列,将其视为一个元素序列。
如果最小不是 0,则使用 such-that not nil 来确保生成一个合适的序列。

22 答案

0

评论者:m0smith

TCHECK-99-3.patch 已更新以支持 :sep 选项。此外,基于一个新的 'apply-to' 函数,这也将对 TCHECK-97 有用。有关建议的 Unicode 实施方案,请参阅 https://github.com/m0smith/test.check/tree/feature/TCHECK-97

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-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
                                                        
(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}}功能是否仍然那么有吸引力?我对{{:sep}}有点不确定,至少在通常我不太愿意没有充分原因就添加功能的方面。

0
评论者:m0smith_

我明白了您在说什么,这很有道理。最好将这个例子包含在文档中。

:sep用于结果字段之间,无论提供的是一个生成器还是多个生成器。这对于创建由逗号分隔的整数字符串(如(to-string int {:sep ","}))很方便。
0

评论者:m0smith

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

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