Using test.check, I'm finding the shrinking to be very, very slow. Running 
a hundred cases takes a few seconds, unless it hits an error, in which case 
it takes 40-60 minutes to shrink, and the shrinking is not very effective 
(resulting test case is much larger than necessary). Sometimes the 
shrinking is much faster. It behaves a bit like it's occasionally getting 
into a pathological state, or a difficult shrinking scenario.

Are there any docs on generators or the shrinking algorithm that would help 
build tests that shrink more effectively?

The problematic generator builds a randomly-sized matrix of integers, with 
randomly assigned names for the rows and columns. The failure case is when 
either a column or row name is repeated. I expect the slow shrinking has 
something to do with it being rare for the generator to emit the same name 
twice.

; Generator of randomly sized matrices of random numbers.
(def gen-matrix
  (gen/bind
    gen/s-pos-int
    (fn [x] (gen/bind
              gen/s-pos-int
              (fn [y] (gen/vector (gen/vector gen/int x) y))))))

; Generator of matrix with probe and sample ids.
(def gen-tsv
  (gen/bind
    gen-matrix
    (fn [m]
      (gen/hash-map
        :probes (gen/vector 
                  (gen/such-that not-empty gen/string-alpha-numeric)
                  (count m))
        :samples (gen/vector 
                   (gen/such-that not-empty gen/string-alpha-numeric)
                   (count (first m)))
        :matrix (gen/return m)))))

Shrinking will result in a case like

{:matrix [[1 4 -3] [-4 -3 -5] [-5 2 3] [4 -5 -5] [1 -2 3] [1 4 1]], 
:samples ["0" "0" "0"], :probes ["0" "0" "0" "0" "0" "0"]}

where :samples ["0" "0"] :probes["0"] would do.

The following test will exhibit the behavior, sometimes succeeding, 
sometimes failing quickly, sometimes shrinking for a very long time:

(tc/quick-check 100 (prop/for-all [tsv gen-tsv] (= (count (set (:probes 
tsv))) (count (:probes tsv)))))

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to