InlineConstructors.js 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  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. var tests = [
  6. function () { return new Constructor(); },
  7. function () { return new Constructor(0, 1); },
  8. function () { return new Constructor(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); },
  9. function () { return new Constructor(0, new Constructor(0, 1).p, new ApplyArgsConstructor(0, 1).p); },
  10. function () { return new ApplyArgsConstructor(); },
  11. function () { return new ApplyArgsConstructor(0, 1); },
  12. function () { return new ApplyArgsConstructor(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); },
  13. function () { return new ApplyArgsConstructor(0, new Constructor(0, 1).p, new ApplyArgsConstructor(0, 1).p); },
  14. function () { return new RecursiveConstructor(); },
  15. function () { return new RecursiveConstructor(0, 1); },
  16. function () { return new RecursiveConstructor(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); },
  17. function () { return new RecursiveConstructor(0, new Constructor(0, 1).p, new ApplyArgsConstructor(0, 1).p); },
  18. function () { return new RecursiveApplyArgsConstructor(); },
  19. function () { return new RecursiveApplyArgsConstructor(0, 1); },
  20. function () { return new RecursiveApplyArgsConstructor(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); },
  21. function () { return new RecursiveApplyArgsConstructor(0, new Constructor(0, 1).p, new ApplyArgsConstructor(0, 1).p); },
  22. function () { return new ReturningConstructor(); },
  23. function () { return new ReturningConstructor(0, 1); },
  24. function () { return new ReturningConstructor(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); },
  25. function () { return new ReturningConstructor(0, new Constructor(0, 1).p, new ApplyArgsConstructor(0, 1).p); },
  26. function () { return new ReturningApplyArgsConstructor(); },
  27. function () { return new ReturningApplyArgsConstructor(0, 1); },
  28. function () { return new ReturningApplyArgsConstructor(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); },
  29. function () { return new ReturningApplyArgsConstructor(0, new Constructor(0, 1).p, new ApplyArgsConstructor(0, 1).p); },
  30. function () { return new ReturningRecursiveConstructor(); },
  31. function () { return new ReturningRecursiveConstructor(0, 1); },
  32. function () { return new ReturningRecursiveConstructor(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); },
  33. function () { return new ReturningRecursiveConstructor(0, new Constructor(0, 1).p, new ApplyArgsConstructor(0, 1).p); },
  34. function () { return new ReturningRecursiveApplyArgsConstructor(); },
  35. function () { return new ReturningRecursiveApplyArgsConstructor(0, 1); },
  36. function () { return new ReturningRecursiveApplyArgsConstructor(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); },
  37. function () { return new ReturningRecursiveApplyArgsConstructor(0, new Constructor(0, 1).p, new ApplyArgsConstructor(0, 1).p); },
  38. ];
  39. for(var i = 0; i < tests.length; ++i) {
  40. echo(tests[i]);
  41. echo("New object: ", tests[i]());
  42. echo();
  43. }
  44. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  45. // Test helpers
  46. function Constructor(a) {
  47. echo(arguments);
  48. this.p = a ? a : 0;
  49. }
  50. function ApplyArgsConstructor() {
  51. Constructor.apply(this, arguments);
  52. }
  53. function RecursiveConstructor(a) {
  54. echo(arguments);
  55. this.p = a ? new RecursiveConstructor(0).p : new Constructor(a).p;
  56. }
  57. function RecursiveApplyArgsConstructor(a) {
  58. echo(arguments);
  59. this.p = a ? new RecursiveApplyArgsConstructor(0).p : new ApplyArgsConstructor(a).p;
  60. }
  61. function ReturningConstructor(a) {
  62. echo(arguments);
  63. return { q: a ? a : 0 };
  64. }
  65. function ReturningApplyArgsConstructor() {
  66. return ReturningConstructor.apply(this, arguments);
  67. }
  68. function ReturningRecursiveConstructor(a) {
  69. echo(arguments);
  70. return { q: a ? new ReturningRecursiveConstructor(0).q : new ReturningConstructor(a).q };
  71. }
  72. function ReturningRecursiveApplyArgsConstructor(a) {
  73. echo(arguments);
  74. return { q: a ? new ReturningRecursiveApplyArgsConstructor(0).q : new ReturningApplyArgsConstructor(a).q };
  75. }
  76. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  77. function myToString(o, quoteStrings) {
  78. switch(o) {
  79. case null:
  80. case undefined:
  81. case -Infinity:
  82. case Infinity:
  83. return "" + o;
  84. }
  85. switch(typeof o) {
  86. case "boolean":
  87. return "" + o;
  88. case "number":
  89. {
  90. if(o === 0 && 1 / o < 0)
  91. return "-0";
  92. var s = "" + o;
  93. var i = s.indexOf("e");
  94. var end = i === -1 ? s.length : e;
  95. i = s.indexOf(".");
  96. var start = i === -1 ? 0 : i + 1;
  97. if(start !== 0) {
  98. if((end - start) % 3 !== 0)
  99. end += 3 - (end - start) % 3;
  100. for(i = end - 3; i > start; i -= 3)
  101. s = s.substring(0, i) + "," + s.substring(i);
  102. end = start - 1;
  103. start = 0;
  104. }
  105. for(i = end - 3; i > start; i -= 3)
  106. s = s.substring(0, i) + "," + s.substring(i);
  107. return s;
  108. }
  109. case "string":
  110. {
  111. var hex = "0123456789abcdef";
  112. var s = "";
  113. for(var i = 0; i < o.length; ++i) {
  114. var c = o.charCodeAt(i);
  115. switch(c) {
  116. case 0x0:
  117. s += "\\0";
  118. continue;
  119. case 0x8:
  120. s += "\\b";
  121. continue;
  122. case 0xb:
  123. s += "\\v";
  124. continue;
  125. case 0xc:
  126. s += "\\f";
  127. continue;
  128. }
  129. if(quoteStrings) {
  130. switch(c) {
  131. case 0x9:
  132. s += "\\t";
  133. continue;
  134. case 0xa:
  135. s += "\\n";
  136. continue;
  137. case 0xd:
  138. s += "\\r";
  139. continue;
  140. case 0x22:
  141. s += "\\\"";
  142. continue;
  143. case 0x5c:
  144. s += "\\\\";
  145. continue;
  146. }
  147. }
  148. if(c >= 0x20 && c < 0x7f)
  149. s += o.charAt(i);
  150. else if(c <= 0xff)
  151. s += "\\x" + hex.charAt((c >> 4) & 0xf) + hex.charAt(c & 0xf);
  152. else
  153. s += "\\u" + hex.charAt((c >> 12) & 0xf) + hex.charAt((c >> 8) & 0xf) + hex.charAt((c >> 4) & 0xf) + hex.charAt(c & 0xf);
  154. }
  155. if(quoteStrings)
  156. s = "\"" + s + "\"";
  157. return s;
  158. }
  159. case "object":
  160. case "function":
  161. break;
  162. default:
  163. return "<unknown type '" + typeof o + "'>";
  164. }
  165. if(o instanceof Array) {
  166. var s = "[";
  167. for(var i = 0; i < o.length; ++i) {
  168. if(i)
  169. s += ", ";
  170. s += myToString(o[i], true);
  171. }
  172. return s + "]";
  173. }
  174. if(o instanceof Error)
  175. return o.name + ": " + o.message;
  176. if(o instanceof RegExp)
  177. return o.toString() + (o.lastIndex === 0 ? "" : " (lastIndex: " + o.lastIndex + ")");
  178. if(o instanceof Object && !(o instanceof Function)) {
  179. var s = "";
  180. for(var p in o)
  181. s += myToString(p) + ": " + myToString(o[p], true) + ", ";
  182. if(s.length !== 0)
  183. s = s.substring(0, s.length - ", ".length);
  184. return "{" + s + "}";
  185. }
  186. return "" + o;
  187. }
  188. function echo() {
  189. var doEcho;
  190. if(this.WScript)
  191. doEcho = function (s) { this.WScript.Echo(s); };
  192. else if(this.document)
  193. doEcho = function (s) {
  194. var div = this.document.createElement("div");
  195. div.innerText = s;
  196. this.document.body.appendChild(div);
  197. };
  198. else
  199. doEcho = function (s) { this.print(s); };
  200. echo = function () {
  201. var s = "";
  202. for(var i = 0; i < arguments.length; ++i)
  203. s += myToString(arguments[i]);
  204. doEcho(s);
  205. };
  206. echo.apply(this, arguments);
  207. }