如何为 test.check 生成随机密钥?
How do I generate random keys for test.check?
我正在使用 test.check 生成哈希图。我想要一个键是一个随机数字关键字这是我试过的
(gen/hash-map
:16 gen/nat
:1041 gen/string
(keyword (str gen/nat)) gen/string)
这对前两个键工作正常,但 gen/sample returns 最后一个键而不是值的函数。 gen/sample {:16 1, :1041 "»", :clojure.test.check.generators.Generator@3daf97b7 "u"}
的输出
您需要使用 clojure.test.check.generators/fmap 将函数(str
、keyword
)应用到您的生成器。
这是一个使用 gen/bind
的例子
user> (require '[clojure.test.check.generators :as gen])
nil
user> (gen/sample (gen/bind gen/nat
#(gen/hash-map
:16 gen/nat
:1041 gen/string
(keyword (str %)) gen/string)))
({:16 0, :1041 "", :0 ""}
{:16 1, :1041 "—", :1 "Õ"}
{:16 1, :1041 "~", :2 "{"}
{:16 0, :1041 "", :0 ""}
{:16 1, :1041 "}", :2 "š¤#"}
{:16 4, :1041 "", :4 "ÂêÃ"}
{:16 6, :1041 "¯¾ùPêà", :1 "xaÝ$"}
{:16 1, :1041 "", :4 "ž"}
{:16 7, :1041 "", :3 "Ù¡"}
{:16 3, :1041 "‚«¤s", :5 "ƶoÒA“"})
user>
这是一个使用 gen/fmap
user> (gen/sample (gen/fmap (fn [[m n s]] (assoc m (keyword (str n)) s))
(gen/tuple (gen/hash-map
:16 gen/nat
:1041 gen/string)
gen/nat gen/string)))
({:16 0, :1041 "", :0 ""}
{:16 0, :1041 "", :1 "Ô"}
{:16 2, :1041 "`", :0 "V²"}
{:16 1, :1041 "X", :2 "b"}
{:16 3, :1041 "JÓ", :2 ""}
{:16 2, :1041 "", :2 ""}
{:16 2, :1041 "", :2 "×kîj"}
{:16 0, :1041 "", :0 ""}
{:16 5, :1041 "ÎÖ", :0 ":üv-`"}
{:16 8, :1041 "¬KéÎêo\r", :4 "ÆÌ"})
user>
在这种情况下,您必须使用 gen/fmap
或 gen/bind
。它们都允许您操纵生成器的输出。如果你想 return 一个生成器,那么使用 gen/bind
。如果你想 return 一个值,那么使用 gen/fmap
。 gen/fmap
和 gen/bind
都有两个参数,一个是生成器,另一个参数是一个函数,它将第一个生成的值作为其输入,return 要么是一个生成器(对于 gen/bind
)或一个值(对于 gen/fmap
)。
我正在使用 test.check 生成哈希图。我想要一个键是一个随机数字关键字这是我试过的
(gen/hash-map
:16 gen/nat
:1041 gen/string
(keyword (str gen/nat)) gen/string)
这对前两个键工作正常,但 gen/sample returns 最后一个键而不是值的函数。 gen/sample {:16 1, :1041 "»", :clojure.test.check.generators.Generator@3daf97b7 "u"}
您需要使用 clojure.test.check.generators/fmap 将函数(str
、keyword
)应用到您的生成器。
这是一个使用 gen/bind
user> (require '[clojure.test.check.generators :as gen])
nil
user> (gen/sample (gen/bind gen/nat
#(gen/hash-map
:16 gen/nat
:1041 gen/string
(keyword (str %)) gen/string)))
({:16 0, :1041 "", :0 ""}
{:16 1, :1041 "—", :1 "Õ"}
{:16 1, :1041 "~", :2 "{"}
{:16 0, :1041 "", :0 ""}
{:16 1, :1041 "}", :2 "š¤#"}
{:16 4, :1041 "", :4 "ÂêÃ"}
{:16 6, :1041 "¯¾ùPêà", :1 "xaÝ$"}
{:16 1, :1041 "", :4 "ž"}
{:16 7, :1041 "", :3 "Ù¡"}
{:16 3, :1041 "‚«¤s", :5 "ƶoÒA“"})
user>
这是一个使用 gen/fmap
user> (gen/sample (gen/fmap (fn [[m n s]] (assoc m (keyword (str n)) s))
(gen/tuple (gen/hash-map
:16 gen/nat
:1041 gen/string)
gen/nat gen/string)))
({:16 0, :1041 "", :0 ""}
{:16 0, :1041 "", :1 "Ô"}
{:16 2, :1041 "`", :0 "V²"}
{:16 1, :1041 "X", :2 "b"}
{:16 3, :1041 "JÓ", :2 ""}
{:16 2, :1041 "", :2 ""}
{:16 2, :1041 "", :2 "×kîj"}
{:16 0, :1041 "", :0 ""}
{:16 5, :1041 "ÎÖ", :0 ":üv-`"}
{:16 8, :1041 "¬KéÎêo\r", :4 "ÆÌ"})
user>
在这种情况下,您必须使用 gen/fmap
或 gen/bind
。它们都允许您操纵生成器的输出。如果你想 return 一个生成器,那么使用 gen/bind
。如果你想 return 一个值,那么使用 gen/fmap
。 gen/fmap
和 gen/bind
都有两个参数,一个是生成器,另一个参数是一个函数,它将第一个生成的值作为其输入,return 要么是一个生成器(对于 gen/bind
)或一个值(对于 gen/fmap
)。