Meikel  Brandmeyer avatar Meikel Brandmeyer committed 2d436c3

DSL domain values

Comments (0)

Files changed (1)

src/main/clojure/clojurecheck/core.clj

   (value  [this] (value v))
   (shrink [this] (f v)))
 
+;; Some of Clojure's internal types are also acting as domain values.
+;; The map to the corresponding behaviour of the given type in the
+;; role of an generator.
+(extend-protocol DomainValue
+
+  ;; Sequences are considered as tuples of generated values.
+  ;; Shrink one after the other.
+  clojure.lang.ISeq
+  (value  [this] (map value this))
+  (shrink [this] (mapcat shrink this))
+
+  ;; Maps are also acting as domain values. The keys are fixed
+  ;; but the values are domain values. Again we try to shrink
+  ;; here one after the other.
+  clojure.lang.IPersistentMap
+  (value  [this] (into (empty this) (for [[k v] this] [k (value v)])))
+  (shrink [this] (for [[k v] this sv (shrink v)] (assoc this k sv))))
+
 (extend-protocol Generator
   clojure.lang.Fn
   (arbitrary [this size] (DomainValue. this (this size)))
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.