From 14c7988eeafd67722bbc246812d536345924c078 Mon Sep 17 00:00:00 2001 From: Linus Groh Date: Sun, 26 Apr 2020 18:49:23 +0100 Subject: [PATCH] LibJS: Implement Number.isInteger() --- Libraries/LibJS/Runtime/NumberConstructor.cpp | 7 ++++ Libraries/LibJS/Runtime/NumberConstructor.h | 1 + Libraries/LibJS/Tests/Number.isInteger.js | 38 +++++++++++++++++++ 3 files changed, 46 insertions(+) create mode 100644 Libraries/LibJS/Tests/Number.isInteger.js diff --git a/Libraries/LibJS/Runtime/NumberConstructor.cpp b/Libraries/LibJS/Runtime/NumberConstructor.cpp index 1c1f4cebc8..fc24b85838 100644 --- a/Libraries/LibJS/Runtime/NumberConstructor.cpp +++ b/Libraries/LibJS/Runtime/NumberConstructor.cpp @@ -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()); diff --git a/Libraries/LibJS/Runtime/NumberConstructor.h b/Libraries/LibJS/Runtime/NumberConstructor.h index ba22130530..4d23819a7a 100644 --- a/Libraries/LibJS/Runtime/NumberConstructor.h +++ b/Libraries/LibJS/Runtime/NumberConstructor.h @@ -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&); }; diff --git a/Libraries/LibJS/Tests/Number.isInteger.js b/Libraries/LibJS/Tests/Number.isInteger.js new file mode 100644 index 0000000000..7dd013f112 --- /dev/null +++ b/Libraries/LibJS/Tests/Number.isInteger.js @@ -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); +}