Codebase list test-check-clojure / 56c03a1
Copy generators impl details from the old cljs code Most of these are avoiding use of HOFs for performance (at least in cljs-land). Another was a bad argument name. Gary Fredericks 8 years ago
1 changed file(s) with 14 addition(s) and 14 deletion(s). Raw diff Collapse all Expand all
6666 of random number generators."
6767 [rr]
6868 (lazy-seq
69 (let [[r1 r2] (random/split rr)]
70 (cons r1
71 (lazy-random-states r2)))))
69 (let [[r1 r2] (random/split rr)]
70 (cons r1
71 (lazy-random-states r2)))))
7272
7373 (defn- gen-seq->seq-gen
7474 "Takes a sequence of generators and returns a generator of sequences (er, vectors)."
8383 (defn fmap
8484 [f gen]
8585 (assert (generator? gen) "Second arg to fmap must be a generator")
86 (gen-fmap (partial rose/fmap f) gen))
86 (gen-fmap #(rose/fmap f %) gen))
8787
8888
8989 (defn return
134134 ([generator max-size]
135135 (let [r (random/make-random)
136136 size-seq (make-size-range-seq max-size)]
137 (core/map (comp rose/root #(call-gen generator %1 %2))
137 (core/map #(rose/root (call-gen generator %1 %2))
138138 (lazy-random-states r)
139139 size-seq))))
140140
163163
164164 (defn- halfs
165165 [n]
166 (take-while (partial not= 0) (iterate #(quot % 2) n)))
166 (take-while #(not= 0 %) (iterate #(quot % 2) n)))
167167
168168 (defn- shrink-int
169169 [integer]
170 (core/map (partial - integer) (halfs integer)))
170 (core/map #(- integer %) (halfs integer)))
171171
172172 (defn- int-rose-tree
173173 [value]
272272 (assert (every? generator? generators)
273273 "Arg to one-of must be a collection of generators")
274274 (bind (choose 0 (dec (count generators)))
275 (partial nth generators)))
275 #(nth generators %)))
276276
277277 (defn- pick
278278 [[h & tail] n]
312312 #(gen-pure (rose/fmap v %)))))
313313
314314 (defn- such-that-helper
315 [max-tries pred gen tries-left rand-seed size]
315 [max-tries pred gen tries-left rng size]
316316 (if (zero? tries-left)
317317 (throw (ex-info (str "Couldn't satisfy such-that predicate after "
318318 max-tries " tries.") {}))
319 (let [[r1 r2] (random/split rand-seed)
319 (let [[r1 r2] (random/split rng)
320320 value (call-gen gen r1 size)]
321321 (if (pred (rose/root value))
322322 (rose/filter pred value)
413413
414414 (def neg-int
415415 "Generate negative integers bounded by the generator's `size` parameter."
416 (fmap (partial * -1) nat))
416 (fmap #(* -1 %) nat))
417417
418418 (def s-pos-int
419419 "Generate strictly positive integers bounded by the generator's `size`
484484 if it's not already."
485485 [coll]
486486 (let [index-gen (choose 0 (dec (count coll)))]
487 (fmap (partial reduce swap (vec coll))
487 (fmap #(reduce swap (vec coll) %)
488488 ;; a vector of swap instructions, with count between
489489 ;; zero and 2 * count. This means that the average number
490490 ;; of instructions is count, which should provide sufficient
509509 `key-gen` and values chosen from `val-gen`."
510510 [key-gen val-gen]
511511 (let [input (vector (tuple key-gen val-gen))]
512 (fmap (partial into {}) input)))
512 (fmap #(into {} %) input)))
513513
514514 (defn hash-map
515515 "Like clojure.core/hash-map, except the values are generators.
526526 vs (take-nth 2 (rest kvs))]
527527 (assert (every? generator? vs)
528528 "Value args to hash-map must be generators")
529 (fmap (partial zipmap ks)
529 (fmap #(zipmap ks %)
530530 (apply tuple vs))))
531531
532532 (def char