-
Notifications
You must be signed in to change notification settings - Fork 4
/
script.cljc
82 lines (68 loc) · 2.29 KB
/
script.cljc
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
(ns darkleaf.effect.script
(:refer-clojure :exclude [test])
(:require
[clojure.test :as t]))
(defn- test-first-item [{:keys [report continuation]} {:keys [args]}]
(let [[effect continuation] (continuation args)]
{:report report
:actual-effect effect
:continuation continuation}))
(defn- test-middle-item [{:keys [report actual-effect continuation]} {:keys [effect coeffect]}]
(cond
(not= :pass (:type report))
{:report report}
(nil? continuation)
{:report {:type :fail
:expected effect
:actual nil
:message "Misssed effect"}}
(not= effect actual-effect)
{:report {:type :fail
:expected effect
:actual actual-effect
:message "Wrong effect"}}
:else
(let [[actual-effect continuation] (continuation coeffect)]
{:report report
:actual-effect actual-effect
:continuation continuation})))
(defn- test-middle-items [ctx items]
(reduce test-middle-item ctx items))
(defn- test-last-item [{:keys [report actual-effect continuation]}
{:keys [return final-effect]}]
(cond
(not= :pass (:type report))
{:report report}
(and (some? final-effect)
(= final-effect actual-effect))
{:report report}
(some? final-effect)
{:report {:type :fail
:expected final-effect
:actual actual-effect
:message "Wrong final effect"}}
(some? continuation)
{:report {:type :fail
:expected nil
:actual actual-effect
:message "Extra effect"}}
(not= return actual-effect)
{:report {:type :fail
:expected return
:actual actual-effect
:message "Wrong return"}}
:else
{:report report}))
(defn test* [continuation script]
{:pre [(<= 2 (count script))]}
(let [first-item (first script)
middle-items (-> script rest butlast)
last-item (last script)]
(-> {:continuation continuation, :report {:type :pass}}
(test-first-item first-item)
(test-middle-items middle-items)
(test-last-item last-item)
:report)))
(defn test [continuation script]
(-> (test* continuation script)
(t/do-report)))