|
23 | 23 | m1)
|
24 | 24 | (= m1 m2)))
|
25 | 25 |
|
26 |
| -(defn- ne [probs] |
27 |
| - (let [[path prob] (first probs)] |
28 |
| - [(assoc prob :path path)])) |
29 |
| - |
30 |
| -#_(deftest conform-explain |
| 26 | +(deftest conform-explain |
31 | 27 | (let [a (s/and #(> % 5) #(< % 10))
|
32 | 28 | o (s/or :s string? :k keyword?)
|
33 | 29 | c (s/cat :a string? :b keyword?)
|
|
37 | 33 | opt (s/? keyword?)
|
38 | 34 | andre (s/& (s/* keyword?) even-count?)
|
39 | 35 | m (s/map-of keyword? string?)
|
40 |
| - coll (s/coll-of keyword? []) |
| 36 | + mkeys (s/map-of (s/and keyword? (s/conformer name)) ::s/any) |
| 37 | + mkeys2 (s/map-of (s/and keyword? (s/conformer name)) ::s/any :conform-keys true) |
| 38 | + s (s/coll-of (s/spec (s/cat :tag keyword? :val ::s/any)) :kind ()) |
| 39 | + v (s/coll-of keyword? :kind []) |
| 40 | + coll (s/coll-of keyword?) |
41 | 41 | lrange (s/int-in 7 42)
|
42 | 42 | drange (s/double-in :infinite? false :NaN? false :min 3.1 :max 3.2)
|
43 | 43 | irange (s/inst-in #inst "1939" #inst "1946")
|
|
46 | 46 | (let [co (result-or-ex (s/conform spec x))
|
47 | 47 | e (result-or-ex (::s/problems (s/explain-data spec x)))]
|
48 | 48 | (when (not= conformed co) (println "conform fail\n\texpect=" conformed "\n\tactual=" co))
|
49 |
| - (when (not (submap? ed e)) (println "explain fail\n\texpect=" ed "\n\tactual=" e)) |
50 |
| - (and (= conformed co) (submap? ed e))) |
| 49 | + (when (not (every? true? (map submap? ed e))) |
| 50 | + (println "explain failures\n\texpect=" ed "\n\tactual failures=" e "\n\tsubmap?=" (map submap? ed e))) |
| 51 | + (and (= conformed co) (every? true? (map submap? ed e)))) |
51 | 52 |
|
52 | 53 | lrange 7 7 nil
|
53 | 54 | lrange 8 8 nil
|
54 |
| - lrange 42 ::s/invalid [{:path [] :pred '(int-in-range? 7 42 %), :val 42, :via [], :in []}] |
| 55 | + lrange 42 ::s/invalid [{:pred '(int-in-range? 7 42 %), :val 42}] |
55 | 56 |
|
56 |
| - irange #inst "1938" ::s/invalid [{:path [] :pred '(inst-in-range? #inst "1939-01-01T00:00:00.000-00:00" #inst "1946-01-01T00:00:00.000-00:00" %), :val #inst "1938", :via [], :in []}] |
| 57 | + irange #inst "1938" ::s/invalid [{:pred '(inst-in-range? #inst "1939-01-01T00:00:00.000-00:00" #inst "1946-01-01T00:00:00.000-00:00" %), :val #inst "1938"}] |
57 | 58 | irange #inst "1942" #inst "1942" nil
|
58 |
| - irange #inst "1946" ::s/invalid [{:path [] :pred '(inst-in-range? #inst "1939-01-01T00:00:00.000-00:00" #inst "1946-01-01T00:00:00.000-00:00" %), :val #inst "1946", :via [], :in []}] |
| 59 | + irange #inst "1946" ::s/invalid [{:pred '(inst-in-range? #inst "1939-01-01T00:00:00.000-00:00" #inst "1946-01-01T00:00:00.000-00:00" %), :val #inst "1946"}] |
59 | 60 |
|
60 |
| - drange 3.0 ::s/invalid [{:path [] :pred '(<= 3.1 %), :val 3.0, :via [], :in []}] |
| 61 | + drange 3.0 ::s/invalid [{:pred '(<= 3.1 %), :val 3.0}] |
61 | 62 | drange 3.1 3.1 nil
|
62 | 63 | drange 3.2 3.2 nil
|
63 |
| - drange Double/POSITIVE_INFINITY ::s/invalid [ {:path [] :pred '(not (isInfinite %)), :val Double/POSITIVE_INFINITY, :via [], :in []}] |
| 64 | + drange Double/POSITIVE_INFINITY ::s/invalid [{:pred '(not (isInfinite %)), :val Double/POSITIVE_INFINITY}] |
64 | 65 | ;; can't use equality-based test for Double/NaN
|
65 |
| - ;; drange Double/NaN ::s/invalid {[] {:pred '(not (isNaN %)), :val Double/NaN, :via [], :in []}} |
| 66 | + ;; drange Double/NaN ::s/invalid {[] {:pred '(not (isNaN %)), :val Double/NaN}} |
66 | 67 |
|
67 | 68 | keyword? :k :k nil
|
68 |
| - keyword? nil ::s/invalid (ne {[] {:pred ::s/unknown :val nil :via []}}) |
69 |
| - keyword? "abc" ::s/invalid (ne {[] {:pred ::s/unknown :val "abc" :via []}}) |
| 69 | + keyword? nil ::s/invalid [{:pred ::s/unknown :val nil}] |
| 70 | + keyword? "abc" ::s/invalid [{:pred ::s/unknown :val "abc"}] |
70 | 71 |
|
71 | 72 | a 6 6 nil
|
72 |
| - a 3 ::s/invalid (ne '{[] {:pred (> % 5), :val 3 :via []}}) |
73 |
| - a 20 ::s/invalid (ne '{[] {:pred (< % 10), :val 20 :via []}}) |
| 73 | + a 3 ::s/invalid '[{:pred (> % 5), :val 3}] |
| 74 | + a 20 ::s/invalid '[{:pred (< % 10), :val 20}] |
74 | 75 | a nil "java.lang.NullPointerException" "java.lang.NullPointerException"
|
75 | 76 | a :k "java.lang.ClassCastException" "java.lang.ClassCastException"
|
76 | 77 |
|
77 | 78 | o "a" [:s "a"] nil
|
78 | 79 | o :a [:k :a] nil
|
79 |
| - o 'a ::s/invalid (ne '{[:s] {:pred string?, :val a :via []}, [:k] {:pred keyword?, :val a :via []}}) |
| 80 | + o 'a ::s/invalid '[{:pred string?, :val a, :path [:s]} {:pred keyword?, :val a :path [:k]}] |
80 | 81 |
|
81 |
| - c nil ::s/invalid (ne '{[:a] {:reason "Insufficient input", :pred string?, :val (), :via []}}) |
82 |
| - c [] ::s/invalid (ne '{[:a] {:reason "Insufficient input", :pred string?, :val (), :via []}}) |
83 |
| - c [:a] ::s/invalid (ne '{[:a] {:pred string?, :val :a, :via []}}) |
84 |
| - c ["a"] ::s/invalid (ne '{[:b] {:reason "Insufficient input", :pred keyword?, :val (), :via []}}) |
| 82 | + c nil ::s/invalid '[{:reason "Insufficient input", :pred string?, :val (), :path [:a]}] |
| 83 | + c [] ::s/invalid '[{:reason "Insufficient input", :pred string?, :val (), :path [:a]}] |
| 84 | + c [:a] ::s/invalid '[{:pred string?, :val :a, :path [:a], :in [0]}] |
| 85 | + c ["a"] ::s/invalid '[{:reason "Insufficient input", :pred keyword?, :val (), :path [:b]}] |
85 | 86 | c ["s" :k] '{:a "s" :b :k} nil
|
86 |
| - c ["s" :k 5] ::s/invalid (ne '{[] {:reason "Extra input", :pred (cat :a string? :b keyword?), :val (5), :via []}}) |
| 87 | + c ["s" :k 5] ::s/invalid '[{:reason "Extra input", :pred (cat :a string? :b keyword?), :val (5)}] |
87 | 88 | (s/cat) nil {} nil
|
88 |
| - (s/cat) [5] ::s/invalid (ne '{[] {:reason "Extra input", :pred (cat), :val (5), :via [], :in [0]}}) |
| 89 | + (s/cat) [5] ::s/invalid '[{:reason "Extra input", :pred (cat), :val (5), :in [0]}] |
89 | 90 |
|
90 |
| - either nil ::s/invalid (ne '{[] {:reason "Insufficient input", :pred (alt :a string? :b keyword?), :val () :via []}}) |
91 |
| - either [] ::s/invalid (ne '{[] {:reason "Insufficient input", :pred (alt :a string? :b keyword?), :val () :via []}}) |
| 91 | + either nil ::s/invalid '[{:reason "Insufficient input", :pred (alt :a string? :b keyword?), :val () :via []}] |
| 92 | + either [] ::s/invalid '[{:reason "Insufficient input", :pred (alt :a string? :b keyword?), :val () :via []}] |
92 | 93 | either [:k] [:b :k] nil
|
93 | 94 | either ["s"] [:a "s"] nil
|
94 |
| - either [:b "s"] ::s/invalid (ne '{[] {:reason "Extra input", :pred (alt :a string? :b keyword?), :val ("s") :via []}}) |
| 95 | + either [:b "s"] ::s/invalid '[{:reason "Extra input", :pred (alt :a string? :b keyword?), :val ("s") :via []}] |
95 | 96 |
|
96 | 97 | star nil [] nil
|
97 | 98 | star [] [] nil
|
98 | 99 | star [:k] [:k] nil
|
99 | 100 | star [:k1 :k2] [:k1 :k2] nil
|
100 |
| - star [:k1 :k2 "x"] ::s/invalid (ne '{[] {:pred keyword?, :val "x" :via []}}) |
101 |
| - star ["a"] ::s/invalid (ne {[] '{:pred keyword?, :val "a" :via []}}) |
| 101 | + star [:k1 :k2 "x"] ::s/invalid '[{:pred keyword?, :val "x" :via []}] |
| 102 | + star ["a"] ::s/invalid '[{:pred keyword?, :val "a" :via []}] |
102 | 103 |
|
103 |
| - plus nil ::s/invalid (ne '{[] {:reason "Insufficient input", :pred keyword?, :val () :via []}}) |
104 |
| - plus [] ::s/invalid (ne '{[] {:reason "Insufficient input", :pred keyword?, :val () :via []}}) |
| 104 | + plus nil ::s/invalid '[{:reason "Insufficient input", :pred keyword?, :val () :via []}] |
| 105 | + plus [] ::s/invalid '[{:reason "Insufficient input", :pred keyword?, :val () :via []}] |
105 | 106 | plus [:k] [:k] nil
|
106 | 107 | plus [:k1 :k2] [:k1 :k2] nil
|
107 |
| - plus [:k1 :k2 "x"] ::s/invalid (ne '{[] {:pred keyword?, :val "x", :via [], :in [2]}}) |
108 |
| - plus ["a"] ::s/invalid (ne '{[] {:pred keyword?, :val "a" :via []}}) |
| 108 | + plus [:k1 :k2 "x"] ::s/invalid '[{:pred keyword?, :val "x", :in [2]}] |
| 109 | + plus ["a"] ::s/invalid '[{:pred keyword?, :val "a" :via []}] |
109 | 110 |
|
110 | 111 | opt nil nil nil
|
111 | 112 | opt [] nil nil
|
112 |
| - opt :k ::s/invalid (ne '{[] {:pred (? keyword?), :val :k, :via []}}) |
| 113 | + opt :k ::s/invalid '[{:pred (? keyword?), :val :k}] |
113 | 114 | opt [:k] :k nil
|
114 |
| - opt [:k1 :k2] ::s/invalid (ne '{[] {:reason "Extra input", :pred (? keyword?), :val (:k2), :via []}}) |
115 |
| - opt [:k1 :k2 "x"] ::s/invalid (ne '{[] {:reason "Extra input", :pred (? keyword?), :val (:k2 "x"), :via []}}) |
116 |
| - opt ["a"] ::s/invalid (ne '{[] {:pred keyword?, :val "a", :via []}}) |
| 115 | + opt [:k1 :k2] ::s/invalid '[{:reason "Extra input", :pred (? keyword?), :val (:k2)}] |
| 116 | + opt [:k1 :k2 "x"] ::s/invalid '[{:reason "Extra input", :pred (? keyword?), :val (:k2 "x")}] |
| 117 | + opt ["a"] ::s/invalid '[{:pred keyword?, :val "a"}] |
117 | 118 |
|
118 | 119 | andre nil nil nil
|
119 | 120 | andre [] nil nil
|
120 |
| - andre :k :clojure.spec/invalid (ne '{[] {:pred (& (* keyword?) even-count?), :val :k, :via []}}) |
121 |
| - andre [:k] ::s/invalid (ne '{[] {:pred even-count?, :val [:k], :via []}}) |
| 121 | + andre :k :clojure.spec/invalid '[{:pred (& (* keyword?) even-count?), :val :k}] |
| 122 | + andre [:k] ::s/invalid '[{:pred even-count?, :val [:k]}] |
122 | 123 | andre [:j :k] [:j :k] nil
|
123 | 124 |
|
124 |
| - m nil ::s/invalid (ne '{[] {:pred map?, :val nil, :via []}}) |
| 125 | + m nil ::s/invalid '[{:pred clojure.core/map?, :val nil}] |
125 | 126 | m {} {} nil
|
126 | 127 | m {:a "b"} {:a "b"} nil
|
127 | 128 |
|
| 129 | + mkeys nil ::s/invalid '[{:pred clojure.core/map?, :val nil}] |
| 130 | + mkeys {} {} nil |
| 131 | + mkeys {:a 1 :b 2} {:a 1 :b 2} nil |
| 132 | + |
| 133 | + mkeys2 nil ::s/invalid '[{:pred clojure.core/map?, :val nil}] |
| 134 | + mkeys2 {} {} nil |
| 135 | + mkeys2 {:a 1 :b 2} {"a" 1 "b" 2} nil |
| 136 | + |
| 137 | + s '([:a 1] [:b "2"]) '({:tag :a :val 1} {:tag :b :val "2"}) nil |
| 138 | + |
| 139 | + v [:a :b] [:a :b] nil |
| 140 | + v '(:a :b) ::s/invalid '[{:pred clojure.core/vector? :val (:a :b)}] |
| 141 | + |
128 | 142 | coll nil nil nil
|
129 | 143 | coll [] [] nil
|
130 | 144 | coll [:a] [:a] nil
|
131 | 145 | coll [:a :b] [:a :b] nil
|
132 |
| - ;;coll [:a "b"] ::s/invalid '{[] {:pred (coll-checker keyword?), :val [:a b], :via []}} |
| 146 | + ;;coll [:a "b"] ::s/invalid '[{:pred (coll-checker keyword?), :val [:a b]}] |
133 | 147 | )))
|
134 | 148 |
|
135 | 149 | (comment
|
|
0 commit comments