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

欢迎!请参阅 关于 页面了解有关如何工作的更多信息。

0
规范
给定的使用 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
_评论来自: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
  "生成有效的NHS号码")
  (gen/fmap #(str (+ (* 10 %) (mod11-checkdigit (str %))))
                           (gen/such-that #(mod11-checkdigit (str %))
                                              (gen/choose 100000000 999999999))))

(defn nhs-number?
  "如果传递的NHS号码有效,则返回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

评论者:alexmiller

我不确定目前基于我们提供并从test.check获得的内容是否可行。

0

评论者:glittershark

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

0

评论者:glittershark

另请参阅 http://dev.clojure.org/jira/browse/TCHECK-107我想

0

评论者:glittershark

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

0
参考文献:https://clojure.atlassian.net/browse/CLJ-2025 (由 alex+import报告)
...