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

欢迎!请参阅 关于 页面了解更多关于其工作方式的信息。

0
test.check

包括添加对嵌套属性支持的功能,这将是有益的。以下是一个可能的实现例子:

`
(defn exists?
[e coll]
(some #{e} coll))

(defn remove-elem
[e coll]
(remove #{e} coll))

;; 此测试应失败,并说明了嵌套属性
(quick-check (for-all [v (gen/vector gen/int)]

           (for-all [e (elements v)]
             #(exists? e (remove-elem e v)))))

`

这个需求是支持现实化属性,这目前尚未实现。

(链接: https://github.com/reiddraper/simple-check/issues/10 文本:原始问题 - GitHub #10)

12 回答

0

由 maciej.jaskowski 发布的评论

此问题的状态如何?
在以下情况下,对此功能上线将极大地帮助我们:我希望验证我的路径查找算法能在给定的图G中找到最优解,因此我生成图和大量的随机路径,检查所有随机路径都比算法找到的路径“次优”。

拥有嵌套的 for-all 将会是简单的。有没有什么办法可以绕过这个问题?

0

由 reiddraper 发布的评论

对于这里的更新不足表示歉意。嵌套属性在我这边还在热砂椅时间上。好消息是它们相当方便,您可以使用{{clojure.test.check.generators/bind}}达到完全相同的效果。您可以在以下链接中看到一个使用{{bind}}的示例(链接:[https://github.com/clojure/test.check/blob/v0.5.8/doc/generator-examples.md#a-vector-and-a-random-element-from-it](https://github.com/clojure/test.check/blob/v0.5.8/doc/generator-examples.md#a-vector-and-a-random-element-from-it) 文本:这里)。

0

由 maciej.jaskowski 发布的评论

显然我需要一些更多的提示,因为我生成的内容(顺便说一句,使用gen/bing生成)都是形如'(graph list-of-random-paths)的对。

只要算法按预期工作,这很有用。然而,一旦它失败了,要弄清楚是哪个随机的路径导致了问题就相当困难。

0

由 reiddraper 发布的评论

您能展示您如何使用嵌套属性编写测试吗?然后我可能可以帮助您将其重写为使用{{bind}}?

0

由 maciej.jaskowski 发布的评论

太好了(图片:谢谢)

请在下面找到最重要的部分。

`
(defn gen-matrix-and-paths [size]

(gen/bind
  (gen-matrix gen/s-pos-int size)
  (fn [matrix]
    (let [ nodes (into [] (range (count matrix)))
           gen-perms (gen-permutations nodes)
           perms (distinct (gen/sample gen-perms 500)) ]
      (gen/tuple 
        (gen/return matrix) 
        (gen/return perms))))))

`

gen-matrix生成一个发生矩阵,例如(链接:[0 1) 和 (link: 4 0)]
gen-permutations生成提供的向量的排列

0

由 reiddraper 发布的评论

我有点困惑。你在遇到什么问题?你粘贴的代码使用了{{bind}},而没有使用嵌套属性。

0

由 maciej.jaskowski 发布的评论

好吧,但现在我只能写出这样的代码

`
(prop/for-all [data (gen-matrix-and-paths 6)]
(let [ [matrix random-paths] data ]

 (not-worse-then-others? tsp matrix random-paths))))

`

这样,如果我的'tsp'算法工作不正确,将会指向一个矩阵和一个路径向量(长度 500),其中有一个路径是反例。如果能得到矩阵和单个反例会更好。

0

由 reiddraper 发布的评论

我仍不确定使用嵌套属性时会是什么样子。您能否按照您喜欢的嵌套属性的方式编写代码?这至少需要两个全量条件。

0

由 maciej.jaskowski 发布的评论

当然可以!

我想写类似这样的东西

`
(prop/for-all [matrix (gen-matrix 6)]
(prop/for-all [random-path (gen-random-path matrix)]

(<= (cost (tsp matrix)) (cost random-path))))

`

0

由 maciej.jaskowski 发布的评论

ping!

0

由 reiddraper 发布的评论

好的,让我们将其翻译为使用 {{gen/bind}}。就像使用嵌套属性那样,{{bind}} 允许您创建依赖于另一个生成器 的生成器。例如,您的 {{gen-random-path}} 依赖于之前生成的 {{matrix}} 变量。所以让我们编写一个生成器,该生成器返回一个 {{matrix}} 和一个 {{random-path}}。

`
(def matrix-and-path
"返回一个包含 [matrix random-path] 的二元组"
(gen/bind (gen-matrix 6)

        (fn [matrix]
           (gen/tuple (gen/return matrix) (gen-random-path matrix)))))

(prop/for-all [[matrix random-path] matrix-and-path]
(<= (cost (tsp matrix)) (cost random-path))
`

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