ladybird/Userland/Libraries/LibJS/Tests/classes/class-methods.js
davidot bfedec6a98 LibJS: Keep PrivateEnvironment through NativeFunction calls
Previously the variable and lexical environments were already kept in a
NativeFunction call. However when we (try to) call a private method from
within an async function we go through async_block_start which sets up
a NativeFunction to call.
This is technically not exactly as the spec describes it, as that
requires you to actually "continue" the context. Since we don't have
that concept (yet) we use this as an implementation detail to access the
private environment from within a native function.

Note that this not allow general private environment access since most
things get blocked by the parser already.
2022-03-09 18:35:27 +01:00

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();
});