ladybird/Libraries/LibJS/Tests/classes/class-methods.js

126 lines
2.2 KiB
JavaScript

test("basic functionality", () => {
class A {
number() {
return 2;
}
string() {
return "foo";
}
}
const a = new A();
expect(a.number()).toBe(2);
expect(a.string()).toBe("foo");
});
test("length", () => {
class A {
method1() {}
method2(a, b, c, d) {}
method3(a, b, ...c) {}
}
const a = new A();
expect(a.method1).toHaveLength(0);
expect(a.method2).toHaveLength(4);
expect(a.method3).toHaveLength(2);
});
test("extended name syntax", () => {
class A {
"method with space"() {
return 1;
}
12() {
return 2;
}
[`he${"llo"}`]() {
return 3;
}
}
const a = new A();
expect(a["method with space"]()).toBe(1);
expect(a[12]()).toBe(2);
expect(a.hello()).toBe(3);
});
test("method named 'async'", () => {
class A {
async() {
return "function named async";
}
}
const a = new A();
expect("async" in a).toBeTrue();
expect(a.async()).toBe("function named async");
});
test("can call other private methods from methods", () => {
class A {
#a() {
return 1;
}
async #b() {
return 2;
}
syncA() {
return this.#a();
}
async asyncA() {
return this.#a();
}
syncB() {
return this.#b();
}
async asyncB() {
return this.#b();
}
}
var called = false;
async function check() {
called = true;
const a = new A();
expect(a.syncA()).toBe(1);
expect(await a.asyncA()).toBe(1);
expect(await a.syncB()).toBe(2);
expect(await a.asyncB()).toBe(2);
return 3;
}
var error = null;
var failed = false;
check().then(
value => {
expect(called).toBeTrue();
expect(value).toBe(3);
},
thrownError => {
failed = true;
error = thrownError;
}
);
runQueuedPromiseJobs();
expect(called).toBeTrue();
if (failed) throw error;
expect(failed).toBeFalse();
});