blob: f087220607c78eba70fbdc60e406eea39f08fd74 [file] [log] [blame]
description(
"This test checks that const declarations in JavaScript work and are readonly."
);
function shouldThrowInvalidConstAssignment(f) {
var threw = false;
try {
f();
} catch(e) {
if (e.name.indexOf("TypeError") !== -1 && e.message.indexOf("readonly") !== -1)
threw = true;
}
if (threw)
testPassed("function threw exception: '" + f.toString() + "'");
else
testFailed("function did not throw: '" + f.toString() + "'");
}
function assert(b) {
if (!b)
testFailed("Invalid assertion.")
else
testPassed("Assertion passed.");
}
shouldThrow("const redef='a'; const redef='a';");
const x = "RIGHT";
shouldThrowInvalidConstAssignment(function() { x = "WRONG"; });
assert(x === "RIGHT");
const z = "RIGHT", y = "RIGHT";
shouldThrowInvalidConstAssignment(function() { y = "WRONG"; });
assert(y === "RIGHT");
const one = 1;
var a = null;
// PostIncResolveNode
shouldThrowInvalidConstAssignment(function() { a = one++; });
assert(a === null);
assert(one === 1);
// PostDecResolveNode
shouldThrowInvalidConstAssignment(function() { a = one--; });
assert(a === null);
assert(one === 1);
// PreIncResolveNode
shouldThrowInvalidConstAssignment(function() { a = ++one; });
assert(a === null);
assert(one === 1);
// PreDecResolveNode
shouldThrowInvalidConstAssignment(function() { a = --one; });
assert(a === null);
assert(one === 1);
// ReadModifyConstNode
shouldThrowInvalidConstAssignment(function() { a = one += 2; });
assert(a === null);
assert(one === 1);
// AssignConstNode
shouldThrowInvalidConstAssignment(function() { a = one = 2; });
assert(a === null);
assert(one === 1);
// PostIncResolveNode
shouldThrow("function f() { const one = 1; one++; return one; } f();");
shouldThrow("function f() { const oneString = '1'; return oneString++; } f();");
shouldThrow("function f() { const one = 1; return one++; } f();");
// PostDecResolveNode
shouldThrow("function f() { const one = 1; one--; return one; } f();");
shouldThrow("function f() { const oneString = '1'; return oneString--; } f();");
shouldThrow("function f() { const one = 1; return one--; } f();");
// PreIncResolveNode
shouldThrow("function f() { const one = 1; ++one; return one; } f();");
shouldThrow("function f() { const one = 1; return ++one; } f();");
// PreDecResolveNode
shouldThrow("function f() { const one = 1; --one; return one; } f();");
shouldThrow("function f() { const one = 1; return --one; } f();");
// ReadModifyConstNode
shouldThrow("function f() { const one = 1; one += 2; return one; } f();");
shouldThrow("function f() { const one = 1; return one += 2; } f();");
// AssignConstNode
shouldThrow("function f() { const one = 1; one = 2; return one; } f();");
shouldThrow("function f() { const one = 1; return one = 2; } f();");
var object = { inWith1: "a", inWith2: "b"}
with (object) {
const inWith1 = "hello";
const inWith2 = "world";
assert(inWith1 === "hello");
assert(inWith2 === "world");
}
shouldBe("object.inWith1", "'a'");
shouldBe("object.inWith2", "'b'");
var f = function g() { g="FAIL"; return g; };
shouldBe("f()", "f");
// Make sure that dynamic scopes (catch, with) don't break const declarations
function tryCatch1() {
var bar = null;
eval("try {\
stuff();\
} catch (e) {\
const bar = 5;\
}");
return bar;
}
function tryCatch2() {
var bar = null;
try {
stuff();
} catch (e) {
const bar = 5;
}
return bar;
}
tryCatch1Result = tryCatch1();
shouldBe("tryCatch1Result", "null");
tryCatch2Result = tryCatch2();
shouldBe("tryCatch2Result", "null");
function with1() {
var bar = null;
eval("with({foo:42}) { const bar = 5; }");
return bar;
}
function with2() {
var bar = null;
with({foo:42}) { const bar = 5; }
return bar;
}
with1Result = with1();
shouldBe("with1Result", "null");
with2Result = with2();
shouldBe("with2Result", "null");
(function () {
(function() {
const x = "1";
shouldThrowInvalidConstAssignment(function() { ++x; });
assert(x === "1");
shouldThrowInvalidConstAssignment(function() { x++; });
assert(x === "1");
shouldThrowInvalidConstAssignment(function() { x--; });
assert(x === "1");
shouldThrowInvalidConstAssignment(function() { --x; });
})();
})();