Last active
February 19, 2021 05:14
-
-
Save aviflax/1a9ba7e73d45157bfc03f6b11c3b9b18 to your computer and use it in GitHub Desktop.
clojure.spec function spec that’s slow with check
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{: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/"}}}}} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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!") |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
$ 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