blob: 9d1310f7b1d337d1623f9bd533c45bd0713d3063 [file] [log] [blame] [edit]
function shouldBe(a, b) {
if (a !== b)
throw new Error(`Expected ${b} but got ${a}`);
}
// Test the basic behaviors of Number.isFinite()
//
shouldBe(Number.hasOwnProperty("isFinite"), true);
shouldBe(typeof Number.isFinite, 'function');
shouldBe(Number.isFinite !== isFinite, true);
// Function properties.
shouldBe(Number.isFinite.length, 1);
shouldBe(Number.isFinite.name, 'isFinite');
shouldBe(Object.getOwnPropertyDescriptor(Number, "isFinite").configurable, true);
shouldBe(Object.getOwnPropertyDescriptor(Number, "isFinite").enumerable, false);
shouldBe(Object.getOwnPropertyDescriptor(Number, "isFinite").writable, true);
// Some simple cases.
shouldBe(Number.isFinite(), false);
shouldBe(Number.isFinite(NaN), false);
shouldBe(Number.isFinite(undefined), false);
shouldBe(Number.isFinite(0), true);
shouldBe(Number.isFinite(-0), true);
shouldBe(Number.isFinite(1), true);
shouldBe(Number.isFinite(-1), true);
shouldBe(Number.isFinite(42), true);
shouldBe(Number.isFinite(123.5), true);
shouldBe(Number.isFinite(-123.5), true);
shouldBe(Number.isFinite(1e10), true);
shouldBe(Number.isFinite(-1e10), true);
shouldBe(Number.isFinite(1.7e10), true);
shouldBe(Number.isFinite(-1.7e10), true);
shouldBe(Number.isFinite(Number.MAX_VALUE), true);
shouldBe(Number.isFinite(Number.MIN_VALUE), true);
shouldBe(Number.isFinite(Number.MAX_SAFE_INTEGER), true);
shouldBe(Number.isFinite(Number.MIN_SAFE_INTEGER), true);
shouldBe(Number.isFinite(Math.PI), true);
shouldBe(Number.isFinite(Math.E), true);
shouldBe(Number.isFinite(Math.LOG2E), true);
shouldBe(Number.isFinite(Math.LOG10E), true);
shouldBe(Number.isFinite(Infinity), false);
shouldBe(Number.isFinite(-Infinity), false);
shouldBe(Number.isFinite(null), false);
shouldBe(Number.isFinite(1, 3), true);
shouldBe(Number.isFinite(Infinity, 3), false);
// Non-numeric.
shouldBe(Number.isFinite({}), false);
shouldBe(Number.isFinite({ webkit: "awesome" }), false);
shouldBe(Number.isFinite([]), false);
shouldBe(Number.isFinite([123]), false);
shouldBe(Number.isFinite([1,1]), false);
shouldBe(Number.isFinite([NaN]), false);
shouldBe(Number.isFinite(""), false);
shouldBe(Number.isFinite("1"), false);
shouldBe(Number.isFinite("x"), false);
shouldBe(Number.isFinite("NaN"), false);
shouldBe(Number.isFinite("Infinity"), false);
shouldBe(Number.isFinite(true), false);
shouldBe(Number.isFinite(false), false);
shouldBe(Number.isFinite(function(){}), false);
shouldBe(Number.isFinite(() => {}), false);
shouldBe(Number.isFinite(isFinite), false);
shouldBe(Number.isFinite(Symbol()), false);
shouldBe(Number.isFinite(new Number(123)), false);
shouldBe(Number.isFinite(new Number(-123)), false);
shouldBe(Number.isFinite(new Number("123")), false);
shouldBe(Number.isFinite(new Number(undefined)), false);
shouldBe(Number.isFinite(new Number(true)), false);
shouldBe(Number.isFinite(new Number(false)), false);
// BigInt
shouldBe(Number.isFinite(BigInt(123)), false);
shouldBe(Number.isFinite(BigInt(-123)), false);
shouldBe(Number.isFinite(BigInt("123")), false);
shouldBe(Number.isFinite(BigInt("-123")), false);
shouldBe(Number.isFinite(BigInt("0x1fffffffffffff")), false);
shouldBe(Number.isFinite(BigInt("0o377777777777777777")), false);
// Type conversion, doesn't happen.
var objectWithNumberValueOf = { valueOf: function() { return 123; } };
var objectWithNaNValueOf = { valueOf: function() { return NaN; } };
shouldBe(Number.isFinite(objectWithNumberValueOf), false);
shouldBe(Number.isFinite(objectWithNaNValueOf), false);
var objectRecordConversionCalls = {
callList: [],
toString: function() {
this.callList.push("toString");
return "Bad";
},
valueOf: function() {
this.callList.push("valueOf");
return 12345;
}
};
shouldBe(Number.isFinite(objectRecordConversionCalls), false);
shouldBe(objectRecordConversionCalls.callList.length, 0);