summaryrefslogtreecommitdiff
path: root/tests/test_language.js
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test_language.js')
-rw-r--r--tests/test_language.js155
1 files changed, 154 insertions, 1 deletions
diff --git a/tests/test_language.js b/tests/test_language.js
index 6b08467..8d13deb 100644
--- a/tests/test_language.js
+++ b/tests/test_language.js
@@ -15,6 +15,22 @@ function assert(actual, expected, message) {
(message ? " (" + message + ")" : ""));
}
+function assert_throws(expected_error, func)
+{
+ var err = false;
+ try {
+ func();
+ } catch(e) {
+ err = true;
+ if (!(e instanceof expected_error)) {
+ throw Error("unexpected exception type");
+ }
+ }
+ if (!err) {
+ throw Error("expected exception");
+ }
+}
+
// load more elaborate version of assert if available
try { __loadScript("test_assert.js"); } catch(e) {}
@@ -233,8 +249,13 @@ function test_delete()
function test_prototype()
{
- function f() { }
+ var f = function f() { };
assert(f.prototype.constructor, f, "prototype");
+
+ var g = function g() { };
+ /* QuickJS bug */
+ Object.defineProperty(g, "prototype", { writable: false });
+ assert(g.prototype.constructor, g, "prototype");
}
function test_arguments()
@@ -376,6 +397,135 @@ function test_spread()
assert(Object.getOwnPropertyNames(x).toString(), "0,length");
}
+function test_function_length()
+{
+ assert( ((a, b = 1, c) => {}).length, 1);
+ assert( (([a,b]) => {}).length, 1);
+ assert( (({a,b}) => {}).length, 1);
+ assert( ((c, [a,b] = 1, d) => {}).length, 1);
+}
+
+function test_argument_scope()
+{
+ var f;
+ var c = "global";
+
+ f = function(a = eval("var arguments")) {};
+ assert_throws(SyntaxError, f);
+
+ f = function(a = eval("1"), b = arguments[0]) { return b; };
+ assert(f(12), 12);
+
+ f = function(a, b = arguments[0]) { return b; };
+ assert(f(12), 12);
+
+ f = function(a, b = () => arguments) { return b; };
+ assert(f(12)()[0], 12);
+
+ f = function(a = eval("1"), b = () => arguments) { return b; };
+ assert(f(12)()[0], 12);
+
+ (function() {
+ "use strict";
+ f = function(a = this) { return a; };
+ assert(f.call(123), 123);
+
+ f = function f(a = f) { return a; };
+ assert(f(), f);
+
+ f = function f(a = eval("f")) { return a; };
+ assert(f(), f);
+ })();
+
+ f = (a = eval("var c = 1"), probe = () => c) => {
+ var c = 2;
+ assert(c, 2);
+ assert(probe(), 1);
+ }
+ f();
+
+ f = (a = eval("var arguments = 1"), probe = () => arguments) => {
+ var arguments = 2;
+ assert(arguments, 2);
+ assert(probe(), 1);
+ }
+ f();
+
+ f = function f(a = eval("var c = 1"), b = c, probe = () => c) {
+ assert(b, 1);
+ assert(c, 1);
+ assert(probe(), 1)
+ }
+ f();
+
+ assert(c, "global");
+ f = function f(a, b = c, probe = () => c) {
+ eval("var c = 1");
+ assert(c, 1);
+ assert(b, "global");
+ assert(probe(), "global")
+ }
+ f();
+ assert(c, "global");
+
+ f = function f(a = eval("var c = 1"), probe = (d = eval("c")) => d) {
+ assert(probe(), 1)
+ }
+ f();
+}
+
+function test_function_expr_name()
+{
+ var f;
+
+ /* non strict mode test : assignment to the function name silently
+ fails */
+
+ f = function myfunc() {
+ myfunc = 1;
+ return myfunc;
+ };
+ assert(f(), f);
+
+ f = function myfunc() {
+ myfunc = 1;
+ (() => {
+ myfunc = 1;
+ })();
+ return myfunc;
+ };
+ assert(f(), f);
+
+ f = function myfunc() {
+ eval("myfunc = 1");
+ return myfunc;
+ };
+ assert(f(), f);
+
+ /* strict mode test : assignment to the function name raises a
+ TypeError exception */
+
+ f = function myfunc() {
+ "use strict";
+ myfunc = 1;
+ };
+ assert_throws(TypeError, f);
+
+ f = function myfunc() {
+ "use strict";
+ (() => {
+ myfunc = 1;
+ })();
+ };
+ assert_throws(TypeError, f);
+
+ f = function myfunc() {
+ "use strict";
+ eval("myfunc = 1");
+ };
+ assert_throws(TypeError, f);
+}
+
test_op1();
test_cvt();
test_eq();
@@ -392,3 +542,6 @@ test_regexp_skip();
test_labels();
test_destructuring();
test_spread();
+test_function_length();
+test_argument_scope();
+test_function_expr_name();