请分享您的想法,参加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 文字:在这里)。

0

评论人:maciej.jaskowski

显然我需要更多的提示,因为我所能生成的只是(顺便说一下,使用gen/bing)成对的(graph list-of-random-paths)

只要算法按预期工作,这就有用。然而,一旦失败,很难找出哪个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) (链接: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

我仍然不确定这样使用嵌套属性会是什么样子。您能否按照您想要的方式编写代码,使其作为一个嵌套属性?这至少需要两个for-alls。

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 提交)
...