-
-
Notifications
You must be signed in to change notification settings - Fork 2
/
spec.clj
61 lines (52 loc) · 1.82 KB
/
spec.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
(ns iced.nrepl.spec)
(defn- try-requires
[& syms]
(try
(doseq [sym syms]
(require sym))
(catch Exception _ nil)))
(try-requires 'clojure.spec.test.alpha
'clojure.spec.test
'clojure.test.check.generators)
(defn- convert-failed-input
[failed-input]
;; NOTE: failed-input
;; [[arg1-1, arg1-2], [arg2-1, arg2-2], ...]
(mapv #(mapv pr-str %) failed-input))
(defmacro stest
[fname & args]
`(when-let [f# (or (resolve (symbol "clojure.spec.test.alpha" ~fname))
(resolve (symbol "clojure.spec.test" ~fname)))]
(f# ~@args)))
(defn check
[sym num-tests]
(when-let [test-results (stest "check" sym {:clojure.spec.test.check/opts {:num-tests num-tests}})]
(let [ret (-> test-results first :clojure.spec.test.check/ret)
{:keys [result num-tests fail]} ret]
(cond
(empty? test-results)
{:result "OK" :num-tests 0}
(true? result)
{:result "OK" :num-tests num-tests}
(instance? Exception result)
{:result "NG"
:num-tests num-tests
:error (.getMessage ^Exception result)
:failed-input (convert-failed-input fail)}
:else
{:result "NG"
:num-tests num-tests
:failed-input (convert-failed-input fail)}))))
(defn ^{:doc "Returns the checking spec result."
:requires {"symbol" "Symbol to check spec."
"num-tests" "Expected number of tests."}
:optional {}
:returns {"result" "'OK' or 'NG'."
"num-tests" "Actual number of tests."
"error" "Error message if occurred"
"failed-input" "The input when error occurred"
"status" "done"}}
iced-spec-check
[msg]
(let [{sym :symbol num-tests :num-tests} msg]
(check (symbol sym) num-tests)))