arguments2.js 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448
  1. //-------------------------------------------------------------------------------------------------------
  2. // Copyright (C) Microsoft. All rights reserved.
  3. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
  4. //-------------------------------------------------------------------------------------------------------
  5. function write(v) { WScript.Echo(v + ""); }
  6. var errorCount = 0;
  7. var r;
  8. function verify(scen, act, exp) {
  9. write(scen + " : " + act);
  10. if (act !== exp) {
  11. write("FAILED : " + scen + " exp: " + exp + " act : " + act);
  12. errorCount++;
  13. } else {
  14. write("PASSED : " + scen + " exp: " + exp + " act : " + act);
  15. }
  16. }
  17. // --------------------------------------------------------------------------------------------------
  18. function Test1(a, b) {
  19. write(arguments.hasOwnProperty("0"));
  20. write(arguments.hasOwnProperty("length"));
  21. return arguments[0] + arguments[1];
  22. }
  23. r = Test1(10, 20);
  24. verify("Test1", r, 30);
  25. // --------------------------------------------------------------------------------------------------
  26. function Test2(a, b) {
  27. a = 100;
  28. verify("Test2 arguments[0]", arguments[0], 100);
  29. b = 200;
  30. verify("Test2 arguments[1]", arguments[1], 200);
  31. arguments[0] = 300;
  32. verify("Test2 a", a, 300);
  33. arguments[1] = 400;
  34. verify("Test2 b", b, 400);
  35. return a + b + arguments[0] + arguments[1];
  36. }
  37. r = Test2(10, 20);
  38. verify("Test2", r, 1400);
  39. // --------------------------------------------------------------------------------------------------
  40. function Test3(a, b) {
  41. var arguments = new Object();
  42. if (arguments[0] == a)
  43. verify("Test3 a", a);
  44. if (arguments[1] == b)
  45. verify("Test3 b", b);
  46. arguments[0] = a;
  47. arguments[1] = b;
  48. a = a + 1;
  49. b = b + 1;
  50. if (arguments[0] == a)
  51. verify("Test3 a1", a);
  52. if (arguments[1] == b)
  53. verify("Test3 b1", b);
  54. return 0;
  55. }
  56. r = Test3(10, 20);
  57. verify("Test3", r, 0);
  58. // --------------------------------------------------------------------------------------------------
  59. function Test4(a, b, arguments) {
  60. if (arguments[0] == a)
  61. verify("Test4 a", a);
  62. if (arguments[1] == b)
  63. verify("Test4 b", b);
  64. arguments[0] = a;
  65. arguments[1] = b;
  66. a = a + 1;
  67. b = b + 1;
  68. if (arguments[0] == a)
  69. verify("Test4 a1", a);
  70. if (arguments[1] == b)
  71. verify("Test4 b1", b);
  72. return 0;
  73. }
  74. r = Test4(10, 20, new Object());
  75. verify("Test4", r, 0);
  76. // --------------------------------------------------------------------------------------------------
  77. function Test5(a, b) {
  78. var count = 0;
  79. arguments[0] = 100;
  80. arguments[1] = 200;
  81. for (var i in arguments) {
  82. count++;
  83. }
  84. return count;
  85. }
  86. r = Test5(10);
  87. verify("Test5 1", r, 2);
  88. r = Test5(10, 20);
  89. verify("Test5 2", r, 2);
  90. r = Test5(10, 20, 30);
  91. verify("Test5 3", r, 3);
  92. // --------------------------------------------------------------------------------------------------
  93. function Test6(a, b) {
  94. var count = 0;
  95. for (var i in arguments) {
  96. count = count + 1;
  97. }
  98. return count;
  99. }
  100. r = Test6(10);
  101. verify("Test6 1", r, 1);
  102. r = Test6(10, 20);
  103. verify("Test6 2", r, 2);
  104. r = Test6(10, 20, 30);
  105. verify("Test6 3", r, 3);
  106. // --------------------------------------------------------------------------------------------------
  107. function Test7() {
  108. return arguments.length;
  109. }
  110. r = Test7();
  111. verify("Test7", r, 0);
  112. r = Test7(10, 20);
  113. verify("Test7", r, 2);
  114. // --------------------------------------------------------------------------------------------------
  115. var callCount = 5;
  116. function Test8() {
  117. var calledCount = 0;
  118. write("Test8 : " + callCount);
  119. if (callCount != 0) {
  120. callCount = callCount - 1;
  121. calledCount = arguments.callee() + 1;
  122. }
  123. return calledCount;
  124. }
  125. r = Test8();
  126. verify("Test8", r, 5);
  127. // --------------------------------------------------------------------------------------------------
  128. function Test9() {
  129. write(arguments.hasOwnProperty("length"));
  130. write(arguments[0] + " " + arguments[1] + " " + arguments.length);
  131. arguments.length = "test";
  132. write(arguments[0] + " " + arguments[1] + " " + arguments.length);
  133. write(arguments.hasOwnProperty("0"));
  134. write(arguments.hasOwnProperty("length"));
  135. return arguments.length;
  136. }
  137. r = Test9();
  138. verify("Test9", r, "test");
  139. r = Test9(10);
  140. verify("Test9", r, "test");
  141. r = Test9(10, 20);
  142. verify("Test9", r, "test");
  143. r = Test9(10, 20, 30);
  144. verify("Test9", r, "test");
  145. // --------------------------------------------------------------------------------------------------
  146. // Test arguments for-in enumeration
  147. function dump_props(obj) {
  148. var s = "";
  149. for (p in obj) {
  150. if (!s) {
  151. s = "[" + p + ": " + obj[p];
  152. } else {
  153. s += ", " + p + ": " + obj[p];
  154. }
  155. }
  156. if (s) {
  157. s += "]";
  158. } else {
  159. s = "[]";
  160. }
  161. return s;
  162. }
  163. //
  164. // simply dump args
  165. //
  166. var dump_args = function (a, b) {
  167. return dump_props(arguments);
  168. }
  169. verify("Test10.1",
  170. dump_args(),
  171. "[]");
  172. verify("Test10.1",
  173. dump_args(13),
  174. "[0: 13]");
  175. verify("Test10.1",
  176. dump_args(13, 24),
  177. "[0: 13, 1: 24]");
  178. verify("Test10.1",
  179. dump_args(13, 24, "string", true),
  180. "[0: 13, 1: 24, 2: string, 3: true]");
  181. //
  182. // make some changes then dump
  183. //
  184. dump_args = function (a, b) {
  185. arguments[0] = 98;
  186. b = 54;
  187. arguments[8] = false;
  188. arguments[10] = 21;
  189. arguments.foo = 'bar';
  190. return dump_props(arguments);
  191. }
  192. verify("Test10.2",
  193. dump_args(),
  194. "[0: 98, 8: false, 10: 21, foo: bar]");
  195. verify("Test10.2",
  196. dump_args(13),
  197. "[0: 98, 8: false, 10: 21, foo: bar]");
  198. verify("Test10.2",
  199. dump_args(13, 24),
  200. "[0: 98, 1: 54, 8: false, 10: 21, foo: bar]");
  201. verify("Test10.2",
  202. dump_args(13, 24, "string", true),
  203. "[0: 98, 1: 54, 2: string, 3: true, 8: false, 10: 21, foo: bar]");
  204. //
  205. // delete and dump
  206. //
  207. var get_args = function (a0, a1, a2, a3, a4) {
  208. return arguments;
  209. }
  210. var delete_args_test = function (args, exp_del, exp_set) {
  211. delete args[1];
  212. delete args[3];
  213. verify("Test10.3.1", dump_props(args), exp_del);
  214. args.foo = "bar";
  215. args[6] = "arg6";
  216. args[2] = "arg2";
  217. args[1] = "arg1";
  218. verify("Test10.3.2", dump_props(args), exp_set);
  219. }
  220. delete_args_test(get_args(),
  221. "[]",
  222. "[1: arg1, 2: arg2, 6: arg6, foo: bar]"
  223. );
  224. delete_args_test(get_args(13),
  225. "[0: 13]",
  226. "[0: 13, 1: arg1, 2: arg2, 6: arg6, foo: bar]"
  227. );
  228. delete_args_test(get_args(13, 24),
  229. "[0: 13]", //[1] deleted
  230. "[0: 13, 1: arg1, 2: arg2, 6: arg6, foo: bar]"
  231. // [1] set after formal args
  232. );
  233. delete_args_test(get_args(13, 24, "string", true),
  234. "[0: 13, 2: string]", //[1][3] deleted
  235. "[0: 13, 2: arg2, 1: arg1, 6: arg6, foo: bar]"
  236. //[1] set after formal args [0][2]
  237. );
  238. function Test11() {
  239. var _t11;
  240. function inner11() {
  241. arguments.valueOf = function() { _t11 = this; }
  242. var x = arguments++;
  243. return x;
  244. }
  245. inner11("sentinel");
  246. verify("Test11 args", _t11[0], "sentinel");
  247. }
  248. Test11();
  249. function Test12() {
  250. function inner12() {
  251. throw arguments;
  252. }
  253. try {
  254. inner12("sentinel");
  255. } catch (e) {
  256. verify("Test12 args", e[0], "sentinel");
  257. }
  258. }
  259. Test12();
  260. function Test13() {
  261. var _t13;
  262. function inner13() {
  263. arguments.capture = function() { _t13 = this }
  264. with(arguments)
  265. capture();
  266. }
  267. inner13("sentinel");
  268. verify("Test13 args", _t13[0], "sentinel");
  269. }
  270. Test13();
  271. function TestBuiltInProperty(propName) {
  272. write("");
  273. write("-------Testing built-in " + propName + " Implementation----");
  274. verify("HasOwnProperty() test", arguments.hasOwnProperty(propName), true);
  275. verify("IsEnumerable() test", arguments.propertyIsEnumerable(propName), false);
  276. arguments[propName] = 40;
  277. verify("Overriding value test", arguments[propName], 40);
  278. delete arguments[propName];
  279. verify("HasOwnProperty() after deletion test", arguments.hasOwnProperty(propName), false);
  280. verify("Value after deletion test", arguments[propName], undefined);
  281. }
  282. TestBuiltInProperty("callee");
  283. TestBuiltInProperty("length");
  284. function Test15() {
  285. var count = 0;
  286. arguments.length += 10;
  287. arguments.length -= 10;
  288. arguments[0] = 100;
  289. arguments[1] = 200;
  290. for (var i in arguments) {
  291. count++;
  292. }
  293. verify("Test15", count, 2);
  294. }
  295. Test15();
  296. function Test16() {
  297. verify("Test16", arguments.length, 3);
  298. function Test16_inner() {
  299. eval("");
  300. }
  301. }
  302. Test16(1, 2, 3);
  303. function Test17(a) {
  304. verify("Test17.1", arguments.length, 1);
  305. verify("Test17.2", a, "Feb20");
  306. function Test17_inner() {
  307. eval("");
  308. }
  309. }
  310. Test17("Feb20");
  311. // Test that changing arguments in one function is reflected in the caller
  312. function Test18_Helper() {
  313. Test18_Helper.caller.arguments.Test18_Value = "Test 18 Value";
  314. }
  315. function Test18() {
  316. verify("Test18.1", arguments.Test18_Value, undefined);
  317. Test18_Helper();
  318. verify("Test18.2", arguments.Test18_Value, "Test 18 Value");
  319. }
  320. Test18();
  321. function Test19(flag)
  322. {
  323. if (flag)
  324. {
  325. write("test19 called");
  326. }
  327. else
  328. {
  329. Test19_Helper();
  330. }
  331. }
  332. function Test19_Helper()
  333. {
  334. arguments.callee.caller(true);
  335. }
  336. Test19();
  337. // --------------------------------------------------------------------------------------------------
  338. if (errorCount > 0) {
  339. write(errorCount + " Tests ");
  340. throw new Error(errorCount);
  341. }