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)来返回最长长度
需要注意返回与接收到的相同类型。
如果没有接收序列,则将其视为一个元素序列。
如果min不是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/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}}示例表明,没有向量功能也不会有很大痛苦。

vector功能不存在时,{{:sep}}功能仍然那么有吸引力吗?我对{{:sep}}有些不确定,至少我在没有充分理由的情况下犹豫是否要添加功能。

0 投票
评论由:m0smith_发布

我明白您的意思,这很有道理。最好是把这个例子包括在文档中。

:sep用于结果字段的分隔,无论提供一个生成器还是多个生成器。这使得创建以逗号分隔的整数列表变得很方便(to-string int {:sep ","})
0 投票

评论由:m0smith

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

0 投票
...