(in-package :ps-test)
;; Tests of everything in the reference.
;; File is generated automatically from the text in reference.lisp by
;; the function make-reference-tests-dot-lisp in ref2test.lisp
;; so do not edit this file.
(eval-when (:compile-toplevel :load-toplevel :execute)
(def-suite ref-tests))
(in-suite ref-tests)
(test-ps-js statements-and-expressions-1
(+ i (if 1 2 3))
"i + (1 ? 2 : 3)")
(test-ps-js statements-and-expressions-2
(if 1 2 3)
"if (1) {
2;
} else {
3;
}")
(test-ps-js symbol-conversion-1
!?#@%
"bangwhathashatpercent")
(test-ps-js symbol-conversion-2
bla-foo-bar
"blaFooBar")
(test-ps-js symbol-conversion-3
*array
"Array")
(test-ps-js symbol-conversion-6
*global-array*
"GLOBALARRAY")
(test-ps-js symbol-conversion-7
*global-array*.length
"GLOBALARRAY.length")
(test-ps-js number-literals-1
1
"1")
(test-ps-js number-literals-2
123.123
"123.123")
(test-ps-js number-literals-3
#x10
"16")
(test-ps-js string-literals-1
"foobar"
"'foobar'")
(test-ps-js string-literals-2
"bratzel bub"
"'bratzel bub'")
(test-ps-js array-literals-1
(array)
"[ ]")
(test-ps-js array-literals-2
(array 1 2 3)
"[ 1, 2, 3 ]")
(test-ps-js array-literals-3
(array (array 2 3)
(array "foobar" "bratzel bub"))
"[ [ 2, 3 ], [ 'foobar', 'bratzel bub' ] ]")
(test-ps-js array-literals-4
(make-array)
"new Array()")
(test-ps-js array-literals-5
(make-array 1 2 3)
"new Array(1, 2, 3)")
(test-ps-js array-literals-6
(make-array
(make-array 2 3)
(make-array "foobar" "bratzel bub"))
"new Array(new Array(2, 3), new Array('foobar', 'bratzel bub'))")
(test-ps-js object-literals-1
(create :foo "bar" :blorg 1)
"{ foo : 'bar', blorg : 1 }")
(test-ps-js object-literals-2
(create :foo "hihi"
:blorg (array 1 2 3)
:another-object (create :schtrunz 1))
"{ foo : 'hihi',
blorg : [ 1, 2, 3 ],
anotherObject : { schtrunz : 1 } }")
(test-ps-js object-literals-3
(slot-value an-object 'foo)
"anObject.foo")
(test-ps-js object-literals-4
an-object.foo
"anObject.foo")
(test-ps-js object-literals-5
(with-slots (a b c) this
(+ a b c))
"this.a + this.b + this.c;")
(test-ps-js regular-expression-literals-1
(regex "foobar")
"/foobar/")
(test-ps-js regular-expression-literals-2
(regex "/foobar/i")
"/foobar/i")
(test-ps-js literal-symbols-1
T
"true")
(test-ps-js literal-symbols-2
FALSE
"false")
(test-ps-js literal-symbols-3
F
"false")
(test-ps-js literal-symbols-4
NIL
"null")
(test-ps-js literal-symbols-5
UNDEFINED
"undefined")
(test-ps-js literal-symbols-6
THIS
"this")
(test-ps-js variables-1
variable
"variable")
(test-ps-js variables-2
a-variable
"aVariable")
(test-ps-js variables-3
*math
"Math")
(test-ps-js variables-4
*math.floor
"Math.floor")
(test-ps-js function-calls-and-method-calls-1
(blorg 1 2)
"blorg(1, 2)")
(test-ps-js function-calls-and-method-calls-2
(foobar (blorg 1 2) (blabla 3 4) (array 2 3 4))
"foobar(blorg(1, 2), blabla(3, 4), [ 2, 3, 4 ])")
(test-ps-js function-calls-and-method-calls-3
((slot-value this 'blorg) 1 2)
"this.blorg(1, 2)")
(test-ps-js function-calls-and-method-calls-4
((aref foo i) 1 2)
"foo[i](1, 2)")
(test-ps-js function-calls-and-method-calls-5
((slot-value (aref foobar 1) 'blorg) NIL T)
"foobar[1].blorg(null, true)")
(test-ps-js function-calls-and-method-calls-6
(this.blorg 1 2)
"this.blorg(1, 2)")
(test-ps-js operator-expressions-1
(* 1 2)
"1 * 2")
(test-ps-js operator-expressions-2
(= 1 2)
"1 == 2")
(test-ps-js operator-expressions-3
(eql 1 2)
"1 == 2")
(test-ps-js operator-expressions-4
(* 1 (+ 2 3 4) 4 (/ 6 7))
"1 * (2 + 3 + 4) * 4 * (6 / 7)")
(test-ps-js operator-expressions-5
(incf i)
"++i")
(test-ps-js operator-expressions-6
(decf i)
"--i")
(test-ps-js operator-expressions-7
(1- i)
"i - 1")
(test-ps-js operator-expressions-8
(1+ i)
"i + 1")
(test-ps-js operator-expressions-9
(not (< i 2))
"i >= 2")
(test-ps-js operator-expressions-10
(not (eql i 2))
"i != 2")
(test-ps-js body-forms-1
(progn (blorg i) (blafoo i))
"blorg(i);
blafoo(i);")
(test-ps-js body-forms-2
(+ i (progn (blorg i) (blafoo i)))
"i + (blorg(i), blafoo(i))")
(test-ps-js function-definition-1
(defun a-function (a b)
(return (+ a b)))
"function aFunction(a, b) {
return a + b;
}")
(test-ps-js function-definition-2
(lambda (a b) (return (+ a b)))
"function (a, b) {
return a + b;
}")
(test-ps-js assignment-1
(setf a 1)
"a = 1;")
(test-ps-js assignment-2
(setf a 2 b 3 c 4 x (+ a b c))
"a = 2;
b = 3;
c = 4;
x = a + b + c;")
(test-ps-js assignment-3
(setf a (+ a 2 3 4 a))
"a += 2 + 3 + 4 + a;")
(test-ps-js assignment-4
(setf a (- 1 a))
"a = 1 - a;")
(test-ps-js assignment-5
(let* ((a 1) (b 2))
(psetf a b b a))
"var a = 1;
var b = 2;
var _js1 = b;
var _js2 = a;
a = _js1;
b = _js2;")
(test-ps-js assignment-6
(setq a 1)
"a = 1;")
(test-ps-js assignment-8
(defun (setf color) (new-color el)
(setf (slot-value (slot-value el 'style) 'color) new-color))
"function __setf_color(newColor, el) {
el.style.color = newColor;
};")
(test-ps-js assignment-9
(setf (color some-div) (+ 23 "em"))
"var _js2 = someDiv;
var _js1 = 23 + 'em';
__setf_color(_js1, _js2);")
(test-ps-js assignment-10
(defsetf left (el) (offset)
`(setf (slot-value (slot-value ,el 'style) 'left) ,offset))
"null")
(test-ps-js assignment-11
(setf (left some-div) (+ 123 "px"))
"var _js2 = someDiv;
var _js1 = 123 + 'px';
_js2.style.left = _js1;")
(test-ps-js assignment-12
(progn (defmacro left (el)
`(slot-value ,el 'offset-left))
(left some-div))
"someDiv.offsetLeft;")
(test-ps-js single-argument-statements-1
(return 1)
"return 1")
(test-ps-js single-argument-statements-2
(throw "foobar")
"throw 'foobar'")
(test-ps-js single-argument-expression-1
(delete (new (*foobar 2 3 4)))
"delete new Foobar(2, 3, 4)")
(test-ps-js single-argument-expression-2
(if (= (typeof blorg) *string)
(alert (+ "blorg is a string: " blorg))
(alert "blorg is not a string"))
"if (typeof blorg == String) {
alert('blorg is a string: ' + blorg);
} else {
alert('blorg is not a string');
}")
(test-ps-js conditional-statements-1
(if (blorg.is-correct)
(progn (carry-on) (return i))
(alert "blorg is not correct!"))
"if (blorg.isCorrect()) {
carryOn();
return i;
} else {
alert('blorg is not correct!');
}")
(test-ps-js conditional-statements-2
(+ i (if (blorg.add-one) 1 2))
"i + (blorg.addOne() ? 1 : 2)")
(test-ps-js conditional-statements-3
(when (blorg.is-correct)
(carry-on)
(return i))
"if (blorg.isCorrect()) {
carryOn();
return i;
}")
(test-ps-js conditional-statements-4
(unless (blorg.is-correct)
(alert "blorg is not correct!"))
"if (!blorg.isCorrect()) {
alert('blorg is not correct!');
}")
(test-ps-js variable-declaration-1
(defvar *a* (array 1 2 3))
"var A = [ 1, 2, 3 ]")
(test-ps-js variable-declaration-2
(simple-let* ((a 0) (b 1))
(alert (+ a b)))
"var a = 0;
var b = 1;
alert(a + b);")
(test-ps-js variable-declaration-3
(simple-let* ((a "World") (b "Hello"))
(simple-let ((a b) (b a))
(alert (+ a b))))
"var a = 'World';
var b = 'Hello';
var _js_a1 = b;
var _js_b2 = a;
var a = _js_a1;
var b = _js_b2;
delete _js_a1;
delete _js_b2;
alert(a + b);")
(test-ps-js variable-declaration-4
(simple-let* ((a 0) (b 1))
(lexical-let* ((a 9) (b 8))
(alert (+ a b)))
(alert (+ a b)))
"var a = 0;
var b = 1;
(function () {
var a = 9;
var b = 8;
alert(a + b);
})();
alert(a + b);")
(test-ps-js variable-declaration-5
(simple-let* ((a "World") (b "Hello"))
(lexical-let ((a b) (b a))
(alert (+ a b)))
(alert (+ a b)))
"var a = 'World';
var b = 'Hello';
(function (a, b) {
alert(a + b);
})(b, a);
alert(a + b);")
(test-ps-js iteration-constructs-1
(do* ((a) b (c (array "a" "b" "c" "d" "e"))
(d 0 (1+ d))
(e (aref c d) (aref c d)))
((or (= d c.length) (eql e "x")))
(setf a d b e)
(document.write (+ "a: " a " b: " b "
")))
"for (var a = null, b = null, c = ['a', 'b', 'c', 'd', 'e'], d = 0, e = c[d]; !(d == c.length || e == 'x'); d += 1, e = c[d]) {
a = d;
b = e;
document.write('a: ' + a + ' b: ' + b + '
');
};")
(test-ps-js iteration-constructs-2
(do ((i 0 (1+ i))
(s 0 (+ s i (1+ i))))
((> i 10))
(document.write (+ "i: " i " s: " s "
")))
"var _js_i1 = 0;
var _js_s2 = 0;
var i = _js_i1;
var s = _js_s2;
delete _js_i1;
delete _js_s2;
for (; i <= 10; ) {
document.write('i: ' + i + ' s: ' + s + '
');
var _js3 = i + 1;
var _js4 = s + i + (i + 1);
i = _js3;
s = _js4;
};")
(test-ps-js iteration-constructs-3
(do* ((i 0 (1+ i))
(s 0 (+ s i (1- i))))
((> i 10))
(document.write (+ "i: " i " s: " s "
")))
"for (var i = 0, s = 0; i <= 10; i += 1, s += i + (i - 1)) {
document.write('i: ' + i + ' s: ' + s + '
');
};")
(test-ps-js iteration-constructs-4
(let* ((arr (array "a" "b" "c" "d" "e")))
(dotimes (i arr.length)
(document.write (+ "i: " i " arr[i]: " (aref arr i) "
"))))
"var arr = ['a', 'b', 'c', 'd', 'e'];
for (var i = 0; i < arr.length; i += 1) {
document.write('i: ' + i + ' arr[i]: ' + arr[i] + '
');
};")
(test-ps-js iteration-constructs-5
(let* ((res 0))
(alert (+ "Summation to 10 is "
(dotimes (i 10 res)
(incf res (1+ i))))))
"var res = 0;
alert('Summation to 10 is ' + (function () {
for (var i = 0; i < 10; i += 1) {
res += i + 1;
};
return res;
})());")
(test-ps-js iteration-constructs-6
(let* ((l (list 1 2 4 8 16 32)))
(dolist (c l)
(document.write (+ "c: " c "
"))))
"var l = [1, 2, 4, 8, 16, 32];
for (var c = null, _js_arrvar2 = l, _js_idx1 = 0; _js_idx1 < _js_arrvar2.length; _js_idx1 += 1) {
c = _js_arrvar2[_js_idx1];
document.write('c: ' + c + '
');
};")
(test-ps-js iteration-constructs-7
(let* ((l (list 1 2 4 8 16 32))
(s 0))
(alert (+ "Sum of " l " is: "
(dolist (c l s)
(incf s c)))))
"var l = [1, 2, 4, 8, 16, 32];
var s = 0;
alert('Sum of ' + l + ' is: ' + (function () {
for (var c = null, _js_arrvar2 = l, _js_idx1 = 0; _js_idx1 < _js_arrvar2.length; _js_idx1 += 1) {
c = _js_arrvar2[_js_idx1];
s += c;
};
return s;
})());")
(test-ps-js iteration-constructs-8
(let* ((obj (create :a 1 :b 2 :c 3)))
(doeach (i obj)
(document.write (+ i ": " (aref obj i) "
"))))
"var obj = { a : 1, b : 2, c : 3 };
for (var i in obj) {
document.write(i + ': ' + obj[i] + '
');
};")
(test-ps-js iteration-constructs-9
(let* ((obj (create :a 1 :b 2 :c 3)))
(doeach ((k v) obj)
(document.write (+ k ": " v "
"))))
"var obj = { a : 1, b : 2, c : 3 };
var v;
for (var k in obj) {
v = obj[k];
document.write(k + ': ' + v + '
');
};")
(test-ps-js iteration-constructs-10
(while (film.is-not-finished)
(this.eat (new *popcorn)))
"while (film.isNotFinished()) {
this.eat(new Popcorn);
}")
(test-ps-js the-case-statement-1
(case (aref blorg i)
((1 "one") (alert "one"))
(2 (alert "two"))
(t (alert "default clause")))
"switch (blorg[i]) {
case 1:
case 'one':
alert('one');
break;
case 2:
alert('two');
break;
default:
alert('default clause');
}")
(test-ps-js the-case-statement-2
(switch (aref blorg i)
(1 (alert "If I get here"))
(2 (alert "I also get here"))
(default (alert "I always get here")))
"switch (blorg[i]) {
case 1: alert('If I get here');
case 2: alert('I also get here');
default: alert('I always get here');
}")
(test-ps-js the-with-statement-1
(with (create :foo "foo" :i "i")
(alert (+ "i is now intermediary scoped: " i)))
"with ({ foo : 'foo', i : 'i' }) {
alert('i is now intermediary scoped: ' + i);
}")
(test-ps-js the-try-statement-1
(try (throw "i")
(:catch (error)
(alert (+ "an error happened: " error)))
(:finally
(alert "Leaving the try form")))
"try {
throw 'i';
} catch (error) {
alert('an error happened: ' + error);
} finally {
alert('Leaving the try form');
}")
(test-ps-js the-html-generator-1
(ps-html ((:a :href "foobar") "blorg"))
"'blorg'")
(test-ps-js the-html-generator-2
(ps-html ((:a :href (generate-a-link)) "blorg"))
"'blorg'")
(test-ps-js the-html-generator-3
(document.write
(ps-html ((:a :href "#"
:onclick (ps-inline (transport))) "link")))
"document.write('link')")
(test-ps-js the-html-generator-4
(let* ((disabled nil)
(authorized t))
(setf element.inner-h-t-m-l
(ps-html ((:textarea (or disabled (not authorized)) :disabled "disabled")
"Edit me"))))
"var disabled = null;
var authorized = true;
element.innerHTML =
'';")