コード例 #1
0
        public void Switch()
        {
            Assert.AreEqual(5, TestUtils.Evaluate("x = 5; switch (x) { }"));
            Assert.AreEqual(6, TestUtils.Evaluate("x = 5; switch (x) { case 5: 6 }"));
            Assert.AreEqual(5, TestUtils.Evaluate("x = 5; switch (x) { case 4: 6 }"));
            Assert.AreEqual(6, TestUtils.Evaluate("x = 5; switch (x) { default: 6 }"));
            Assert.AreEqual(6, TestUtils.Evaluate("x = 5; switch (x) { case 4: case 5: 6 }"));
            Assert.AreEqual(7, TestUtils.Evaluate("x = 5; switch (x) { case 5: 6; case 6: 7; }"));
            Assert.AreEqual(6, TestUtils.Evaluate("x = 5; switch (x) { case 5: 6; break; 7 }"));
            Assert.AreEqual(6, TestUtils.Evaluate("x = 5; switch (x) { case 5: 6; break; case 6: 7 }"));
            Assert.AreEqual(8, TestUtils.Evaluate("x = 5; switch (x) { case 4: 6; case 5: 7; default: 8 }"));
            Assert.AreEqual(1, TestUtils.Evaluate("switch (5) { default: 3; case 4: 1 }"));
            Assert.AreEqual(5, TestUtils.Evaluate("(function(x) { switch (x) { case 8: return 4; case 9: return 5; default: return 7 } })(9)"));

            // If there identical clauses, pick the first that matches.
            Assert.AreEqual(1, TestUtils.Evaluate("x = 5; switch (x) { case 5: 1; break; case 5: 2; }"));

            // Switch expression is evaluated first, then all the clauses.
            Assert.AreEqual(6, TestUtils.Evaluate("x = 5; switch (x ++) { } x"));
            Assert.AreEqual(4, TestUtils.Evaluate("x = 0; switch (x = 1) { case x = 2: x = 3; break; case x = 4: x = 5; } x"));
            Assert.AreEqual(2, TestUtils.Evaluate("x = 0; switch (x = 1, 2) { case x = 2: break; case x = 4: x = 5; } x"));
            Assert.AreEqual(3, TestUtils.Evaluate("x = 0; switch (x = 1, 2) { case x = 2: x = 3; break; case x = 4: x = 5; } x"));

            // Multiple default clauses are not allowed.
            Assert.AreEqual("SyntaxError", TestUtils.EvaluateExceptionType("x = 5; switch (x) { default: 6; default: 7 }"));
        }
コード例 #2
0
        public void parseArray()
        {
            // Arrays
            Assert.AreEqual("", TestUtils.Evaluate("JSON.parse('[]').toString()"));
            Assert.AreEqual(0, TestUtils.Evaluate("JSON.parse('[]').length"));
            Assert.AreEqual("1,2,3", TestUtils.Evaluate("JSON.parse('[1, 2, 3]').toString()"));
            Assert.AreEqual(3, TestUtils.Evaluate("JSON.parse('[1,2,3]').length"));

            // Nested arrays
            Assert.AreEqual("1,2", TestUtils.Evaluate("JSON.parse('[[1 , 2]]').toString()"));
            Assert.AreEqual(1, TestUtils.Evaluate("JSON.parse('[[1 , 2]]').length"));
            Assert.AreEqual(2, TestUtils.Evaluate("JSON.parse('[[1 , 2]]')[0].length"));

            // With reviver.
            Assert.AreEqual("2,3,41", TestUtils.Evaluate(@"JSON.parse('[1,2,3]', function(name, value) { return this[name] + 1 })"));
            Assert.AreEqual("2,3,41", TestUtils.Evaluate(@"JSON.parse('[1,2,3]', function(name, value) { return value + 1 })"));
            Assert.AreEqual("1,,3", TestUtils.Evaluate(@"JSON.parse('[1,2,3]', function(name, value) { return value == 2 ? undefined : value }).toString()"));

            // Invalid arrays
            Assert.AreEqual("SyntaxError", TestUtils.EvaluateExceptionType("JSON.parse('[')"));
            Assert.AreEqual("SyntaxError", TestUtils.EvaluateExceptionType("JSON.parse('[5')"));
            Assert.AreEqual("SyntaxError", TestUtils.EvaluateExceptionType("JSON.parse('[,]')"));
            Assert.AreEqual("SyntaxError", TestUtils.EvaluateExceptionType("JSON.parse('[5,]')"));
            Assert.AreEqual("SyntaxError", TestUtils.EvaluateExceptionType("JSON.parse('[,5]')"));
            Assert.AreEqual("SyntaxError", TestUtils.EvaluateExceptionType("JSON.parse('[5,,5]')"));
        }
コード例 #3
0
        public void Constructor()
        {
            // Constructor
            Assert.AreEqual(Undefined.Value, TestUtils.Evaluate("f = new Function('', ''); f()"));
            Assert.AreEqual(4, TestUtils.Evaluate("f = new Function('a', 'b', 'return a+b'); f(1, 3)"));
            Assert.AreEqual(4, TestUtils.Evaluate("f = new Function('a,b', 'return a+b'); f(1, 3)"));
            Assert.AreEqual("SyntaxError", TestUtils.EvaluateExceptionType("f = new Function('a, ,b', 'return a+b')"));
            Assert.AreEqual("SyntaxError", TestUtils.EvaluateExceptionType("f = new Function('a,15,b', 'return a+b')"));
            Assert.AreEqual("SyntaxError", TestUtils.EvaluateExceptionType("f = new Function('a,this,b', 'return a+b')"));
            Assert.AreEqual("SyntaxError", TestUtils.EvaluateExceptionType("f = new Function('a,c d,b', 'return a+b')"));
            Assert.AreEqual("SyntaxError", TestUtils.EvaluateExceptionType("f = new Function('a,c d,b', 'return a+b }')"));

            // Call
            Assert.AreEqual(4, TestUtils.Evaluate("f = Function('a', 'b', 'return a+b'); f(1, 3)"));

            // toString
            if (TestUtils.Engine != JSEngine.JScript)
            {
                Assert.AreEqual("function Function() { [native code] }", TestUtils.Evaluate("Function.toString()"));
            }

            // length
            Assert.AreEqual(1, TestUtils.Evaluate("Function.length"));

            // no enumerable properties
            Assert.AreEqual("", TestUtils.Evaluate("y = ''; for (var x in Function) { y += x } y"));
            Assert.AreEqual("", TestUtils.Evaluate("y = ''; for (var x in new Function()) { y += x } y"));
        }
コード例 #4
0
        public void ForIn()
        {
            // for (x in <expression>)
            Assert.AreEqual("ab", TestUtils.Evaluate("y = ''; for (x in {a: 1, b: 2}) { y += x } y"));
            Assert.AreEqual("1", TestUtils.Evaluate("y = 0; for (x in [7, 5]) { y = x } y"));
            Assert.AreEqual(0, TestUtils.Evaluate("x = 0; for (x in null) { x = 1 } x"));
            Assert.AreEqual(0, TestUtils.Evaluate("x = 0; for (x in undefined) { x = 1 } x"));
            Assert.AreEqual("ReferenceError", TestUtils.EvaluateExceptionType("for (5 in [1, 2]) {}"));

            // for (var x in <expression>)
            Assert.AreEqual("1", TestUtils.Evaluate("y = 0; for (var x in [7, 5]) { y = x } y"));
            Assert.AreEqual("01234", TestUtils.Evaluate("y = ''; for (var x in 'hello') { y += x } y"));
            Assert.AreEqual("SyntaxError", TestUtils.EvaluateExceptionType("for (var 5 in [1, 2])"));

            // All properties in the prototype chain should be enumerated, but the same property
            // name is never enumerated twice.  Properties in the prototype chain with the same
            // name are shadowed and therefore are not enumerated.
            Assert.AreEqual("b,c", TestUtils.Evaluate("y = []; for (var x in Object.create({a:1, b:2, c:3}, {a:{value:4}, b:{value:5, enumerable:true}})) { y.push(x) } y.toString()"));

            // Properties are not enumerated if they have been deleted.
            Assert.AreEqual("a,b", TestUtils.Evaluate("y = []; z = {a:1, b:2, c:3}; for (var x in z) { y.push(x); delete z.c; } y.toString()"));

            // Adding a property while enumerating it should return the keys as they were originally.
            Assert.AreEqual("bc", TestUtils.Evaluate("var a = {b: 2, c: 3}; var keys = ''; for (var x in a) { a.d = 5; keys += x; }"));

            // Strict mode: the name "eval" is not allowed in strict mode.
            Assert.AreEqual("SyntaxError", TestUtils.EvaluateExceptionType("'use strict'; for (var eval in {a:1}) {}"));
        }
コード例 #5
0
        public void Call()
        {
            // RegExp
            Assert.AreEqual("", TestUtils.Evaluate("RegExp().source"));
            Assert.AreEqual("", TestUtils.Evaluate("RegExp(undefined).source"));

            // RegExp(pattern)
            TestUtils.Evaluate("var x = RegExp('abc')");
            Assert.AreEqual("abc", TestUtils.Evaluate("x.source"));
            Assert.AreEqual(false, TestUtils.Evaluate("x.global"));
            Assert.AreEqual(false, TestUtils.Evaluate("x.ignoreCase"));
            Assert.AreEqual(false, TestUtils.Evaluate("x.multiline"));
            Assert.AreEqual(0, TestUtils.Evaluate("x.lastIndex"));

            // RegExp(pattern, flags)
            TestUtils.Evaluate("var x = RegExp('abc', 'g')");
            Assert.AreEqual("abc", TestUtils.Evaluate("x.source"));
            Assert.AreEqual(true, TestUtils.Evaluate("x.global"));
            Assert.AreEqual(false, TestUtils.Evaluate("x.ignoreCase"));
            Assert.AreEqual(false, TestUtils.Evaluate("x.multiline"));
            Assert.AreEqual(0, TestUtils.Evaluate("x.lastIndex"));

            // RegExp(regExp)
            TestUtils.Evaluate("var x = RegExp(new RegExp('abc', 'g'))");
            Assert.AreEqual("abc", TestUtils.Evaluate("x.source"));
            Assert.AreEqual(true, TestUtils.Evaluate("x.global"));
            Assert.AreEqual(false, TestUtils.Evaluate("x.ignoreCase"));
            Assert.AreEqual(false, TestUtils.Evaluate("x.multiline"));
            Assert.AreEqual(true, TestUtils.Evaluate("x === RegExp(x)"));
            Assert.AreEqual(0, TestUtils.Evaluate("x.lastIndex"));

            // RegExp(regExp, flags)
            Assert.AreEqual(TestUtils.Engine == JSEngine.JScript ? "RegExpError" : "TypeError",
                            TestUtils.EvaluateExceptionType("RegExp(new RegExp('abc', 'g'), 'i')"));
        }
コード例 #6
0
 public void Identifiers()
 {
     Assert.AreEqual(5, TestUtils.Evaluate("delete $; $ = 5; $"));
     Assert.AreEqual(6, TestUtils.Evaluate("delete dung; d\\u0075ng = 6; dung"));
     Assert.AreEqual(7, TestUtils.Evaluate("delete another; \\u0061nother = 7; another"));
     Assert.AreEqual("SyntaxError", TestUtils.EvaluateExceptionType("ident\\u0020ifier"));
 }
コード例 #7
0
ファイル: NumberTests.cs プロジェクト: ffarzat/Jurassic
        public void toFixed()
        {
            Assert.AreEqual("0", TestUtils.Evaluate("0 .toFixed()"));
            Assert.AreEqual("0.00", TestUtils.Evaluate("0 .toFixed(2)"));
            Assert.AreEqual("77", TestUtils.Evaluate("77.1274.toFixed()"));
            Assert.AreEqual("77.1274", TestUtils.Evaluate("77.1274.toFixed(4)"));
            Assert.AreEqual("77.13", TestUtils.Evaluate("77.1274.toFixed(2)"));
            Assert.AreEqual("77", TestUtils.Evaluate("77.1274.toFixed(0)"));
            Assert.AreEqual("77", TestUtils.Evaluate("77.1234.toFixed()"));
            Assert.AreEqual("77.13", TestUtils.Evaluate("77.1274.toFixed(2)"));
            Assert.AreEqual("77.00", TestUtils.Evaluate("77 .toFixed(2)"));
            Assert.AreEqual("0.1", TestUtils.Evaluate("0.09.toFixed(1)"));
            Assert.AreEqual("0.2", TestUtils.Evaluate("0.19.toFixed(1)"));
            Assert.AreEqual("0.0", TestUtils.Evaluate("0.03.toFixed(1)"));
            Assert.AreEqual("-1", TestUtils.Evaluate("(-0.7).toFixed()"));
            Assert.AreEqual("1000000000000000", TestUtils.Evaluate("1e+15.toFixed()"));
            Assert.AreEqual("1e+21", TestUtils.Evaluate("1e21.toFixed()"));
            Assert.AreEqual("1e+21", TestUtils.Evaluate("1e21.toFixed(15)"));
            Assert.AreEqual("1000000000000000.00000000000000000000", TestUtils.Evaluate("1e+15.toFixed(20)"));
            Assert.AreEqual("0", TestUtils.Evaluate("1e-15.toFixed()"));
            Assert.AreEqual("0.00000000000000100000", TestUtils.Evaluate("1e-15.toFixed(20)"));
            Assert.AreEqual("1234567890123456768", TestUtils.Evaluate("1234567890123456789 .toFixed(0)"));
            Assert.AreEqual("77.12739999999999440661", TestUtils.Evaluate("77.1274.toFixed(20)"));
            Assert.AreEqual("Infinity", TestUtils.Evaluate("Number.POSITIVE_INFINITY.toFixed()"));
            Assert.AreEqual("-Infinity", TestUtils.Evaluate("Number.NEGATIVE_INFINITY.toFixed()"));
            Assert.AreEqual("NaN", TestUtils.Evaluate("NaN.toFixed()"));

            // Negative tests.
            Assert.AreEqual("RangeError", TestUtils.EvaluateExceptionType("77.1274.toFixed(-1)"));
            Assert.AreEqual("RangeError", TestUtils.EvaluateExceptionType("77.1274.toFixed(21)"));

            // length
            Assert.AreEqual(1, TestUtils.Evaluate("NaN.toFixed.length"));
        }
コード例 #8
0
ファイル: NumberTests.cs プロジェクト: ffarzat/Jurassic
        public void toExponential()
        {
            Assert.AreEqual("0e+0", TestUtils.Evaluate("0 .toExponential()"));
            Assert.AreEqual("0.00e+0", TestUtils.Evaluate("0 .toExponential(2)"));
            Assert.AreEqual("7.71234e+1", TestUtils.Evaluate("77.1234.toExponential()"));
            Assert.AreEqual("7.7123e+1", TestUtils.Evaluate("77.1234.toExponential(4)"));
            Assert.AreEqual("7.71e+1", TestUtils.Evaluate("77.1234.toExponential(2)"));
            Assert.AreEqual("8e+1", TestUtils.Evaluate("77.1234.toExponential(0)"));
            Assert.AreEqual("7.71234e+1", TestUtils.Evaluate("77.1234.toExponential()"));
            Assert.AreEqual("8e+1", TestUtils.Evaluate("77.1234.toExponential(0)"));
            Assert.AreEqual("7.7e+1", TestUtils.Evaluate("77 .toExponential()"));
            Assert.AreEqual("5e-16", TestUtils.Evaluate("5e-16.toExponential()"));
            Assert.AreEqual("5.000e-16", TestUtils.Evaluate("5e-16.toExponential(3)"));
            Assert.AreEqual("1e+1", TestUtils.Evaluate("9.9.toExponential(0)"));
            Assert.AreEqual("1.2345678901234568e+18", TestUtils.Evaluate("1234567890123456789 .toExponential()"));
            Assert.AreEqual("1.23456789012345676800e+18", TestUtils.Evaluate("1234567890123456789 .toExponential(20)"));
            Assert.AreEqual("5e-324", TestUtils.Evaluate("Number.MIN_VALUE.toExponential()"));
            Assert.AreEqual("4.94e-324", TestUtils.Evaluate("Number.MIN_VALUE.toExponential(2)"));
            Assert.AreEqual("1.80e+308", TestUtils.Evaluate("Number.MAX_VALUE.toExponential(2)"));
            Assert.AreEqual("Infinity", TestUtils.Evaluate("Number.POSITIVE_INFINITY.toExponential()"));
            Assert.AreEqual("-Infinity", TestUtils.Evaluate("Number.NEGATIVE_INFINITY.toExponential()"));
            Assert.AreEqual("NaN", TestUtils.Evaluate("NaN.toExponential()"));

            // Negative tests.
            Assert.AreEqual("RangeError", TestUtils.EvaluateExceptionType("77.1234.toExponential(-1)"));
            Assert.AreEqual("RangeError", TestUtils.EvaluateExceptionType("77.1234.toExponential(21)"));

            // length
            Assert.AreEqual(1, TestUtils.Evaluate("NaN.toExponential.length"));
        }
コード例 #9
0
 public void decodeURI()
 {
     Assert.AreEqual("abc", TestUtils.Evaluate("decodeURI('abc')"));
     Assert.AreEqual("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789;/?:@&=+$,-_.!~*'()#",
                     TestUtils.Evaluate("decodeURI('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789;/?:@&=+$,-_.!~*\\'()#')"));
     Assert.AreEqual("%3F", TestUtils.Evaluate("decodeURI('%3F')"));
     Assert.AreEqual("%2f", TestUtils.Evaluate("decodeURI('%2f')"));
     Assert.AreEqual("%23", TestUtils.Evaluate("decodeURI('%23')"));
     Assert.AreEqual("!", TestUtils.Evaluate("decodeURI('%21')"));
     Assert.AreEqual("^", TestUtils.Evaluate("decodeURI('%5e')"));
     Assert.AreEqual("^", TestUtils.Evaluate("decodeURI('^')"));
     Assert.AreEqual("Ҧ", TestUtils.Evaluate("decodeURI('Ҧ')"));
     Assert.AreEqual("Ҧ", TestUtils.Evaluate("decodeURI('%D2%A6')"));
     Assert.AreEqual("Ҧa", TestUtils.Evaluate("decodeURI('%D2%A6a')"));
     Assert.AreEqual("ᵝ", TestUtils.Evaluate("decodeURI('%E1%B5%9D')"));
     Assert.AreEqual("\U0001D11E", TestUtils.Evaluate("decodeURI('%F0%9D%84%9E')"));
     Assert.AreEqual("URIError", TestUtils.EvaluateExceptionType("decodeURI('%B')"));
     Assert.AreEqual("URIError", TestUtils.EvaluateExceptionType("decodeURI('%H5')"));
     Assert.AreEqual("URIError", TestUtils.EvaluateExceptionType("decodeURI('%B5')"));
     Assert.AreEqual("URIError", TestUtils.EvaluateExceptionType("decodeURI('%F8')"));
     Assert.AreEqual("URIError", TestUtils.EvaluateExceptionType("decodeURI('%E1')"));
     Assert.AreEqual("URIError", TestUtils.EvaluateExceptionType("decodeURI('%E1%B5')"));
     Assert.AreEqual("URIError", TestUtils.EvaluateExceptionType("decodeURI('%E1%E1%9D')"));
     if (TestUtils.Engine != JSEngine.JScript)
     {
         Assert.AreEqual("URIError", TestUtils.EvaluateExceptionType("decodeURI('%C0%A6')"));    // Test is buggy in JScript.
     }
 }
コード例 #10
0
        public void OctalNumbers()
        {
            // Octal numbers and escape sequences are not supported in strict mode.
            Assert.AreEqual(0, TestUtils.Evaluate("'use strict'; 0"));
            Assert.AreEqual("SyntaxError", TestUtils.EvaluateExceptionType("'use strict'; 05"));
            Assert.AreEqual("SyntaxError", TestUtils.EvaluateExceptionType("'use strict'; 011"));
            Assert.AreEqual("SyntaxError", TestUtils.EvaluateExceptionType("'use strict'; 0123456701234567"));
            Assert.AreEqual("SyntaxError", TestUtils.EvaluateExceptionType("'use strict'; 09"));

            // Octal numbers and escape sequences are supported in ECMAScript 5 mode.
            Assert.AreEqual(0, TestUtils.Evaluate("0"));
            Assert.AreEqual(5, TestUtils.Evaluate("05"));
            Assert.AreEqual(9, TestUtils.Evaluate("011"));
            Assert.AreEqual(5744368105847.0, TestUtils.Evaluate("0123456701234567"));
            Assert.AreEqual("SyntaxError", TestUtils.EvaluateExceptionType("09"));

            // And they are supported in compatibility mode.
            TestUtils.CompatibilityMode = CompatibilityMode.ECMAScript3;
            try
            {
                Assert.AreEqual(0, TestUtils.Evaluate("0"));
                Assert.AreEqual(5, TestUtils.Evaluate("05"));
                Assert.AreEqual(9, TestUtils.Evaluate("011"));
                Assert.AreEqual(5744368105847.0, TestUtils.Evaluate("0123456701234567"));
                Assert.AreEqual("SyntaxError", TestUtils.EvaluateExceptionType("09"));
            }
            finally
            {
                TestUtils.CompatibilityMode = CompatibilityMode.Latest;
            }
        }
コード例 #11
0
        public void eval()
        {
            Assert.AreEqual(Undefined.Value, TestUtils.Evaluate("eval()"));
            Assert.AreEqual(5, TestUtils.Evaluate("eval(5)"));
            Assert.AreEqual(true, TestUtils.Evaluate("var x = {}; eval(x) === x;"));
            Assert.AreEqual(true, TestUtils.Evaluate("var x = {}; e = eval; e(x) === x;"));
            Assert.AreEqual(1, TestUtils.Evaluate("eval('Math.abs(-1)')"));

            // The lexical environment does not change inside an eval if it is a direct call.
            Assert.AreEqual(5, TestUtils.Evaluate("(function() { var a = 5; return eval('a'); })()"));
            Assert.AreEqual(6, TestUtils.Evaluate("(function() { var a = 5; eval('a = 6'); return a; })()"));

            // Variables should not be reinitialized.
            Assert.AreEqual(0, TestUtils.Evaluate("var x = 0; eval('var x'); x"));

            // Eval() can introduce new variables into a function scope.
            Assert.AreEqual(5, TestUtils.Evaluate("b = 1; (function() { var a = 5; eval('var b = a'); return b; })()"));
            Assert.AreEqual(1, TestUtils.Evaluate("b = 1; (function() { var a = 5; eval('var b = a'); b = 4; })(); b;"));
            Assert.AreEqual(8, TestUtils.Evaluate("(function() { eval('var b = 8'); return eval('b'); })();"));

            // The global lexical environment is used for a non-direct call.
            Assert.AreEqual(5, TestUtils.Evaluate("e = eval; (function() { var a = 5; e('a = 6'); return a; })()"));
            Assert.AreEqual(1, TestUtils.Evaluate("e = eval; a = 1; (function() { var a = 5; return e('a'); })()"));
            Assert.AreEqual(3, TestUtils.Evaluate("e = eval; a = 3; b = 2; (function() { var a = 5; e('var b = a'); return b; })()"));
            Assert.AreEqual(3, TestUtils.Evaluate("e = eval; a = 3; b = 2; (function() { var a = 5; e('var b = a'); })(); b"));

            // Strict mode: eval has it's own scope.
            TestUtils.Evaluate("delete a");
            Assert.AreEqual("undefined", TestUtils.Evaluate("'use strict'; eval('var a = false'); typeof a"));
            Assert.AreEqual("undefined", TestUtils.Evaluate(@"eval(""'use strict'; var a = false""); typeof a"));

            // Return is not allowed.
            Assert.AreEqual("SyntaxError", TestUtils.EvaluateExceptionType("e = eval; (function() { var a = 5; e('return a'); })()"));
        }
コード例 #12
0
        public void parseNumber()
        {
            // Numbers
            Assert.AreEqual(0, TestUtils.Evaluate("JSON.parse('0')"));
            Assert.AreEqual(5, TestUtils.Evaluate("JSON.parse('5')"));
            Assert.AreEqual(-5, TestUtils.Evaluate("JSON.parse('-5')"));
            Assert.AreEqual(5.6, TestUtils.Evaluate("JSON.parse('5.6')"));
            Assert.AreEqual(-5.6, TestUtils.Evaluate("JSON.parse('-5.6')"));
            Assert.AreEqual(560, TestUtils.Evaluate("JSON.parse('5.6e2')"));
            Assert.AreEqual(1, TestUtils.Evaluate("JSON.parse('100e-2')"));
            Assert.AreEqual(500, TestUtils.Evaluate("JSON.parse('5E2')"));
            Assert.AreEqual(5, TestUtils.Evaluate("JSON.parse('5E0')"));
            Assert.AreEqual(-500, TestUtils.Evaluate("JSON.parse('-5E+2')"));

            // With reviver.
            Assert.AreEqual(6, TestUtils.Evaluate(@"JSON.parse('5', function(name, value) { return value + 1 })"));
            Assert.AreEqual(Undefined.Value, TestUtils.Evaluate(@"JSON.parse('5', function(name, value) { })"));

            // Invalid numbers
            Assert.AreEqual("SyntaxError", TestUtils.EvaluateExceptionType("JSON.parse('05')"));
            Assert.AreEqual("SyntaxError", TestUtils.EvaluateExceptionType("JSON.parse('.5')"));
            Assert.AreEqual("SyntaxError", TestUtils.EvaluateExceptionType("JSON.parse('.e5')"));
            Assert.AreEqual("SyntaxError", TestUtils.EvaluateExceptionType("JSON.parse('-.5')"));
            Assert.AreEqual("SyntaxError", TestUtils.EvaluateExceptionType("JSON.parse('5.')"));
            Assert.AreEqual("SyntaxError", TestUtils.EvaluateExceptionType("JSON.parse('5e')"));
            Assert.AreEqual("SyntaxError", TestUtils.EvaluateExceptionType("JSON.parse('5e+')"));
            Assert.AreEqual("SyntaxError", TestUtils.EvaluateExceptionType("JSON.parse('5e-')"));
            Assert.AreEqual("SyntaxError", TestUtils.EvaluateExceptionType("JSON.parse('+5')"));
            Assert.AreEqual("SyntaxError", TestUtils.EvaluateExceptionType("JSON.parse('5e05')"));
            Assert.AreEqual("SyntaxError", TestUtils.EvaluateExceptionType("JSON.parse('12\\t\\r\\n 34')"));
        }
コード例 #13
0
        public void hasOwnProperty()
        {
            Assert.AreEqual(true, TestUtils.Evaluate("String.prototype.hasOwnProperty('split')"));
            Assert.AreEqual(false, TestUtils.Evaluate("new String('test').hasOwnProperty('split')"));
            TestUtils.Evaluate("var x = new String('sdf');");
            TestUtils.Evaluate("x.testing = 5;");
            Assert.AreEqual(true, TestUtils.Evaluate("x.hasOwnProperty('testing')"));
            Assert.AreEqual(false, TestUtils.Evaluate("x.hasOwnProperty('Testing')"));
            Assert.AreEqual(false, TestUtils.Evaluate("x.hasOwnProperty('split')"));
            Assert.AreEqual(true, TestUtils.Evaluate("Math.hasOwnProperty('cos')"));
            Assert.AreEqual(true, TestUtils.Evaluate("Math.hasOwnProperty('E')"));
            Assert.AreEqual(true, TestUtils.Evaluate("x = function() { this.a = 5; }; x.prototype = { b: 2 }; y = new x(); y.hasOwnProperty('a')"));
            Assert.AreEqual(false, TestUtils.Evaluate("x = function() { this.a = 5; }; x.prototype = { b: 2 }; y = new x(); y.hasOwnProperty('b')"));
            Assert.AreEqual(true, TestUtils.Evaluate("Math.hasOwnProperty({toString: function() { return 'max' }})"));

            // length
            Assert.AreEqual(1, TestUtils.Evaluate("Math.hasOwnProperty.length"));

            // "this" object must be convertible to object.
            Assert.AreEqual("TypeError", TestUtils.EvaluateExceptionType("Math.hasOwnProperty.call(undefined, 'max')"));
            Assert.AreEqual("TypeError", TestUtils.EvaluateExceptionType("Math.hasOwnProperty.call(null, 'max')"));

            // First parameter must be convertible to string.
            Assert.AreEqual("Error", TestUtils.EvaluateExceptionType("Math.hasOwnProperty({toString: function() { throw new Error('test') }})"));
            Assert.AreEqual("Error", TestUtils.EvaluateExceptionType("Math.hasOwnProperty.call(undefined, {toString: function() { throw new Error('test') }})"));
        }
コード例 #14
0
        public void bind()
        {
            Assert.AreEqual("[object Math]", TestUtils.Evaluate("var f = {}.toString.bind(Math); f();"));
            Assert.AreEqual(32, TestUtils.Evaluate("var f = Math.pow.bind(undefined, 2); f(5);"));
            Assert.AreEqual(5, TestUtils.Evaluate("new Function('a,b', 'return a / b').bind(undefined, 10)(2)"));
            Assert.AreEqual(15, TestUtils.Evaluate("new Function('a,b', 'return a + b').bind(undefined, 10, 5)(2)"));

            // length of bound functions is the number of arguments remaining.
            Assert.AreEqual(2, TestUtils.Evaluate("Math.pow.length"));
            Assert.AreEqual(2, TestUtils.Evaluate("var f = Math.pow.bind(undefined); f.length"));
            Assert.AreEqual(1, TestUtils.Evaluate("var f = Math.pow.bind(undefined, 2); f.length"));
            Assert.AreEqual(0, TestUtils.Evaluate("var f = Math.pow.bind(undefined, 2, 5); f.length"));
            Assert.AreEqual(0, TestUtils.Evaluate("var f = Math.pow.bind(undefined, 2, 5, 7); f.length"));

            // length
            Assert.AreEqual(1, TestUtils.Evaluate("Function.prototype.bind.length"));

            // Caller and arguments throw a TypeError exception.
            Assert.AreEqual("TypeError", TestUtils.EvaluateExceptionType(@"
                function foo() { return bar.arguments; }
                var bar = foo.bind({});
                function baz() { return bar(); }
                baz();"));
            Assert.AreEqual("TypeError", TestUtils.EvaluateExceptionType(@"
                function foo() { return bar.caller; }
                var bar = foo.bind({});
                function baz() { return bar(); }
                baz();"));
        }
コード例 #15
0
        public void With()
        {
            Assert.AreEqual(234, TestUtils.Evaluate("x = { a: 234 }; with (x) { a }"));
            Assert.AreEqual(234, TestUtils.Evaluate("x = { a: 234 }; a = 5; with (x) { a }"));
            Assert.AreEqual(15, TestUtils.Evaluate("x = { a: 234 }; b = 15; with (x) { b }"));
            Assert.AreEqual(1, TestUtils.Evaluate("x = { a: 234 }; a = 1; b = 2; with (x) { a = 12, b = 13 } a"));
            Assert.AreEqual(13, TestUtils.Evaluate("x = { a: 234 }; a = 1; b = 2; with (x) { a = 12, b = 13 } b"));
            Assert.AreEqual(12, TestUtils.Evaluate("x = { a: 234 }; a = 1; b = 2; with (x) { a = 12, b = 13 } x.a"));
            Assert.AreEqual(6, TestUtils.Evaluate("b = 5; with (x) { y = b; x.b = 6; b; }"));
            Assert.AreEqual(3, TestUtils.Evaluate("x = Object.create({b: 3}); b = 2; with (x) { b }"));
            Assert.AreEqual(Undefined.Value, TestUtils.Evaluate("x = { a: 234 }; a = 1; b = 2; with (x) { a = 12, b = 13 } x.b"));
            Assert.AreEqual("number", TestUtils.Evaluate("x = { a: 234 }; a = 1; b = 2; with (x) { a = 12, typeof(b) }"));

            // Implicit this.
            // corrected test case to account for time zone differences
            int baseYear = 1970;

            if ((DateTime.Now - DateTime.UtcNow).Ticks < 0)
            {
                baseYear = 1969;
            }
            Assert.AreEqual(baseYear, TestUtils.Evaluate("x = new Date(5); x.f = x.getFullYear; with (x) { f() }"));
            Assert.AreEqual(true, TestUtils.Evaluate("x = { a: 1, b: 2 }; with (x) { (function() { return this })() === this }"));
            Assert.AreEqual("TypeError", TestUtils.EvaluateExceptionType("x = new Date(5); f = x.getFullYear; with (x) { f() }"));
            Assert.AreEqual(baseYear, TestUtils.Evaluate("x = new Date(5); x.f = x.getFullYear; with (x) { (function b() { return f() })() }"));

            // With and var.
            Assert.AreEqual(5, TestUtils.Evaluate("x = { a: 234 }; with (x) { var a = 5; } x.a"));
            Assert.AreEqual(0, TestUtils.Evaluate("a = 0; x = { a: 234 }; with (x) { var a = 5; } a"));
            Assert.AreEqual(5, TestUtils.Evaluate("b = 0; x = { a: 234 }; with (x) { var b = 5; } b"));
            Assert.AreEqual(4, TestUtils.Evaluate("foo = {x: 4}; with (foo) { var x; x }"));
            Assert.AreEqual(1123, TestUtils.Evaluate("with ({}) { var with_unique_1 = 1123; } with_unique_1"));

            // With and prototype chains.
            Assert.AreEqual(10, TestUtils.Evaluate("x = Object.create({ b: 5 }); with (x) { b = 10 } x.b"));
            Assert.AreEqual(5, TestUtils.Evaluate("x = Object.create({ b: 5 }); with (x) { b = 10 } Object.getPrototypeOf(x).b"));

            // With inside a function.
            Assert.AreEqual(1, TestUtils.Evaluate("function foo() { with ({ a: 1 }) { return a; } } foo()"));
            Assert.AreEqual(1, TestUtils.Evaluate("x = { a: 1 }; function foo() { with (x) { return a; } } foo()"));
            Assert.AreEqual(2, TestUtils.Evaluate("x = { a: 1 }; function foo() { with (x) { a = 2; } } foo(); x.a"));
            Assert.AreEqual(2, TestUtils.Evaluate("x = { a: 1 }; var foo = function() { with (x) { a = 2; } }; foo(); x.a"));
            Assert.AreEqual(2, TestUtils.Evaluate("x = { a: 1 }; y = 2; function foo() { with (x) { return y; } } foo()"));
            Assert.AreEqual(1, TestUtils.Evaluate("x = { a: 1 }; y = 2; function foo() { with (x) { y = a; } } foo(); y"));
            Assert.AreEqual(1, TestUtils.Evaluate(@"var x = { eval: 1 }; var f = function(){ with(x){ return st_eval = eval; } }; f();"));

            // With and object literals.
            Assert.AreEqual(42, TestUtils.Evaluate("delete a; x = { a: 42 }; with (x) { y = { get z() { return a; }} } y.z"));

            // With and function declarations.
            Assert.AreEqual("ReferenceError", TestUtils.EvaluateExceptionType("delete a; x = { a: 43 }; with (x) { function y() { return a } } y()"));
            Assert.AreEqual("function", TestUtils.Evaluate("result = typeof _f; with ({a: 2}) { function _f() { return 5 } } result"));

            // With statements are syntax errors in strict mode.
            Assert.AreEqual("SyntaxError", TestUtils.EvaluateExceptionType("'use strict'; var x = {}; with (x) { }"));
            Assert.AreEqual("SyntaxError", TestUtils.EvaluateExceptionType(@"eval(""'use strict'; var o = {}; with (o) {}"")"));
            Assert.AreEqual("SyntaxError", TestUtils.EvaluateExceptionType(@"'use strict'; eval(""var o = {}; with (o) {}"")"));
            Assert.AreEqual("SyntaxError", TestUtils.EvaluateExceptionType(@"eval(""function f() { 'use strict'; var o = {}; with (o) {} }"")"));
        }
コード例 #16
0
 public void Return()
 {
     Assert.AreEqual(10, TestUtils.Evaluate("function f() { for (var i = 0; i < 1; i++) { return 10; } return 15; } f()"));
     Assert.AreEqual(5, TestUtils.Evaluate("function f() { return 5 } f()"));
     Assert.AreEqual(Undefined.Value, TestUtils.Evaluate("function f() { } f()"));
     Assert.AreEqual(Undefined.Value, TestUtils.Evaluate("function f() { return } f()"));
     Assert.AreEqual("SyntaxError", TestUtils.EvaluateExceptionType("return 5"));
     Assert.AreEqual("SyntaxError", TestUtils.EvaluateExceptionType("eval('return 5')"));
 }
コード例 #17
0
 public void Operators()
 {
     Assert.AreEqual("SyntaxError", TestUtils.EvaluateExceptionType("++"));
     Assert.AreEqual("SyntaxError", TestUtils.EvaluateExceptionType("*"));
     Assert.AreEqual("SyntaxError", TestUtils.EvaluateExceptionType("5 *"));
     Assert.AreEqual("SyntaxError", TestUtils.EvaluateExceptionType("!"));
     Assert.AreEqual("SyntaxError", TestUtils.EvaluateExceptionType("! * 5"));
     Assert.AreEqual("SyntaxError", TestUtils.EvaluateExceptionType("("));
     Assert.AreEqual("SyntaxError", TestUtils.EvaluateExceptionType("(1"));
 }
コード例 #18
0
        public void stringify()
        {
            // Undefined and null.
            Assert.AreEqual("null", TestUtils.Evaluate("JSON.stringify(null)"));
            Assert.AreEqual(Undefined.Value, TestUtils.Evaluate("JSON.stringify(undefined)"));

            // Boolean.
            Assert.AreEqual("false", TestUtils.Evaluate("JSON.stringify(false)"));
            Assert.AreEqual("true", TestUtils.Evaluate("JSON.stringify(true)"));
            Assert.AreEqual("false", TestUtils.Evaluate("JSON.stringify(new Boolean(false))"));
            Assert.AreEqual("true", TestUtils.Evaluate("JSON.stringify(new Boolean(true))"));

            // Numbers.
            Assert.AreEqual("5", TestUtils.Evaluate("JSON.stringify(5)"));
            Assert.AreEqual("5e+100", TestUtils.Evaluate("JSON.stringify(5e100)"));
            Assert.AreEqual("5.1", TestUtils.Evaluate("JSON.stringify(5.1)"));
            Assert.AreEqual("5.1", TestUtils.ChangeLocale("es-ES", () => TestUtils.Evaluate("JSON.stringify(5.1)")));
            Assert.AreEqual("null", TestUtils.Evaluate("JSON.stringify(-Infinity)"));
            Assert.AreEqual("null", TestUtils.Evaluate("JSON.stringify(Infinity)"));
            Assert.AreEqual("null", TestUtils.Evaluate("JSON.stringify(NaN)"));
            Assert.AreEqual("5", TestUtils.Evaluate("JSON.stringify(new Number(5))"));
            Assert.AreEqual("null", TestUtils.Evaluate("JSON.stringify(new Number(NaN))"));

            // Strings.
            Assert.AreEqual(@"""test""", TestUtils.Evaluate("JSON.stringify('test')"));
            Assert.AreEqual(@"""\b\f\n\r\t""", TestUtils.Evaluate(@"JSON.stringify('\b\f\n\r\t')"));
            Assert.AreEqual(@"""\u0000""", TestUtils.Evaluate("JSON.stringify(String.fromCharCode(0))"));
            Assert.AreEqual(@"""\u001f""", TestUtils.Evaluate("JSON.stringify(String.fromCharCode(0x1F))"));
            Assert.AreEqual(@"""test""", TestUtils.Evaluate("JSON.stringify(new String('test'))"));
            Assert.AreEqual(@"""te\""st""", TestUtils.Evaluate("JSON.stringify('te\"st')"));
            Assert.AreEqual(@"""te'st""", TestUtils.Evaluate("JSON.stringify('te\\'st')"));

            // Dates.
            Assert.AreEqual("null", TestUtils.Evaluate("JSON.stringify(Date.prototype)"));
            Assert.AreEqual(@"""1970-01-01T00:00:00.005Z""", TestUtils.Evaluate("JSON.stringify(new Date(5))"));

            // Arrays.
            Assert.AreEqual("[]", TestUtils.Evaluate("JSON.stringify([])"));
            Assert.AreEqual("[0,1,2]", TestUtils.Evaluate("JSON.stringify([0, 1, 2])"));
            Assert.AreEqual("[0,null,2]", TestUtils.Evaluate("JSON.stringify([0, , 2])"));
            Assert.AreEqual("[0,null,2]", TestUtils.Evaluate("JSON.stringify([0, undefined, 2])"));

            // Functions.
            Assert.AreEqual(Undefined.Value, TestUtils.Evaluate("JSON.stringify(function() {})"));
            Assert.AreEqual("[null]", TestUtils.Evaluate("JSON.stringify([function() {}])"));
            Assert.AreEqual("{}", TestUtils.Evaluate("JSON.stringify({f: function() {}})"));

            // Objects.
            Assert.AreEqual("{}", TestUtils.Evaluate("JSON.stringify({})"));
            Assert.AreEqual(@"{""a"":1,""b"":2}", TestUtils.Evaluate("JSON.stringify({a: 1, b: 2})"));

            // Cyclic reference
            Assert.AreEqual("TypeError", TestUtils.EvaluateExceptionType("a = []; a[0] = a; JSON.stringify(a)"));
        }
コード例 #19
0
 public void DivisionAmbiguity()
 {
     // Division and regular expressions are ambiguous in the lexical grammar.  The parser
     // is required to resolve the ambiguity.
     Assert.AreEqual("/abc/", TestUtils.Evaluate("/abc/.toString()"));
     Assert.AreEqual(3, TestUtils.Evaluate("abc = 2; 6/abc"));
     Assert.AreEqual("/abc/", TestUtils.Evaluate("if (true) /abc/.toString()"));
     Assert.AreEqual(1.5, TestUtils.Evaluate("g = 2; (5 + 1) /2/g"));
     Assert.AreEqual("/abc/", TestUtils.Evaluate("if (true) {} /abc/.toString()"));
     Assert.AreEqual(double.NaN, TestUtils.Evaluate("a = {} / 2"));
     Assert.AreEqual("SyntaxError", TestUtils.EvaluateExceptionType("{} / 2"));
 }
コード例 #20
0
        public void parse()
        {
            Assert.AreEqual(5, TestUtils.Evaluate("JSON.parse(5, 5)"));
            Assert.AreEqual(5, TestUtils.Evaluate("JSON.parse(5, {})"));

            // length
            Assert.AreEqual(2, TestUtils.Evaluate("JSON.parse.length"));

            // Errors
            Assert.AreEqual("SyntaxError", TestUtils.EvaluateExceptionType("JSON.parse()"));
            Assert.AreEqual("SyntaxError", TestUtils.EvaluateExceptionType("JSON.parse('')"));
        }
コード例 #21
0
ファイル: DateTests.cs プロジェクト: ffarzat/Jurassic
        public void toISOString()
        {
            // JScript does not support Date.toISOString
            if (TestUtils.Engine == JSEngine.JScript)
            {
                return;
            }

            Assert.AreEqual("1970-01-01T00:00:00.012Z", TestUtils.Evaluate("new Date(12).toISOString()"));
            Assert.AreEqual("2010-04-24T23:59:57.000Z", TestUtils.Evaluate("new Date('24 Apr 2010 23:59:57 GMT').toISOString()"));
            Assert.AreEqual("RangeError", TestUtils.EvaluateExceptionType("new Date(NaN).toISOString()"));
            Assert.AreEqual(0, TestUtils.Evaluate("new Date().toISOString.length"));
        }
コード例 #22
0
        public void caller()
        {
            // In non-strict mode, caller doesn't exist.
            Assert.AreEqual(Undefined.Value, TestUtils.Evaluate("function f() { return arguments.caller; } f()"));

            // In strict mode, caller throws an error.
            Assert.AreEqual("TypeError", TestUtils.EvaluateExceptionType("function f() { 'use strict'; return arguments.caller; } f()"));

            // In strict mode, callee is not writable or configurable.
            // Note: attempting to delete a non-configurable property results in an exception in strict mode.
            Assert.AreEqual("TypeError", TestUtils.EvaluateExceptionType("function f() { 'use strict'; arguments.caller = 2; } f()"));
            Assert.AreEqual("TypeError", TestUtils.EvaluateExceptionType("function f() { 'use strict'; return delete arguments.caller; } f()"));
        }
コード例 #23
0
        public void getPrototypeOf()
        {
            Assert.AreEqual(true, TestUtils.Evaluate("Object.getPrototypeOf(new Number(55)) === Number.prototype"));
            Assert.AreEqual(true, TestUtils.Evaluate("Object.getPrototypeOf(new String('test')) === String.prototype"));

            // length
            Assert.AreEqual(1, TestUtils.Evaluate("Object.getPrototypeOf.length"));

            // Argument must be an object.
            Assert.AreEqual("TypeError", TestUtils.EvaluateExceptionType("Object.getPrototypeOf()"));
            Assert.AreEqual("TypeError", TestUtils.EvaluateExceptionType("Object.getPrototypeOf(true)"));
            Assert.AreEqual("TypeError", TestUtils.EvaluateExceptionType("Object.getPrototypeOf(5)"));
            Assert.AreEqual("TypeError", TestUtils.EvaluateExceptionType("Object.getPrototypeOf('test')"));
        }
コード例 #24
0
 public void encodeURI()
 {
     Assert.AreEqual("abc", TestUtils.Evaluate("encodeURI('abc')"));
     Assert.AreEqual("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789;/?:@&=+$,-_.!~*'()#",
                     TestUtils.Evaluate("encodeURI('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789;/?:@&=+$,-_.!~*\\'()#')"));
     Assert.AreEqual("%5E", TestUtils.Evaluate("encodeURI('^')"));
     Assert.AreEqual("%D2%A6", TestUtils.Evaluate("encodeURI('Ҧ')"));
     Assert.AreEqual("%E1%B5%9D", TestUtils.Evaluate("encodeURI('ᵝ')"));
     Assert.AreEqual("%F0%9D%84%9E", TestUtils.Evaluate("encodeURI('\U0001D11E')"));
     Assert.AreEqual("%F0%9D%84%9Ee", TestUtils.Evaluate("encodeURI('\U0001D11Ee')"));
     Assert.AreEqual("k%CC%81u%CC%ADo%CC%84%CC%81n", TestUtils.Evaluate("encodeURI('\u006B\u0301\u0075\u032D\u006F\u0304\u0301\u006E')"));
     Assert.AreEqual("URIError", TestUtils.EvaluateExceptionType("encodeURI('\uD834')"));
     Assert.AreEqual("URIError", TestUtils.EvaluateExceptionType("encodeURI('\uDD1E')"));
 }
コード例 #25
0
        public void Continue()
        {
            // continue
            Assert.AreEqual(1, TestUtils.Evaluate("x = y = 1; while(x < 5) { x ++; continue; y ++ } y"));
            Assert.AreEqual(2, TestUtils.Evaluate("x = 1; do { x ++; continue; x += 10 } while(false); x"));
            Assert.AreEqual(5, TestUtils.Evaluate("for(x = 1; x < 5; x ++) { continue; x += 10 } x"));

            // continue [label]
            Assert.AreEqual(1, TestUtils.Evaluate("x = y = 1; test: while(x < 5) { x ++; continue test; y ++ } y"));
            Assert.AreEqual(2, TestUtils.Evaluate("x = 0; test: do { x ++; while(x < 5) { x ++; continue test; x += 10 } x += 20 } while(false); x"));

            // The label must be an enclosing *iteration* statement in the same function.
            Assert.AreEqual("SyntaxError", TestUtils.EvaluateExceptionType("x = 1; test: continue test; x"));
        }
コード例 #26
0
        public void If()
        {
            Assert.AreEqual(5, TestUtils.Evaluate("if (true) 5"));
            Assert.AreEqual(Undefined.Value, TestUtils.Evaluate("if (false) 5"));
            Assert.AreEqual("SyntaxError", TestUtils.EvaluateExceptionType("if (true) 5 else 6"));
            Assert.AreEqual(5, TestUtils.Evaluate("if (true) 5; else 6"));
            Assert.AreEqual(6, TestUtils.Evaluate("if (false) 5; else 6"));

            // Nested if statements.
            Assert.AreEqual(1, TestUtils.Evaluate("if (true) if (true) 1; else 2; else 3"));
            Assert.AreEqual(2, TestUtils.Evaluate("if (true) if (false) 1; else 2; else 3"));
            Assert.AreEqual(3, TestUtils.Evaluate("if (false) if (true) 1; else 2; else 3"));
            Assert.AreEqual(3, TestUtils.Evaluate("if (false) if (false) 1; else 2; else 3"));
        }
コード例 #27
0
        public void Var()
        {
            Assert.AreEqual(Undefined.Value, TestUtils.Evaluate("var x"));
            Assert.AreEqual(Undefined.Value, TestUtils.Evaluate("var x; x"));
            Assert.AreEqual(Undefined.Value, TestUtils.Evaluate("var x, y"));
            Assert.AreEqual(5, TestUtils.Evaluate("var x = 5; x"));
            Assert.AreEqual(6, TestUtils.Evaluate("var x, y = 6; y"));
            Assert.AreEqual(1, TestUtils.Evaluate("var x = 1, y = 2; x"));
            Assert.AreEqual(2, TestUtils.Evaluate("var x = 1, y = 2; y"));
            Assert.AreEqual(2, TestUtils.Evaluate("var x = Math.max(1, 2); x"));

            // Strict mode: the name "eval" is not allowed in strict mode.
            Assert.AreEqual("SyntaxError", TestUtils.EvaluateExceptionType("'use strict'; var eval = 5"));
        }
コード例 #28
0
        public void toString()
        {
            Assert.AreEqual("[object Object]", TestUtils.Evaluate("({}).toString()"));
            Assert.AreEqual("test", TestUtils.Evaluate("({ toString: function() { return 'test' } }).toString()"));

            // length
            Assert.AreEqual(0, TestUtils.Evaluate("Object.toString.length"));

            // Error in toString will result in error.
            Assert.AreEqual("Error", TestUtils.EvaluateExceptionType("({ toString: function() { throw new Error('test') } }).toString()"));

            // Addendum 7-1-10: null and undefined return their own strings.
            Assert.AreEqual("[object Undefined]", TestUtils.Evaluate("({}).toString.call(undefined)"));
            Assert.AreEqual("[object Null]", TestUtils.Evaluate("({}).toString.call(null)"));
        }
コード例 #29
0
        public void getOwnPropertyNames()
        {
            Assert.AreEqual("", TestUtils.Evaluate("Object.getOwnPropertyNames({}).toString()"));
            Assert.AreEqual("a", TestUtils.Evaluate("Object.getOwnPropertyNames({a: 'hello'}).toString()"));
            Assert.AreEqual("0,1,length", TestUtils.Evaluate("Object.getOwnPropertyNames([15, 16]).toString()"));

            // length
            Assert.AreEqual(1, TestUtils.Evaluate("Object.getOwnPropertyNames.length"));

            // Argument must be an object.
            Assert.AreEqual("TypeError", TestUtils.EvaluateExceptionType("Object.getOwnPropertyNames()"));
            Assert.AreEqual("TypeError", TestUtils.EvaluateExceptionType("Object.getOwnPropertyNames(true)"));
            Assert.AreEqual("TypeError", TestUtils.EvaluateExceptionType("Object.getOwnPropertyNames(5)"));
            Assert.AreEqual("TypeError", TestUtils.EvaluateExceptionType("Object.getOwnPropertyNames('test')"));
        }
コード例 #30
0
 public void encodeURIComponent()
 {
     Assert.AreEqual("abc", TestUtils.Evaluate("encodeURIComponent('abc')"));
     Assert.AreEqual("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_.!~*'()",
                     TestUtils.Evaluate("encodeURIComponent('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_.!~*\\'()')"));
     Assert.AreEqual("%3F", TestUtils.Evaluate("encodeURIComponent('?')"));
     Assert.AreEqual("%2F", TestUtils.Evaluate("encodeURIComponent('/')"));
     Assert.AreEqual("%23", TestUtils.Evaluate("encodeURIComponent('#')"));
     Assert.AreEqual("%5E", TestUtils.Evaluate("encodeURIComponent('^')"));
     Assert.AreEqual("%D2%A6", TestUtils.Evaluate("encodeURIComponent('Ҧ')"));
     Assert.AreEqual("%E1%B5%9D", TestUtils.Evaluate("encodeURIComponent('ᵝ')"));
     Assert.AreEqual("%F0%9D%84%9E", TestUtils.Evaluate("encodeURIComponent('\U0001D11E')"));
     Assert.AreEqual("%F0%9D%84%9Ee", TestUtils.Evaluate("encodeURIComponent('\U0001D11Ee')"));
     Assert.AreEqual("URIError", TestUtils.EvaluateExceptionType("encodeURIComponent('\uD834')"));
     Assert.AreEqual("URIError", TestUtils.EvaluateExceptionType("encodeURIComponent('\uDD1E')"));
 }