1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 10:37:45 +00:00

Libraries: Move to Userland/Libraries/

This commit is contained in:
Andreas Kling 2021-01-12 12:17:30 +01:00
parent dc28c07fa5
commit 13d7c09125
1857 changed files with 266 additions and 274 deletions

View file

@ -0,0 +1,135 @@
let x, o;
test("basic functionality", () => {
x = 1;
expect((x = 2)).toBe(2);
expect(x).toBe(2);
x = 1;
expect((x += 2)).toBe(3);
expect(x).toBe(3);
x = 3;
expect((x -= 2)).toBe(1);
expect(x).toBe(1);
x = 3;
expect((x *= 2)).toBe(6);
expect(x).toBe(6);
x = 6;
expect((x /= 2)).toBe(3);
expect(x).toBe(3);
x = 6;
expect((x %= 4)).toBe(2);
expect(x).toBe(2);
x = 2;
expect((x **= 3)).toBe(8);
expect(x).toBe(8);
x = 3;
expect((x &= 2)).toBe(2);
expect(x).toBe(2);
x = 3;
expect((x |= 4)).toBe(7);
expect(x).toBe(7);
x = 6;
expect((x ^= 2)).toBe(4);
expect(x).toBe(4);
x = 2;
expect((x <<= 2)).toBe(8);
expect(x).toBe(8);
x = 8;
expect((x >>= 2)).toBe(2);
expect(x).toBe(2);
x = -(2 ** 32 - 10);
expect((x >>>= 2)).toBe(2);
expect(x).toBe(2);
});
test("logical assignment operators", () => {
// short circuiting evaluation
x = false;
expect((x &&= expect.fail())).toBeFalse();
x = true;
expect((x ||= expect.fail())).toBeTrue();
x = "foo";
expect((x ??= expect.fail())).toBe("foo");
const prepareObject = (shortCircuitValue, assignmentValue) => ({
get shortCircuit() {
return shortCircuitValue;
},
set shortCircuit(_) {
// assignment will short circuit in all test cases
// so its setter must never be called
expect().fail();
},
assignment: assignmentValue,
});
o = prepareObject(false, true);
expect((o.shortCircuit &&= "foo")).toBeFalse();
expect(o.shortCircuit).toBeFalse();
expect((o.assignment &&= "bar")).toBe("bar");
expect(o.assignment).toBe("bar");
o = prepareObject(true, false);
expect((o.shortCircuit ||= "foo")).toBeTrue();
expect(o.shortCircuit).toBeTrue();
expect((o.assignment ||= "bar")).toBe("bar");
expect(o.assignment).toBe("bar");
o = prepareObject("test", null);
expect((o.shortCircuit ??= "foo")).toBe("test");
expect(o.shortCircuit).toBe("test");
expect((o.assignment ??= "bar")).toBe("bar");
expect(o.assignment).toBe("bar");
});
test("evaluation order", () => {
for (const op of [
"=",
"+=",
"-=",
"*=",
"/=",
"%=",
"**=",
"&=",
"|=",
"^=",
"<<=",
">>=",
">>>=",
"&&=",
"||=",
"??=",
]) {
var a = [];
function b() {
b.hasBeenCalled = true;
throw Error();
}
function c() {
c.hasBeenCalled = true;
throw Error();
}
b.hasBeenCalled = false;
c.hasBeenCalled = false;
expect(() => {
new Function(`a[b()] ${op} c()`)();
}).toThrow(Error);
expect(b.hasBeenCalled).toBeTrue();
expect(c.hasBeenCalled).toBeFalse();
}
});

View file

@ -0,0 +1,60 @@
test("basic numeric and", () => {
expect(0 & 0).toBe(0);
expect(0 & 1).toBe(0);
expect(0 & 2).toBe(0);
expect(0 & 3).toBe(0);
expect(0 & 4).toBe(0);
expect(0 & 5).toBe(0);
expect(1 & 0).toBe(0);
expect(1 & 1).toBe(1);
expect(1 & 2).toBe(0);
expect(1 & 3).toBe(1);
expect(1 & 4).toBe(0);
expect(1 & 5).toBe(1);
expect(2 & 0).toBe(0);
expect(2 & 1).toBe(0);
expect(2 & 2).toBe(2);
expect(2 & 3).toBe(2);
expect(2 & 4).toBe(0);
expect(2 & 5).toBe(0);
expect(3 & 0).toBe(0);
expect(3 & 1).toBe(1);
expect(3 & 2).toBe(2);
expect(3 & 3).toBe(3);
expect(3 & 4).toBe(0);
expect(3 & 5).toBe(1);
expect(4 & 0).toBe(0);
expect(4 & 1).toBe(0);
expect(4 & 2).toBe(0);
expect(4 & 3).toBe(0);
expect(4 & 4).toBe(4);
expect(4 & 5).toBe(4);
expect(5 & 0).toBe(0);
expect(5 & 1).toBe(1);
expect(5 & 2).toBe(0);
expect(5 & 3).toBe(1);
expect(5 & 4).toBe(4);
expect(5 & 5).toBe(5);
});
test("and with non-numeric values", () => {
let x = 3;
let y = 7;
expect("42" & 6).toBe(2);
expect(x & y).toBe(3);
expect(x & [[[[13]]]]).toBe(1);
expect(undefined & y).toBe(0);
expect("a" & "b").toBe(0);
expect(null & null).toBe(0);
expect(undefined & undefined).toBe(0);
expect(NaN & NaN).toBe(0);
expect(NaN & 6).toBe(0);
expect(Infinity & Infinity).toBe(0);
expect(-Infinity & Infinity).toBe(0);
});

View file

@ -0,0 +1,60 @@
test("basic numeric shifting", () => {
expect(0 << 0).toBe(0);
expect(0 << 1).toBe(0);
expect(0 << 2).toBe(0);
expect(0 << 3).toBe(0);
expect(0 << 4).toBe(0);
expect(0 << 5).toBe(0);
expect(1 << 0).toBe(1);
expect(1 << 1).toBe(2);
expect(1 << 2).toBe(4);
expect(1 << 3).toBe(8);
expect(1 << 4).toBe(16);
expect(1 << 5).toBe(32);
expect(2 << 0).toBe(2);
expect(2 << 1).toBe(4);
expect(2 << 2).toBe(8);
expect(2 << 3).toBe(16);
expect(2 << 4).toBe(32);
expect(2 << 5).toBe(64);
expect(3 << 0).toBe(3);
expect(3 << 1).toBe(6);
expect(3 << 2).toBe(12);
expect(3 << 3).toBe(24);
expect(3 << 4).toBe(48);
expect(3 << 5).toBe(96);
expect(4 << 0).toBe(4);
expect(4 << 1).toBe(8);
expect(4 << 2).toBe(16);
expect(4 << 3).toBe(32);
expect(4 << 4).toBe(64);
expect(4 << 5).toBe(128);
expect(5 << 0).toBe(5);
expect(5 << 1).toBe(10);
expect(5 << 2).toBe(20);
expect(5 << 3).toBe(40);
expect(5 << 4).toBe(80);
expect(5 << 5).toBe(160);
});
test("shifting with non-numeric values", () => {
let x = 3;
let y = 7;
expect("42" << 6).toBe(2688);
expect(x << y).toBe(384);
expect(x << [[[[12]]]]).toBe(12288);
expect(undefined << y).toBe(0);
expect("a" << "b").toBe(0);
expect(null << null).toBe(0);
expect(undefined << undefined).toBe(0);
expect(NaN << NaN).toBe(0);
expect(NaN << 6).toBe(0);
expect(Infinity << Infinity).toBe(0);
expect(-Infinity << Infinity).toBe(0);
});

View file

@ -0,0 +1,60 @@
test("basic numeric or", () => {
expect(0 | 0).toBe(0);
expect(0 | 1).toBe(1);
expect(0 | 2).toBe(2);
expect(0 | 3).toBe(3);
expect(0 | 4).toBe(4);
expect(0 | 5).toBe(5);
expect(1 | 0).toBe(1);
expect(1 | 1).toBe(1);
expect(1 | 2).toBe(3);
expect(1 | 3).toBe(3);
expect(1 | 4).toBe(5);
expect(1 | 5).toBe(5);
expect(2 | 0).toBe(2);
expect(2 | 1).toBe(3);
expect(2 | 2).toBe(2);
expect(2 | 3).toBe(3);
expect(2 | 4).toBe(6);
expect(2 | 5).toBe(7);
expect(3 | 0).toBe(3);
expect(3 | 1).toBe(3);
expect(3 | 2).toBe(3);
expect(3 | 3).toBe(3);
expect(3 | 4).toBe(7);
expect(3 | 5).toBe(7);
expect(4 | 0).toBe(4);
expect(4 | 1).toBe(5);
expect(4 | 2).toBe(6);
expect(4 | 3).toBe(7);
expect(4 | 4).toBe(4);
expect(4 | 5).toBe(5);
expect(5 | 0).toBe(5);
expect(5 | 1).toBe(5);
expect(5 | 2).toBe(7);
expect(5 | 3).toBe(7);
expect(5 | 4).toBe(5);
expect(5 | 5).toBe(5);
});
test("or with non-numeric values", () => {
let x = 3;
let y = 7;
expect("42" | 6).toBe(46);
expect(x | y).toBe(7);
expect(x | [[[[12]]]]).toBe(15);
expect(undefined | y).toBe(7);
expect("a" | "b").toBe(0);
expect(null | null).toBe(0);
expect(undefined | undefined).toBe(0);
expect(NaN | NaN).toBe(0);
expect(NaN | 6).toBe(6);
expect(Infinity | Infinity).toBe(0);
expect(-Infinity | Infinity).toBe(0);
});

View file

@ -0,0 +1,62 @@
test("basic numeric shifting", () => {
expect(0 >> 0).toBe(0);
expect(0 >> 1).toBe(0);
expect(0 >> 2).toBe(0);
expect(0 >> 3).toBe(0);
expect(0 >> 4).toBe(0);
expect(0 >> 5).toBe(0);
expect(1 >> 0).toBe(1);
expect(1 >> 1).toBe(0);
expect(1 >> 2).toBe(0);
expect(1 >> 3).toBe(0);
expect(1 >> 4).toBe(0);
expect(1 >> 5).toBe(0);
expect(5 >> 0).toBe(5);
expect(5 >> 1).toBe(2);
expect(5 >> 2).toBe(1);
expect(5 >> 3).toBe(0);
expect(5 >> 4).toBe(0);
expect(5 >> 5).toBe(0);
expect(42 >> 0).toBe(42);
expect(42 >> 1).toBe(21);
expect(42 >> 2).toBe(10);
expect(42 >> 3).toBe(5);
expect(42 >> 4).toBe(2);
expect(42 >> 5).toBe(1);
});
test("numeric shifting with negative lhs values", () => {
expect(-1 >> 0).toBe(-1);
expect(-1 >> 1).toBe(-1);
expect(-1 >> 2).toBe(-1);
expect(-1 >> 3).toBe(-1);
expect(-1 >> 4).toBe(-1);
expect(-1 >> 5).toBe(-1);
expect(-5 >> 0).toBe(-5);
expect(-5 >> 1).toBe(-3);
expect(-5 >> 2).toBe(-2);
expect(-5 >> 3).toBe(-1);
expect(-5 >> 4).toBe(-1);
expect(-5 >> 5).toBe(-1);
});
test("shifting with non-numeric values", () => {
let x = 67;
let y = 4;
expect("42" >> 3).toBe(5);
expect(x >> y).toBe(4);
expect(x >> [[[[5]]]]).toBe(2);
expect(undefined >> y).toBe(0);
expect("a" >> "b").toBe(0);
expect(null >> null).toBe(0);
expect(undefined >> undefined).toBe(0);
expect(NaN >> NaN).toBe(0);
expect(6 >> NaN).toBe(6);
expect(Infinity >> Infinity).toBe(0);
expect(-Infinity >> Infinity).toBe(0);
});

View file

@ -0,0 +1,62 @@
test("basic numeric shifting", () => {
expect(0 >>> 0).toBe(0);
expect(0 >>> 1).toBe(0);
expect(0 >>> 2).toBe(0);
expect(0 >>> 3).toBe(0);
expect(0 >>> 4).toBe(0);
expect(0 >>> 5).toBe(0);
expect(1 >>> 0).toBe(1);
expect(1 >>> 1).toBe(0);
expect(1 >>> 2).toBe(0);
expect(1 >>> 3).toBe(0);
expect(1 >>> 4).toBe(0);
expect(1 >>> 5).toBe(0);
expect(5 >>> 0).toBe(5);
expect(5 >>> 1).toBe(2);
expect(5 >>> 2).toBe(1);
expect(5 >>> 3).toBe(0);
expect(5 >>> 4).toBe(0);
expect(5 >>> 5).toBe(0);
expect(42 >>> 0).toBe(42);
expect(42 >>> 1).toBe(21);
expect(42 >>> 2).toBe(10);
expect(42 >>> 3).toBe(5);
expect(42 >>> 4).toBe(2);
expect(42 >>> 5).toBe(1);
});
test("numeric shifting with negative lhs values", () => {
expect(-1 >>> 0).toBe(4294967295);
expect(-1 >>> 1).toBe(2147483647);
expect(-1 >>> 2).toBe(1073741823);
expect(-1 >>> 3).toBe(536870911);
expect(-1 >>> 4).toBe(268435455);
expect(-1 >>> 5).toBe(134217727);
expect(-5 >>> 0).toBe(4294967291);
expect(-5 >>> 1).toBe(2147483645);
expect(-5 >>> 2).toBe(1073741822);
expect(-5 >>> 3).toBe(536870911);
expect(-5 >>> 4).toBe(268435455);
expect(-5 >>> 5).toBe(134217727);
});
test("shifting with non-numeric values", () => {
let x = -67;
let y = 4;
expect("-42" >>> 3).toBe(536870906);
expect(x >>> y).toBe(268435451);
expect(x >>> [[[[5]]]]).toBe(134217725);
expect(undefined >>> y).toBe(0);
expect("a" >>> "b").toBe(0);
expect(null >>> null).toBe(0);
expect(undefined >>> undefined).toBe(0);
expect(NaN >>> NaN).toBe(0);
expect(6 >>> NaN).toBe(6);
expect(Infinity >>> Infinity).toBe(0);
expect(-Infinity >>> Infinity).toBe(0);
});

View file

@ -0,0 +1,60 @@
test("basic numeric xor", () => {
expect(0 ^ 0).toBe(0);
expect(0 ^ 1).toBe(1);
expect(0 ^ 2).toBe(2);
expect(0 ^ 3).toBe(3);
expect(0 ^ 4).toBe(4);
expect(0 ^ 5).toBe(5);
expect(1 ^ 0).toBe(1);
expect(1 ^ 1).toBe(0);
expect(1 ^ 2).toBe(3);
expect(1 ^ 3).toBe(2);
expect(1 ^ 4).toBe(5);
expect(1 ^ 5).toBe(4);
expect(2 ^ 0).toBe(2);
expect(2 ^ 1).toBe(3);
expect(2 ^ 2).toBe(0);
expect(2 ^ 3).toBe(1);
expect(2 ^ 4).toBe(6);
expect(2 ^ 5).toBe(7);
expect(3 ^ 0).toBe(3);
expect(3 ^ 1).toBe(2);
expect(3 ^ 2).toBe(1);
expect(3 ^ 3).toBe(0);
expect(3 ^ 4).toBe(7);
expect(3 ^ 5).toBe(6);
expect(4 ^ 0).toBe(4);
expect(4 ^ 1).toBe(5);
expect(4 ^ 2).toBe(6);
expect(4 ^ 3).toBe(7);
expect(4 ^ 4).toBe(0);
expect(4 ^ 5).toBe(1);
expect(5 ^ 0).toBe(5);
expect(5 ^ 1).toBe(4);
expect(5 ^ 2).toBe(7);
expect(5 ^ 3).toBe(6);
expect(5 ^ 4).toBe(1);
expect(5 ^ 5).toBe(0);
});
test("xor with non-numeric values", () => {
let x = 3;
let y = 7;
expect("42" ^ 6).toBe(44);
expect(x ^ y).toBe(4);
expect(x ^ [[[[12]]]]).toBe(15);
expect(undefined ^ y).toBe(7);
expect("a" ^ "b").toBe(0);
expect(null ^ null).toBe(0);
expect(undefined ^ undefined).toBe(0);
expect(NaN ^ NaN).toBe(0);
expect(NaN ^ 6).toBe(6);
expect(Infinity ^ Infinity).toBe(0);
expect(-Infinity ^ Infinity).toBe(0);
});

View file

@ -0,0 +1,729 @@
test("basic functionality", () => {
const vals = [
1,
2,
1.23,
2.34567,
1n,
2n,
[],
[1],
[2],
[1, 2],
"foo",
"fooo",
"🔥",
"❤️",
"bar",
{},
{ a: 1 },
{ a: 2 },
{ b: 1 },
true,
false,
undefined,
null,
NaN,
+Infinity,
-Infinity,
];
// Each row contains: xIndex, yIndex, (x < y), (x > y), (x <= y), (x >= y)
// where x = vals[xIndex], y = vals[yIndex]
// Table can be generated using a mature engine and the following code:
// for (var xIndex = 0; xIndex < vals.length; ++xIndex) {
// for (var yIndex = 0; yIndex < vals.length; ++yIndex) {
// var x = vals[xIndex];
// var y = vals[yIndex];
// console.log(`[${xIndex}, ${yIndex}, ${x < y}, ${x > y}, ${x <= y}, ${x >= y}]`);
// }
// }
const table = [
[0, 0, false, false, true, true],
[0, 1, true, false, true, false],
[0, 2, true, false, true, false],
[0, 3, true, false, true, false],
[0, 4, false, false, true, true],
[0, 5, true, false, true, false],
[0, 6, false, true, false, true],
[0, 7, false, false, true, true],
[0, 8, true, false, true, 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, false, false],
[0, 16, false, false, false, false],
[0, 17, false, false, false, false],
[0, 18, false, false, false, false],
[0, 19, false, false, true, true],
[0, 20, false, true, false, true],
[0, 21, false, false, false, false],
[0, 22, false, true, false, true],
[0, 23, false, false, false, false],
[0, 24, true, false, true, false],
[0, 25, false, true, false, true],
[1, 0, false, true, false, true],
[1, 1, false, false, true, true],
[1, 2, false, true, false, true],
[1, 3, true, false, true, false],
[1, 4, false, true, false, true],
[1, 5, false, false, true, true],
[1, 6, false, true, false, true],
[1, 7, false, true, false, true],
[1, 8, false, false, true, true],
[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, false, false, false],
[1, 16, false, false, false, false],
[1, 17, false, false, false, false],
[1, 18, false, false, false, false],
[1, 19, false, true, false, true],
[1, 20, false, true, false, true],
[1, 21, false, false, false, false],
[1, 22, false, true, false, true],
[1, 23, false, false, false, false],
[1, 24, true, false, true, false],
[1, 25, false, true, false, true],
[2, 0, false, true, false, true],
[2, 1, true, false, true, false],
[2, 2, false, false, true, true],
[2, 3, true, false, true, false],
[2, 4, false, true, false, true],
[2, 5, true, false, true, false],
[2, 6, false, true, false, true],
[2, 7, false, true, false, true],
[2, 8, true, false, true, false],
[2, 9, false, false, false, false],
[2, 10, false, false, false, false],
[2, 11, false, false, false, false],
[2, 12, false, false, false, false],
[2, 13, false, false, false, false],
[2, 14, false, false, false, false],
[2, 15, false, false, false, false],
[2, 16, false, false, false, false],
[2, 17, false, false, false, false],
[2, 18, false, false, false, false],
[2, 19, false, true, false, true],
[2, 20, false, true, false, true],
[2, 21, false, false, false, false],
[2, 22, false, true, false, true],
[2, 23, false, false, false, false],
[2, 24, true, false, true, false],
[2, 25, false, true, false, true],
[3, 0, false, true, false, true],
[3, 1, false, true, false, true],
[3, 2, false, true, false, true],
[3, 3, false, false, true, true],
[3, 4, false, true, false, true],
[3, 5, false, true, false, true],
[3, 6, false, true, false, true],
[3, 7, false, true, false, true],
[3, 8, false, true, false, true],
[3, 9, false, false, false, false],
[3, 10, false, false, false, false],
[3, 11, false, false, false, false],
[3, 12, false, false, false, false],
[3, 13, false, false, false, false],
[3, 14, false, false, false, false],
[3, 15, false, false, false, false],
[3, 16, false, false, false, false],
[3, 17, false, false, false, false],
[3, 18, false, false, false, false],
[3, 19, false, true, false, true],
[3, 20, false, true, false, true],
[3, 21, false, false, false, false],
[3, 22, false, true, false, true],
[3, 23, false, false, false, false],
[3, 24, true, false, true, false],
[3, 25, false, true, false, true],
[4, 0, false, false, true, true],
[4, 1, true, false, true, false],
[4, 2, true, false, true, false],
[4, 3, true, false, true, false],
[4, 4, false, false, true, true],
[4, 5, true, false, true, false],
[4, 6, false, true, false, true],
[4, 7, false, false, true, true],
[4, 8, true, false, true, false],
[4, 9, false, false, false, false],
[4, 10, false, false, false, false],
[4, 11, false, false, false, false],
[4, 12, false, false, false, false],
[4, 13, false, false, false, false],
[4, 14, false, false, false, false],
[4, 15, false, false, false, false],
[4, 16, false, false, false, false],
[4, 17, false, false, false, false],
[4, 18, false, false, false, false],
[4, 19, false, false, true, true],
[4, 20, false, true, false, true],
[4, 21, false, false, false, false],
[4, 22, false, true, false, true],
[4, 23, false, false, false, false],
[4, 24, true, false, true, false],
[4, 25, false, true, false, true],
[5, 0, false, true, false, true],
[5, 1, false, false, true, true],
[5, 2, false, true, false, true],
[5, 3, true, false, true, false],
[5, 4, false, true, false, true],
[5, 5, false, false, true, true],
[5, 6, false, true, false, true],
[5, 7, false, true, false, true],
[5, 8, false, false, true, true],
[5, 9, false, false, false, false],
[5, 10, false, false, false, false],
[5, 11, false, false, false, false],
[5, 12, false, false, false, false],
[5, 13, false, false, false, false],
[5, 14, false, false, false, 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, true, false, true],
[5, 20, false, true, false, true],
[5, 21, false, false, false, false],
[5, 22, false, true, false, true],
[5, 23, false, false, false, false],
[5, 24, true, false, true, false],
[5, 25, false, true, false, true],
[6, 0, true, false, true, false],
[6, 1, true, false, true, false],
[6, 2, true, false, true, false],
[6, 3, true, false, true, false],
[6, 4, true, false, true, false],
[6, 5, true, false, true, false],
[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, true, false, true, false],
[6, 11, true, false, true, false],
[6, 12, true, false, true, false],
[6, 13, true, false, true, false],
[6, 14, true, false, true, false],
[6, 15, true, false, true, false],
[6, 16, true, false, true, false],
[6, 17, true, false, true, false],
[6, 18, true, false, true, false],
[6, 19, true, false, true, false],
[6, 20, false, false, true, true],
[6, 21, false, false, false, false],
[6, 22, false, false, true, true],
[6, 23, false, false, false, false],
[6, 24, true, false, true, false],
[6, 25, false, true, false, true],
[7, 0, false, false, true, true],
[7, 1, true, false, true, false],
[7, 2, true, false, true, false],
[7, 3, true, false, true, false],
[7, 4, false, false, true, true],
[7, 5, true, false, true, false],
[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, true, false, true, false],
[7, 11, true, false, true, false],
[7, 12, true, false, true, false],
[7, 13, true, false, true, false],
[7, 14, true, false, true, false],
[7, 15, true, false, true, false],
[7, 16, true, false, true, false],
[7, 17, true, false, true, false],
[7, 18, true, false, true, false],
[7, 19, false, false, true, true],
[7, 20, false, true, false, true],
[7, 21, false, false, false, false],
[7, 22, false, true, false, true],
[7, 23, false, false, false, false],
[7, 24, true, false, true, false],
[7, 25, false, true, false, true],
[8, 0, false, true, false, true],
[8, 1, false, false, true, true],
[8, 2, false, true, false, true],
[8, 3, true, false, true, false],
[8, 4, false, true, false, true],
[8, 5, false, false, true, 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, true, false, true, false],
[8, 11, true, false, true, false],
[8, 12, true, false, true, false],
[8, 13, true, false, true, false],
[8, 14, true, false, true, false],
[8, 15, true, false, true, false],
[8, 16, true, false, true, false],
[8, 17, true, false, true, false],
[8, 18, true, false, true, false],
[8, 19, false, true, false, true],
[8, 20, false, true, false, true],
[8, 21, false, false, false, false],
[8, 22, false, true, false, true],
[8, 23, false, false, false, false],
[8, 24, true, false, true, false],
[8, 25, false, true, false, true],
[9, 0, false, false, false, false],
[9, 1, false, false, false, false],
[9, 2, false, false, false, false],
[9, 3, false, false, false, false],
[9, 4, false, false, false, false],
[9, 5, false, false, false, false],
[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, true, false, true, false],
[9, 11, true, false, true, false],
[9, 12, true, false, true, false],
[9, 13, true, false, true, false],
[9, 14, true, false, true, false],
[9, 15, true, false, true, false],
[9, 16, true, false, true, false],
[9, 17, true, false, true, false],
[9, 18, true, false, true, false],
[9, 19, false, false, false, false],
[9, 20, false, false, false, false],
[9, 21, false, false, false, false],
[9, 22, false, false, false, false],
[9, 23, false, false, false, false],
[9, 24, false, false, false, false],
[9, 25, false, false, false, false],
[10, 0, false, false, false, false],
[10, 1, false, false, false, false],
[10, 2, false, false, false, false],
[10, 3, false, false, false, false],
[10, 4, false, false, false, false],
[10, 5, false, false, false, false],
[10, 6, false, true, false, true],
[10, 7, false, true, false, true],
[10, 8, false, true, false, true],
[10, 9, false, true, false, true],
[10, 10, false, false, true, true],
[10, 11, true, false, true, false],
[10, 12, true, false, true, false],
[10, 13, true, false, true, false],
[10, 14, false, true, false, true],
[10, 15, false, true, false, true],
[10, 16, false, true, false, true],
[10, 17, false, true, false, true],
[10, 18, false, true, false, true],
[10, 19, false, false, false, false],
[10, 20, false, false, false, false],
[10, 21, false, false, false, false],
[10, 22, false, false, false, false],
[10, 23, false, false, false, false],
[10, 24, false, false, false, false],
[10, 25, false, false, false, false],
[11, 0, false, false, false, false],
[11, 1, false, false, false, false],
[11, 2, false, false, false, false],
[11, 3, false, false, false, false],
[11, 4, false, false, false, false],
[11, 5, false, false, false, false],
[11, 6, false, true, false, true],
[11, 7, false, true, false, true],
[11, 8, false, true, false, true],
[11, 9, false, true, false, true],
[11, 10, false, true, false, true],
[11, 11, false, false, true, true],
[11, 12, true, false, true, false],
[11, 13, true, false, true, false],
[11, 14, false, true, false, true],
[11, 15, false, true, false, true],
[11, 16, false, true, false, true],
[11, 17, false, true, false, true],
[11, 18, false, true, false, true],
[11, 19, false, false, false, false],
[11, 20, false, false, false, false],
[11, 21, false, false, false, false],
[11, 22, false, false, false, false],
[11, 23, false, false, false, false],
[11, 24, false, false, false, false],
[11, 25, false, false, false, false],
[12, 0, false, false, false, false],
[12, 1, false, false, false, false],
[12, 2, false, false, false, false],
[12, 3, false, false, false, false],
[12, 4, false, false, false, false],
[12, 5, false, false, false, false],
[12, 6, false, true, false, true],
[12, 7, false, true, false, true],
[12, 8, false, true, false, true],
[12, 9, false, true, false, true],
[12, 10, false, true, false, true],
[12, 11, false, true, false, true],
[12, 12, false, false, true, true],
[12, 13, false, true, false, true],
[12, 14, false, true, false, true],
[12, 15, false, true, false, true],
[12, 16, false, true, false, true],
[12, 17, false, true, false, true],
[12, 18, false, true, false, true],
[12, 19, false, false, false, false],
[12, 20, false, false, false, false],
[12, 21, false, false, false, false],
[12, 22, false, false, false, false],
[12, 23, false, false, false, false],
[12, 24, false, false, false, false],
[12, 25, false, false, false, false],
[13, 0, false, false, false, false],
[13, 1, false, false, false, false],
[13, 2, false, false, false, false],
[13, 3, false, false, false, false],
[13, 4, false, false, false, false],
[13, 5, false, false, false, false],
[13, 6, false, true, false, true],
[13, 7, false, true, false, true],
[13, 8, false, true, false, true],
[13, 9, false, true, false, true],
[13, 10, false, true, false, true],
[13, 11, false, true, false, true],
[13, 12, true, false, true, false],
[13, 13, false, false, true, true],
[13, 14, false, true, false, true],
[13, 15, false, true, false, true],
[13, 16, false, true, false, true],
[13, 17, false, true, false, true],
[13, 18, false, true, false, true],
[13, 19, false, false, false, false],
[13, 20, false, false, false, false],
[13, 21, false, false, false, false],
[13, 22, false, false, false, false],
[13, 23, false, false, false, false],
[13, 24, false, false, false, false],
[13, 25, false, false, false, false],
[14, 0, false, false, false, false],
[14, 1, false, false, false, false],
[14, 2, false, false, false, false],
[14, 3, false, false, false, false],
[14, 4, false, false, false, false],
[14, 5, false, false, false, false],
[14, 6, false, true, false, true],
[14, 7, false, true, false, true],
[14, 8, false, true, false, true],
[14, 9, false, true, false, true],
[14, 10, true, false, true, false],
[14, 11, true, false, true, false],
[14, 12, true, false, true, false],
[14, 13, true, false, true, false],
[14, 14, false, false, true, true],
[14, 15, false, true, false, true],
[14, 16, false, true, false, true],
[14, 17, false, true, false, true],
[14, 18, false, true, false, true],
[14, 19, false, false, false, false],
[14, 20, false, false, false, false],
[14, 21, false, false, false, false],
[14, 22, false, false, false, false],
[14, 23, false, false, false, false],
[14, 24, false, false, false, false],
[14, 25, false, false, false, false],
[15, 0, false, false, false, false],
[15, 1, false, false, false, false],
[15, 2, false, false, false, false],
[15, 3, false, false, false, false],
[15, 4, false, false, false, false],
[15, 5, false, false, false, false],
[15, 6, false, true, false, true],
[15, 7, false, true, false, true],
[15, 8, false, true, false, true],
[15, 9, false, true, false, true],
[15, 10, true, false, true, false],
[15, 11, true, false, true, false],
[15, 12, true, false, true, false],
[15, 13, true, false, true, false],
[15, 14, true, false, true, false],
[15, 15, false, false, true, true],
[15, 16, false, false, true, true],
[15, 17, false, false, true, true],
[15, 18, false, false, true, true],
[15, 19, false, false, false, false],
[15, 20, false, false, false, false],
[15, 21, false, false, false, false],
[15, 22, false, false, false, false],
[15, 23, false, false, false, false],
[15, 24, false, false, false, false],
[15, 25, false, false, false, false],
[16, 0, false, false, false, false],
[16, 1, false, false, false, false],
[16, 2, false, false, false, false],
[16, 3, false, false, false, false],
[16, 4, false, false, false, false],
[16, 5, false, false, false, false],
[16, 6, false, true, false, true],
[16, 7, false, true, false, true],
[16, 8, false, true, false, true],
[16, 9, false, true, false, true],
[16, 10, true, false, true, false],
[16, 11, true, false, true, false],
[16, 12, true, false, true, false],
[16, 13, true, false, true, false],
[16, 14, true, false, true, false],
[16, 15, false, false, true, true],
[16, 16, false, false, true, true],
[16, 17, false, false, true, true],
[16, 18, false, false, true, true],
[16, 19, false, false, false, false],
[16, 20, false, false, false, false],
[16, 21, false, false, false, false],
[16, 22, false, false, false, false],
[16, 23, false, false, false, false],
[16, 24, false, false, false, false],
[16, 25, false, false, false, false],
[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, true, false, true],
[17, 7, false, true, false, true],
[17, 8, false, true, false, true],
[17, 9, false, true, false, true],
[17, 10, true, false, true, false],
[17, 11, true, false, true, false],
[17, 12, true, false, true, false],
[17, 13, true, false, true, false],
[17, 14, true, false, true, false],
[17, 15, false, false, true, true],
[17, 16, false, false, true, true],
[17, 17, false, false, true, true],
[17, 18, false, false, true, true],
[17, 19, false, false, false, false],
[17, 20, false, false, false, false],
[17, 21, false, false, false, false],
[17, 22, false, false, false, false],
[17, 23, false, false, false, false],
[17, 24, false, false, false, false],
[17, 25, false, false, false, false],
[18, 0, false, false, false, false],
[18, 1, false, false, false, false],
[18, 2, false, false, false, false],
[18, 3, false, false, false, false],
[18, 4, false, false, false, false],
[18, 5, false, false, false, false],
[18, 6, false, true, false, true],
[18, 7, false, true, false, true],
[18, 8, false, true, false, true],
[18, 9, false, true, false, true],
[18, 10, true, false, true, false],
[18, 11, true, false, true, false],
[18, 12, true, false, true, false],
[18, 13, true, false, true, false],
[18, 14, true, false, true, false],
[18, 15, false, false, true, true],
[18, 16, false, false, true, true],
[18, 17, false, false, true, true],
[18, 18, false, false, true, true],
[18, 19, false, false, false, false],
[18, 20, false, false, false, false],
[18, 21, false, false, false, false],
[18, 22, false, false, false, false],
[18, 23, false, false, false, false],
[18, 24, false, false, false, false],
[18, 25, false, false, false, false],
[19, 0, false, false, true, true],
[19, 1, true, false, true, false],
[19, 2, true, false, true, false],
[19, 3, true, false, true, false],
[19, 4, false, false, true, true],
[19, 5, true, false, true, false],
[19, 6, false, true, false, true],
[19, 7, false, false, true, true],
[19, 8, true, false, true, 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, true, true],
[19, 20, false, true, false, true],
[19, 21, false, false, false, false],
[19, 22, false, true, false, true],
[19, 23, false, false, false, false],
[19, 24, true, false, true, false],
[19, 25, false, true, false, true],
[20, 0, true, false, true, false],
[20, 1, true, false, true, false],
[20, 2, true, false, true, false],
[20, 3, true, false, true, false],
[20, 4, true, false, true, false],
[20, 5, true, false, true, false],
[20, 6, false, false, true, true],
[20, 7, true, false, true, false],
[20, 8, true, false, true, 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, false, false, false],
[20, 16, false, false, false, false],
[20, 17, false, false, false, false],
[20, 18, false, false, false, false],
[20, 19, true, false, true, false],
[20, 20, false, false, true, true],
[20, 21, false, false, false, false],
[20, 22, false, false, true, true],
[20, 23, false, false, false, false],
[20, 24, true, false, true, false],
[20, 25, false, true, false, true],
[21, 0, false, false, false, false],
[21, 1, false, false, false, false],
[21, 2, false, false, false, false],
[21, 3, false, false, false, false],
[21, 4, false, false, false, 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, false, false, false, false],
[21, 16, false, false, false, false],
[21, 17, false, false, false, false],
[21, 18, false, false, false, false],
[21, 19, false, false, false, false],
[21, 20, false, false, false, false],
[21, 21, false, false, false, false],
[21, 22, false, false, false, false],
[21, 23, false, false, false, false],
[21, 24, false, false, false, false],
[21, 25, false, false, false, false],
[22, 0, true, false, true, false],
[22, 1, true, false, true, false],
[22, 2, true, false, true, false],
[22, 3, true, false, true, false],
[22, 4, true, false, true, false],
[22, 5, true, false, true, false],
[22, 6, false, false, true, true],
[22, 7, true, false, true, false],
[22, 8, true, false, true, false],
[22, 9, false, false, false, false],
[22, 10, false, false, false, false],
[22, 11, false, false, false, false],
[22, 12, false, false, false, false],
[22, 13, false, false, false, false],
[22, 14, false, false, false, false],
[22, 15, false, false, false, false],
[22, 16, false, false, false, false],
[22, 17, false, false, false, false],
[22, 18, false, false, false, false],
[22, 19, true, false, true, false],
[22, 20, false, false, true, true],
[22, 21, false, false, false, false],
[22, 22, false, false, true, true],
[22, 23, false, false, false, false],
[22, 24, true, false, true, false],
[22, 25, false, true, false, true],
[23, 0, false, false, false, false],
[23, 1, false, false, false, false],
[23, 2, false, false, false, false],
[23, 3, false, false, false, false],
[23, 4, false, false, false, false],
[23, 5, false, false, false, false],
[23, 6, false, false, false, false],
[23, 7, false, false, false, false],
[23, 8, false, false, false, false],
[23, 9, false, false, false, false],
[23, 10, false, false, false, false],
[23, 11, false, false, false, false],
[23, 12, false, false, false, false],
[23, 13, false, false, false, false],
[23, 14, false, false, false, false],
[23, 15, false, false, false, false],
[23, 16, false, false, false, false],
[23, 17, false, false, false, false],
[23, 18, false, false, false, false],
[23, 19, false, false, false, false],
[23, 20, false, false, false, false],
[23, 21, false, false, false, false],
[23, 22, false, false, false, false],
[23, 23, false, false, false, false],
[23, 24, false, false, false, false],
[23, 25, false, false, false, false],
[24, 0, false, true, false, true],
[24, 1, false, true, false, true],
[24, 2, false, true, false, true],
[24, 3, false, true, false, true],
[24, 4, false, true, false, true],
[24, 5, false, true, false, true],
[24, 6, false, true, false, true],
[24, 7, false, true, false, true],
[24, 8, false, true, false, true],
[24, 9, false, false, false, false],
[24, 10, false, false, false, false],
[24, 11, false, false, false, false],
[24, 12, false, false, false, false],
[24, 13, false, false, false, false],
[24, 14, false, false, false, false],
[24, 15, false, false, false, false],
[24, 16, false, false, false, false],
[24, 17, false, false, false, false],
[24, 18, false, false, false, false],
[24, 19, false, true, false, true],
[24, 20, false, true, false, true],
[24, 21, false, false, false, false],
[24, 22, false, true, false, true],
[24, 23, false, false, false, false],
[24, 24, false, false, true, true],
[24, 25, false, true, false, true],
[25, 0, true, false, true, false],
[25, 1, true, false, true, false],
[25, 2, true, false, true, false],
[25, 3, true, false, true, false],
[25, 4, true, false, true, false],
[25, 5, true, false, true, false],
[25, 6, true, false, true, false],
[25, 7, true, false, true, false],
[25, 8, true, false, true, false],
[25, 9, false, false, false, false],
[25, 10, false, false, false, false],
[25, 11, false, false, false, false],
[25, 12, false, false, false, false],
[25, 13, false, false, false, false],
[25, 14, false, false, false, false],
[25, 15, false, false, false, false],
[25, 16, false, false, false, false],
[25, 17, false, false, false, false],
[25, 18, false, false, false, false],
[25, 19, true, false, true, false],
[25, 20, true, false, true, false],
[25, 21, false, false, false, false],
[25, 22, true, false, true, false],
[25, 23, false, false, false, false],
[25, 24, true, false, true, false],
[25, 25, false, false, true, true],
];
for (let test of table) {
let x = vals[test[0]];
let y = vals[test[1]];
expect(x < y).toBe(test[2]);
expect(x > y).toBe(test[3]);
expect(x <= y).toBe(test[4]);
expect(x >= y).toBe(test[5]);
}
});

View file

@ -0,0 +1,23 @@
test("basic functionality", () => {
expect(~0).toBe(-1);
expect(~1).toBe(-2);
expect(~2).toBe(-3);
expect(~3).toBe(-4);
expect(~4).toBe(-5);
expect(~5).toBe(-6);
expect(~-1).toBe(0);
expect(~42).toBe(-43);
expect(~9999).toBe(-10000);
});
test("non-numeric values", () => {
expect(~"42").toBe(-43);
expect(~"foo").toBe(-1);
expect(~[]).toBe(-1);
expect(~{}).toBe(-1);
expect(~undefined).toBe(-1);
expect(~null).toBe(-1);
expect(~NaN).toBe(-1);
expect(~Infinity).toBe(-1);
expect(~-Infinity).toBe(-1);
});

View file

@ -0,0 +1,24 @@
test("inside parenthesis", () => {
expect((1, 2, 3)).toBe(3);
expect((1, 2 + 3, 4)).toBe(4);
});
test("with post-increment operator", () => {
let foo = 0;
foo = (foo++, foo);
expect(foo).toBe(1);
});
test("with assignment operator", () => {
var a, b, c;
expect(((a = b = 3), (c = 4))).toBe(4);
expect(a).toBe(3);
expect(b).toBe(3);
expect(c).toBe(4);
var x, y, z;
expect((x = ((y = 5), (z = 6)))).toBe(6);
expect(x).toBe(6);
expect(y).toBe(5);
expect(z).toBe(6);
});

View file

@ -0,0 +1,61 @@
test("deleting object properties", () => {
const o = {};
o.x = 1;
o.y = 2;
o.z = 3;
expect(Object.getOwnPropertyNames(o)).toHaveLength(3);
expect(delete o.x).toBeTrue();
expect(o.hasOwnProperty("x")).toBeFalse();
expect(o.hasOwnProperty("y")).toBeTrue();
expect(o.hasOwnProperty("z")).toBeTrue();
expect(Object.getOwnPropertyNames(o)).toHaveLength(2);
expect(delete o.y).toBeTrue();
expect(o.hasOwnProperty("x")).toBeFalse();
expect(o.hasOwnProperty("y")).toBeFalse();
expect(o.hasOwnProperty("z")).toBeTrue();
expect(Object.getOwnPropertyNames(o)).toHaveLength(1);
expect(delete o.z).toBeTrue();
expect(o.hasOwnProperty("x")).toBeFalse();
expect(o.hasOwnProperty("y")).toBeFalse();
expect(o.hasOwnProperty("z")).toBeFalse();
expect(Object.getOwnPropertyNames(o)).toHaveLength(0);
});
test("deleting array indices", () => {
const a = [3, 5, 7];
expect(Object.getOwnPropertyNames(a)).toHaveLength(4);
expect(delete a[0]).toBeTrue();
expect(a.hasOwnProperty(0)).toBeFalse();
expect(a.hasOwnProperty(1)).toBeTrue();
expect(a.hasOwnProperty(2)).toBeTrue();
expect(Object.getOwnPropertyNames(a)).toHaveLength(3);
expect(delete a[1]).toBeTrue();
expect(a.hasOwnProperty(0)).toBeFalse();
expect(a.hasOwnProperty(1)).toBeFalse();
expect(a.hasOwnProperty(2)).toBeTrue();
expect(Object.getOwnPropertyNames(a)).toHaveLength(2);
expect(delete a[2]).toBeTrue();
expect(a.hasOwnProperty(0)).toBeFalse();
expect(a.hasOwnProperty(1)).toBeFalse();
expect(a.hasOwnProperty(2)).toBeFalse();
expect(Object.getOwnPropertyNames(a)).toHaveLength(1);
expect(delete a["42"]).toBeTrue();
expect(Object.getOwnPropertyNames(a)).toHaveLength(1);
});
test("deleting non-configurable property", () => {
const q = {};
Object.defineProperty(q, "foo", { value: 1, writable: false, enumerable: false });
expect(q.foo).toBe(1);
expect(delete q.foo).toBeFalse();
expect(q.hasOwnProperty("foo")).toBeTrue();
});

View file

@ -0,0 +1,9 @@
a = 1;
test("basic functionality", () => {
expect(delete a).toBeTrue();
expect(() => {
a;
}).toThrowWithMessage(ReferenceError, "'a' is not defined");
});

View file

@ -0,0 +1,8 @@
a = 1;
test("basic functionality", () => {
expect(delete globalThis.a).toBeTrue();
expect(() => {
a = 2;
}).not.toThrow();
});

View file

@ -0,0 +1,32 @@
test("in operator with objects", () => {
const o = { foo: "bar", bar: undefined };
expect("" in o).toBeFalse();
expect("foo" in o).toBeTrue();
expect("bar" in o).toBeTrue();
expect("baz" in o).toBeFalse();
expect("toString" in o).toBeTrue();
});
test("in operator with arrays", () => {
const a = ["hello", "friends"];
expect(0 in a).toBeTrue();
expect(1 in a).toBeTrue();
expect(2 in a).toBeFalse();
expect("0" in a).toBeTrue();
expect("hello" in a).toBeFalse();
expect("friends" in a).toBeFalse();
expect("length" in a).toBeTrue();
});
test("in operator with string object", () => {
const s = new String("foo");
expect("length" in s).toBeTrue();
});
test("error when used with primitives", () => {
["foo", 123, null, undefined].forEach(value => {
expect(() => {
"prop" in value;
}).toThrowWithMessage(TypeError, "'in' operator must be used on an object");
});
});

View file

@ -0,0 +1,36 @@
test("basic functionality", () => {
function Foo() {
this.x = 123;
}
const foo = new Foo();
expect(foo instanceof Foo).toBeTrue();
});
test("derived ES5 classes", () => {
function Base() {
this.is_base = true;
}
function Derived() {
this.is_derived = true;
}
Object.setPrototypeOf(Derived.prototype, Base.prototype);
const d = new Derived();
expect(d instanceof Derived).toBeTrue();
expect(d instanceof Base).toBeTrue();
});
test("issue #3930, instanceof on arrow function", () => {
function f() {}
const a = () => {};
expect(() => {
f instanceof a;
}).toThrow(TypeError);
expect(() => {
a instanceof a;
}).toThrow(TypeError);
});

View file

@ -0,0 +1,50 @@
test("booleans", () => {
expect(true && true).toBeTrue();
expect(false && false).toBeFalse();
expect(true && false).toBeFalse();
expect(false && true).toBeFalse();
});
test("strings", () => {
expect("" && "").toBe("");
expect("" && false).toBe("");
expect("" && true).toBe("");
expect(false && "").toBeFalse();
expect(true && "").toBe("");
expect("foo" && "bar").toBe("bar");
expect("foo" && false).toBeFalse();
expect("foo" && true).toBeTrue();
expect(false && "bar").toBeFalse();
expect(true && "bar").toBe("bar");
});
test("numbers", () => {
expect(false && 1 === 2).toBeFalse();
expect(true && 1 === 2).toBeFalse();
expect(0 && false).toBe(0);
expect(0 && true).toBe(0);
expect(42 && false).toBeFalse();
expect(42 && true).toBeTrue();
expect(false && 0).toBeFalse();
expect(true && 0).toBe(0);
expect(false && 42).toBeFalse();
expect(true && 42).toBe(42);
});
test("objects", () => {
expect([] && false).toBeFalse();
expect([] && true).toBeTrue();
expect(false && []).toBeFalse();
expect(true && []).toHaveLength(0);
});
test("null & undefined", () => {
expect(null && false).toBeNull();
expect(null && true).toBeNull();
expect(false && null).toBeFalse();
expect(true && null).toBeNull();
expect(undefined && false).toBeUndefined();
expect(undefined && true).toBeUndefined();
expect(false && undefined).toBeFalse();
expect(true && undefined).toBeUndefined();
});

View file

@ -0,0 +1,13 @@
test("basic functionality", () => {
let foo = 1;
false && (foo = 2);
expect(foo).toBe(1);
foo = 1;
true || (foo = 2);
expect(foo).toBe(1);
foo = 1;
true ?? (foo = 2);
expect(foo).toBe(1);
});

View file

@ -0,0 +1,50 @@
test("booleans", () => {
expect(true ?? true).toBeTrue();
expect(false ?? false).toBeFalse();
expect(true ?? false).toBeTrue();
expect(false ?? true).toBeFalse();
});
test("strings", () => {
expect("" ?? "").toBe("");
expect("" ?? false).toBe("");
expect("" ?? true).toBe("");
expect(false ?? "").toBeFalse();
expect(true ?? "").toBeTrue();
expect("foo" ?? "bar").toBe("foo");
expect("foo" ?? false).toBe("foo");
expect("foo" ?? true).toBe("foo");
expect(false ?? "bar").toBeFalse();
expect(true ?? "bar").toBeTrue();
});
test("numbers", () => {
expect(false ?? 1 === 2).toBeFalse();
expect(true ?? 1 === 2).toBeTrue();
expect(0 ?? false).toBe(0);
expect(0 ?? true).toBe(0);
expect(42 ?? false).toBe(42);
expect(42 ?? true).toBe(42);
expect(false ?? 0).toBeFalse();
expect(true ?? 0).toBeTrue();
expect(false ?? 42).toBeFalse();
expect(true ?? 42).toBeTrue();
});
test("objects", () => {
expect([] ?? false).toHaveLength(0);
expect([] ?? true).toHaveLength(0);
expect(false ?? []).toBeFalse();
expect(true ?? []).toBeTrue();
});
test("null & undefined", () => {
expect(null ?? false).toBeFalse();
expect(null ?? true).toBeTrue();
expect(false ?? null).toBeFalse();
expect(true ?? null).toBeTrue();
expect(undefined ?? false).toBeFalse();
expect(undefined ?? true).toBeTrue();
expect(false ?? undefined).toBeFalse();
expect(true ?? undefined).toBeTrue();
});

View file

@ -0,0 +1,50 @@
test("booleans", () => {
expect(true || true).toBeTrue();
expect(false || false).toBeFalse();
expect(true || false).toBeTrue();
expect(false || true).toBeTrue();
});
test("strings", () => {
expect("" || "").toBe("");
expect("" || false).toBeFalse();
expect("" || true).toBeTrue();
expect(false || "").toBe("");
expect(true || "").toBeTrue();
expect("foo" || "bar").toBe("foo");
expect("foo" || false).toBe("foo");
expect("foo" || true).toBe("foo");
expect(false || "bar").toBe("bar");
expect(true || "bar").toBeTrue();
});
test("numbers", () => {
expect(false || 1 === 2).toBeFalse();
expect(true || 1 === 2).toBeTrue();
expect(0 || false).toBeFalse();
expect(0 || true).toBeTrue();
expect(42 || false).toBe(42);
expect(42 || true).toBe(42);
expect(false || 0).toBe(0);
expect(true || 0).toBeTrue();
expect(false || 42).toBe(42);
expect(true || 42).toBeTrue();
});
test("objects", () => {
expect([] || false).toHaveLength(0);
expect([] || true).toHaveLength(0);
expect(false || []).toHaveLength(0);
expect(true || []).toBeTrue();
});
test("null & undefined", () => {
expect(null || false).toBeFalse();
expect(null || true).toBeTrue();
expect(false || null).toBeNull();
expect(true || null).toBeTrue();
expect(undefined || false).toBeFalse();
expect(undefined || true).toBeTrue();
expect(false || undefined).toBeUndefined();
expect(true || undefined).toBeTrue();
});

View file

@ -0,0 +1,16 @@
test("basic functionality", () => {
expect(10 % 3).toBe(1);
expect(10.5 % 2.5).toBe(0.5);
expect(-0.99 % 0.99).toBe(-0);
// Examples from MDN:
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators
expect(12 % 5).toBe(2);
expect(-1 % 2).toBe(-1);
expect(1 % -2).toBe(1);
expect(1 % 2).toBe(1);
expect(2 % 3).toBe(2);
expect(-4 % 2).toBe(-0);
expect(5.5 % 2).toBe(1.5);
expect(NaN % 2).toBeNaN();
});

View file

@ -0,0 +1,20 @@
test("basic functionality", () => {
const x = 1;
expect(x === 1 ? true : false).toBeTrue();
expect(x ? x : 0).toBe(x);
expect(1 < 2 ? true : false).toBeTrue();
expect(0 ? 1 : 1 ? 10 : 20).toBe(10);
expect(0 ? (1 ? 1 : 10) : 20).toBe(20);
});
test("object values", () => {
const o = {};
o.f = true;
expect(o.f ? true : false).toBeTrue();
expect(1 ? o.f : null).toBeTrue();
});
test("issue #4409, '?.' followed by decimal digit", () => {
expect("return false?.1:.2").toEvalTo(0.2);
});

View file

@ -0,0 +1,27 @@
test("basic functionality", () => {
expect(typeof "foo").toBe("string");
expect(typeof (1 + 2)).toBe("number");
expect(typeof {}).toBe("object");
expect(typeof null).toBe("object");
expect(typeof undefined).toBe("undefined");
expect(typeof 1n).toBe("bigint");
expect(typeof Symbol()).toBe("symbol");
expect(typeof function () {}).toBe("function");
var iExist = 1;
expect(typeof iExist).toBe("number");
expect(typeof iDontExist).toBe("undefined");
});
test("typeof calls property getter", () => {
var calls = 0;
Object.defineProperty(globalThis, "foo", {
get() {
calls++;
return 10;
},
});
expect(typeof foo).toBe("number");
expect(calls).toBe(1);
});

View file

@ -0,0 +1,14 @@
test("basic functionality", () => {
expect(void "").toBeUndefined();
expect(void "foo").toBeUndefined();
expect(void 1).toBeUndefined();
expect(void 42).toBeUndefined();
expect(void true).toBeUndefined();
expect(void false).toBeUndefined();
expect(void null).toBeUndefined();
expect(void undefined).toBeUndefined();
expect(void function () {}).toBeUndefined();
expect(void (() => {})).toBeUndefined();
expect(void (() => "hello friends")()).toBeUndefined();
expect((() => void "hello friends")()).toBeUndefined();
});