diff --git a/Libraries/LibJS/Runtime/MathObject.cpp b/Libraries/LibJS/Runtime/MathObject.cpp index 133d439759..d8945a4793 100644 --- a/Libraries/LibJS/Runtime/MathObject.cpp +++ b/Libraries/LibJS/Runtime/MathObject.cpp @@ -50,6 +50,7 @@ MathObject::MathObject() put_native_function("cos", cos, 1, attr); put_native_function("tan", tan, 1, attr); put_native_function("pow", pow, 2, attr); + put_native_function("sign", sign, 1, attr); put("E", Value(M_E), 0); put("LN2", Value(M_LN2), 0); @@ -206,4 +207,20 @@ Value MathObject::pow(Interpreter& interpreter) return exp(interpreter, interpreter.argument(0), interpreter.argument(1)); } +Value MathObject::sign(Interpreter& interpreter) +{ + auto number = interpreter.argument(0).to_number(interpreter); + if (interpreter.exception()) + return {}; + if (number.is_positive_zero()) + return Value(0); + if (number.is_negative_zero()) + return Value(-0.0); + if (number.as_double() > 0) + return Value(1); + if (number.as_double() < 0) + return Value(-1); + return js_nan(); +} + } diff --git a/Libraries/LibJS/Runtime/MathObject.h b/Libraries/LibJS/Runtime/MathObject.h index 75901cbee4..f8d21b91d0 100644 --- a/Libraries/LibJS/Runtime/MathObject.h +++ b/Libraries/LibJS/Runtime/MathObject.h @@ -51,6 +51,7 @@ private: static Value cos(Interpreter&); static Value tan(Interpreter&); static Value pow(Interpreter&); + static Value sign(Interpreter&); }; } diff --git a/Libraries/LibJS/Tests/Math.sign.js b/Libraries/LibJS/Tests/Math.sign.js new file mode 100644 index 0000000000..e60233b8cb --- /dev/null +++ b/Libraries/LibJS/Tests/Math.sign.js @@ -0,0 +1,42 @@ +load("test-common.js"); + +function isPositiveZero(value) { + return value === 0 && 1 / value === Infinity; +} + +function isNegativeZero(value) { + return value === 0 && 1 / value === -Infinity; +} + +try { + assert(Math.sign.length === 1); + + assert(Math.sign(0.0001) === 1); + assert(Math.sign(1) === 1); + assert(Math.sign(42) === 1); + assert(Math.sign(Infinity) === 1); + assert(isPositiveZero(Math.sign(0))); + assert(isPositiveZero(Math.sign(null))); + assert(isPositiveZero(Math.sign(''))); + assert(isPositiveZero(Math.sign([]))); + + assert(Math.sign(-0.0001) === -1); + assert(Math.sign(-1) === -1); + assert(Math.sign(-42) === -1); + assert(Math.sign(-Infinity) === -1); + assert(isNegativeZero(Math.sign(-0))); + assert(isNegativeZero(Math.sign(-null))); + assert(isNegativeZero(Math.sign(-''))); + assert(isNegativeZero(Math.sign(-[]))); + + assert(isNaN(Math.sign())); + assert(isNaN(Math.sign(undefined))); + assert(isNaN(Math.sign([1, 2, 3]))); + assert(isNaN(Math.sign({}))); + assert(isNaN(Math.sign(NaN))); + assert(isNaN(Math.sign("foo"))); + + console.log("PASS"); +} catch (e) { + console.log("FAIL: " + e); +}