NumericLiteralTest.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  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. WScript.LoadScriptFile("..\\UnitTestFramework\\UnitTestFramework.js");
  6. var tests = [
  7. {
  8. name: "Digit must follow leading 0<x|o|b> Numeric Literal Identifier Test",
  9. body: function ()
  10. {
  11. assert.throws(function () { eval("0b"); }, SyntaxError,"0b should not be valid");
  12. assert.throws(function () { eval("0o"); }, SyntaxError,"0o should not be valid");
  13. assert.throws(function () { eval("0x"); }, SyntaxError,"0x should not be valid");
  14. }
  15. },
  16. {
  17. name: "Octal Brute Force number Check",
  18. body: function ()
  19. {
  20. var o = [0o0 ,0o1 ,0o2 ,0o3 ,0o4 ,0o5 ,0o6 ,0o7,0o10,
  21. 0o11,0o12,0o13,0o14,0o15,0o16,0o17
  22. ];
  23. for(var i = 0; i < o.length;i++)
  24. {
  25. assert.areEqual(i,o[i],"decimal literal: ",i," should equal octal literal: ",o[i]);
  26. }
  27. }
  28. },
  29. {
  30. name: "Octal and Binary Number Constructor",
  31. body: function ()
  32. {
  33. assert.areEqual(1, Number('0b1'));
  34. assert.areEqual(3, Number('0b11'));
  35. assert.areEqual(NaN,Number('0b2'));
  36. assert.areEqual(1, Number('0o1'));
  37. assert.areEqual(NaN,Number('0o9'));
  38. }
  39. },
  40. {
  41. name: "Octal Syntax Test (leading zeros, unexpected characters, & lower and upper case O",
  42. body: function ()
  43. {
  44. var o = 0o765;
  45. var o1 = 0o102;
  46. var o2 = 0O543;
  47. var o3 = 0O000000000543;
  48. assert.throws(function () { eval("0o108"); }, SyntaxError,"an octal can't have an 8");
  49. assert.throws(function () { eval("0o10B"); }, SyntaxError,"an octal can't have a hex digit");
  50. assert.throws(function () { eval("0o109"); }, SyntaxError,"an octal can't have a 9");
  51. assert.areEqual(501, o, "lower case O test");
  52. assert.areEqual(66, o1, "lower case O test 2");
  53. assert.areEqual(355, o2, "upper case O test");
  54. assert.areEqual(355, o3, "leading 0 test");
  55. }
  56. },
  57. {
  58. name: "Octal Addition,Subtraction,Division, & Multiplication Test",
  59. body: function ()
  60. {
  61. var o1 = 0o10 + 0o6;
  62. var o2 = 0o12 - 0o5;
  63. var o3 = 0o17 * 0o2;
  64. var o4 = 0o22 / 0o11;
  65. var o5 = 0o13 / 0o10;
  66. assert.areEqual(14, o1,"Addition Test");
  67. assert.areEqual(5, o2,"Subtraction Test");
  68. assert.areEqual(30, o3,"Multiplication Test");
  69. assert.areEqual(2, o4,"simple division Test");
  70. assert.areEqual(1.375,o5,"Make sure decimal numbers work properly after division");
  71. }
  72. },
  73. {
  74. name: "Octal bitwise Operator Test",
  75. body: function ()
  76. {
  77. var o1 = 0o1 & 0o10;
  78. var o2 = 0o4 | 0o6;
  79. var o3 = 0o2 ^ 0o3;
  80. var o4 = 0o4 | 0o2;
  81. var o5 = 0o6 & 0o3;
  82. var o6 = 0o2 ^ 0o5;
  83. var o7 = ~0o10;
  84. assert.areEqual(0,o1, "bitwise And Test when no bit line up");
  85. assert.areEqual(6,o2, "bitwise Or Test when bits line up");
  86. assert.areEqual(1,o3, "bitwise Xor Test");
  87. assert.areEqual(6,o4, "bitwise Or when bits don't line up");
  88. assert.areEqual(2,o5, "bitwise And where a bit lines up");
  89. assert.areEqual(7,o6, "bitwise Xor when no bits line up");
  90. assert.areEqual(~8,o7,"bitwise Not");
  91. }
  92. },
  93. {
  94. name: "Octal +/- 0 is correct",
  95. body: function () {
  96. function isNegativeZero(x) { return x === 0 && (1 / x) === -Infinity; };
  97. assert.isFalse(isNegativeZero( 0o0), "Number.isInteger returns true for 0");
  98. assert.isTrue (isNegativeZero(-0o0), "Number.isInteger returns true for -0");
  99. assert.areEqual(isNegativeZero(0o0),isNegativeZero(+0o0), "should not be -0");
  100. }
  101. },
  102. {
  103. name: "Octal JSON parse",
  104. body: function () {
  105. var obj = [0o0, [0o0, [0o0, 0o1, 0o2, 0o3, 0o4, 0o5]], 0o2];
  106. function reviver(key, value)
  107. {
  108. if (key == "4") return undefined;
  109. if (key == "3") return "THREE";
  110. return value;
  111. }
  112. var str = JSON.stringify(obj);
  113. var parsedObj = JSON.parse(str, reviver);
  114. assert.areEqual(parsedObj, [0,[0,[0,1,2,"THREE",,5]],2], "JSON.parse() should assign the value returned by reviver for array");
  115. var str = "[0o0, [0o0, [0o0, 0o1, 0o2, 0o3, 0o4, 0o5]], 0o2]";
  116. assert.throws(function () { var parsedObj = JSON.parse(str); }, SyntaxError,"JSON should not support Octal literals");
  117. }
  118. },
  119. {
  120. name: "Binary Brute Force number Check",
  121. body: function ()
  122. {
  123. var b = [0b0,0b1,0b10,0b11,0b100,0b101,0b110,0b111,0b1000,
  124. 0b1001,0b1010,0b1011,0b1100,0b1101,0b1110,0b1111,
  125. ];
  126. for(var i = 0; i < b.length;i++)
  127. {
  128. assert.areEqual(i,b[i],"decimal literal: ",i," should equal binary literal: ",b[i]);
  129. }
  130. }
  131. },
  132. {
  133. name: "Binary Front zeros, 0B format Tests, and unexpected characters",
  134. body: function ()
  135. {
  136. var b1 = 0b000001;
  137. var b2 = 0B00101;
  138. assert.throws(function () { eval("0b102"); }, SyntaxError,"a binary number can't have any digit greater than 1");
  139. assert.throws(function () { eval("0b10B"); }, SyntaxError,"a binary number can't have a hex digit");
  140. assert.areEqual(1,b1,"front zero test");
  141. assert.areEqual(5,b2,"upper case B test");
  142. }
  143. },
  144. {
  145. name: "Binary Addition,Subtraction,Division, & Multiplication Test",
  146. body: function ()
  147. {
  148. var b1 = 0b000001 + 0B1010;
  149. var b2 = 0B00101 - 0b100;
  150. var b3 = 0b10 * 0b11;
  151. var b4 = 0b100 / 0b10;
  152. var b5 = 0b1011 / 0b1000;
  153. assert.areEqual(11, b1,"Addition Test");
  154. assert.areEqual(1, b2,"Subtraction Test");
  155. assert.areEqual(6, b3,"Multiplication Test");
  156. assert.areEqual(2, b4,"Simple Division Test");
  157. assert.areEqual(1.375, b5,"Make sure decimal numbers work properly after division");
  158. }
  159. },
  160. {
  161. name: "Binary bitwise Operator Test",
  162. body: function ()
  163. {
  164. var b1 = 0b000001 & 0B1010;
  165. var b2 = 0B00101 | 0b100;
  166. var b3 = 0b10 ^ 0b11;
  167. var b4 = 0b100 | 0b10;
  168. var b5 = 0b110 & 0b11;
  169. var b6 = 0b10 ^ 0b101;
  170. var b7 = ~0b10;
  171. assert.areEqual(0,b1, "bitwise And Test when no bit line up");
  172. assert.areEqual(5,b2, "bitwise Or Test when bits line up");
  173. assert.areEqual(1,b3, "bitwise Xor Test");
  174. assert.areEqual(6,b4, "bitwise Or when bits don't line up");
  175. assert.areEqual(2,b5, "bitwise And where a bit lines up");
  176. assert.areEqual(7,b6, "bitwise Xor when no bits line up");
  177. assert.areEqual(~2,b7,"bitwise Not");
  178. }
  179. },
  180. {
  181. name: "Binary Max number and Proper rounding Tests",
  182. body: function()
  183. {
  184. //signed 32 bit int max
  185. var b1 = 0b01111111111111111111111111111111;
  186. assert.areEqual(2147483647,b1);//does b1 = 2^31-1?
  187. var b2 = 0b0111111111111111111111111111111100000000001111111111; //51 bits
  188. var b3 = 0b01111111111111111111111111111111000000000011111111110;//52 bits
  189. var b4 = 0b100000000000000000000000000000000000000000000000000000;//53 bits (first unsafe number)
  190. var b5 = 0b100000000000000000000000000000000000000000000000000001;//53 bits (unsafe number)
  191. var b6 = 0b100000000000000000000000000000000000000000000000000101;
  192. var b7 = 0b0111111111111111111111111111111111111111111111111111110;//54 bits
  193. assert.areEqual(Number.MAX_SAFE_INTEGER, 0b011111111111111111111111111111111111111111111111111111,
  194. "Number.MAX_SAFE_INTEGER is the largest integer value representable by Number without losing precision, i.e. 9007199254740991");
  195. assert.areEqual(2251799812637695,b2,"Test to stress the less than or equal to 52 bit conditional case failed");
  196. assert.areEqual(4503599625275390,b3,"Test to stress the 53rd bit conditional case in javahelp.cpp failed");
  197. assert.areEqual(9007199254740992,b4,"should not have to round up or down");
  198. assert.areEqual(9007199254740992,b5,"should round down from 9007199254740993 by 1");
  199. assert.areEqual(9007199254740996,b6,"should round up from 9007199254740995 by 1 to");
  200. assert.areEqual(18014398509481982,b7,"1 bit out of precison range Test");
  201. }
  202. },
  203. {
  204. name: "Binary +/- 0 is correct",
  205. body: function () {
  206. function isNegativeZero(x) { return x === 0 && (1 / x) === -Infinity; };
  207. assert.isFalse(isNegativeZero( 0b0), "Number.isInteger returns true for 0");
  208. assert.isTrue (isNegativeZero(-0b0), "Number.isInteger returns true for -0");
  209. assert.areEqual(isNegativeZero(0b0),isNegativeZero(+0b0), "should not be -0");
  210. }
  211. },
  212. {
  213. name: "Binary JSON parse",
  214. body: function () {
  215. var obj = [0b0, [0b0, [0b0, 0b1, 0b10, 0b11, 0b100, 0b101]], 0b10];
  216. function reviver(key, value)
  217. {
  218. if (key == "4") return undefined;
  219. if (key == "3") return "THREE";
  220. return value;
  221. }
  222. var str = JSON.stringify(obj);
  223. var parsedObj = JSON.parse(str, reviver);
  224. assert.areEqual(parsedObj, [0,[0,[0,1,2,"THREE",,5]],2], "JSON.parse() should assign the value returned by reviver for array");
  225. var str = "[0b0, [0b0, [0b0, 0b1, 0b10, 0b11, 0b100, 0b101]], 0b10]";
  226. assert.throws(function () { var parsedObj = JSON.parse(str); }, SyntaxError,"JSON should not support Binary literals");
  227. }
  228. }];
  229. testRunner.runTests(tests, { verbose: WScript.Arguments[0] != "summary" });