mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-07-05 16:41:52 +00:00
The optimization that skips the string conversion for number values was causing -0 to be returned as-is. This patch adds a check for this case.
82 lines
2.4 KiB
JavaScript
82 lines
2.4 KiB
JavaScript
// This is necessary because we can't simply check if 0 is negative using equality,
|
|
// since -0 === 0 evaluates to true.
|
|
// test262 checks for negative zero in a similar way here:
|
|
// https://github.com/tc39/test262/blob/main/test/built-ins/parseFloat/S15.1.2.3_A1_T2.js
|
|
function isZeroNegative(x) {
|
|
const isZero = x === 0;
|
|
const isNegative = 1 / x === Number.NEGATIVE_INFINITY;
|
|
|
|
return isZero && isNegative;
|
|
}
|
|
|
|
test("parsing numbers", () => {
|
|
[
|
|
[1, 1],
|
|
[0.23, 0.23],
|
|
[1.23, 1.23],
|
|
[0.0123e2, 1.23],
|
|
[1.23e4, 12300],
|
|
[Infinity, Infinity],
|
|
].forEach(test => {
|
|
expect(parseFloat(test[0])).toBe(test[1]);
|
|
expect(parseFloat(+test[0])).toBe(test[1]);
|
|
expect(parseFloat(-test[0])).toBe(-test[1]);
|
|
});
|
|
});
|
|
|
|
test("parsing zero", () => {
|
|
expect(isZeroNegative(parseFloat("0"))).toBeFalse();
|
|
expect(isZeroNegative(parseFloat("+0"))).toBeFalse();
|
|
expect(isZeroNegative(parseFloat("-0"))).toBeTrue();
|
|
|
|
expect(isZeroNegative(parseFloat(0))).toBeFalse();
|
|
expect(isZeroNegative(parseFloat(+0))).toBeFalse();
|
|
expect(isZeroNegative(parseFloat(-0))).toBeFalse();
|
|
});
|
|
|
|
test("parsing strings", () => {
|
|
[
|
|
["0", 0],
|
|
["1", 1],
|
|
[".23", 0.23],
|
|
["1.23", 1.23],
|
|
["0.0123E+2", 1.23],
|
|
["1.23e4", 12300],
|
|
["0x1.23p5", 0],
|
|
["1.23p5", 1.23],
|
|
["1.23e42351245", Infinity],
|
|
["Infinity", Infinity],
|
|
].forEach(test => {
|
|
expect(parseFloat(test[0])).toBe(test[1]);
|
|
expect(parseFloat(`+${test[0]}`)).toBe(test[1]);
|
|
expect(parseFloat(`-${test[0]}`)).toBe(-test[1]);
|
|
expect(parseFloat(`${test[0]}foo`)).toBe(test[1]);
|
|
expect(parseFloat(`+${test[0]}foo`)).toBe(test[1]);
|
|
expect(parseFloat(`-${test[0]}foo`)).toBe(-test[1]);
|
|
expect(parseFloat(` \n \t ${test[0]} \v foo `)).toBe(test[1]);
|
|
expect(parseFloat(` \r -${test[0]} \f \n\n foo `)).toBe(-test[1]);
|
|
expect(parseFloat({ toString: () => test[0] })).toBe(test[1]);
|
|
});
|
|
});
|
|
|
|
test("parsing NaN", () => {
|
|
[
|
|
"",
|
|
[],
|
|
[],
|
|
true,
|
|
false,
|
|
null,
|
|
undefined,
|
|
NaN,
|
|
"foo123",
|
|
"foo+123",
|
|
"fooInfinity",
|
|
"foo+Infinity",
|
|
].forEach(value => {
|
|
expect(parseFloat(value)).toBeNaN();
|
|
});
|
|
|
|
expect(parseFloat()).toBeNaN();
|
|
expect(parseFloat("", 123, Infinity)).toBeNaN();
|
|
});
|