1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 23:07:35 +00:00

LibJS: Implement Number.isInteger()

This commit is contained in:
Linus Groh 2020-04-26 18:49:23 +01:00 committed by Andreas Kling
parent 7bd6b58b29
commit 14c7988eea
3 changed files with 46 additions and 0 deletions

View file

@ -41,6 +41,7 @@ NumberConstructor::NumberConstructor()
: NativeFunction("Number", *interpreter().global_object().function_prototype())
{
put_native_function("isFinite", is_finite, 1);
put_native_function("isInteger", is_integer, 1);
put_native_function("isNaN", is_nan, 1);
put_native_function("isSafeInteger", is_safe_integer, 1);
@ -80,6 +81,12 @@ Value NumberConstructor::is_finite(Interpreter& interpreter)
return Value(interpreter.argument(0).is_finite_number());
}
Value NumberConstructor::is_integer(Interpreter& interpreter)
{
auto value = interpreter.argument(0);
return Value(value.is_number() && (i32)value.as_double() == value.as_double());
}
Value NumberConstructor::is_nan(Interpreter& interpreter)
{
return Value(interpreter.argument(0).is_nan());

View file

@ -43,6 +43,7 @@ private:
virtual const char* class_name() const override { return "NumberConstructor"; }
static Value is_finite(Interpreter&);
static Value is_integer(Interpreter&);
static Value is_nan(Interpreter&);
static Value is_safe_integer(Interpreter&);
};

View file

@ -0,0 +1,38 @@
load("test-common.js");
try {
assert(Number.isInteger.length === 1);
assert(Number.isInteger(0) === true);
assert(Number.isInteger(42) === true);
assert(Number.isInteger(-10000) === true);
assert(Number.isInteger(5) === true);
assert(Number.isInteger(5.0) === true);
assert(Number.isInteger(5.0000000000000001) === true);
// FIXME: values outside of i32's range should still return true
// assert(Number.isInteger(+2147483647 + 1) === true);
// assert(Number.isInteger(-2147483648 - 1) === true);
// assert(Number.isInteger(99999999999999999999999999999999999) === true);
assert(Number.isInteger(5.000000000000001) === false);
assert(Number.isInteger(1.23) === false);
assert(Number.isInteger("") === false);
assert(Number.isInteger("0") === false);
assert(Number.isInteger("42") === false);
assert(Number.isInteger(true) === false);
assert(Number.isInteger(false) === false);
assert(Number.isInteger(null) === false);
assert(Number.isInteger([]) === false);
assert(Number.isInteger(Infinity) === false);
assert(Number.isInteger(-Infinity) === false);
assert(Number.isInteger(NaN) === false);
assert(Number.isInteger() === false);
assert(Number.isInteger(undefined) === false);
assert(Number.isInteger("foo") === false);
assert(Number.isInteger({}) === false);
assert(Number.isInteger([1, 2, 3]) === false);
console.log("PASS");
} catch (e) {
console.log("FAIL: " + e.message);
}