2024年Clojure状态调查!中分享您的想法。

欢迎!请在关于页面查看有关此功能的更多信息。

0
Spec
给定一个使用such-that且失败以找到值的生成器,错误没有足够的信息来确定哪个规范或谓词有问题


(require '[clojure.spec :as s])
(s/exercise (s/and string? #{"hi"}))
ExceptionInfo 在100次尝试后无法满足such-that谓词。 clojure.core/ex-info (core.clj:4725)


这种情况的另一个特例是当提供一个有效但不满足规范的定制生成器时(Clojure添加此过滤器内部)


(require '[clojure.spec :as s])
(s/exercise (s/with-gen int? #(s/gen #{:a})))


*提议:* 在错误中指出哪个规范失败生成,如果可行,还可以指定整个规范中的路径。

(注意:原始描述已移动到评论)

6 答案

0
_Comment made by: alexmiller_

[原始描述来自票务:]

我创建了一个不符合规范的生成器(doh!). 生成器包含such-that谓词。当我尝试从生成器创建示例时,我得到这个错误

ExceptionInfo 在100次尝试后无法满足such-that谓词。 clojure.core/ex-info (core.clj:4725)

我假设这是指我的自定义生成器,但这是一条红鲱鱼,因为实际上规范必须使用such-that来确保生成的值符合规范,并且是这种such-that导致了失败,而不是我自定义生成器中的那个。

代码(问题已修正,但显示了生成器中的such-that


(defn mod11-checkdigit
  "计算校验位,请参阅 http://freagra.com/imthealth/mitNNC.html"
  [n]
  (let [x (->> (map #(Integer/parseInt (str %)) (take 9 n))
               (map * (range 10 1 -1))
               (reduce +))
        y (mod x 11)
        c (- 11 y)]
    (cond (== 10 c) nil
          (== 11 c) 0
          :else c)))

(def nhs-number-gen
  "生成有效的英国国民保健服务编号"
  (gen/fmap #(str (+ (* 10 %) (mod11-checkdigit (str %))))
               (gen/such-that #(mod11-checkdigit (str %))))
                           (gen/choose 100000000 999999999))))

(defn nhs-number?
  "如果传入的是有效的英国国民保健服务编号则返回true,否则返回false"
  [n]
  (and (string? n) (= 10 (count n)) (= (str (mod11-checkdigit n)) (str (last n)))))

(s/def ::nhs-number (s/with-gen nhs-number?
                                (fn [] nhs-number-gen)))




如果生成的值不符合规定的错误抛出会更方便。
0
by

由:alexmiller 提出评论

我不确定根据我们提供给 test.check 和从它那里得到的内容,现在是否能实现这一点。

0
by

由:glittershark 提出评论

看起来 test.check 正在更新以支持错误定制的错误: https://github.com/clojure/test.check/commit/5aea0e275257680b672309b1e940be6dae92c17d 。我已经有一个补丁,用于更新 clojure.spec 以使用它,尽管显然它不起作用,因为链接的提交还没有包含在 test.check 的发布版本中。

0
by

由:glittershark 提出评论

另见http://dev.clojure.org/jira/browse/TCHECK-107 我想

0
by

由:glittershark 提出评论

附上补丁以供将来参考(《better-such-that-info.patch》)。

0
by
参考:https://clojure.atlassian.net/browse/CLJ-2025(由 alex+import 提出)
...