ladybird/Libraries/LibJS/Tests/binary-relational.js
Marcin Gasperowicz eadce65e04
LibJS: Implement standard semantics for relational operators (#2417)
Previously, the relational operators where casting any value to double
and comparing the results according to C++ semantics.

This patch makes the relational operators in JS behave according to the
standard specification.

Since we don't have BigInt yet, the implementation doesn't take it into
account. 

Moved PreferredType from Object to Value. Value::to_primitive now
passes preferred_type to Object::to_primitive.
2020-05-28 17:19:59 +02:00

531 lines
20 KiB
JavaScript

load("test-common.js");
try {
const vals = [
1,
2,
[],
[1],
[2],
[1, 2],
"foo",
"fooo",
"🔥",
"❤️",
"bar",
{},
{ a: 1 },
{ a: 2 },
{ b: 1 },
true,
false,
undefined,
null,
NaN,
+Infinity,
-Infinity,
];
// Each row contains: x_index, y_index, (x < y), (x > y), (x <= y), (x >= y)
// where x = vals[x_index], y = vals[y_index]
const table = [
[0, 0, false, false, true, true],
[0, 1, true, false, true, false],
[0, 2, false, true, false, true],
[0, 3, false, false, true, true],
[0, 4, true, false, true, false],
[0, 5, false, false, false, false],
[0, 6, false, false, false, false],
[0, 7, false, false, false, false],
[0, 8, false, false, false, false],
[0, 9, false, false, false, false],
[0, 10, false, false, false, false],
[0, 11, false, false, false, false],
[0, 12, false, false, false, false],
[0, 13, false, false, false, false],
[0, 14, false, false, false, false],
[0, 15, false, false, true, true],
[0, 16, false, true, false, true],
[0, 17, false, false, false, false],
[0, 18, false, true, false, true],
[0, 19, false, false, false, false],
[0, 20, true, false, true, false],
[0, 21, false, true, false, true],
[1, 0, false, true, false, true],
[1, 1, false, false, true, true],
[1, 2, false, true, false, true],
[1, 3, false, true, false, true],
[1, 4, false, false, true, true],
[1, 5, false, false, false, false],
[1, 6, false, false, false, false],
[1, 7, false, false, false, false],
[1, 8, false, false, false, false],
[1, 9, false, false, false, false],
[1, 10, false, false, false, false],
[1, 11, false, false, false, false],
[1, 12, false, false, false, false],
[1, 13, false, false, false, false],
[1, 14, false, false, false, false],
[1, 15, false, true, false, true],
[1, 16, false, true, false, true],
[1, 17, false, false, false, false],
[1, 18, false, true, false, true],
[1, 19, false, false, false, false],
[1, 20, true, false, true, false],
[1, 21, false, true, false, true],
[2, 0, true, false, true, false],
[2, 1, true, false, true, false],
[2, 2, false, false, true, true],
[2, 3, true, false, true, false],
[2, 4, true, false, true, false],
[2, 5, true, false, true, false],
[2, 6, true, false, true, false],
[2, 7, true, false, true, false],
[2, 8, true, false, true, false],
[2, 9, true, false, true, false],
[2, 10, true, false, true, false],
[2, 11, true, false, true, false],
[2, 12, true, false, true, false],
[2, 13, true, false, true, false],
[2, 14, true, false, true, false],
[2, 15, true, false, true, false],
[2, 16, false, false, true, true],
[2, 17, false, false, false, false],
[2, 18, false, false, true, true],
[2, 19, false, false, false, false],
[2, 20, true, false, true, false],
[2, 21, false, true, false, true],
[3, 0, false, false, true, true],
[3, 1, true, false, true, false],
[3, 2, false, true, false, true],
[3, 3, false, false, true, true],
[3, 4, true, false, true, false],
[3, 5, true, false, true, false],
[3, 6, true, false, true, false],
[3, 7, true, false, true, false],
[3, 8, true, false, true, false],
[3, 9, true, false, true, false],
[3, 10, true, false, true, false],
[3, 11, true, false, true, false],
[3, 12, true, false, true, false],
[3, 13, true, false, true, false],
[3, 14, true, false, true, false],
[3, 15, false, false, true, true],
[3, 16, false, true, false, true],
[3, 17, false, false, false, false],
[3, 18, false, true, false, true],
[3, 19, false, false, false, false],
[3, 20, true, false, true, false],
[3, 21, false, true, false, true],
[4, 0, false, true, false, true],
[4, 1, false, false, true, true],
[4, 2, false, true, false, true],
[4, 3, false, true, false, true],
[4, 4, false, false, true, true],
[4, 5, false, true, false, true],
[4, 6, true, false, true, false],
[4, 7, true, false, true, false],
[4, 8, true, false, true, false],
[4, 9, true, false, true, false],
[4, 10, true, false, true, false],
[4, 11, true, false, true, false],
[4, 12, true, false, true, false],
[4, 13, true, false, true, false],
[4, 14, true, false, true, false],
[4, 15, false, true, false, true],
[4, 16, false, true, false, true],
[4, 17, false, false, false, false],
[4, 18, false, true, false, true],
[4, 19, false, false, false, false],
[4, 20, true, false, true, false],
[4, 21, false, true, false, true],
[5, 0, false, false, false, false],
[5, 1, false, false, false, false],
[5, 2, false, true, false, true],
[5, 3, false, true, false, true],
[5, 4, true, false, true, false],
[5, 5, false, false, true, true],
[5, 6, true, false, true, false],
[5, 7, true, false, true, false],
[5, 8, true, false, true, false],
[5, 9, true, false, true, false],
[5, 10, true, false, true, false],
[5, 11, true, false, true, false],
[5, 12, true, false, true, false],
[5, 13, true, false, true, false],
[5, 14, true, false, true, false],
[5, 15, false, false, false, false],
[5, 16, false, false, false, false],
[5, 17, false, false, false, false],
[5, 18, false, false, false, false],
[5, 19, false, false, false, false],
[5, 20, false, false, false, false],
[5, 21, false, false, false, false],
[6, 0, false, false, false, false],
[6, 1, false, false, false, false],
[6, 2, false, true, false, true],
[6, 3, false, true, false, true],
[6, 4, false, true, false, true],
[6, 5, false, true, false, true],
[6, 6, false, false, true, true],
[6, 7, true, false, true, false],
[6, 8, true, false, true, false],
[6, 9, true, false, true, false],
[6, 10, false, true, false, true],
[6, 11, false, true, false, true],
[6, 12, false, true, false, true],
[6, 13, false, true, false, true],
[6, 14, false, true, false, true],
[6, 15, false, false, false, false],
[6, 16, false, false, false, false],
[6, 17, false, false, false, false],
[6, 18, false, false, false, false],
[6, 19, false, false, false, false],
[6, 20, false, false, false, false],
[6, 21, false, false, false, false],
[7, 0, false, false, false, false],
[7, 1, false, false, false, false],
[7, 2, false, true, false, true],
[7, 3, false, true, false, true],
[7, 4, false, true, false, true],
[7, 5, false, true, false, true],
[7, 6, false, true, false, true],
[7, 7, false, false, true, true],
[7, 8, true, false, true, false],
[7, 9, true, false, true, false],
[7, 10, false, true, false, true],
[7, 11, false, true, false, true],
[7, 12, false, true, false, true],
[7, 13, false, true, false, true],
[7, 14, false, true, false, true],
[7, 15, false, false, false, false],
[7, 16, false, false, false, false],
[7, 17, false, false, false, false],
[7, 18, false, false, false, false],
[7, 19, false, false, false, false],
[7, 20, false, false, false, false],
[7, 21, false, false, false, false],
[8, 0, false, false, false, false],
[8, 1, false, false, false, false],
[8, 2, false, true, false, true],
[8, 3, false, true, false, true],
[8, 4, false, true, false, true],
[8, 5, false, true, false, true],
[8, 6, false, true, false, true],
[8, 7, false, true, false, true],
[8, 8, false, false, true, true],
[8, 9, false, true, false, true],
[8, 10, false, true, false, true],
[8, 11, false, true, false, true],
[8, 12, false, true, false, true],
[8, 13, false, true, false, true],
[8, 14, false, true, false, true],
[8, 15, false, false, false, false],
[8, 16, false, false, false, false],
[8, 17, false, false, false, false],
[8, 18, false, false, false, false],
[8, 19, false, false, false, false],
[8, 20, false, false, false, false],
[8, 21, false, false, false, false],
[9, 0, false, false, false, false],
[9, 1, false, false, false, false],
[9, 2, false, true, false, true],
[9, 3, false, true, false, true],
[9, 4, false, true, false, true],
[9, 5, false, true, false, true],
[9, 6, false, true, false, true],
[9, 7, false, true, false, true],
[9, 8, true, false, true, false],
[9, 9, false, false, true, true],
[9, 10, false, true, false, true],
[9, 11, false, true, false, true],
[9, 12, false, true, false, true],
[9, 13, false, true, false, true],
[9, 14, false, true, false, true],
[9, 15, false, false, false, false],
[9, 16, false, false, false, false],
[9, 17, false, false, false, false],
[9, 18, false, false, false, false],
[9, 19, false, false, false, false],
[9, 20, false, false, false, false],
[9, 21, false, false, false, false],
[10, 0, false, false, false, false],
[10, 1, false, false, false, false],
[10, 2, false, true, false, true],
[10, 3, false, true, false, true],
[10, 4, false, true, false, true],
[10, 5, false, true, false, true],
[10, 6, true, false, true, false],
[10, 7, true, false, true, false],
[10, 8, true, false, true, false],
[10, 9, true, false, true, false],
[10, 10, false, false, true, true],
[10, 11, false, true, false, true],
[10, 12, false, true, false, true],
[10, 13, false, true, false, true],
[10, 14, false, true, false, true],
[10, 15, false, false, false, false],
[10, 16, false, false, false, false],
[10, 17, false, false, false, false],
[10, 18, false, false, false, false],
[10, 19, false, false, false, false],
[10, 20, false, false, false, false],
[10, 21, false, false, false, false],
[11, 0, false, false, false, false],
[11, 1, false, false, false, false],
[11, 2, false, true, false, true],
[11, 3, false, true, false, true],
[11, 4, false, true, false, true],
[11, 5, false, true, false, true],
[11, 6, true, false, true, false],
[11, 7, true, false, true, false],
[11, 8, true, false, true, false],
[11, 9, true, false, true, false],
[11, 10, true, false, true, false],
[11, 11, false, false, true, true],
[11, 12, false, false, true, true],
[11, 13, false, false, true, true],
[11, 14, false, false, true, true],
[11, 15, false, false, false, false],
[11, 16, false, false, false, false],
[11, 17, false, false, false, false],
[11, 18, false, false, false, false],
[11, 19, false, false, false, false],
[11, 20, false, false, false, false],
[11, 21, false, false, false, false],
[12, 0, false, false, false, false],
[12, 1, false, false, false, false],
[12, 2, false, true, false, true],
[12, 3, false, true, false, true],
[12, 4, false, true, false, true],
[12, 5, false, true, false, true],
[12, 6, true, false, true, false],
[12, 7, true, false, true, false],
[12, 8, true, false, true, false],
[12, 9, true, false, true, false],
[12, 10, true, false, true, false],
[12, 11, false, false, true, true],
[12, 12, false, false, true, true],
[12, 13, false, false, true, true],
[12, 14, false, false, true, true],
[12, 15, false, false, false, false],
[12, 16, false, false, false, false],
[12, 17, false, false, false, false],
[12, 18, false, false, false, false],
[12, 19, false, false, false, false],
[12, 20, false, false, false, false],
[12, 21, false, false, false, false],
[13, 0, false, false, false, false],
[13, 1, false, false, false, false],
[13, 2, false, true, false, true],
[13, 3, false, true, false, true],
[13, 4, false, true, false, true],
[13, 5, false, true, false, true],
[13, 6, true, false, true, false],
[13, 7, true, false, true, false],
[13, 8, true, false, true, false],
[13, 9, true, false, true, false],
[13, 10, true, false, true, false],
[13, 11, false, false, true, true],
[13, 12, false, false, true, true],
[13, 13, false, false, true, true],
[13, 14, false, false, true, true],
[13, 15, false, false, false, false],
[13, 16, false, false, false, false],
[13, 17, false, false, false, false],
[13, 18, false, false, false, false],
[13, 19, false, false, false, false],
[13, 20, false, false, false, false],
[13, 21, false, false, false, false],
[14, 0, false, false, false, false],
[14, 1, false, false, false, false],
[14, 2, false, true, false, true],
[14, 3, false, true, false, true],
[14, 4, false, true, false, true],
[14, 5, false, true, false, true],
[14, 6, true, false, true, false],
[14, 7, true, false, true, false],
[14, 8, true, false, true, false],
[14, 9, true, false, true, false],
[14, 10, true, false, true, false],
[14, 11, false, false, true, true],
[14, 12, false, false, true, true],
[14, 13, false, false, true, true],
[14, 14, false, false, true, true],
[14, 15, false, false, false, false],
[14, 16, false, false, false, false],
[14, 17, false, false, false, false],
[14, 18, false, false, false, false],
[14, 19, false, false, false, false],
[14, 20, false, false, false, false],
[14, 21, false, false, false, false],
[15, 0, false, false, true, true],
[15, 1, true, false, true, false],
[15, 2, false, true, false, true],
[15, 3, false, false, true, true],
[15, 4, true, false, true, false],
[15, 5, false, false, false, false],
[15, 6, false, false, false, false],
[15, 7, false, false, false, false],
[15, 8, false, false, false, false],
[15, 9, false, false, false, false],
[15, 10, false, false, false, false],
[15, 11, false, false, false, false],
[15, 12, false, false, false, false],
[15, 13, false, false, false, false],
[15, 14, false, false, false, false],
[15, 15, false, false, true, true],
[15, 16, false, true, false, true],
[15, 17, false, false, false, false],
[15, 18, false, true, false, true],
[15, 19, false, false, false, false],
[15, 20, true, false, true, false],
[15, 21, false, true, false, true],
[16, 0, true, false, true, false],
[16, 1, true, false, true, false],
[16, 2, false, false, true, true],
[16, 3, true, false, true, false],
[16, 4, true, false, true, false],
[16, 5, false, false, false, false],
[16, 6, false, false, false, false],
[16, 7, false, false, false, false],
[16, 8, false, false, false, false],
[16, 9, false, false, false, false],
[16, 10, false, false, false, false],
[16, 11, false, false, false, false],
[16, 12, false, false, false, false],
[16, 13, false, false, false, false],
[16, 14, false, false, false, false],
[16, 15, true, false, true, false],
[16, 16, false, false, true, true],
[16, 17, false, false, false, false],
[16, 18, false, false, true, true],
[16, 19, false, false, false, false],
[16, 20, true, false, true, false],
[16, 21, false, true, false, true],
[17, 0, false, false, false, false],
[17, 1, false, false, false, false],
[17, 2, false, false, false, false],
[17, 3, false, false, false, false],
[17, 4, false, false, false, false],
[17, 5, false, false, false, false],
[17, 6, false, false, false, false],
[17, 7, false, false, false, false],
[17, 8, false, false, false, false],
[17, 9, false, false, false, false],
[17, 10, false, false, false, false],
[17, 11, false, false, false, false],
[17, 12, false, false, false, false],
[17, 13, false, false, false, false],
[17, 14, false, false, false, false],
[17, 15, false, false, false, false],
[17, 16, false, false, false, false],
[17, 17, false, false, false, false],
[17, 18, false, false, false, false],
[17, 19, false, false, false, false],
[17, 20, false, false, false, false],
[17, 21, false, false, false, false],
[18, 0, true, false, true, false],
[18, 1, true, false, true, false],
[18, 2, false, false, true, true],
[18, 3, true, false, true, false],
[18, 4, true, false, true, false],
[18, 5, false, false, false, false],
[18, 6, false, false, false, false],
[18, 7, false, false, false, false],
[18, 8, false, false, false, false],
[18, 9, false, false, false, false],
[18, 10, false, false, false, false],
[18, 11, false, false, false, false],
[18, 12, false, false, false, false],
[18, 13, false, false, false, false],
[18, 14, false, false, false, false],
[18, 15, true, false, true, false],
[18, 16, false, false, true, true],
[18, 17, false, false, false, false],
[18, 18, false, false, true, true],
[18, 19, false, false, false, false],
[18, 20, true, false, true, false],
[18, 21, false, true, false, true],
[19, 0, false, false, false, false],
[19, 1, false, false, false, false],
[19, 2, false, false, false, false],
[19, 3, false, false, false, false],
[19, 4, false, false, false, false],
[19, 5, false, false, false, false],
[19, 6, false, false, false, false],
[19, 7, false, false, false, false],
[19, 8, false, false, false, false],
[19, 9, false, false, false, false],
[19, 10, false, false, false, false],
[19, 11, false, false, false, false],
[19, 12, false, false, false, false],
[19, 13, false, false, false, false],
[19, 14, false, false, false, false],
[19, 15, false, false, false, false],
[19, 16, false, false, false, false],
[19, 17, false, false, false, false],
[19, 18, false, false, false, false],
[19, 19, false, false, false, false],
[19, 20, false, false, false, false],
[19, 21, false, false, false, false],
[20, 0, false, true, false, true],
[20, 1, false, true, false, true],
[20, 2, false, true, false, true],
[20, 3, false, true, false, true],
[20, 4, false, true, false, true],
[20, 5, false, false, false, false],
[20, 6, false, false, false, false],
[20, 7, false, false, false, false],
[20, 8, false, false, false, false],
[20, 9, false, false, false, false],
[20, 10, false, false, false, false],
[20, 11, false, false, false, false],
[20, 12, false, false, false, false],
[20, 13, false, false, false, false],
[20, 14, false, false, false, false],
[20, 15, false, true, false, true],
[20, 16, false, true, false, true],
[20, 17, false, false, false, false],
[20, 18, false, true, false, true],
[20, 19, false, false, false, false],
[20, 20, false, false, true, true],
[20, 21, false, true, false, true],
[21, 0, true, false, true, false],
[21, 1, true, false, true, false],
[21, 2, true, false, true, false],
[21, 3, true, false, true, false],
[21, 4, true, false, true, false],
[21, 5, false, false, false, false],
[21, 6, false, false, false, false],
[21, 7, false, false, false, false],
[21, 8, false, false, false, false],
[21, 9, false, false, false, false],
[21, 10, false, false, false, false],
[21, 11, false, false, false, false],
[21, 12, false, false, false, false],
[21, 13, false, false, false, false],
[21, 14, false, false, false, false],
[21, 15, true, false, true, false],
[21, 16, true, false, true, false],
[21, 17, false, false, false, false],
[21, 18, true, false, true, false],
[21, 19, false, false, false, false],
[21, 20, true, false, true, false],
[21, 21, false, false, true, true],
];
for (let test of table) {
let x = vals[test[0]];
let y = vals[test[1]];
assert(x < y === test[2]);
assert(x > y === test[3]);
assert(x <= y === test[4]);
assert(x >= y === test[5]);
}
console.log("PASS");
} catch (e) {
console.log("FAIL: " + e);
}