| //------------------------------------------------------------------------------------------------------- |
| // 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(v) { WScript.Echo(v + ""); } |
| |
| (function Test1() { |
| var str = "Unresolvable reference"; |
| try { |
| test1_value = 'test1 value...'; |
| } catch (e) { |
| write("Exception: " + str); |
| return; |
| } |
| write("Return: " + str); |
| })(); |
| |
| (function Test1_eval() { |
| var str = "Test1_eval: Unresolvable reference"; |
| try { |
| eval("test1_eval_value = 10"); |
| } catch (e) { |
| write("Exception: " + str); |
| return; |
| } |
| write("Return: " + str); |
| })(); |
| |
| (function Test1_1() { |
| var str = "Test1_1: Globally resolvable reference"; |
| try { |
| test1_1_value = 'value...'; // declared below |
| } catch (e) { |
| write("Exception: " + str); |
| return; |
| } |
| write("Return: " + str); |
| })(); |
| var test1_1_value; // declared globally |
| |
| (function Test1_2() { |
| (function g() { |
| var str = "Test1_2: Parent resolvable reference"; |
| try { |
| test1_2_value = 'value...'; // declared below |
| } catch (e) { |
| write("Exception: " + str); |
| return; |
| } |
| write("Return: " + str); |
| })(); |
| var test1_2_value = 0; // declared in parent |
| })(); |
| |
| var glo = this; |
| (function Test1_3() { |
| (function g() { |
| var str = "Test1_3: Explicitly bound reference"; |
| try { |
| glo.test1_3_value = 'value...'; |
| } catch (e) { |
| write("Exception: " + str); |
| return; |
| } |
| write("Return: " + str); |
| })(); |
| })(); |
| |
| (function Test1_3_eval() { |
| (function g() { |
| var str = "Test1_3_eval: Explicitly bound reference"; |
| try { |
| eval("this.test1_3_eval_value = 10"); |
| } catch (e) { |
| write("Exception: " + str); |
| return; |
| } |
| write("Return: " + str); |
| })(); |
| })(); |
| |
| (function Test2(){ |
| var str = "Readonly property"; |
| var obj = new Object(); |
| Object.defineProperty(obj, "foo", { |
| writable:false, |
| value:20 |
| }); |
| |
| try { |
| obj.foo = 30; |
| } catch(e) { |
| write("Exception: " + str); |
| return; |
| } |
| |
| write("Return: " + str); |
| })(); |
| |
| (function Test2_1(){ |
| var str = "Test2_1: Readonly property on global"; |
| Object.defineProperty(glo, "foo", { |
| writable:false, |
| value:20 |
| }); |
| |
| try { |
| foo = 30; // Implicitly assign to global |
| } catch(e) { |
| write("Exception: " + str); |
| return; |
| } |
| |
| write("Return: " + str); |
| })(); |
| |
| (function Test2_2(){ |
| var str = "Test2_2: Readonly property on global"; |
| try { |
| glo.foo = 30; // Explicitly assign to global |
| } catch(e) { |
| write("Exception: " + str); |
| return; |
| } |
| |
| write("Return: " + str); |
| })(); |
| |
| (function Test2_3(){ |
| var str = "Test2_3: Readonly property on prototype"; |
| var proto = Object.create(Object.prototype, { |
| "foo": { |
| writable:false, |
| value:20 |
| } |
| }); |
| var obj = Object.create(proto); |
| |
| try { |
| obj.foo = 30; |
| } catch(e) { |
| write("Exception: " + str); |
| return; |
| } |
| |
| write("Return: " + str); |
| })(); |
| |
| (function Test2_3_int(){ |
| var str = "Test2_3_int: Readonly property on Number prototype"; |
| Object.defineProperty(Number.prototype, "foo", { |
| writable:false, |
| configurable:true, |
| value:20 |
| }); |
| |
| try { |
| 123["foo"] = 23; |
| } catch(e) { |
| write("Exception: " + str); |
| return; |
| } finally { |
| delete Number.prototype.foo; |
| } |
| |
| write("Return: " + str); |
| })(); |
| |
| (function Test2_4(){ |
| var str = "Test2_4: Readonly property with index property name"; |
| var prop = "7"; // Use a string |
| var obj = Object.create(Object.prototype, { |
| "7": { |
| writable:false, |
| value:20 |
| } |
| }); |
| |
| try { |
| obj[prop] = 24; |
| } catch(e) { |
| write("Exception: " + str); |
| return; |
| } |
| |
| write("Return: " + str); |
| })(); |
| |
| (function Test2_4_arr(){ |
| var str = "Test2_4_arr: Readonly property on array with index property name"; |
| var prop = "7"; // Use a string |
| var obj = [0,1,2,3,4,5,6,7,8,9]; |
| Object.defineProperty(obj, prop, { |
| writable:false, |
| value:20 |
| }); |
| |
| try { |
| obj[prop] = 24; |
| } catch(e) { |
| write("Exception: " + str); |
| return; |
| } |
| |
| write("Return: " + str); |
| })(); |
| |
| (function Test2_4_eval(){ |
| var str = "Test2_4_eval: Readonly property with index property name"; |
| var prop = "7"; // Use a string |
| var obj = Object.create(Object.prototype, { |
| "7": { |
| writable:false, |
| value:20 |
| } |
| }); |
| |
| try { |
| eval("obj[prop] = 24"); |
| } catch(e) { |
| write("Exception: " + str); |
| return; |
| } |
| |
| write("Return: " + str); |
| })(); |
| |
| (function Test2_5(){ |
| var str = "Test2_5: Readonly property with index property name"; |
| var prop = 3; // Use an integer |
| var obj = Object.create(Object.prototype, { |
| "3": { |
| writable:false, |
| value:20 |
| } |
| }); |
| |
| try { |
| obj[prop] = 25; |
| } catch(e) { |
| write("Exception: " + str); |
| return; |
| } |
| |
| write("Return: " + str); |
| })(); |
| |
| (function Test2_5_arr(){ |
| var str = "Test2_5_arr: Readonly property on array with index property name"; |
| var prop = 3; // Use an integer |
| var obj = []; |
| Object.defineProperty(obj, prop, { |
| writable:false, |
| value:20 |
| }); |
| |
| try { |
| obj[prop] = 25; |
| } catch(e) { |
| write("Exception: " + str); |
| return; |
| } |
| |
| write("Return: " + str); |
| })(); |
| |
| (function Test2_5_eval(){ |
| var str = "Test2_5_eval: Readonly property with index property name"; |
| var prop = 3; // Use an integer |
| var obj = Object.create(Object.prototype, { |
| "3": { |
| writable:false, |
| value:20 |
| } |
| }); |
| |
| try { |
| eval("obj[prop] = 25"); |
| } catch(e) { |
| write("Exception: " + str); |
| return; |
| } |
| |
| write("Return: " + str); |
| })(); |
| |
| (function Test2_6(){ |
| var str = "Test2_6: Readonly property on arguments (empty)"; |
| Object.defineProperty(arguments, "1", { |
| writable:false, |
| value:20 |
| }); |
| |
| try { |
| arguments[1] = 26; |
| } catch(e) { |
| write("Exception: " + str); |
| return; |
| } |
| |
| write("Return: " + str); |
| })(); |
| |
| (function Test2_7(a,b,c){ |
| var str = "Test2_7: Readonly property on arguments (with formals)"; |
| Object.defineProperty(arguments, "1", { |
| writable:false, |
| value:20 |
| }); |
| |
| try { |
| arguments[1] = 27; |
| } catch(e) { |
| write("Exception: " + str); |
| return; |
| } |
| |
| write("Return: " + str); |
| })(270,271,272); |
| |
| (function Test2_8(a,b,c){ |
| var str = "Test2_8: Undefined setter on arguments (with formals)"; |
| Object.defineProperty(arguments, "1", { |
| get: function() { return "arguments[1] value"; } // Only getter specified |
| }); |
| |
| try { |
| arguments[1] = 28; |
| } catch(e) { |
| write("Exception: " + str); |
| return; |
| } |
| |
| write("Return: " + str); |
| })(280, 281, 282); |
| |
| (function Test2_9() { |
| var str = "Test2_9: Readonly property indexed by variable"; |
| var prop = "prop"; // Use a string |
| var obj = {}; |
| Object.defineProperty(obj, prop, { |
| writable: false, |
| value: 20 |
| }); |
| |
| try { |
| obj[prop] = 25; |
| } catch (e) { |
| write("Exception: " + str); |
| return; |
| } |
| |
| write("Return: " + str); |
| })(); |
| |
| (function Test3(){ |
| var str = "Setter undefined"; |
| var obj = new Object(); |
| Object.defineProperty(obj, "foo", { |
| set: undefined |
| }); |
| |
| try { |
| obj.foo = 30; |
| } catch(e) { |
| write("Exception: " + str); |
| return; |
| } |
| |
| write("Return: " + str); |
| })(); |
| |
| (function Test3_eval(){ |
| var str = "Test3_eval: Setter undefined"; |
| var obj = new Object(); |
| Object.defineProperty(obj, "foo", { |
| set: undefined |
| }); |
| |
| try { |
| eval("obj.foo = 30"); |
| } catch(e) { |
| write("Exception: " + str); |
| return; |
| } |
| |
| write("Return: " + str); |
| })(); |
| |
| (function Test3_1(){ |
| var str = "Test3_1: Setter undefined"; |
| var obj = new Object(); |
| Object.defineProperty(obj, "foo", { |
| get: function() { return "foo value"; } // Only getter specified |
| }); |
| |
| try { |
| obj.foo = 30; |
| } catch(e) { |
| write("Exception: " + str); |
| return; |
| } |
| |
| write("Return: " + str); |
| })(); |
| |
| (function Test3_2(){ |
| var str = "Test3_2: Setter undefined on prototype"; |
| var proto = Object.create(Object.prototype, { |
| "foo": { |
| get: function() { return "foo value"; } // Only getter specified |
| } |
| }); |
| var obj = Object.create(proto); |
| |
| try { |
| obj.foo = 30; |
| } catch(e) { |
| write("Exception: " + str); |
| return; |
| } |
| |
| write("Return: " + str); |
| })(); |
| |
| (function Test3_2_int(){ |
| var str = "Test3_2_int: Setter undefined on Number prototype"; |
| Object.defineProperty(Number.prototype, "foo", { |
| get: function() { return "foo value"; }, // Only getter defined |
| configurable:true |
| }); |
| |
| try { |
| 123["foo"] = 32; |
| } catch(e) { |
| write("Exception: " + str); |
| return; |
| } finally { |
| delete Number.prototype.foo; |
| } |
| |
| write("Return: " + str); |
| })(); |
| |
| (function Test3_3(){ |
| var str = "Test3_3: Setter undefined on index property name"; |
| var prop = "7"; // Use a string |
| var obj = Object.create(Object.prototype, { |
| "7": { |
| get: function() { return "foo value"; } // Only getter specified |
| } |
| }); |
| |
| try { |
| obj[prop] = 33; |
| } catch(e) { |
| write("Exception: " + str); |
| return; |
| } |
| |
| write("Return: " + str); |
| })(); |
| |
| (function Test3_3_arr(){ |
| var str = "Test3_3_arr: Setter undefined on array with index property name"; |
| var prop = "7"; // Use a string |
| var obj = [0,1,2,3,4,5,6,7,8]; |
| Object.defineProperty(obj, prop, { |
| get: function() { return "foo value"; } // Only getter specified |
| }); |
| |
| try { |
| obj[prop] = 33; |
| } catch(e) { |
| write("Exception: " + str); |
| return; |
| } |
| |
| write("Return: " + str); |
| })(); |
| |
| (function Test3_4(){ |
| var str = "Test3_4: Setter undefined on index property name"; |
| var prop = 7; // Use a integer |
| var obj = Object.create(Object.prototype, { |
| "7": { |
| get: function() { return "foo value"; } // Only getter specified |
| } |
| }); |
| |
| try { |
| obj[prop] = 34; |
| } catch(e) { |
| write("Exception: " + str); |
| return; |
| } |
| |
| write("Return: " + str); |
| })(); |
| |
| (function Test3_4_arr(){ |
| var str = "Test3_4_arr: Setter undefined on array with index property name"; |
| var prop = 3; // Use a integer |
| var obj = []; |
| Object.defineProperty(obj, prop, { |
| get: function() { return "foo value"; } // Only getter specified |
| }); |
| |
| try { |
| obj[prop] = 34; |
| } catch(e) { |
| write("Exception: " + str); |
| return; |
| } |
| |
| write("Return: " + str); |
| })(); |
| |
| (function Test3_5() { |
| var str = "Test3_5: Setter undefined and indexed by variable"; |
| var prop = "prop"; // Use a string |
| var obj = {}; |
| Object.defineProperty(obj, prop, { |
| get: function () { return "foo value"; } // Only getter specified |
| }); |
| |
| try { |
| obj[prop] = 25; |
| } catch (e) { |
| write("Exception: " + str); |
| return; |
| } |
| |
| write("Return: " + str); |
| })(); |
| |
| (function Test4(){ |
| var str = "Adding non-existent property to non-extensible object"; |
| var obj = new Object(); |
| Object.preventExtensions(obj); |
| |
| try { |
| obj.foo = 20; |
| } catch(e) { |
| write("Exception: " + str); |
| return; |
| } |
| write("Return: " + str); |
| })(); |
| |
| (function Test4_1(){ |
| var str = "Test4_1: Adding non-existent index property to non-extensible object"; |
| var obj = new Object(); |
| Object.preventExtensions(obj); |
| |
| try { |
| obj[3] = 20; |
| } catch(e) { |
| write("Exception: " + str); |
| return; |
| } |
| write("Return: " + str); |
| })(); |
| |
| (function Test4_arr_1(){ |
| var str = "Test4_arr_1: Adding non-existent property to non-extensible array with index property name"; |
| var obj = []; |
| var prop = "7"; // Use a string |
| Object.preventExtensions(obj); |
| |
| try { |
| obj[prop] = 4; |
| } catch(e) { |
| write("Exception: " + str); |
| return; |
| } |
| write("Return: " + str); |
| })(); |
| |
| (function Test4_arr_2(){ |
| var str = "Test4_arr_2: Adding non-existent property to non-extensible array with index property name"; |
| var obj = []; |
| var prop = 3; // Use an integer |
| Object.preventExtensions(obj); |
| |
| try { |
| obj[prop] = 4; |
| } catch(e) { |
| write("Exception: " + str); |
| return; |
| } |
| write("Return: " + str); |
| })(); |
| |
| (function Test5(){ |
| var str = "Postfix increment to non-writable property"; |
| var obj = new Object(); |
| Object.defineProperty(obj, "foo", { |
| writable:false, |
| value:20 |
| }); |
| try { |
| obj.foo++; |
| } catch(e) { |
| write("Exception: " + str); |
| return; |
| } |
| write("Return: " + str); |
| } )(); |
| |
| (function Test6(){ |
| var str = "Postfix increment on non-extensible object's non-existent property"; |
| var obj = new Object(); |
| Object.preventExtensions(obj); |
| |
| try { |
| obj.foo++; |
| } catch(e) { |
| write("Exception: " + str); |
| return; |
| } |
| write("Return: " + str); |
| } )(); |
| |
| (function Test7(){ |
| var str = "Assign NaN of globalObject via property"; |
| var globalObject = Function("return this;")(); |
| try { |
| globalObject.NaN = "blah"; |
| } catch(e) { |
| write("Exception: " + str); |
| return; |
| } |
| write("Return: " + str); |
| } )(); |
| |
| (function Test8(){ |
| var str = "Assign Infinity of globalObject via indexer/literal"; |
| var globalObject = Function("return this;")(); |
| try { |
| globalObject[Infinity] = "blah"; |
| } catch(e) { |
| write("Exception: " + str); |
| return; |
| } |
| write("Return: " + str); |
| } )(); |
| |
| (function Test9(){ |
| var str = "Assign Infinity of globalObject via indexer/string"; |
| var globalObject = Function("return this;")(); |
| try { |
| globalObject["Infinity"] = "blah"; |
| } catch(e) { |
| write("Exception: " + str); |
| return; |
| } |
| write("Return: " + str); |
| } )(); |