ES6NumberAPIs.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  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. // ES6 Number API extensions tests -- verifies the API shape and basic functionality
  6. WScript.LoadScriptFile("..\\UnitTestFramework\\UnitTestFramework.js");
  7. var tests = [
  8. {
  9. name: "Number constructor and prototype should have spec defined built-ins with correct lengths",
  10. body: function () {
  11. assert.isTrue(Number.hasOwnProperty('EPSILON'), "Number should have a EPSILON value property");
  12. assert.isTrue(Number.hasOwnProperty('MAX_SAFE_INTEGER'), "Number should have a MAX_SAFE_INTEGER value property");
  13. assert.isTrue(Number.hasOwnProperty('MIN_SAFE_INTEGER'), "Number should have a MIN_SAFE_INTEGER value property");
  14. assert.isTrue(Number.hasOwnProperty('parseInt'), "Number should have a parseInt method");
  15. assert.isTrue(Number.hasOwnProperty('parseFloat'), "Number should have a parseFloat method");
  16. assert.isTrue(Number.hasOwnProperty('isNaN'), "Number should have a isNaN method");
  17. assert.isTrue(Number.hasOwnProperty('isFinite'), "Number should have a isFinite method");
  18. assert.isTrue(Number.hasOwnProperty('isInteger'), "Number should have a isInteger method");
  19. assert.isTrue(Number.hasOwnProperty('isSafeInteger'), "Number should have a isSafeInteger method");
  20. assert.isTrue(Number.parseInt.length === 2, "parseInt method takes two arguments");
  21. assert.isTrue(Number.parseFloat.length === 1, "parseFloat method takes one argument");
  22. assert.isTrue(Number.isNaN.length === 1, "isNaN method takes one argument");
  23. assert.isTrue(Number.isFinite.length === 1, "isFinite method takes one argument");
  24. assert.isTrue(Number.isInteger.length === 1, "isInteger method takes one argument");
  25. assert.isTrue(Number.isSafeInteger.length === 1, "isSafeInteger method takes one argument");
  26. }
  27. },
  28. {
  29. name: "EPSILON is approximately 2.220446049250313e-16",
  30. body: function () {
  31. var computedEpsilon = (function () {
  32. var next, result;
  33. for (next = 1; 1 + next !== 1; next = next / 2) {
  34. result = next;
  35. }
  36. return result;
  37. }());
  38. // Use areEqual because we want this value to be exact. That is, even though it is
  39. // floating point use a strict equality comparison instead of an epsilon check.
  40. assert.areEqual(Number.EPSILON, computedEpsilon, "Number.EPSILON matches computed value");
  41. }
  42. },
  43. {
  44. name: "MAX_SAFE_INTEGER and MIN_SAFE_INTEGER are exactly +/-9007199254740991",
  45. body: function () {
  46. assert.areEqual(Number.MAX_SAFE_INTEGER, 9007199254740991, "Number.MAX_SAFE_INTEGER is the largest integer value representable by Number without losing precision, i.e. 9007199254740991");
  47. assert.areEqual(Number.MIN_SAFE_INTEGER, -9007199254740991, "Number.MIN_SAFE_INTEGER is the loweset integer value representable by Number without losing precision, i.e. -9007199254740991");
  48. }
  49. },
  50. {
  51. name: "parseInt parses integers in a given string in the given radix -- same as the global object's parseInt",
  52. body: function () {
  53. // Just do a small sample of tests since we know the implementation of parseInt is the exact same as the global parseInt function
  54. assert.areEqual(0, Number.parseInt("0"), "Testing sample: 0");
  55. assert.areEqual(-1, Number.parseInt("-1"), "Testing sample: -1");
  56. assert.areEqual(128, Number.parseInt("10000000", 2), "Testing sample: 10000000 base 2");
  57. assert.areEqual(16, Number.parseInt("g", new String("17")), "Testing sample: g base 17");
  58. assert.areEqual(parseInt, Number.parseInt, "global parseInt and Number.parseInt are the same function object");
  59. }
  60. },
  61. {
  62. name: "parseFloat parses floats in a given string -- same as the global object's parseFloat",
  63. body: function () {
  64. // Just do a small sample of tests since we know the implementation of parseFloat is the exact same as the global parseFloat function
  65. assert.areEqual(0, Number.parseFloat("0"), "Testing sample: 0");
  66. assert.areEqual(-1, Number.parseFloat("-1"), "Testing sample: -1");
  67. assert.areEqual(3.14159, Number.parseFloat("3.14159"), "Testing sample: 3.14159");
  68. assert.areEqual(parseFloat, Number.parseFloat, "global parseFloat and Number.parseFloat are the same function object");
  69. }
  70. },
  71. {
  72. name: "isNaN behaves similar to the global object's isNaN except it does not coerce its argument to Number",
  73. body: function () {
  74. assert.isTrue(Number.isNaN(NaN), "Number.isNaN returns true for NaN");
  75. assert.isTrue(Number.isNaN(0/0), "Number.isNaN returns true for 0/0 which is NaN");
  76. assert.isFalse(Number.isNaN(123), "Number.isNaN returns false for a finite number, say 123");
  77. assert.isFalse(Number.isNaN(-3.14159), "Number.isNaN returns false for a finite number, say -3.14159");
  78. assert.isFalse(Number.isNaN(Infinity), "Number.isNaN returns false for +Infinity");
  79. assert.isFalse(Number.isNaN(-Infinity), "Number.isNaN returns false for -Infinity");
  80. assert.isFalse(Number.isNaN(undefined), "Number.isNaN returns false for undefined");
  81. assert.isFalse(Number.isNaN(null), "Number.isNaN returns false for null");
  82. assert.isFalse(Number.isNaN(new Number(0)), "Number.isNaN returns false for Number object");
  83. assert.isFalse(Number.isNaN(new Number(NaN)), "Number.isNaN returns false for Number object whose value is NaN");
  84. assert.isFalse(Number.isNaN("1234"), "Number.isNaN returns false for a string with value '1234'");
  85. assert.isFalse(Number.isNaN("NaN"), "Number.isNaN returns false for a string with value 'NaN'");
  86. assert.isFalse(Number.isNaN("Apple"), "Number.isNaN returns false for a string with value 'Apple'");
  87. }
  88. },
  89. {
  90. name: "isFinite behaves similar to the global object's isFinite except it does not coerce its argument to Number",
  91. body: function () {
  92. assert.isTrue(Number.isFinite(0), "Number.isFinite returns true for 0");
  93. assert.isTrue(Number.isFinite(123), "Number.isFinite returns true for 123");
  94. assert.isTrue(Number.isFinite(-3.14159), "Number.isFinite returns true for -3.14159");
  95. assert.isTrue(Number.isFinite(Number.MAX_SAFE_INTEGER), "Number.isFinite returns true for Number.MAX_SAFE_INTEGER");
  96. assert.isTrue(Number.isFinite(Number.MIN_SAFE_INTEGER), "Number.isFinite returns true for Number.MIN_SAFE_INTEGER");
  97. assert.isFalse(Number.isFinite(Infinity), "Number.isFinite returns false for Infinity");
  98. assert.isFalse(Number.isFinite(-Infinity), "Number.isFinite returns false for -Infinity");
  99. assert.isFalse(Number.isFinite(NaN), "Number.isFinite returns false for NaN");
  100. assert.isFalse(Number.isFinite(undefined), "Number.isFinite returns false for undefined");
  101. assert.isFalse(Number.isFinite(null), "Number.isFinite returns false for null");
  102. assert.isFalse(Number.isFinite(new Number(0)), "Number.isFinite returns false for Number object with finite value");
  103. assert.isFalse(Number.isFinite(new Number(Infinity)), "Number.isFinite returns false for Number object with infinite value");
  104. assert.isFalse(Number.isFinite("1234"), "Number.isFinite returns false for a string with value '1234'");
  105. assert.isFalse(Number.isFinite("Infinity"), "Number.isFinite returns false for a string with value 'Infinity'");
  106. assert.isFalse(Number.isFinite("NaN"), "Number.isFinite returns false for a string with value 'NaN'");
  107. assert.isFalse(Number.isFinite("Apple"), "Number.isFinite returns false for a string with value 'Apple'");
  108. }
  109. },
  110. {
  111. name: "isInteger returns true if its argument is a number and, after coercion via ToInteger abstract operation, is the same value, false otherwise",
  112. body: function () {
  113. assert.isTrue(Number.isInteger(0), "Number.isInteger returns true for 0");
  114. assert.isTrue(Number.isInteger(-0), "Number.isInteger returns true for -0");
  115. assert.isTrue(Number.isInteger(1), "Number.isInteger returns true for 1");
  116. assert.isTrue(Number.isInteger(-1), "Number.isInteger returns true for -1");
  117. assert.isTrue(Number.isInteger(12345), "Number.isInteger returns true for 12345");
  118. assert.isTrue(Number.isInteger(Number.MAX_SAFE_INTEGER), "Number.isInteger returns true for Number.MAX_SAFE_INTEGER");
  119. assert.isTrue(Number.isInteger(Number.MIN_SAFE_INTEGER), "Number.isInteger returns true for Number.MIN_SAFE_INTEGER");
  120. assert.isTrue(Number.isInteger(Number.MAX_SAFE_INTEGER - 1000), "Number.isInteger returns true for Number.MAX_SAFE_INTEGER - 1000");
  121. assert.isTrue(Number.isInteger(Number.MAX_SAFE_INTEGER + 1000), "Number.isInteger returns true for Number.MAX_SAFE_INTEGER + 1000");
  122. assert.isFalse(Number.isInteger(Infinity), "Number.isInteger returns false for Infinity");
  123. assert.isFalse(Number.isInteger(-Infinity), "Number.isInteger returns false for -Infinity");
  124. assert.isFalse(Number.isInteger(0.5), "Number.isInteger returns false for 0.5");
  125. assert.isFalse(Number.isInteger(-0.5), "Number.isInteger returns false for -0.5");
  126. assert.isFalse(Number.isInteger(3.14159), "Number.isInteger returns false for 3.14159");
  127. assert.isFalse(Number.isInteger(Number.MAX_SAFE_INTEGER / 2), "Number.isInteger returns false for Number.MAX_SAFE_INTEGER / 2");
  128. assert.isFalse(Number.isInteger(NaN), "Number.isInteger returns false for NaN");
  129. assert.isFalse(Number.isInteger(undefined), "Number.isInteger returns false for undefined");
  130. assert.isFalse(Number.isInteger(null), "Number.isInteger returns false for null");
  131. assert.isFalse(Number.isInteger("12345"), "Number.isInteger returns false for a string with value '12345'");
  132. assert.isFalse(Number.isInteger("3.14159"), "Number.isInteger returns false for a string with value '3.14159'");
  133. assert.isFalse(Number.isInteger("NaN"), "Number.isInteger returns false for a string with value 'NaN'");
  134. assert.isFalse(Number.isInteger(new Number(125)), "Number.isInteger returns false for a Number object with value 125");
  135. assert.isFalse(Number.isInteger(new Number(65.536)), "Number.isInteger returns false for Number object with value 65.536");
  136. assert.isFalse(Number.isInteger(new Number(Infinity)), "Number.isInteger returns false for Number object with value Infinity");
  137. }
  138. },
  139. {
  140. name: "isSafeInteger returns true if its argument is a number and, after coercion via ToInteger abstract operation, is the same value, false otherwise",
  141. body: function () {
  142. assert.isTrue(Number.isSafeInteger(0), "Number.isSafeInteger returns true for 0");
  143. assert.isTrue(Number.isSafeInteger(-0), "Number.isSafeInteger returns true for -0");
  144. assert.isTrue(Number.isSafeInteger(1), "Number.isSafeInteger returns true for 1");
  145. assert.isTrue(Number.isSafeInteger(-1), "Number.isSafeInteger returns true for -1");
  146. assert.isTrue(Number.isSafeInteger(12345), "Number.isSafeInteger returns true for 12345");
  147. assert.isTrue(Number.isSafeInteger(Number.MAX_SAFE_INTEGER), "Number.isSafeInteger returns true for Number.MAX_SAFE_INTEGER");
  148. assert.isTrue(Number.isSafeInteger(Number.MIN_SAFE_INTEGER), "Number.isSafeInteger returns true for Number.MIN_SAFE_INTEGER");
  149. assert.isTrue(Number.isSafeInteger(Number.MAX_SAFE_INTEGER - 1000), "Number.isSafeInteger returns true for Number.MAX_SAFE_INTEGER - 1000");
  150. assert.isTrue(Number.isSafeInteger(Number.MIN_SAFE_INTEGER + 1000), "Number.isSafeInteger returns true for Number.MIN_SAFE_INTEGER + 1000");
  151. assert.isFalse(Number.isSafeInteger(Number.MAX_SAFE_INTEGER + 1000), "Number.isSafeInteger returns false for Number.MAX_SAFE_INTEGER + 1000");
  152. assert.isFalse(Number.isSafeInteger(Number.MIN_SAFE_INTEGER - 1000), "Number.isSafeInteger returns false for Number.MIN_SAFE_INTEGER - 1000");
  153. assert.isFalse(Number.isSafeInteger(Infinity), "Number.isSafeInteger returns false for Infinity");
  154. assert.isFalse(Number.isSafeInteger(-Infinity), "Number.isSafeInteger returns false for -Infinity");
  155. assert.isFalse(Number.isSafeInteger(0.5), "Number.isSafeInteger returns false for 0.5");
  156. assert.isFalse(Number.isSafeInteger(-0.5), "Number.isSafeInteger returns false for -0.5");
  157. assert.isFalse(Number.isSafeInteger(3.14159), "Number.isSafeInteger returns false for 3.14159");
  158. assert.isFalse(Number.isSafeInteger(Number.MAX_SAFE_INTEGER / 2), "Number.isSafeInteger returns false for Number.MAX_SAFE_INTEGER / 2");
  159. assert.isFalse(Number.isSafeInteger(NaN), "Number.isSafeInteger returns false for NaN");
  160. assert.isFalse(Number.isSafeInteger(undefined), "Number.isSafeInteger returns false for undefined");
  161. assert.isFalse(Number.isSafeInteger(null), "Number.isSafeInteger returns false for null");
  162. assert.isFalse(Number.isSafeInteger("12345"), "Number.isSafeInteger returns false for a string with value '12345'");
  163. assert.isFalse(Number.isSafeInteger("3.14159"), "Number.isSafeInteger returns false for a string with value '3.14159'");
  164. assert.isFalse(Number.isSafeInteger("NaN"), "Number.isSafeInteger returns false for a string with value 'NaN'");
  165. assert.isFalse(Number.isSafeInteger(new Number(125)), "Number.isSafeInteger returns false for a Number object with value 125");
  166. assert.isFalse(Number.isSafeInteger(new Number(65.536)), "Number.isSafeInteger returns false for Number object with value 65.536");
  167. assert.isFalse(Number.isSafeInteger(new Number(Infinity)), "Number.isSafeInteger returns false for Number object with value Infinity");
  168. }
  169. },
  170. ];
  171. testRunner.runTests(tests, { verbose: WScript.Arguments[0] != "summary" });