| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 |
- //-------------------------------------------------------------------------------------------------------
- // Copyright (C) Microsoft. All rights reserved.
- // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
- //-------------------------------------------------------------------------------------------------------
- function write(value)
- {
- WScript.Echo(value);
- }
- function RunTest(testCase, testCount)
- {
- var testFunction = testCase[0];
- var testScenario = testCase[1];
- testScenario = " (test " + testCount + "): " + testScenario;
- write(testScenario);
- try
- {
- var result = testFunction();
- if (result == true)
- {
- write("PASS");
- }
- }
- catch (e)
- {
- var resultString = "FAILED" + testScenario;
- write(resultString + " :: " + e.message);
- }
- }
- function RunAllTests(){
- for(var i = 0; i < testList.length; ++i){
- RunTest(testList[i], i + 1);
- }
- }
- var testList = [
- [Test1, "Object literal duplicate set/get property"],
- [Test2, "Object literal set must have exactly one argument"],
- ];
- // Utility functions
- function Verify(expression, actualValue, expectedValue)
- {
- if (!expectedValue) {
- if (actualValue) {
- write("Success: " + expression);
- } else {
- write("Failed: " + expression);
- }
- return actualValue;
- } else if (expectedValue != actualValue) {
- write("Failed: Expected " + expression + " = " + expectedValue + ", got " + actualValue);
- return false;
- }
- write("Success: Expected " + expression + " = " + expectedValue + ", got " + actualValue);
- return true;
- }
- //Tests
- write("ES 5 Object Literal grammar: parsing-only tests");
- // Test: Object literal duplicate set\get property. See ECMAScript 11.1.5.
- function Test1(args)
- {
- // duplicate property
- // This causes error only in the case when strict code mode is enabled. Strict mode is not implemented yet.
- var isOk = true;
- try
- {
- eval("function f() { var o = { foo: 1, foo: 2 }; }");
- }
- catch (ex)
- {
- isOk = Verify("duplicate data properties in object literal should not throw SyntaxError in non-strict mode", false);
- }
- // property and get
- try
- {
- eval("function f() { var o = { foo: 1, get foo() {return this.value;} }; }");
- }
- catch(ex)
- {
- isOk = Verify("data property and get with same name in object literal should not throw SyntaxError", false);
- }
- // get and property
- try
- {
- eval("function f() { var o = { get foo() {return this.value;}, foo: 1 }; }");
- }
- catch(ex)
- {
- isOk = Verify("get and data property with same name in object literal should not throw SyntaxError", false);
- }
- // property and set
- try
- {
- eval("function f() { var o = { foo: 1, set foo(arg) { this.value = arg;} }; }");
- }
- catch(ex)
- {
- isOk = Verify("data property and set with same name in object literal should not throw SyntaxError", false);
- }
- // set and property
- try
- {
- eval("function f() { var o = { set foo(arg) { this.value = arg;}, foo: 1 }; }");
- }
- catch(ex)
- {
- isOk = Verify("set and data property with same name in object literal should not throw SyntaxError", false);
- }
- try //duplicate get
- {
- eval("function f() { var o = {get foo(){return this.value;}, get foo(){return this.value*2;}}; }");
- }
- catch(ex)
- {
- isOk = Verify("duplicate get in object literal should not throw SyntaxError", false);
- }
- try //duplicate set
- {
- eval("function f() { var o = {set foo(args){this.value = args*2;}, set foo(args){ this.value = args*args}}; }");
- }
- catch(ex)
- {
- isOk = Verify("duplicate set in object literal should not throw SyntaxError", false);
- }
- try //duplicate get after get and set
- {
- eval("function f() { var o = { get foo(){ return this.value; }, set foo(arg){ this.value = arg; }, get foo(){ return this.value; } }; }");
- }
- catch(ex)
- {
- isOk = Verify("duplicate get after get and set in object literal should not throw SyntaxError", false);
- }
- try //duplicate set after set and get
- {
- eval("function f() { var o = { set foo(arg){ this.value = arg; }, get foo(){ return this.value; }, set foo(arg1){ this.value = arg1; } } }");
- }
- catch(ex)
- {
- isOk = Verify("duplicate set after get and set in object literal should not throw SyntaxError", false);
- }
- return isOk;
- }
- // Object literal set must have exactly one argument
- function Test2()
- {
- var exception;
- exception = null;
- try // setter with no arguments
- {
- eval("function f() { var o = { set foo() { this.value = 0; } } }");
- }
- catch (ex)
- {
- exception = ex;
- }
- if(!Verify("set with no arguments in object literal throws SyntaxError", true, exception instanceof SyntaxError)) return false;
- exception = null;
- try // setter with two arguments
- {
- eval("function f() { var o = { set foo(arg1, arg2) { this.value = 0; } } }");
- }
- catch (ex)
- {
- exception = ex;
- }
- if(!Verify("set with two arguments in object literal throws SyntaxError", true, exception instanceof SyntaxError)) return false;
- return true;
- }
- RunAllTests();
|