Skip to content

Instantly share code, notes, and snippets.

@aviflax
Last active February 19, 2021 05:14
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save aviflax/1a9ba7e73d45157bfc03f6b11c3b9b18 to your computer and use it in GitHub Desktop.
Save aviflax/1a9ba7e73d45157bfc03f6b11c3b9b18 to your computer and use it in GitHub Desktop.
clojure.spec function spec that’s slow with check
{:deps {org.clojure/clojure {:type :mvn :version "1.9.0-alpha17"}
org.clojure/test.check {:type :mvn :version "0.10.0-alpha2"}}
:providers {:mvn {:repos {"central" {:url "https://repo1.maven.org/maven2/"}
"clojars" {:url "https://clojars.org/repo/"}}}}}
(ns user
(:require [clojure.spec.alpha :as s]
[clojure.spec.gen.alpha :as gen]
[clojure.spec.test.alpha :as stest]
[clojure.string :as string]
[clojure.java.io :as io]
[clojure.pprint :as pp])
(:import [java.io InputStream]))
(s/def ::non-empty-string
(s/with-gen
(s/and string? (complement string/blank?))
#(gen/not-empty (gen/string-alphanumeric))))
(s/def ::string-row
(s/coll-of string?
:kind vector?
:into []
:count 8
:gen-max 10
:gen (fn [] (gen/tuple (gen/fmap str (gen/uuid)) ; guid
(gen/fmap str (gen/large-integer* {:min 1})) ; index
(gen/fmap str (gen/large-integer* {:min 1})) ; lane-id
(s/gen ::non-empty-string) ; lane-name
(gen/fmap str (gen/large-integer* {:min 0 :max 100})) ; confidence
(s/gen ::non-empty-string) ; lpr-filename
(gen/string-alphanumeric) ; overview-filename
(gen/string-alphanumeric))))) ; lpr
(s/def ::stream-of-string-rows
(s/with-gen
(partial instance? InputStream)
(fn [] (gen/fmap #(->> (map (partial string/join ",") %)
(string/join "\n")
.getBytes
io/input-stream)
(gen/vector (s/gen ::string-row))))))
(s/fdef something-please
:args (s/cat :stream ::stream-of-string-rows)
:ret keyword?)
(defn ^:private something-please [csv-stream] :something)
(println "Running checks!\n")
(println ":num-tests not specified:")
(println (time (first (stest/check 'user/something-please))))
(println "\n:num-tests specified as 10:")
(println (time (first (stest/check 'user/something-please {:clojure.spec.test.check/opts {:num-tests 10}}))))
(println "\ndone!")
$ clj slow_check.clj
Running checks!
:num-tests not specified:
"Elapsed time: 17556.506856 msecs"
{:spec #object[clojure.spec.alpha$fspec_impl$reify__1355 0x8ed9cf clojure.spec.alpha$fspec_impl$reify__1355@8ed9cf], :clojure.spec.test.check/ret {:result true, :num-tests 1000, :seed 1501114576145}, :sym user/something-please}
:num-tests specified as 10:
"Elapsed time: 2.497168 msecs"
{:spec #object[clojure.spec.alpha$fspec_impl$reify__1355 0x8ed9cf clojure.spec.alpha$fspec_impl$reify__1355@8ed9cf], :clojure.spec.test.check/ret {:result true, :num-tests 10, :seed 1501114593162}, :sym user/something-please}
done!
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment