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)))))

`

此要求是支持具象化属性,但目前尚未实现。

(link: https://github.com/reiddraper/simple-check/issues/10 text: 原始问题 - 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))))

`

这会指向一个矩阵和长度为500的路径向量,其中一个路径是反例。如果我能得到矩阵和一个单独的反例会更理想。

0

评论者:reiddraper

我还不确定这个会用嵌套属性是什么样子。你能请你以你想要的嵌套属性的方式编写代码吗?这将涉及至少两个 for-all。

0
by

评论者: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
by

评论者:maciej.jaskowski

ping!

0
by

评论者: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
by
参考: https://clojure.atlassian.net/browse/TCHECK-7 (由hypirion报告)
...