diff options
Diffstat (limited to 'js/src/jit-test/tests/decorators/class-decorators.js')
-rw-r--r-- | js/src/jit-test/tests/decorators/class-decorators.js | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/decorators/class-decorators.js b/js/src/jit-test/tests/decorators/class-decorators.js new file mode 100644 index 0000000000..f9b120ff45 --- /dev/null +++ b/js/src/jit-test/tests/decorators/class-decorators.js @@ -0,0 +1,101 @@ +// |jit-test| skip-if: !getBuildConfiguration("decorators") + +load(libdir + "asserts.js"); + +let dec1Called = false; + +// This explicitly tests the case where undefined is returned. +function dec1(value, context) { + dec1Called = true; + // returns undefined +} + +function dec2(value, context) { + return class extends value { + constructor(...args) { + super(...args); + } + + x2 = true; + } +} + +function checkDecoratorContext(name) { + return function (value, context) { + assertEq(typeof value, "function"); + assertEq(context.kind, "class"); + assertEq(context.name, name); + assertEq(typeof context.addInitializer, "undefined"); + // return undefined + } +} + +@dec1 class C1 {}; +assertEq(dec1Called, true); + +@dec2 class C2 { + x1 = true; +} + +let c2 = new C2(); +assertEq(c2.x1, true); +assertEq(c2.x2, true); + +let c3 = new @dec2 class { + x1 = true; +} + +assertEq(c3.x1, true); +assertEq(c3.x2, true); + +@checkDecoratorContext("D") class D {} +let d2 = new @checkDecoratorContext(undefined) class {}; + +class E { + static #dec1(value, context) { + return class extends value { + constructor(...args) { + super(...args); + } + + x2 = true; + } + } + static { + this.F = @E.#dec1 class { + x1 = true; + } + } +} + +let f = new E.F(); +assertEq(f.x1, true); +assertEq(f.x2, true); + +assertThrowsInstanceOf(() => { + @(() => { return "hello!"; }) class G {} +}, TypeError), "Returning a value other than undefined or a callable throws."; + +assertThrowsInstanceOf(() => { + class G { + static #dec1() {} + static { + @G.#dec1 class G {} + } + } +}, ReferenceError), "can't access lexical declaration 'G' before initialization"; + +const decoratorOrder = []; +function makeOrderedDecorator(order) { + return function (value, context) { + decoratorOrder.push(order); + return value; + } +} + +@makeOrderedDecorator(1) @makeOrderedDecorator(2) @makeOrderedDecorator(3) +class H {} +assertEq(decoratorOrder.length, 3); +assertEq(decoratorOrder[0], 3); +assertEq(decoratorOrder[1], 2); +assertEq(decoratorOrder[2], 1); |