1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/*
* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/licenses/publicdomain/
*/
/*
* These tests depend on the fact that testLenientAndStrict tries the
* strict case first; otherwise, the non-strict evaluation creates the
* variable. Ugh. Ideally, we would use evalcx, but that's not
* available in the browser.
*/
/* Assigning to an undeclared variable should fail in strict mode. */
assertEq(testLenientAndStrict('undeclared=1',
completesNormally,
raisesException(ReferenceError)),
true);
/*
* Assigning to a var-declared variable should be okay in strict and
* lenient modes.
*/
assertEq(testLenientAndStrict('var var_declared; var_declared=1',
completesNormally,
completesNormally),
true);
/*
* We mustn't report errors until the code is actually run; the variable
* could be created in the mean time.
*/
assertEq(testLenientAndStrict('undeclared_at_compiletime=1',
parsesSuccessfully,
parsesSuccessfully),
true);
function obj() {
var o = { x: 1, y: 1 };
Object.defineProperty(o, 'x', { writable: false });
return o;
}
/* Put EXPR in a strict mode code context with 'with' bindings in scope. */
function in_strict_with(expr) {
return "with(obj()) { (function () { 'use strict'; " + expr + " })(); }";
}
assertEq(raisesException(TypeError)(in_strict_with('x = 2; y = 2;')), true);
assertEq(raisesException(TypeError)(in_strict_with('x++;')), true);
assertEq(raisesException(TypeError)(in_strict_with('++x;')), true);
assertEq(raisesException(TypeError)(in_strict_with('x--;')), true);
assertEq(raisesException(TypeError)(in_strict_with('--x;')), true);
reportCompare(true, true);
|