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](https://clojure.atlassian.net/browse/TCHECK-7)(由hypirion报告)
...