ladybird/Libraries/LibJS/Tests/functions/function-new-target.js

61 lines
1.4 KiB
JavaScript

test("basic functionality", () => {
function foo() {
return new.target;
}
expect(foo()).toBeUndefined();
expect(new foo()).toEqual(foo);
function bar() {
const baz = () => new.target;
return baz();
}
expect(bar()).toBeUndefined();
expect(new bar()).toEqual(bar);
class baz {
constructor() {
this.newTarget = new.target;
}
}
expect(new baz().newTarget).toEqual(baz);
});
test("retrieving new.target from direct eval", () => {
function foo() {
return eval("new.target");
}
let result;
expect(() => {
result = foo();
}).not.toThrowWithMessage(SyntaxError, "'new.target' not allowed outside of a function");
expect(result).toBe(undefined);
expect(() => {
result = new foo();
}).not.toThrowWithMessage(SyntaxError, "'new.target' not allowed outside of a function");
expect(result).toBe(foo);
});
test("cannot retrieve new.target from indirect eval", () => {
const indirect = eval;
function foo() {
return indirect("new.target");
}
expect(() => {
foo();
}).toThrowWithMessage(SyntaxError, "'new.target' not allowed outside of a function");
expect(() => {
new foo();
}).toThrowWithMessage(SyntaxError, "'new.target' not allowed outside of a function");
});
test("syntax error outside of function", () => {
expect("new.target").not.toEval();
});