Fixed bug where (setf x (- x 1 2)) yielded x -= 1 - 2.
[clinton/parenscript.git] / t / reference-tests.lisp
1 (in-package :ps-test)
2 ;; Tests of everything in the reference.
3 ;; File is generated automatically from the text in reference.lisp by
4 ;; the function make-reference-tests-dot-lisp in ref2test.lisp
5 ;; so do not edit this file.
6 (eval-when (:compile-toplevel :load-toplevel :execute)
7 (def-suite ref-tests))
8 (in-suite ref-tests)
9
10 (test-ps-js statements-and-expressions-1
11 (+ i (if 1 2 3))
12 "i + (1 ? 2 : 3)")
13
14 (test-ps-js statements-and-expressions-2
15 (if 1 2 3)
16 "if (1) {
17 2;
18 } else {
19 3;
20 }")
21
22 (test-ps-js symbol-conversion-1
23 !?#@%
24 "bangwhathashatpercent")
25
26 (test-ps-js symbol-conversion-2
27 bla-foo-bar
28 "blaFooBar")
29
30 (test-ps-js symbol-conversion-3
31 *array
32 "Array")
33
34 (test-ps-js symbol-conversion-6
35 *global-array*
36 "GLOBALARRAY")
37
38 (test-ps-js symbol-conversion-7
39 *global-array*.length
40 "GLOBALARRAY.length")
41
42 (test-ps-js number-literals-1
43 1
44 "1")
45
46 (test-ps-js number-literals-2
47 123.123
48 "123.123")
49
50 (test-ps-js number-literals-3
51 #x10
52 "16")
53
54 (test-ps-js string-literals-1
55 "foobar"
56 "'foobar'")
57
58 (test-ps-js string-literals-2
59 "bratzel bub"
60 "'bratzel bub'")
61
62 (test-ps-js array-literals-1
63 (array)
64 "[ ]")
65
66 (test-ps-js array-literals-2
67 (array 1 2 3)
68 "[ 1, 2, 3 ]")
69
70 (test-ps-js array-literals-3
71 (array (array 2 3)
72 (array "foobar" "bratzel bub"))
73 "[ [ 2, 3 ], [ 'foobar', 'bratzel bub' ] ]")
74
75 (test-ps-js array-literals-4
76 (make-array)
77 "new Array()")
78
79 (test-ps-js array-literals-5
80 (make-array 1 2 3)
81 "new Array(1, 2, 3)")
82
83 (test-ps-js array-literals-6
84 (make-array
85 (make-array 2 3)
86 (make-array "foobar" "bratzel bub"))
87 "new Array(new Array(2, 3), new Array('foobar', 'bratzel bub'))")
88
89 (test-ps-js object-literals-1
90 (create :foo "bar" :blorg 1)
91 "{ foo : 'bar',
92 blorg : 1 }")
93
94 (test-ps-js object-literals-2
95 (create :foo "hihi"
96 :blorg (array 1 2 3)
97 :another-object (create :schtrunz 1))
98 "{ foo : 'hihi',
99 blorg : [ 1, 2, 3 ],
100 anotherObject : { schtrunz : 1 } }")
101
102 (test-ps-js object-literals-3
103 (slot-value an-object 'foo)
104 "anObject.foo")
105
106 (test-ps-js object-literals-4
107 an-object.foo
108 "anObject.foo")
109
110 (test-ps-js object-literals-5
111 (with-slots (a b c) this
112 (+ a b c))
113 "this.a + this.b + this.c;")
114
115 (test-ps-js regular-expression-literals-1
116 (regex "foobar")
117 "/foobar/")
118
119 (test-ps-js regular-expression-literals-2
120 (regex "/foobar/i")
121 "/foobar/i")
122
123 (test-ps-js literal-symbols-1
124 T
125 "true")
126
127 (test-ps-js literal-symbols-2
128 FALSE
129 "false")
130
131 (test-ps-js literal-symbols-3
132 NIL
133 "null")
134
135 (test-ps-js literal-symbols-4
136 UNDEFINED
137 "undefined")
138
139 (test-ps-js literal-symbols-5
140 THIS
141 "this")
142
143 (test-ps-js variables-1
144 variable
145 "variable")
146
147 (test-ps-js variables-2
148 a-variable
149 "aVariable")
150
151 (test-ps-js variables-3
152 *math
153 "Math")
154
155 (test-ps-js variables-4
156 *math.floor
157 "Math.floor")
158
159 (test-ps-js function-calls-and-method-calls-1
160 (blorg 1 2)
161 "blorg(1, 2)")
162
163 (test-ps-js function-calls-and-method-calls-2
164 (foobar (blorg 1 2) (blabla 3 4) (array 2 3 4))
165 "foobar(blorg(1, 2), blabla(3, 4), [ 2, 3, 4 ])")
166
167 (test-ps-js function-calls-and-method-calls-3
168 ((aref foo i) 1 2)
169 "foo[i](1, 2)")
170
171 (test-ps-js function-calls-and-method-calls-4
172 (.blorg this 1 2)
173 "this.blorg(1, 2)")
174
175 (test-ps-js function-calls-and-method-calls-5
176 (this.blorg 1 2)
177 "this.blorg(1, 2)")
178
179 (test-ps-js function-calls-and-method-calls-6
180 (.blorg (aref foobar 1) NIL T)
181 "foobar[1].blorg(null, true)")
182
183 (test-ps-js operator-expressions-1
184 (* 1 2)
185 "1 * 2")
186
187 (test-ps-js operator-expressions-2
188 (= 1 2)
189 "1 == 2")
190
191 (test-ps-js operator-expressions-3
192 (eql 1 2)
193 "1 == 2")
194
195 (test-ps-js operator-expressions-5
196 (* 1 (+ 2 3 4) 4 (/ 6 7))
197 "1 * (2 + 3 + 4) * 4 * (6 / 7)")
198
199 (test-ps-js operator-expressions-6
200 (incf i)
201 "++i")
202
203 (test-ps-js operator-expressions-7
204 (decf i)
205 "--i")
206
207 (test-ps-js operator-expressions-8
208 (1- i)
209 "i - 1")
210
211 (test-ps-js operator-expressions-9
212 (1+ i)
213 "i + 1")
214
215 (test-ps-js operator-expressions-10
216 (not (< i 2))
217 "i >= 2")
218
219 (test-ps-js operator-expressions-11
220 (not (eql i 2))
221 "i != 2")
222
223 (test-ps-js body-forms-1
224 (progn (blorg i) (blafoo i))
225 "blorg(i);
226 blafoo(i);")
227
228 (test-ps-js body-forms-2
229 (+ i (progn (blorg i) (blafoo i)))
230 "i + (blorg(i), blafoo(i))")
231
232 (test-ps-js function-definition-1
233 (defun a-function (a b)
234 (return (+ a b)))
235 "function aFunction(a, b) {
236 return a + b;
237 }")
238
239 (test-ps-js function-definition-2
240 (lambda (a b) (return (+ a b)))
241 "function (a, b) {
242 return a + b;
243 }")
244
245 (test-ps-js assignment-1
246 (setf a 1)
247 "a = 1;")
248
249 (test-ps-js assignment-2
250 (setf a 2 b 3 c 4 x (+ a b c))
251 "a = 2;
252 b = 3;
253 c = 4;
254 x = a + b + c;")
255
256 (test-ps-js assignment-3
257 (setf a (+ a 2 3 4 a))
258 "a += 2 + 3 + 4 + a;")
259
260 (test-ps-js assignment-4
261 (setf a (- 1 a))
262 "a = 1 - a;")
263
264 (test-ps-js assignment-5
265 (defun (setf color) (new-color el)
266 (setf (slot-value (slot-value el 'style) 'color) new-color))
267 "function __setf_color(newColor, el) {
268 el.style.color = newColor;
269 };")
270
271 (test-ps-js assignment-6
272 (setf (color some-div) (+ 23 "em"))
273 "var _js2 = someDiv;
274 var _js1 = 23 + 'em';
275 __setf_color(_js1, _js2);")
276
277 (test-ps-js assignment-7
278 (defsetf left (el) (offset)
279 `(setf (slot-value (slot-value ,el 'style) 'left) ,offset))
280 "null")
281
282 (test-ps-js assignment-8
283 (setf (left some-div) (+ 123 "px"))
284 "var _js2 = someDiv;
285 var _js1 = 123 + 'px';
286 _js2.style.left = _js1;")
287
288 (test-ps-js assignment-9
289 (progn (defmacro left (el)
290 `(slot-value ,el 'offset-left))
291 (left some-div))
292 "someDiv.offsetLeft;")
293
294 (test-ps-js single-argument-statements-1
295 (return 1)
296 "return 1")
297
298 (test-ps-js single-argument-statements-2
299 (throw "foobar")
300 "throw 'foobar'")
301
302 (test-ps-js single-argument-expression-1
303 (delete (new (*foobar 2 3 4)))
304 "delete new Foobar(2, 3, 4)")
305
306 (test-ps-js single-argument-expression-2
307 (if (= (typeof blorg) *string)
308 (alert (+ "blorg is a string: " blorg))
309 (alert "blorg is not a string"))
310 "if (typeof blorg == String) {
311 alert('blorg is a string: ' + blorg);
312 } else {
313 alert('blorg is not a string');
314 }")
315
316 (test-ps-js conditional-statements-1
317 (if (blorg.is-correct)
318 (progn (carry-on) (return i))
319 (alert "blorg is not correct!"))
320 "if (blorg.isCorrect()) {
321 carryOn();
322 return i;
323 } else {
324 alert('blorg is not correct!');
325 }")
326
327 (test-ps-js conditional-statements-2
328 (+ i (if (blorg.add-one) 1 2))
329 "i + (blorg.addOne() ? 1 : 2)")
330
331 (test-ps-js conditional-statements-3
332 (when (blorg.is-correct)
333 (carry-on)
334 (return i))
335 "if (blorg.isCorrect()) {
336 carryOn();
337 return i;
338 }")
339
340 (test-ps-js conditional-statements-4
341 (unless (blorg.is-correct)
342 (alert "blorg is not correct!"))
343 "if (!blorg.isCorrect()) {
344 alert('blorg is not correct!');
345 }")
346
347 (test-ps-js variable-declaration-1
348 (defvar *a* (array 1 2 3))
349 "var A = [ 1, 2, 3 ]")
350
351 (test-ps-js variable-declaration-2
352 (if (= i 1)
353 (let* ((blorg "hallo"))
354 (alert blorg))
355 (let* ((blorg "blitzel"))
356 (alert blorg)))
357 "if (i == 1) {
358 var blorg = 'hallo';
359 alert(blorg);
360 } else {
361 var blorg = 'blitzel';
362 alert(blorg);
363 }")
364
365 (test-ps-js variable-declaration-3
366 (if (= i 1)
367 (lexical-let* ((blorg "hallo"))
368 (alert blorg))
369 (lexical-let* ((blorg "blitzel"))
370 (alert blorg)))
371 "if (i == 1) {
372 (function () {
373 var newlexicalcontext1 = new Object;
374 newlexicalcontext1['blorg'] = 'hallo';
375 with (newlexicalcontext1) {
376 alert(blorg);
377 };
378 })();
379 } else {
380 (function () {
381 var newlexicalcontext3 = new Object;
382 newlexicalcontext3['blorg'] = 'blitzel';
383 with (newlexicalcontext3) {
384 alert(blorg);
385 };
386 })();
387 }")
388
389 (test-ps-js iteration-constructs-1
390 (do ((i 0 (1+ i))
391 (l (aref blorg i) (aref blorg i)))
392 ((or (= i blorg.length)
393 (eql l "Fumitastic")))
394 (document.write (+ "L is " l)))
395 "for (var i = 0, l = blorg[i];
396 !(i == blorg.length || l == 'Fumitastic');
397 i = i + 1, l = blorg[i]) {
398 document.write('L is ' + l);
399 }")
400
401 (test-ps-js iteration-constructs-2
402 (dotimes (i blorg.length)
403 (document.write (+ "L is " (aref blorg i))))
404 "for (var i = 0; i < blorg.length; i = i + 1) {
405 document.write('L is ' + blorg[i]);
406 }")
407
408 (test-ps-js iteration-constructs-3
409 (dolist (l blorg)
410 (document.write (+ "L is " l)))
411 " var tmpArr1 = blorg;
412 for (var tmpI2 = 0; tmpI2 < tmpArr1.length;
413 tmpI2 = tmpI2 + 1) {
414 var l = tmpArr1[tmpI2];
415 document.write('L is ' + l);
416 };")
417
418 (test-ps-js iteration-constructs-4
419 (doeach (i object)
420 (document.write (+ i " is " (aref object i))))
421 "for (var i in object) {
422 document.write(i + ' is ' + object[i]);
423 }")
424
425 (test-ps-js iteration-constructs-5
426 (while (film.is-not-finished)
427 (this.eat (new *popcorn)))
428 "while (film.isNotFinished()) {
429 this.eat(new Popcorn);
430 }")
431
432 (test-ps-js the-case-statement-1
433 (case (aref blorg i)
434 ((1 "one") (alert "one"))
435 (2 (alert "two"))
436 (t (alert "default clause")))
437 "switch (blorg[i]) {
438 case 1:
439 case 'one':
440 alert('one');
441 break;
442 case 2:
443 alert('two');
444 break;
445 default: alert('default clause');
446 }")
447
448 (test-ps-js the-case-statement-2
449 (switch (aref blorg i)
450 (1 (alert "If I get here"))
451 (2 (alert "I also get here"))
452 (default (alert "I always get here")))
453 "switch (blorg[i]) {
454 case 1: alert('If I get here');
455 case 2: alert('I also get here');
456 default: alert('I always get here');
457 }")
458
459 (test-ps-js the-with-statement-1
460 (with (create :foo "foo" :i "i")
461 (alert (+ "i is now intermediary scoped: " i)))
462 "with ({ foo : 'foo',
463 i : 'i' }) {
464 alert('i is now intermediary scoped: ' + i);
465 }")
466
467 (test-ps-js the-try-statement-1
468 (try (throw "i")
469 (:catch (error)
470 (alert (+ "an error happened: " error)))
471 (:finally
472 (alert "Leaving the try form")))
473 "try {
474 throw 'i';
475 } catch (error) {
476 alert('an error happened: ' + error);
477 } finally {
478 alert('Leaving the try form');
479 }")
480
481 (test-ps-js the-html-generator-1
482 (ps-html ((:a :href "foobar") "blorg"))
483 "'<a href=\"foobar\">blorg</a>'")
484
485 (test-ps-js the-html-generator-2
486 (ps-html ((:a :href (generate-a-link)) "blorg"))
487 "'<a href=\"' + generateALink() + '\">blorg</a>'")
488
489 (test-ps-js the-html-generator-3
490 (document.write
491 (ps-html ((:a :href "#"
492 :onclick (lisp (ps-inline (transport)))) "link")))
493 "document.write('<a href=\"#\" onclick=\"' + 'javascript:transport()' + '\">link</a>')")
494
495 (test-ps-js the-html-generator-4
496 (let* ((disabled nil)
497 (authorized t))
498 (setf element.inner-h-t-m-l
499 (ps-html ((:textarea (or disabled (not authorized)) :disabled "disabled")
500 "Edit me"))))
501 " var disabled = null;
502 var authorized = true;
503 element.innerHTML =
504 '<textarea'
505 + (disabled || !authorized ? ' disabled=\"' + 'disabled' + '\"' : '')
506 + '>Edit me</textarea>';")
507