LibWeb: Implement HTML spec-compliant rules for floating-point parsing

Attempt to implement HTML specs for parsing floating-point number
https://html.spec.whatwg.org/multipage/common-microsyntaxes.html#rules-for-parsing-floating-point-number-values
This commit is contained in:
Khaled Lakehal 2024-10-25 14:25:04 +02:00 committed by Andreas Kling
commit 14e1e55319
Notes: github-actions[bot] 2024-10-30 09:48:30 +00:00
3 changed files with 329 additions and 5 deletions

View file

@ -0,0 +1,84 @@
<input id="input_number" type="number" />
<script src="include.js"></script>
<script>
function testInputGetter(element, value) {
try {
element.value = value;
println(`${element.valueAsNumber}`);
} catch (e) {
println(`error`);
}
};
function testInputSetter(element, valueAsNumber) {
try {
element.valueAsNumber = valueAsNumber;
println(`${element.value}`);
} catch (e) {
println(`error`);
}
};
test(() => {
let input = document.getElementById("input_number");
println(`Getting values (string to number)`);
// Basic valid floating point number parsing
testInputGetter(input, "42");
testInputGetter(input, "-42");
testInputGetter(input, "+42");
testInputGetter(input, "0");
testInputGetter(input, "0.5");
testInputGetter(input, "-0.5");
testInputGetter(input, ".5");
testInputGetter(input, ".");
// Floating point parsing with leading and trailing whitespace
testInputGetter(input, " 123 ");
testInputGetter(input, "\t-123\t");
testInputGetter(input, "\n 0.5 \n");
// Handling NaN and Infinity values
testInputGetter(input, "NaN");
testInputGetter(input, "Infinity");
testInputGetter(input, "-Infinity");
// Parsing numbers in exponential notation
testInputGetter(input, "1e2");
testInputGetter(input, "1e-2");
testInputGetter(input, "1.5e3");
testInputGetter(input, "-1.5e-3");
// Handling special values 2^1024 and -2^1024
testInputGetter(input, "2e1024");
testInputGetter(input, "-2e1024");
// Handling invalid floating point number inputs
testInputGetter(input, "abc");
testInputGetter(input, "1.2.3");
testInputGetter(input, "++123");
testInputGetter(input, "--123");
// Handling negative zero (-0)
testInputGetter(input, "-0");
testInputGetter(input, "+0");
// Handling large numbers and overflow
testInputGetter(input, "1e308");
testInputGetter(input, "-1e308");
testInputGetter(input, "1e309"); // overflow
testInputGetter(input, "-1e309"); // overflow
println(`Setting values (number to string)`);
testInputSetter(input, 42);
testInputSetter(input, -42);
testInputSetter(input, 0.5);
testInputSetter(input, -0.5);
testInputSetter(input, 1e2);
testInputSetter(input, 1e-2);
testInputSetter(input, 1.5e3);
testInputSetter(input, -1.5e-3);
testInputSetter(input, 2e1024);
testInputSetter(input, -2e1024);
testInputSetter(input, 1e308);
testInputSetter(input, -1e308);
testInputSetter(input, 1e309);
testInputSetter(input, -1e309);
testInputSetter(input, -0);
testInputSetter(input, +0);
testInputSetter(input, 0);
});
</script>