| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494 |
- //-------------------------------------------------------------------------------------------------------
- // Copyright (C) Microsoft. All rights reserved.
- // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
- //-------------------------------------------------------------------------------------------------------
- WScript.LoadScriptFile("..\\UnitTestFramework\\UnitTestFramework.js");
- function checkNaN(value, message) {
- assert.isTrue(isNaN(value), message);
- }
- function checkNegZero(value, message) {
- assert.strictEqual(1/value, -Infinity, message);
- }
- function checkPlusZero(value, message) {
- assert.strictEqual(1/value, +Infinity, message);
- }
- function checkClose(value, target, message) {
- assert.isTrue(Math.abs(value - target) < 0.000000001, message)
- }
- const tests = [
- {
- name: "Constants",
- body() {
- assert.areEqual(Math.E , 2.718281828459045, "Maths constant with wrong value");
- assert.areEqual(Math.PI , 3.141592653589793, "Maths constant with wrong value");
- assert.areEqual(Math.LN10 , 2.302585092994046, "Maths constant with wrong value");
- assert.areEqual(Math.LN2 , 0.6931471805599453, "Maths constant with wrong value");
- assert.areEqual(Math.LOG2E , 1.4426950408889633, "Maths constant with wrong value");
- assert.areEqual(Math.LOG10E , 0.4342944819032518, "Maths constant with wrong value");
- assert.areEqual(Math.SQRT1_2, 0.7071067811865476, "Maths constant with wrong value");
- assert.areEqual(Math.SQRT2 , 1.4142135623730951, "Maths constant with wrong value");
- }
- },
- {
- name : "Math.abs",
- body() {
- checkNaN(Math.abs(NaN), "Math.abs(NaN) should equal NaN");
- checkNaN(Math.abs(), "Math.abs() should equal NaN");
- checkPlusZero(Math.abs(-0), "Math.abs should convert -0 to 0");
- checkPlusZero(Math.abs(+0), "Math.abs should convert -0 to 0");
- var input = [+Infinity, -Infinity, -3.14, 3.14, -5, 5, 2147483647 /*INT_MAX*/, -2147483648 /* INT_MIN */];
- var expected = [+Infinity, +Infinity, 3.14, 3.14, 5, 5, 2147483647, 2147483648];
- for (var i in input) {
- assert.isFalse(Math.abs(input[i]) !== expected[i], `Math.abs(${input[i]}) should equal ${expected[i]}`);
- }
- }
- },
- {
- name : "Math.sqrt",
- body() {
- checkNaN(Math.sqrt(NaN), "Math.sqrt(NaN) should equal NaN");
- checkNaN(Math.sqrt(), "Math.sqrt() should equal NaN");
- checkNaN(Math.sqrt(-Infinity), "Math.sqrt(-Infinity) should equal NaN");
- checkNaN(Math.sqrt(-0.1), "Math.sqrt(-0.1) should equal NaN");
- checkPlusZero(Math.sqrt(+0), "Math.sqrt(+0) should be +0");
- checkNegZero(Math.sqrt(-0.0), "Math.sqrt(-0) should be -0");
- assert.strictEqual(Math.sqrt(+Infinity), +Infinity, "Math.sqrt(+Infinity) should equal +Infinity")
- assert.strictEqual(Math.sqrt(25), 5, "Math.sqrt(25) should equal 5")
- }
- },
- {
- name : "Math.cos",
- body() {
- checkNaN(Math.cos(), "Math.cos() should be NaN");
- checkNaN(Math.cos(NaN), "Math.cos(NaN) should be NaN");
- // infinity
- checkNaN(Math.cos(+Infinity), "Math.cos(+Infinity) should be NaN");
- checkNaN(Math.cos(-Infinity), "Math.cos(-Infinity) should be NaN");
- assert.strictEqual(Math.cos(+0), 1, "Math.cos(+0) should be 1");
- assert.strictEqual(Math.cos(-0.0), 1, "Math.cos(-0.0) should be 1");
- checkClose(Math.cos((Math.PI) / 2), 0, "Math.cos((Math.PI) / 2) should be 0");
- checkClose(Math.cos((Math.PI) / 3), 0.5, "Math.cos((Math.PI) / 3) should be 0.5");
- }
- },
- {
- name : "Math.acos",
- body() {
- checkNaN(Math.acos(), "Math.acos() should be NaN");
- checkNaN(Math.acos(NaN), "Math.acos(NaN) should be NaN");
- // interesting floating point limits
- checkNaN(Math.acos(5.1), "Math.acos(5.1) should be NaN");
- checkNaN(Math.acos(-2), "Math.acos(-2) should be NaN");
- // infinity
- checkNaN(Math.acos(+Infinity), "Math.acos(+Infinity) should be NaN");
- checkNaN(Math.acos(-Infinity), "Math.acos(-Infinity) should be NaN");
- assert.strictEqual(Math.acos(1), 0, "Math.acos(1) should be 0");
- assert.strictEqual(Math.acos(0), (Math.PI) / 2, "Math.acos(0) should be (Math.PI) / 2");
- checkClose(Math.acos(0.5), (Math.PI) / 3, "Math.acos(0.5) should be (Math.PI) / 3");
- }
- },
- {
- name : "Math.sin",
- body() {
- checkNaN(Math.sin(), "Math.sin() should be NaN");
- checkNaN(Math.sin(NaN), "Math.sin(NaN) should be NaN");
- // infinity
- checkNaN(Math.sin(+Infinity), "Math.sin(+Infinity) should be NaN");
- checkNaN(Math.sin(-Infinity), "Math.sin(-Infinity) should be NaN");
- // +0 and -0
- checkPlusZero(Math.sin(+0.0), "Math.sin(+0.0) should be +0");
- checkNegZero(Math.sin(-0.0), "Math.sin(-0.0) should be -0");
- assert.strictEqual(Math.sin(Math.PI / 2), 1, "Math.sin(Math.PI / 2) should be 1");
- checkClose(Math.sin(Math.PI / 6), 0.5, "Math.sin(Math.PI / 6) should be 0.5");
- }
- },
- {
- name : "Math.asin",
- body() {
- checkNaN(Math.asin(), "Math.asin() should be NaN");
- checkNaN(Math.asin(NaN), "Math.asin(NaN) should be NaN");
- // interesting floating point limits
- checkNaN(Math.asin(5.1), "Math.asin(5.1) should be NaN");
- checkNaN(Math.asin(-2), "Math.asin(-2) should be NaN");
- // infinity
- checkNaN(Math.asin(+Infinity), "Math.asin(+Infinity) should be NaN");
- checkNaN(Math.asin(-Infinity), "Math.asin(-Infinity) should be NaN");
- assert.strictEqual(Math.asin(1), (Math.PI) / 2, "Math.asin(1) should be (Math.PI) / 2");
- checkClose(Math.asin(0.5), (Math.PI) / 6, "Math.asin(0.5) should be (Math.PI) / 6");
- checkPlusZero(Math.asin(+0), "Math.asin(+0) should be +0");
- checkNegZero(Math.asin(-0.0), "Math.asin(-0.0) should be -0");
- }
- },
- {
- name : "Math.atan",
- body() {
- checkNaN(Math.atan(), "Math.atan() should be NaN");
- checkNaN(Math.atan(NaN), "Math.atan(NaN) should be NaN");
- assert.strictEqual(Math.atan(+Infinity), (Math.PI) / 2, "Math.atan(+Infinity) should be (Math.PI) / 2");
- assert.strictEqual(Math.atan(-Infinity), -(Math.PI) / 2, "Math.atan(-Infinity) should be -(Math.PI) / 2");
- assert.strictEqual(Math.atan(1), (Math.PI) / 4, "Math.atan(1) should be (Math.PI) / 4");
- checkPlusZero(Math.atan(+0), "Math.atan(+0) should be +0");
- checkNegZero(Math.atan(-0.0), "Math.atan(-0.0) should be -0");
- }
- },
- {
- name : "Math.tan",
- body() {
- checkNaN(Math.tan(), "Math.tan() should be NaN");
- checkNaN(Math.tan(NaN), "Math.tan(NaN) should be NaN");
- // infinity
- checkNaN(Math.tan(+Infinity), "Math.tan(+Infinity) should be NaN");
- checkNaN(Math.tan(-Infinity), "Math.tan(-Infinity) should be NaN");
- // +0 and -0
- checkPlusZero(Math.tan(+0), "Math.tan(+0) should be +0");
- checkNegZero(Math.tan(-0.0), "Math.tan(-0.0) should be -0");
- checkClose(Math.tan(Math.PI / 4), 1, "Math.tan(Math.PI / 4) should be 1");
- }
- },
- {
- name : "Math.exp",
- body() {
- checkNaN(Math.exp(), "Math.exp() should be NaN");
- checkNaN(Math.exp(NaN), "Math.exp(NaN) should be NaN");
- assert.strictEqual(Math.exp(+0), 1, "Math.exp(1) should be 1");
- assert.strictEqual(Math.exp(-0.0), 1, "Math.exp(-0.0) should be 1");
- assert.strictEqual(Math.exp(+Infinity), +Infinity, "Math.exp(+Infinity) should be +Infinity");
- assert.strictEqual(Math.exp(-Infinity), 0, "Math.exp(-Infinity) should be 0");
- checkClose(Math.exp(3), Math.E * Math.E * Math.E, "Math.exp(3) should be Math.E * Math.E * Math.E");
- }
- },
- {
- name : "Math.log",
- body() {
- checkNaN(Math.log(), "Math.log() should be NaN");
- checkNaN(Math.log(NaN), "Math.log(NaN) should be NaN");
- assert.strictEqual(Math.log(+0), -Infinity, "Math.log(+0) should be -Infinity");
- assert.strictEqual(Math.log(-0.0), -Infinity, "Math.log(-0.0) should be -Infinity");
- assert.strictEqual(Math.log(1), 0, "Math.log(1) should be 0");
- assert.strictEqual(Math.log(+Infinity), +Infinity, "Math.log(+Infinity) should be +Infinity");
- assert.strictEqual(Math.log(Math.E*Math.E*Math.E), 3, "Math.log(Math.E*Math.E*Math.E) should be 3");
- }
- },
- {
- name : "Math.pow",
- body() {
- function checkNaNPow(x, y) {
- checkNaN(Math.pow(x, y), `Math.pow(${x}, ${y}) should be NaN`);
- }
- function check(result, x, y) {
- var pow = Math.pow(x, y);
- if (result !== 0) {
- if (pow !== result) {
- checkClose(pow, result, `Math.pow(${x}, ${y}) should equal ${result}`);
- }
- } else if (1 / result === +Infinity) {
- checkPlusZero(pow, `Math.pow(${x}, ${y}) should equal +0`);
- } else {
- checkNegZero(pow, `Math.pow(${x}, ${y}) should equal -0`);
- }
- }
- checkNaN(Math.pow(), "Math.pow() should be NaN");
- checkNaNPow(NaN, NaN);
- checkNaNPow(Infinity, NaN);
- checkNaNPow(-Infinity, NaN);
- checkNaNPow(0, NaN);
- checkNaNPow(-0, NaN);
- checkNaNPow(3, NaN);
- checkNaNPow(-3, NaN);
- check(1, NaN, 0);
- check(1, Infinity, 0);
- check(1, -Infinity, 0);
- check(1, 0, 0);
- check(1, -0, 0);
- check(1, 3, 0);
- check(1, -3, 0);
- check(1, NaN, -0);
- check(1, Infinity, -0);
- check(1, -Infinity, -0);
- check(1, 0, -0);
- check(1, -0, -0);
- check(1, 3, -0);
- check(1, -3, -0);
- checkNaNPow(NaN, 3);
- checkNaNPow(NaN, Infinity);
- checkNaNPow(NaN, -Infinity);
- check(Infinity, +1.1, Infinity);
- check(Infinity, -1.1, Infinity);
- check(0, +1.1, -Infinity);
- check(0, -1.1, -Infinity);
- checkNaNPow(+1, Infinity);
- checkNaNPow(-1, Infinity);
- checkNaNPow(+1, -Infinity);
- checkNaNPow(-1, -Infinity);
- check(0, +0.9, Infinity);
- check(0, -0.9, Infinity);
- check(Infinity, +0.9, -Infinity);
- check(Infinity, -0.9, -Infinity);
- check(Infinity, Infinity, 0.1);
- check(+0, Infinity, -0.1);
- check(-Infinity, -Infinity, 3);
- check(+Infinity, -Infinity, 4);
- check(-0, -Infinity, -3);
- check(+0, -Infinity, -4);
- check(0, 0, 0.1);
- check(+Infinity, +0, -3);
- check(+Infinity, +0, -0.1);
- check(+Infinity, -0, -1.1);
- check(-0.0, -0, +3);
- check(+0.0, -0, +4);
- check(-Infinity, -0, -3);
- check(+Infinity, -0, -4);
- checkNaNPow(-3, 3.3);
- check(25, 5, 2);
- check(25, -5, 2);
- check(1/25, -5, -2);
- }
- },
- {
- name : "Math.atan2",
- body() {
- checkNaN(Math.atan2(), "Math.atan2() should be NaN");
- checkNaN(Math.atan2(NaN, NaN), "Math.atan2(NaN, NaN) should be NaN");
- checkNaN(Math.atan2(2, NaN), "Math.atan2(2, NaN) should be NaN");
- checkNaN(Math.atan2(NaN, -3), "Math.atan2(NaN, -3) should be NaN");
- function checkATan2(result, a, b) {
- assert.strictEqual(Math.atan2(a, b), result, `Math.atan2(${a}, ${b}) should equal ${result}`);
- }
- checkATan2((Math.PI) / 2, 3, +0);
- checkATan2((Math.PI) / 2, 3, -0);
- checkPlusZero(Math.atan2(0, 3),"Math.atan2(0, 3) should equal +0");
- checkPlusZero(Math.atan2(0, 0),"Math.atan2(0, 0) should equal +0");
- checkATan2(Math.PI, 0, -0);
- checkATan2(Math.PI, 0, -2);
- checkNegZero(Math.atan2(-0, 3),"Math.atan2(-0, 3) should equal -0");
- checkNegZero(Math.atan2(-0, 0),"Math.atan2(-0, 0) should equal -0");
- checkATan2(-Math.PI, -0, -0);
- checkATan2(-Math.PI, -0, -2);
- checkATan2(-(Math.PI) / 2, -3, +0);
- checkATan2(-(Math.PI) / 2, -3, -0);
- checkPlusZero(Math.atan2(3, +Infinity),"Math.atan2(3, +Infinity) should equal +0");
- checkATan2((Math.PI), 3, -Infinity);
- checkATan2((-Math.PI), -3, -Infinity);
- checkNegZero(Math.atan2(-3, +Infinity),"Math.atan2(-3, +Infinity) should equal -0");
- checkATan2((Math.PI)/2, +Infinity, 3);
- checkATan2(-(Math.PI) / 2, -Infinity, 3);
- checkATan2((Math.PI) / 2, +Infinity, -3);
- checkATan2(-(Math.PI) / 2, -Infinity, -3);
- checkATan2(Math.PI / 4, +Infinity, +Infinity);
- checkATan2(3 * Math.PI / 4, +Infinity, -Infinity);
- checkATan2(-Math.PI / 4, -Infinity, +Infinity);
- checkATan2(-3 * Math.PI / 4, -Infinity, -Infinity);
- checkATan2((Math.PI) / 4, 5, 5.0);
- }
- },
- {
- name: "Math.ceil and Math.floor",
- body() {
- checkNaN(Math.ceil(NaN), "Math.ceil(NaN) should be NaN");
- checkNaN(Math.ceil(), "Math.ceil() should be NaN");
- checkNaN(Math.floor(NaN), "Math.floor(NaN) should be NaN");
- checkNaN(Math.floor(), "Math.floor() should be NaN");
- function check(result, value) {
- var ceil = Math.ceil(value);
- var floor = Math.floor(-value);
- if (result !== 0) {
- assert.strictEqual(ceil, result, `Math.ceil(${value}) should equal ${result} not ${ceil}`);
- assert.strictEqual(-floor, result, `-Math.floor(${-value}) should equal ${result} not ${-floor}`);
- } else if (1/result === -Infinity || (value > -1 && value < 1 && value !== 0)) {
- checkNegZero(ceil, `Math.ceil(${value}) should equal -0 not ${ceil}`);
- checkPlusZero(floor, `Math.floor(${-value}) should equal +0 not ${floor}`)
- } else {
- checkPlusZero(ceil, `Math.ceil(${value}) should equal +0 not ${ceil}`);
- checkNegZero(floor, `Math.floor(${-value}) should equal -0 not ${floor}`)
- }
- }
-
- check(+0, +0);
- check(-0, -0);
- check(+Infinity, +Infinity);
- check(-Infinity, -Infinity);
- // values abs(x) < 1
- check(-0, -4.9406564584124654000e-324);
- check(-0, -9.8813129168249309000e-324);
- check(-0, -0.5);
- check(-0, -9.9999999999999989000e-001);
- check(-0, -9.9999999999999978000e-001);
- check(-1, -1);
- check(1, 4.9406564584124654000e-324);
- check(1, 9.8813129168249309000e-324);
- check(1, 0.5);
- check(1, 9.9999999999999989000e-001);
- check(1, 9.9999999999999978000e-001);
- check(1, 1);
- // other interesting double values
- var x = 1;
- for(var i = 0; i < 50; ++i)
- {
- check(x, x - 0.1);
- check(-x + 1, -x + 0.1);
- x = x * 2;
- }
- check(54, 53.7);
- check(112233581321, 112233581320.001);
- // values around the maximums
- check(1.7976931348623157000e+308, 1.7976931348623157000e+308);
- check(-1.7976931348623157000e+308, -1.7976931348623157000e+308)
- // values around INT_MIN and INT_MAX for amd64 (Bug 179932)
- assert.isFalse(Math.ceil(2147483648) <= 2147483647, "Math.ceil(2147483648) should not be <= 2147483647");
- assert.isFalse(Math.ceil(-2147483649) >= -2147483648, "Math.ceil(-2147483649) should not be >= -2147483648");
- check(-0, -0.1);
- check(-0, -0);
-
- }
- },
- {
- name : "Math.round",
- body() {
- // check rounding of NaN
- checkNaN(Math.round(NaN), "Math.round(NaN) should be NaN");
- checkNaN(Math.round(Math.asin(2.0)), "Math.round(Math.asin(2.0)) should be NaN");
- checkNaN(Math.round(), "Math.round() should be NaN");
- // check rounding of Infinity
- assert.strictEqual(Infinity, Math.round(Infinity), "Math.round(Infinity)");
- assert.strictEqual(-Infinity, Math.round(-Infinity), "Math.round(-Infinity)");
- // check positive and negative 0
- checkPlusZero(Math.round(+0), "Math.round(+0)");
- checkNegZero(Math.round(-0), "Math.round(-0)");
- // check various values between 0 and 0.5
- checkPlusZero(Math.round(4.9999999999999994000e-001), "round largest value < 0.5"); // for ES5 the result is 0
- checkPlusZero(Math.round(4.9999999999999989000e-001), "round 2nd largest value < 0.5");
- checkPlusZero(Math.round(4.9406564584124654000e-324), "round smallest value > 0");
- checkPlusZero(Math.round(9.8813129168249309000e-324), "round 2nd smallest value > 0");
- for(var i = 0.001; i < 0.5; i += 0.001)
- {
- checkPlusZero(Math.round(i), "round " + i);
- }
- // check various values between -0.5 and 0
- checkNegZero(Math.round(-4.9406564584124654000e-324), "round most positive value < 0");
- checkNegZero(Math.round(-9.8813129168249309000e-324), "round 2nd most positive value < 0");
- checkNegZero(Math.round(-4.9999999999999994000e-001), "round most negative value > -0.5");
- checkNegZero(Math.round(-4.9999999999999989000e-001), "round 2nd most negative value > -0.5");
- checkNegZero(Math.round(-0), "round -0 should be -0");
- for(var i = -0.001; i > -0.5; i -= 0.001)
- {
- checkNegZero(Math.round(i), "round " + i);
- }
- // check various integers
- assert.strictEqual(1, Math.round(1), "round 1");
- assert.strictEqual(2, Math.round(2), "round 2");
- assert.strictEqual(-1, Math.round(-1), "round -1");
- assert.strictEqual(-2, Math.round(-2), "round -2");
- assert.strictEqual(4294967295, Math.round(4294967295), "round 4294967295");
- assert.strictEqual(4294967296, Math.round(4294967296), "round 4294967296");
- assert.strictEqual(-4294967296, Math.round(-4294967296), "round -4294967296");
- for(var i = 1000; i < 398519; i += 179)
- {
- assert.strictEqual(i, Math.round(i), "round " + i);
- }
- for(var i = 0.001; i <= 0.5; i += 0.001)
- {
- assert.strictEqual(1, Math.round(0.5 + i), "round " + (0.5+i));
- }
- for(var i = -0.001; i >= -0.5; i -= 0.001)
- {
- assert.strictEqual(-1, Math.round(-0.5 + i), "round " + (-0.5+i));
- }
- // check I + 0.5
- assert.strictEqual(1, Math.round(0.5), "round 0.5");
- assert.strictEqual(2, Math.round(1.5), "round 1.5");
- assert.strictEqual(3, Math.round(2.5), "round 2.5");
- assert.strictEqual(4294967296, Math.round(4294967295 + 0.5), "round 4294967295.5");
- for(var i = -100000; i <= 100000; i += 100)
- {
- assert.strictEqual(i+1, Math.round(i + 0.5), "round " + (i+0.5));
- }
- // miscellaneous other real numbers
- assert.strictEqual(30593859183, Math.round(30593859183.3915898), "round a double with high precision");
- assert.strictEqual(1, Math.round(5.0000000000000011000e-001), "round smallest value > 0.5");
- assert.strictEqual(1, Math.round(5.0000000000000022000e-001), "round 2nd smallest value > 0.5");
- assert.strictEqual(1.7976931348623157000e+308, Math.round(1.7976931348623157000e+308), "round largest number < Infinity");
- assert.strictEqual(1.7976931348623155000e+308, Math.round(1.7976931348623155000e+308), "round 2nd largest number < Infinity");
- assert.strictEqual(-1.7976931348623157000e+308, Math.round(-1.7976931348623157000e+308), "round least positive number > -Infinity");
- assert.strictEqual(-1.7976931348623155000e+308, Math.round(-1.7976931348623155000e+308), "round 2nd least positive number > -Infinity");
- // if x <= -2^52 or x >= 2^52, Math.round(x) == x
- assert.strictEqual(4503599627370496, Math.round(4503599627370496), "round 4503599627370496");
- assert.strictEqual(4503599627370497, Math.round(4503599627370497), "round 4503599627370497");
- assert.strictEqual(4503599627370548, Math.round(4503599627370548), "round 4503599627370548");
- assert.strictEqual(9007199254740991, Math.round(9007199254740991), "round 9007199254740991");
- assert.strictEqual(-4503599627370496, Math.round(-4503599627370496), "round -4503599627370496");
- assert.strictEqual(-4503599627370497, Math.round(-4503599627370497), "round -4503599627370497");
- assert.strictEqual(-4503599627370548, Math.round(-4503599627370548), "round -4503599627370548");
- assert.strictEqual(-9007199254740991, Math.round(-9007199254740991), "round -9007199254740991");
- // values around INT_MIN and INT_MAX for amd64 (Bug 179932)
- assert.isFalse(Math.round(2147483648) <= 2147483647, "Math.round(2147483648)")
- assert.isFalse(Math.round(-2147483649) >= -2147483648, "Math.round(-2147483649)")
- }
- }
- ];
- testRunner.runTests(tests, { verbose: WScript.Arguments[0] != "summary" });
|