| //------------------------------------------------------------------------------------------------------- |
| // 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 + ""); } |
| |
| var errorCount = 0; |
| var r; |
| |
| function verify(scen, act, exp) { |
| write(scen + " : " + act); |
| if (act !== exp) { |
| write("FAILED : " + scen + " exp: " + exp + " act : " + act); |
| errorCount++; |
| } else { |
| write("PASSED : " + scen + " exp: " + exp + " act : " + act); |
| } |
| } |
| |
| // -------------------------------------------------------------------------------------------------- |
| function Test1(a, b) { |
| write(arguments.hasOwnProperty("0")); |
| write(arguments.hasOwnProperty("length")); |
| return arguments[0] + arguments[1]; |
| } |
| |
| r = Test1(10, 20); |
| verify("Test1", r, 30); |
| |
| // -------------------------------------------------------------------------------------------------- |
| function Test2(a, b) { |
| a = 100; |
| verify("Test2 arguments[0]", arguments[0], 100); |
| |
| b = 200; |
| verify("Test2 arguments[1]", arguments[1], 200); |
| |
| arguments[0] = 300; |
| verify("Test2 a", a, 300); |
| |
| arguments[1] = 400; |
| verify("Test2 b", b, 400); |
| |
| return a + b + arguments[0] + arguments[1]; |
| } |
| |
| r = Test2(10, 20); |
| verify("Test2", r, 1400); |
| |
| // -------------------------------------------------------------------------------------------------- |
| function Test3(a, b) { |
| var arguments = new Object(); |
| |
| if (arguments[0] == a) |
| verify("Test3 a", a); |
| |
| if (arguments[1] == b) |
| verify("Test3 b", b); |
| |
| arguments[0] = a; |
| arguments[1] = b; |
| |
| a = a + 1; |
| b = b + 1; |
| |
| if (arguments[0] == a) |
| verify("Test3 a1", a); |
| |
| if (arguments[1] == b) |
| verify("Test3 b1", b); |
| |
| return 0; |
| } |
| |
| r = Test3(10, 20); |
| verify("Test3", r, 0); |
| |
| // -------------------------------------------------------------------------------------------------- |
| function Test4(a, b, arguments) { |
| if (arguments[0] == a) |
| verify("Test4 a", a); |
| |
| if (arguments[1] == b) |
| verify("Test4 b", b); |
| |
| arguments[0] = a; |
| arguments[1] = b; |
| |
| a = a + 1; |
| b = b + 1; |
| |
| if (arguments[0] == a) |
| verify("Test4 a1", a); |
| |
| if (arguments[1] == b) |
| verify("Test4 b1", b); |
| |
| return 0; |
| } |
| |
| r = Test4(10, 20, new Object()); |
| verify("Test4", r, 0); |
| |
| // -------------------------------------------------------------------------------------------------- |
| function Test5(a, b) { |
| var count = 0; |
| |
| arguments[0] = 100; |
| arguments[1] = 200; |
| |
| for (var i in arguments) { |
| count++; |
| } |
| |
| return count; |
| } |
| |
| r = Test5(10); |
| verify("Test5 1", r, 2); |
| |
| r = Test5(10, 20); |
| verify("Test5 2", r, 2); |
| |
| r = Test5(10, 20, 30); |
| verify("Test5 3", r, 3); |
| |
| // -------------------------------------------------------------------------------------------------- |
| function Test6(a, b) { |
| var count = 0; |
| |
| for (var i in arguments) { |
| count = count + 1; |
| } |
| |
| return count; |
| } |
| |
| r = Test6(10); |
| verify("Test6 1", r, 1); |
| |
| r = Test6(10, 20); |
| verify("Test6 2", r, 2); |
| |
| r = Test6(10, 20, 30); |
| verify("Test6 3", r, 3); |
| |
| // -------------------------------------------------------------------------------------------------- |
| function Test7() { |
| return arguments.length; |
| } |
| |
| r = Test7(); |
| verify("Test7", r, 0); |
| |
| r = Test7(10, 20); |
| verify("Test7", r, 2); |
| |
| // -------------------------------------------------------------------------------------------------- |
| var callCount = 5; |
| function Test8() { |
| var calledCount = 0; |
| write("Test8 : " + callCount); |
| if (callCount != 0) { |
| callCount = callCount - 1; |
| calledCount = arguments.callee() + 1; |
| } |
| return calledCount; |
| } |
| |
| r = Test8(); |
| verify("Test8", r, 5); |
| |
| // -------------------------------------------------------------------------------------------------- |
| |
| function Test9() { |
| write(arguments.hasOwnProperty("length")); |
| write(arguments[0] + " " + arguments[1] + " " + arguments.length); |
| |
| arguments.length = "test"; |
| |
| write(arguments[0] + " " + arguments[1] + " " + arguments.length); |
| write(arguments.hasOwnProperty("0")); |
| write(arguments.hasOwnProperty("length")); |
| |
| return arguments.length; |
| } |
| |
| r = Test9(); |
| verify("Test9", r, "test"); |
| |
| r = Test9(10); |
| verify("Test9", r, "test"); |
| |
| r = Test9(10, 20); |
| verify("Test9", r, "test"); |
| |
| r = Test9(10, 20, 30); |
| verify("Test9", r, "test"); |
| |
| // -------------------------------------------------------------------------------------------------- |
| // Test arguments for-in enumeration |
| |
| function dump_props(obj) { |
| var s = ""; |
| for (p in obj) { |
| if (!s) { |
| s = "[" + p + ": " + obj[p]; |
| } else { |
| s += ", " + p + ": " + obj[p]; |
| } |
| } |
| |
| if (s) { |
| s += "]"; |
| } else { |
| s = "[]"; |
| } |
| return s; |
| } |
| |
| // |
| // simply dump args |
| // |
| var dump_args = function (a, b) { |
| return dump_props(arguments); |
| } |
| |
| verify("Test10.1", |
| dump_args(), |
| "[]"); |
| |
| verify("Test10.1", |
| dump_args(13), |
| "[0: 13]"); |
| |
| verify("Test10.1", |
| dump_args(13, 24), |
| "[0: 13, 1: 24]"); |
| |
| verify("Test10.1", |
| dump_args(13, 24, "string", true), |
| "[0: 13, 1: 24, 2: string, 3: true]"); |
| |
| // |
| // make some changes then dump |
| // |
| dump_args = function (a, b) { |
| arguments[0] = 98; |
| b = 54; |
| arguments[8] = false; |
| arguments[10] = 21; |
| arguments.foo = 'bar'; |
| return dump_props(arguments); |
| } |
| |
| verify("Test10.2", |
| dump_args(), |
| "[0: 98, 8: false, 10: 21, foo: bar]"); |
| |
| verify("Test10.2", |
| dump_args(13), |
| "[0: 98, 8: false, 10: 21, foo: bar]"); |
| |
| verify("Test10.2", |
| dump_args(13, 24), |
| "[0: 98, 1: 54, 8: false, 10: 21, foo: bar]"); |
| |
| verify("Test10.2", |
| dump_args(13, 24, "string", true), |
| "[0: 98, 1: 54, 2: string, 3: true, 8: false, 10: 21, foo: bar]"); |
| |
| // |
| // delete and dump |
| // |
| var get_args = function (a0, a1, a2, a3, a4) { |
| return arguments; |
| } |
| |
| var delete_args_test = function (args, exp_del, exp_set) { |
| delete args[1]; |
| delete args[3]; |
| verify("Test10.3.1", dump_props(args), exp_del); |
| args.foo = "bar"; |
| args[6] = "arg6"; |
| args[2] = "arg2"; |
| args[1] = "arg1"; |
| verify("Test10.3.2", dump_props(args), exp_set); |
| } |
| |
| delete_args_test(get_args(), |
| "[]", |
| "[1: arg1, 2: arg2, 6: arg6, foo: bar]" |
| ); |
| |
| delete_args_test(get_args(13), |
| "[0: 13]", |
| "[0: 13, 1: arg1, 2: arg2, 6: arg6, foo: bar]" |
| ); |
| |
| delete_args_test(get_args(13, 24), |
| "[0: 13]", //[1] deleted |
| "[0: 13, 1: arg1, 2: arg2, 6: arg6, foo: bar]" |
| // [1] set after formal args |
| ); |
| |
| delete_args_test(get_args(13, 24, "string", true), |
| "[0: 13, 2: string]", //[1][3] deleted |
| "[0: 13, 2: arg2, 1: arg1, 6: arg6, foo: bar]" |
| //[1] set after formal args [0][2] |
| ); |
| |
| function Test11() { |
| var _t11; |
| |
| function inner11() { |
| arguments.valueOf = function() { _t11 = this; } |
| |
| var x = arguments++; |
| return x; |
| } |
| |
| inner11("sentinel"); |
| verify("Test11 args", _t11[0], "sentinel"); |
| } |
| |
| Test11(); |
| |
| function Test12() { |
| function inner12() { |
| throw arguments; |
| } |
| |
| try { |
| inner12("sentinel"); |
| } catch (e) { |
| verify("Test12 args", e[0], "sentinel"); |
| } |
| } |
| |
| Test12(); |
| |
| function Test13() { |
| var _t13; |
| |
| function inner13() { |
| arguments.capture = function() { _t13 = this } |
| |
| with(arguments) |
| capture(); |
| } |
| |
| inner13("sentinel"); |
| verify("Test13 args", _t13[0], "sentinel"); |
| } |
| |
| Test13(); |
| |
| function TestBuiltInProperty(propName) { |
| write(""); |
| write("-------Testing built-in " + propName + " Implementation----"); |
| verify("HasOwnProperty() test", arguments.hasOwnProperty(propName), true); |
| verify("IsEnumerable() test", arguments.propertyIsEnumerable(propName), false); |
| arguments[propName] = 40; |
| verify("Overriding value test", arguments[propName], 40); |
| delete arguments[propName]; |
| verify("HasOwnProperty() after deletion test", arguments.hasOwnProperty(propName), false); |
| verify("Value after deletion test", arguments[propName], undefined); |
| } |
| |
| TestBuiltInProperty("callee"); |
| TestBuiltInProperty("length"); |
| |
| function Test15() { |
| var count = 0; |
| |
| arguments.length += 10; |
| arguments.length -= 10; |
| |
| arguments[0] = 100; |
| arguments[1] = 200; |
| |
| for (var i in arguments) { |
| count++; |
| } |
| |
| verify("Test15", count, 2); |
| } |
| |
| Test15(); |
| |
| function Test16() { |
| verify("Test16", arguments.length, 3); |
| function Test16_inner() { |
| eval(""); |
| } |
| } |
| |
| Test16(1, 2, 3); |
| |
| function Test17(a) { |
| verify("Test17.1", arguments.length, 1); |
| verify("Test17.2", a, "Feb20"); |
| function Test17_inner() { |
| eval(""); |
| } |
| } |
| |
| Test17("Feb20"); |
| |
| // Test that changing arguments in one function is reflected in the caller |
| |
| function Test18_Helper() { |
| Test18_Helper.caller.arguments.Test18_Value = "Test 18 Value"; |
| } |
| |
| function Test18() { |
| verify("Test18.1", arguments.Test18_Value, undefined); |
| Test18_Helper(); |
| verify("Test18.2", arguments.Test18_Value, undefined); |
| } |
| |
| Test18(); |
| |
| function Test19(flag) |
| { |
| if (flag) |
| { |
| write("test19 called"); |
| } |
| else |
| { |
| Test19_Helper(); |
| } |
| } |
| |
| function Test19_Helper() |
| { |
| arguments.callee.caller(true); |
| } |
| Test19(); |
| |
| // -------------------------------------------------------------------------------------------------- |
| |
| if (errorCount > 0) { |
| write(errorCount + " Tests "); |
| throw new Error(errorCount); |
| } |