]> code.delx.au - gnu-emacs-elpa/blob - test/context-coloring-test.el
Merge branch 'develop'
[gnu-emacs-elpa] / test / context-coloring-test.el
1 ;; -*- lexical-binding: t; -*-
2
3 (defconst context-coloring-test-path
4 (file-name-directory (or load-file-name buffer-file-name)))
5
6 (defun context-coloring-test-resolve-path (path)
7 (expand-file-name path context-coloring-test-path))
8
9 (defun get-string-from-file (path)
10 (with-temp-buffer
11 (insert-file-contents path)
12 (buffer-string)))
13
14 (defun context-coloring-test-read-file (path)
15 (get-string-from-file (context-coloring-test-resolve-path path)))
16
17 (defun context-coloring-test-cleanup ()
18 (setq context-coloring-after-colorize-hook nil)
19 (setq context-coloring-js-block-scopes nil))
20
21 (defmacro context-coloring-test-with-fixture (fixture &rest body)
22 "Evaluate BODY in a temporary buffer with the relative
23 FIXTURE."
24 `(with-temp-buffer
25 (unwind-protect
26 (progn
27 (insert (context-coloring-test-read-file ,fixture))
28 ,@body)
29 (context-coloring-test-cleanup))))
30
31 (defun context-coloring-test-with-temp-buffer-async (callback)
32 "Create a temporary buffer, and evaluate CALLBACK there. A
33 teardown callback is passed to CALLBACK for it to invoke when it
34 is done."
35 (let ((temp-buffer (make-symbol "temp-buffer")))
36 (let ((previous-buffer (current-buffer))
37 (temp-buffer (generate-new-buffer " *temp*")))
38 (set-buffer temp-buffer)
39 (funcall
40 callback
41 (lambda ()
42 (and (buffer-name temp-buffer)
43 (kill-buffer temp-buffer))
44 (set-buffer previous-buffer))))))
45
46 (defun context-coloring-test-with-fixture-async (fixture callback)
47 "Evaluate CALLBACK in a temporary buffer with the relative
48 FIXTURE. A teardown callback is passed to CALLBACK for it to
49 invoke when it is done."
50 (context-coloring-test-with-temp-buffer-async
51 (lambda (done-with-temp-buffer)
52 (insert (context-coloring-test-read-file fixture))
53 (funcall
54 callback
55 (lambda ()
56 (context-coloring-test-cleanup)
57 (funcall done-with-temp-buffer))))))
58
59 (defun context-coloring-test-js-mode (fixture callback)
60 (context-coloring-test-with-fixture-async
61 fixture
62 (lambda (done-with-test)
63 (js-mode)
64 (context-coloring-mode)
65 (context-coloring-colorize
66 (lambda ()
67 (funcall callback done-with-test))))))
68
69 (defmacro context-coloring-test-js2-mode (fixture &rest body)
70 `(context-coloring-test-with-fixture
71 ,fixture
72 (require 'js2-mode)
73 (setq js2-mode-show-parse-errors nil)
74 (setq js2-mode-show-strict-warnings nil)
75 (js2-mode)
76 (context-coloring-mode)
77 ,@body))
78
79 (defconst context-coloring-test-level-regexp
80 "context-coloring-level-\\([[:digit:]]+\\)-face")
81
82 (defun context-coloring-test-assert-region-level (start end level)
83 (let ((i 0)
84 (length (- end start)))
85 (while (< i length)
86 (let* ((point (+ i start))
87 (face (get-text-property point 'face))
88 actual-level)
89 (when (not (when face
90 (let* ((face-string (symbol-name face))
91 (matches (string-match context-coloring-test-level-regexp face-string)))
92 (when matches
93 (setq actual-level (string-to-number (substring face-string
94 (match-beginning 1)
95 (match-end 1))))
96 (= level actual-level)))))
97 (ert-fail (format "Expected level in region [%s, %s), which is \"%s\", to be %s; but at point %s, it was %s"
98 start end (buffer-substring-no-properties start end) level point actual-level))))
99 (setq i (+ i 1)))))
100
101 (defun context-coloring-test-assert-message (expected)
102 (with-current-buffer "*Messages*"
103 (let ((messages (split-string (buffer-substring-no-properties (point-min) (point-max)) "\n")))
104 (let ((message (car (nthcdr (- (length messages) 2) messages))))
105 (should (equal message expected))))))
106
107 (ert-deftest context-coloring-test-unsupported-mode ()
108 (context-coloring-test-with-fixture
109 "./fixtures/function-scopes.js"
110 (context-coloring-mode)
111 (context-coloring-test-assert-message
112 "Context coloring is not available for this major mode")))
113
114 (defun context-coloring-test-js-function-scopes ()
115 (context-coloring-test-assert-region-level 1 9 0)
116 (context-coloring-test-assert-region-level 9 23 1)
117 (context-coloring-test-assert-region-level 23 25 0)
118 (context-coloring-test-assert-region-level 25 34 1)
119 (context-coloring-test-assert-region-level 34 35 0)
120 (context-coloring-test-assert-region-level 35 52 1)
121 (context-coloring-test-assert-region-level 52 66 2)
122 (context-coloring-test-assert-region-level 66 72 1)
123 (context-coloring-test-assert-region-level 72 81 2)
124 (context-coloring-test-assert-region-level 81 82 1)
125 (context-coloring-test-assert-region-level 82 87 2)
126 (context-coloring-test-assert-region-level 87 89 1))
127
128 (ert-deftest-async context-coloring-test-js-mode-function-scopes (done)
129 (context-coloring-test-js-mode
130 "./fixtures/function-scopes.js"
131 (lambda (teardown)
132 (unwind-protect
133 (context-coloring-test-js-function-scopes)
134 (funcall teardown))
135 (funcall done))))
136
137 (ert-deftest context-coloring-test-js2-mode-function-scopes ()
138 (context-coloring-test-js2-mode
139 "./fixtures/function-scopes.js"
140 (context-coloring-test-js-function-scopes)))
141
142 (defun context-coloring-test-js-global ()
143 (context-coloring-test-assert-region-level 20 28 1)
144 (context-coloring-test-assert-region-level 28 35 0)
145 (context-coloring-test-assert-region-level 35 41 1))
146
147 (ert-deftest-async context-coloring-test-js-mode-global (done)
148 (context-coloring-test-js-mode
149 "./fixtures/global.js"
150 (lambda (teardown)
151 (unwind-protect
152 (context-coloring-test-js-global)
153 (funcall teardown))
154 (funcall done))))
155
156 (ert-deftest context-coloring-test-js2-mode-global ()
157 (context-coloring-test-js2-mode
158 "./fixtures/global.js"
159 (context-coloring-test-js-global)))
160
161 (defun context-coloring-test-js-block-scopes ()
162 (context-coloring-test-assert-region-level 20 64 1)
163 (setq context-coloring-js-block-scopes t)
164 (context-coloring-colorize)
165 (context-coloring-test-assert-region-level 20 27 1)
166 (context-coloring-test-assert-region-level 27 41 2)
167 (context-coloring-test-assert-region-level 41 42 1)
168 (context-coloring-test-assert-region-level 42 64 2))
169
170 (ert-deftest context-coloring-test-js2-mode-block-scopes ()
171 (context-coloring-test-js2-mode
172 "./fixtures/block-scopes.js"
173 (context-coloring-test-js-block-scopes)))
174
175 (defun context-coloring-test-js-catch ()
176 (context-coloring-test-assert-region-level 20 27 1)
177 (context-coloring-test-assert-region-level 27 51 2)
178 (context-coloring-test-assert-region-level 51 52 1)
179 (context-coloring-test-assert-region-level 52 73 2)
180 (context-coloring-test-assert-region-level 73 101 3)
181 (context-coloring-test-assert-region-level 101 102 1)
182 (context-coloring-test-assert-region-level 102 117 3)
183 (context-coloring-test-assert-region-level 117 123 2))
184
185 (ert-deftest-async context-coloring-test-js-mode-catch (done)
186 (context-coloring-test-js-mode
187 "./fixtures/catch.js"
188 (lambda (teardown)
189 (unwind-protect
190 (context-coloring-test-js-catch)
191 (funcall teardown))
192 (funcall done))))
193
194 (ert-deftest context-coloring-test-js2-mode-catch ()
195 (context-coloring-test-js2-mode
196 "./fixtures/catch.js"
197 (context-coloring-test-js-catch)))
198
199 (defun context-coloring-test-js-key-names ()
200 (context-coloring-test-assert-region-level 20 63 1))
201
202 (ert-deftest-async context-coloring-test-js-mode-key-names (done)
203 (context-coloring-test-js-mode
204 "./fixtures/key-names.js"
205 (lambda (teardown)
206 (unwind-protect
207 (context-coloring-test-js-key-names)
208 (funcall teardown))
209 (funcall done))))
210
211 (ert-deftest context-coloring-test-js2-mode-key-names ()
212 (context-coloring-test-js2-mode
213 "./fixtures/key-names.js"
214 (context-coloring-test-js-key-names)))
215
216 (defun context-coloring-test-js-property-lookup ()
217 (context-coloring-test-assert-region-level 20 26 0)
218 (context-coloring-test-assert-region-level 26 38 1)
219 (context-coloring-test-assert-region-level 38 44 0)
220 (context-coloring-test-assert-region-level 44 52 1)
221 (context-coloring-test-assert-region-level 57 63 0)
222 (context-coloring-test-assert-region-level 63 74 1))
223
224 (ert-deftest-async context-coloring-test-js-mode-property-lookup (done)
225 (context-coloring-test-js-mode
226 "./fixtures/property-lookup.js"
227 (lambda (teardown)
228 (unwind-protect
229 (context-coloring-test-js-property-lookup)
230 (funcall teardown))
231 (funcall done))))
232
233 (ert-deftest context-coloring-test-js2-mode-property-lookup ()
234 (context-coloring-test-js2-mode
235 "./fixtures/property-lookup.js"
236 (context-coloring-test-js-property-lookup)))
237
238 (provide 'context-coloring-test)