1
+ (ns self-host.test
2
+ (:require [cljs.test :as test
3
+ :refer-macros [run-tests deftest testing is async]]
4
+ [cljs.js :as cljs]
5
+ [cljs.nodejs :as nodejs]))
6
+
7
+ (set! (.-user js/cljs) #js {})
8
+
9
+ (nodejs/enable-util-print! )
10
+
11
+ (defn latch [m f]
12
+ (let [r (atom 0 )]
13
+ (add-watch r :latch
14
+ (fn [_ _ o n]
15
+ (when (== n m) (f ))))
16
+ r))
17
+
18
+ (defn inc! [r]
19
+ (swap! r inc))
20
+
21
+ (def vm (js/require " vm" ))
22
+ (def fs (js/require " fs" ))
23
+ (def st (cljs/empty-state ))
24
+
25
+ (defn node-eval [{:keys [name source]}]
26
+ (if-not js/COMPILED
27
+ (.runInThisContext vm source (str (munge name) " .js" ))
28
+ (js/eval source)))
29
+
30
+ (def libs
31
+ {'bootstrap-test.core :cljs
32
+ 'bootstrap-test.macros :clj
33
+ 'bootstrap-test.helper :clj })
34
+
35
+ (defn node-load [{:keys [name macros]} cb]
36
+ (if (contains? libs name)
37
+ (let [path (str " src/test/self/" (cljs/ns->relpath name)
38
+ " ." (cljs.core/name (get libs name)))]
39
+ (.readFile fs path " utf-8"
40
+ (fn [err src]
41
+ (cb (if-not err
42
+ {:lang :clj :source src}
43
+ (.error js/console err))))))
44
+ (cb nil )))
45
+
46
+ (defn elide-env [env ast opts]
47
+ (dissoc ast :env ))
48
+
49
+ ; ; NOTE: can't set passes because callbacks happen _inside_ binding
50
+ ; ; do so will effect other tests
51
+
52
+ (deftest test-analyze-str
53
+ (async done
54
+ (let [l (latch 1 done)]
55
+ (cljs/analyze-str st " (+ 1 1)" nil
56
+ {:context :expr }
57
+ (fn [{:keys [error value]}]
58
+ (is (nil? error))
59
+ (is (= :js (:op value)))
60
+ (inc! l))))))
61
+
62
+ (deftest test-compile-str
63
+ (async done
64
+ (let [l (latch 3 done)]
65
+ (cljs/compile-str st " (+ 1 1)"
66
+ (fn [{:keys [error value]}]
67
+ (is (nil? error))
68
+ (is (= value " (1 + 1);\n " ))
69
+ (inc! l)))
70
+ (cljs/compile-str st " (fn [])" nil
71
+ {:context :expr }
72
+ (fn [{:keys [error value]}]
73
+ (is (nil? error))
74
+ (is (= value " (function (){\n return null;\n })" ))
75
+ (inc! l)))
76
+ (cljs/compile-str st " (if cljs.core.first 1 2)" nil
77
+ {:context :expr }
78
+ (fn [{:keys [error value]}]
79
+ (is (nil? error))
80
+ (is (= value " (cljs.core.truth_(cljs.core.first)?1:2)" ))
81
+ (inc! l))))))
82
+
83
+ (deftest test-eval-str
84
+ (async done
85
+ (let [l (latch 5 done)]
86
+ (cljs/eval-str st " (+ 1 1)" nil
87
+ {:eval node-eval}
88
+ (fn [{:keys [error value]}]
89
+ (is (nil? error))
90
+ (is (== value 2 ))
91
+ (inc! l)))
92
+ (cljs/eval-str st " (def x 1)" nil
93
+ {:eval node-eval
94
+ :context :expr
95
+ :def-emits-var true }
96
+ (fn [{:keys [error value]}]
97
+ (is (nil? error))
98
+ (is (var? value))
99
+ (inc! l)))
100
+ (cljs/eval-str st " (fn [])" nil
101
+ {:eval node-eval
102
+ :context :expr
103
+ :def-emits-var true }
104
+ (fn [{:keys [error value]}]
105
+ (is (nil? error))
106
+ (is (fn? value))
107
+ (inc! l)))
108
+ (cljs/eval-str st " ((fn [a b] (+ a b)) 1 2)" nil
109
+ {:eval node-eval
110
+ :context :expr
111
+ :def-emits-var true }
112
+ (fn [{:keys [error value]}]
113
+ (is (nil? error))
114
+ (is (== 3 ))
115
+ (inc! l)))
116
+ #_(cljs/eval-str st " (ns foo.bar)" nil
117
+ {:eval node-eval
118
+ :context :expr
119
+ :def-emits-var true }
120
+ (fn [{:keys [error value]}]
121
+ (is (nil? error))
122
+ (is (not (nil? js/foo.bar)))
123
+ (inc! l)))
124
+ (cljs/eval-str st " (defn foo [a b] (+ a b))" nil
125
+ {:eval node-eval
126
+ :context :expr
127
+ :def-emits-var true }
128
+ (fn [{:keys [error value]}]
129
+ (is (nil? error))
130
+ (is (== (js/cljs.user.foo 1 2 ) 3 ))
131
+ (inc! l))))))
132
+
133
+ #_(deftest test-eval-str-with-require
134
+ (async done
135
+ (let [l (latch 3 done)]
136
+ (cljs/eval-str st
137
+ " (ns foo.bar (:require [bootstrap-test.core]))\n (bootstrap-test.core/foo 3 4)"
138
+ nil
139
+ {:eval node-eval
140
+ :load node-load}
141
+ (fn [{:keys [value error]}]
142
+ (is (nil? error))
143
+ (is (== 7 value))
144
+ (inc! l)))
145
+ (cljs/eval-str st
146
+ " (ns foo.bar (:require-macros [bootstrap-test.macros :refer [foo]]))\n (foo 4 4)"
147
+ nil
148
+ {:eval node-eval
149
+ :load node-load}
150
+ (fn [{:keys [error value]}]
151
+ (is (nil? error))
152
+ (is (== 16 value))
153
+ (inc! l)))
154
+ (cljs/eval-str st
155
+ " (ns foo.bar)\n (first [1 2 3])"
156
+ nil
157
+ {:eval node-eval
158
+ :load node-load}
159
+ (fn [{:keys [error value]}]
160
+ (is (nil? error))
161
+ (is (== 1 value))
162
+ (inc! l))))))
163
+
164
+ (defn -main [& args]
165
+ (run-tests ))
166
+
167
+ (set! *main-cli-fn* -main)
168
+
169
+ (comment
170
+ )
0 commit comments