_Comment made by: alexmiller_

[Original description from ticket:]

I created a generator that did not conform to the spec (doh!). The generator contained the such-that predicate. When I tried creating a sample from the generator I got this error:

ExceptionInfo Couldn't satisfy such-that predicate after 100 tries. clojure.core/ex-info (core.clj:4725)

I assumed that it referred to my custom generator but that was a red herring because in fact spec must be using such-that to ensure that the generated value conforms to the spec, and it was this such-that that generated the failure, not the one in my custom generator.

Code (with the problem corrected but showing the such-that in my generator:

(defn mod11-checkdigit

"Calculate the checkdigit see

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

"Generates a valid NHS number"

(gen/fmap #(str (+ (* 10 %) (mod11-checkdigit (str %))))

(gen/such-that #(mod11-checkdigit (str %))

(gen/choose 100000000 999999999))))

(defn nhs-number?

"Returns true if passed a valid nhs number else returns 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)))

It would be nicer if the error thrown due to the generated value being non-conformant with the spec stated this.