Skip to content

Instantly share code, notes, and snippets.

@Folcon
Last active February 10, 2017 11:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Folcon/4098bd3a11a5f1bf52bd6adeb098234b to your computer and use it in GitHub Desktop.
Save Folcon/4098bd3a11a5f1bf52bd6adeb098234b to your computer and use it in GitHub Desktop.
(ns todo-spec-issue
(:require
[clojure.spec :as s]
[clojure.spec.test :as stest]
[clojure.spec.impl.gen :as gen]))
(s/def ::id int?)
(s/def ::name string?)
(s/def ::todo (s/keys :req-un [::id ::name]))
(s/def ::todos (s/and
(s/map-of ::id ::todo)
#(sorted? %)
))
(s/def ::db (s/keys :req-un [::todos]))
(println "First sample:")
(println (gen/sample (s/gen ::db) 1))
;or
(println "First exercise:")
(println (s/exercise ::db 1))
;gives:
;Uncaught cljs.core.ExceptionInfo
;message: "Couldn't satisfy such-that predicate after 100 tries."
;Whereas:
(s/def ::todos (s/and
(s/map-of ::id ::todo)
))
(s/def ::db (s/keys :req-un [::todos]))
(println "Second sample:")
(println (gen/sample (s/gen ::db) 1))
;gives:
;({:todos {0 {:id 0, :name ""}, -1 {:id -1, :name ""}}})
;and
(println "Second exercise:")
(s/exercise ::db 1)
;gives:
;([{:todos {-1 {:id -1, :name ""}, 0 {:id 0, :name ""}}}
; {:todos {-1 {:id -1, :name ""}, 0 {:id 0, :name ""}}}])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment