Skip to content

Latest commit

 

History

History
1508 lines (1168 loc) · 52 KB

README.md

File metadata and controls

1508 lines (1168 loc) · 52 KB

JavaScript Decorator Tests

This repo contains a single file with many behavioral tests for the upcoming decorators and decorator metadata features in JavaScript. It's intended to be easy to use for testing a given JavaScript implementation: just run the file decorator-tests.js and see what console.log prints (although you may need to comment out some of the tests if your implementation emits code containing syntax errors, which TypeScript currently does). The source code for that file is in TypeScript (see decorator-tests.ts) to make authoring the tests easier (e.g. to catch typos). I'm planning to use these tests to help me implement JavaScript decorators for esbuild.

Some caveats:

  • The specifications are still a work in progress, and may be outdated
  • I'm not the author of the specifications and I may have misinterpreted them
  • Deviations from the specifications by the tools below may be intentional
  • The specifications themselves don't yet have good test coverage (see this and this)

You can use node run.mjs after npm install to run and update the tests below.

Test Results

Known issues:

  • Class binding references are incorrect if a decorator changes them. (Bug #3787)
❌ 9 checks failed (click for details)
❌ Class decorators: Binding initialization (class statement)
  Code: block
  Expected: class
  Observed: class

❌ Class decorators: Binding initialization (class statement)
  Code: Foo2.field
  Expected: class
  Observed: undefined

❌ Class decorators: Binding initialization (class statement)
  Code: foo.field
  Expected: class
  Observed: class

❌ Class decorators: Binding initialization (class statement)
  Code: old.getter
  Expected: class
  Observed: class

❌ Class decorators: Binding initialization (class statement)
  Code: foo.getter
  Expected: class
  Observed: class

❌ Class decorators: Binding initialization (class statement)
  Code: (obj = { foo: null }, old.setter = obj, obj.foo)
  Expected: class
  Observed: class

❌ Class decorators: Binding initialization (class statement)
  Code: (obj = { foo: null }, foo.setter = obj, obj.foo)
  Expected: class
  Observed: class

❌ Class decorators: Binding initialization (class expression)
  Code: block
  Expected: class
  Observed: undefined

❌ Class decorators: Binding initialization (class expression)
  Code: Foo2.field
  Expected: class
  Observed: undefined

❌ 9 checks failed

Babel (@babel/[email protected])

Known issues:

  • References to the uninitialized class name within a decorator return undefined instead of throwing a ReferenceError.
❌ 11 checks failed (click for details)
❌ Decorator list evaluation: Class binding (class statement)
  Code: fn()
  Expected: throws instanceof ReferenceError
  Observed: returns undefined

❌ Decorator list evaluation: Class binding (class statement)
  Code: fn()
  Expected: throws instanceof ReferenceError
  Observed: returns undefined

❌ Decorator list evaluation: Class binding (class statement)
  Code: fn()
  Expected: throws instanceof ReferenceError
  Observed: returns undefined

❌ Decorator list evaluation: Class binding (class statement)
  Code: fn()
  Expected: throws instanceof ReferenceError
  Observed: returns undefined

❌ Decorator list evaluation: Class binding (class statement)
  Code: fn()
  Expected: throws instanceof ReferenceError
  Observed: returns undefined

❌ Decorator list evaluation: Class binding (class statement)
  Code: fn()
  Expected: throws instanceof ReferenceError
  Observed: returns undefined

❌ Decorator list evaluation: Class binding (class statement)
  Code: fn()
  Expected: throws instanceof ReferenceError
  Observed: returns undefined

❌ Decorator list evaluation: Class binding (class statement)
  Code: fn()
  Expected: throws instanceof ReferenceError
  Observed: returns undefined

❌ Decorator list evaluation: Class binding (class statement)
  Code: fn()
  Expected: throws instanceof ReferenceError
  Observed: returns undefined

❌ Decorator list evaluation: Class binding (class statement)
  Code: fn()
  Expected: throws instanceof ReferenceError
  Observed: returns undefined

❌ Decorator list evaluation: Class binding (class expression)
  Code: firstFn()
  Expected: throws instanceof ReferenceError
  Observed: returns class

❌ 11 checks failed

TypeScript ([email protected])

Known issues:

  • In decorators of static fields and static accessors, the value of this appears to be incorrect.
  • Using await within a decorator can cause TypeScript to emit invalid code containing a syntax error.
  • References to the uninitialized class name within a decorator return undefined instead of throwing a ReferenceError.
  • TypeScript doesn't prevent addInitializer from adding more initializers after decorationState.[[Finished]] is true.
❌ 44 checks failed (click for details)
❌ Class decorators: Extra initializer
  Code: oldAddInitializer(() => { })
  Expected: throws instanceof TypeError
  Observed: returns undefined

❌ Class decorators: Binding initialization (class statement)
  Code: Foo.field
  Expected: class
  Observed: undefined

❌ Class decorators: Binding initialization (class expression)
  Code: Foo.field
  Expected: class
  Observed: undefined

❌ Method decorators: Extra initializer (instance method)
  Code: oldAddInitializer(() => { })
  Expected: throws instanceof TypeError
  Observed: returns undefined

❌ Method decorators: Extra initializer (static method)
  Code: oldAddInitializer(() => { })
  Expected: throws instanceof TypeError
  Observed: returns undefined

❌ Method decorators: Extra initializer (private instance method)
  Code: oldAddInitializer(() => { })
  Expected: throws instanceof TypeError
  Observed: returns undefined

❌ Method decorators: Extra initializer (private static method)
  Code: oldAddInitializer(() => { })
  Expected: throws instanceof TypeError
  Observed: returns undefined

❌ Field decorators: Extra initializer (instance field)
  Code: oldAddInitializer(() => { })
  Expected: throws instanceof TypeError
  Observed: returns undefined

❌ Field decorators: Extra initializer (static field)
  Code: oldAddInitializer(() => { })
  Expected: throws instanceof TypeError
  Observed: returns undefined

❌ Field decorators: Extra initializer (private instance field)
  Code: oldAddInitializer(() => { })
  Expected: throws instanceof TypeError
  Observed: returns undefined

❌ Field decorators: Extra initializer (private static field)
  Code: oldAddInitializer(() => { })
  Expected: throws instanceof TypeError
  Observed: returns undefined

❌ Getter decorators: Extra initializer (instance getter)
  Code: oldAddInitializer(() => { })
  Expected: throws instanceof TypeError
  Observed: returns undefined

❌ Getter decorators: Extra initializer (static getter)
  Code: oldAddInitializer(() => { })
  Expected: throws instanceof TypeError
  Observed: returns undefined

❌ Getter decorators: Extra initializer (private instance getter)
  Code: oldAddInitializer(() => { })
  Expected: throws instanceof TypeError
  Observed: returns undefined

❌ Getter decorators: Extra initializer (private static getter)
  Code: oldAddInitializer(() => { })
  Expected: throws instanceof TypeError
  Observed: returns undefined

❌ Setter decorators: Extra initializer (instance setter)
  Code: oldAddInitializer(() => { })
  Expected: throws instanceof TypeError
  Observed: returns undefined

❌ Setter decorators: Extra initializer (static setter)
  Code: oldAddInitializer(() => { })
  Expected: throws instanceof TypeError
  Observed: returns undefined

❌ Setter decorators: Extra initializer (private instance setter)
  Code: oldAddInitializer(() => { })
  Expected: throws instanceof TypeError
  Observed: returns undefined

❌ Setter decorators: Extra initializer (private static setter)
  Code: oldAddInitializer(() => { })
  Expected: throws instanceof TypeError
  Observed: returns undefined

❌ Auto-accessor decorators: Extra initializer (instance auto-accessor)
  Code: oldAddInitializer(() => { })
  Expected: throws instanceof TypeError
  Observed: returns undefined

❌ Auto-accessor decorators: Extra initializer (static auto-accessor)
  Code: oldAddInitializer(() => { })
  Expected: throws instanceof TypeError
  Observed: returns undefined

❌ Auto-accessor decorators: Extra initializer (private instance auto-accessor)
  Code: oldAddInitializer(() => { })
  Expected: throws instanceof TypeError
  Observed: returns undefined

❌ Auto-accessor decorators: Extra initializer (private static auto-accessor)
  Code: oldAddInitializer(() => { })
  Expected: throws instanceof TypeError
  Observed: returns undefined

❌ Decorator list evaluation: "this" (class statement)
  Code: _classThis_1.foo(5)
  Throws: TypeError: _classThis_1.foo is not a function

❌ Decorator list evaluation: "this" (class statement)
  Code: _classThis_1.foo(11)
  Throws: TypeError: _classThis_1.foo is not a function

❌ Decorator list evaluation: "this" (class statement)
  Code: '' + log
  Expected: "0,1,2,3,4,5,6,7,8,9,10,11"
  Observed: "0,1,2,3,4,6,7,8,9,10"

❌ Decorator list evaluation: "this" (class expression)
  Code: _classThis_1.foo(5)
  Throws: TypeError: _classThis_1.foo is not a function

❌ Decorator list evaluation: "this" (class expression)
  Code: _classThis_1.foo(11)
  Throws: TypeError: _classThis_1.foo is not a function

❌ Decorator list evaluation: "this" (class expression)
  Code: '' + log
  Expected: "0,1,2,3,4,5,6,7,8,9,10,11"
  Observed: "0,1,2,3,4,6,7,8,9,10"

❌ Decorator list evaluation: "await" (class statement)
  Throws: SyntaxError: "await" can only be used inside an "async" function

❌ Decorator list evaluation: "await" (class expression)
  Throws: SyntaxError: "await" can only be used inside an "async" function

❌ Decorator list evaluation: Class binding (class statement)
  Code: fn()
  Expected: throws instanceof ReferenceError
  Observed: returns undefined

❌ Decorator list evaluation: Class binding (class statement)
  Code: fn()
  Expected: throws instanceof ReferenceError
  Observed: returns undefined

❌ Decorator list evaluation: Class binding (class statement)
  Code: fn()
  Expected: throws instanceof ReferenceError
  Observed: returns undefined

❌ Decorator list evaluation: Class binding (class statement)
  Code: fn()
  Expected: throws instanceof ReferenceError
  Observed: returns undefined

❌ Decorator list evaluation: Class binding (class statement)
  Code: fn()
  Expected: throws instanceof ReferenceError
  Observed: returns undefined

❌ Decorator list evaluation: Class binding (class statement)
  Code: fn()
  Expected: throws instanceof ReferenceError
  Observed: returns undefined

❌ Decorator list evaluation: Class binding (class statement)
  Code: fn()
  Expected: throws instanceof ReferenceError
  Observed: returns undefined

❌ Decorator list evaluation: Class binding (class statement)
  Code: fn()
  Expected: throws instanceof ReferenceError
  Observed: returns undefined

❌ Decorator list evaluation: Class binding (class statement)
  Code: fn()
  Expected: throws instanceof ReferenceError
  Observed: returns undefined

❌ Decorator list evaluation: Class binding (class statement)
  Code: fn()
  Expected: throws instanceof ReferenceError
  Observed: returns undefined

❌ Decorator list evaluation: Class binding (class statement)
  Code: fn()
  Expected: throws instanceof ReferenceError
  Observed: returns undefined

❌ Decorator list evaluation: Class binding (class statement)
  Code: firstFn()
  Expected: null
  Observed: class

❌ Decorator list evaluation: Class binding (class expression)
  Code: firstFn()
  Expected: throws instanceof ReferenceError
  Observed: returns class

❌ 44 checks failed

Known issues:

  • SWC implements an older version of the specification from 2022 with outdated behavior.
  • Generated code sometimes has syntax errors because SWC fails to transform certain decorators.
❌ 247 checks failed (click for details)
❌ Class decorators: Basic expression: Property value
  Code: ()=>cls.name
  Expected: "Foo"
  Observed: ""

❌ Class decorators: Basic expression: Property value
  Code: ()=>ctx.name
  Expected: "Foo"
  Observed: ""

❌ Class decorators: Basic expression: Variable initializer
  Code: ()=>cls.name
  Expected: "Foo"
  Observed: ""

❌ Class decorators: Basic expression: Variable initializer
  Code: ()=>ctx.name
  Expected: "Foo"
  Observed: ""

❌ Class decorators: Basic expression: Array binding
  Code: ()=>cls.name
  Expected: "Foo"
  Observed: ""

❌ Class decorators: Basic expression: Array binding
  Code: ()=>ctx.name
  Expected: "Foo"
  Observed: ""

❌ Class decorators: Basic expression: Object binding
  Code: ()=>cls.name
  Expected: "Foo"
  Observed: ""

❌ Class decorators: Basic expression: Object binding
  Code: ()=>ctx.name
  Expected: "Foo"
  Observed: ""

❌ Class decorators: Basic expression: Assignment initializer
  Code: ()=>cls.name
  Expected: "Foo"
  Observed: ""

❌ Class decorators: Basic expression: Assignment initializer
  Code: ()=>ctx.name
  Expected: "Foo"
  Observed: ""

❌ Class decorators: Basic expression: Assignment array binding
  Code: ()=>cls.name
  Expected: "Foo"
  Observed: ""

❌ Class decorators: Basic expression: Assignment array binding
  Code: ()=>ctx.name
  Expected: "Foo"
  Observed: ""

❌ Class decorators: Basic expression: Assignment object binding
  Code: ()=>cls.name
  Expected: "Foo"
  Observed: ""

❌ Class decorators: Basic expression: Assignment object binding
  Code: ()=>ctx.name
  Expected: "Foo"
  Observed: ""

❌ Class decorators: Basic expression: Instance field initializer
  Code: ()=>cls.name
  Expected: "Foo"
  Observed: ""

❌ Class decorators: Basic expression: Instance field initializer
  Code: ()=>ctx.name
  Expected: "Foo"
  Observed: ""

❌ Class decorators: Basic expression: Static field initializer
  Code: ()=>cls.name
  Expected: "Foo"
  Observed: ""

❌ Class decorators: Basic expression: Static field initializer
  Code: ()=>ctx.name
  Expected: "Foo"
  Observed: ""

❌ Class decorators: Basic expression: Instance auto-accessor initializer
  Code: ()=>cls.name
  Expected: "Foo"
  Observed: ""

❌ Class decorators: Basic expression: Instance auto-accessor initializer
  Code: ()=>ctx.name
  Expected: "Foo"
  Observed: ""

❌ Class decorators: Basic expression: Static auto-accessor initializer
  Code: ()=>cls.name
  Expected: "Foo"
  Observed: ""

❌ Class decorators: Basic expression: Static auto-accessor initializer
  Code: ()=>ctx.name
  Expected: "Foo"
  Observed: ""

❌ Class decorators: Extra initializer
  Code: ()=>oldAddInitializer(()=>{})
  Expected: throws instanceof TypeError
  Observed: throws Error: attempted to call addInitializer after decoration was finished

❌ Class decorators: Binding initialization (class statement)
  Code: ()=>_Foo.field
  Expected: class
  Observed: undefined

❌ Class decorators: Binding initialization (class statement)
  Code: ()=>old.getter
  Expected: class
  Observed: class

❌ Class decorators: Binding initialization (class statement)
  Code: ()=>foo.getter
  Expected: class
  Observed: class

❌ Class decorators: Binding initialization (class statement)
  Code: ()=>(obj = { foo: null }, old.setter = obj, obj.foo)
  Expected: class
  Observed: class

❌ Class decorators: Binding initialization (class statement)
  Code: ()=>(obj = { foo: null }, foo.setter = obj, obj.foo)
  Expected: class
  Observed: class

❌ Class decorators: Binding initialization (class expression)
  Code: ()=>Foo.field
  Expected: class
  Observed: undefined

❌ Method decorators: Basic (instance method)
  Code: ()=>ctx.access.has({ [key]: false })
  Throws: TypeError: ctx.access.has is not a function

❌ Method decorators: Basic (instance method)
  Code: ()=>ctx.access.has({ bar: true })
  Throws: TypeError: ctx.access.has is not a function

❌ Method decorators: Basic (instance method)
  Code: ()=>ctx.access.get({ [key]: 123 })
  Expected: 123
  Observed: foo() {}

❌ Method decorators: Basic (instance method)
  Code: ()=>ctx.access.has({ [key]: false })
  Throws: TypeError: ctx.access.has is not a function

❌ Method decorators: Basic (instance method)
  Code: ()=>ctx.access.has({ bar: true })
  Throws: TypeError: ctx.access.has is not a function

❌ Method decorators: Basic (instance method)
  Code: ()=>ctx.access.get({ [key]: 123 })
  Expected: 123
  Observed: [bar]() {}

❌ Method decorators: Basic (instance method)
  Code: ()=>ctx.access.has({ [key]: false })
  Throws: TypeError: ctx.access.has is not a function

❌ Method decorators: Basic (instance method)
  Code: ()=>ctx.access.has({ bar: true })
  Throws: TypeError: ctx.access.has is not a function

❌ Method decorators: Basic (instance method)
  Code: ()=>ctx.access.get({ [key]: 123 })
  Expected: 123
  Observed: [baz]() {}

❌ Method decorators: Basic (static method)
  Code: ()=>ctx.access.has({ [key]: false })
  Throws: TypeError: ctx.access.has is not a function

❌ Method decorators: Basic (static method)
  Code: ()=>ctx.access.has({ bar: true })
  Throws: TypeError: ctx.access.has is not a function

❌ Method decorators: Basic (static method)
  Code: ()=>ctx.access.get({ [key]: 123 })
  Expected: 123
  Observed: foo() {}

❌ Method decorators: Basic (static method)
  Code: ()=>ctx.access.has({ [key]: false })
  Throws: TypeError: ctx.access.has is not a function

❌ Method decorators: Basic (static method)
  Code: ()=>ctx.access.has({ bar: true })
  Throws: TypeError: ctx.access.has is not a function

❌ Method decorators: Basic (static method)
  Code: ()=>ctx.access.get({ [key]: 123 })
  Expected: 123
  Observed: [bar]() {}

❌ Method decorators: Basic (static method)
  Code: ()=>ctx.access.has({ [key]: false })
  Throws: TypeError: ctx.access.has is not a function

❌ Method decorators: Basic (static method)
  Code: ()=>ctx.access.has({ bar: true })
  Throws: TypeError: ctx.access.has is not a function

❌ Method decorators: Basic (static method)
  Code: ()=>ctx.access.get({ [key]: 123 })
  Expected: 123
  Observed: [baz]() {}

❌ Method decorators: Basic (private instance method)
  Code: ()=>fn.name
  Expected: "#foo"
  Observed: ""

❌ Method decorators: Basic (private instance method)
  Code: ()=>ctx.access.has(new Foo)
  Throws: TypeError: ctx.access.has is not a function

❌ Method decorators: Basic (private instance method)
  Code: ()=>ctx.access.has({})
  Throws: TypeError: ctx.access.has is not a function

❌ Method decorators: Basic (private static method)
  Code: ()=>fn.name
  Expected: "#foo"
  Observed: ""

❌ Method decorators: Basic (private static method)
  Code: ()=>ctx.access.has(Foo)
  Throws: TypeError: ctx.access.has is not a function

❌ Method decorators: Basic (private static method)
  Code: ()=>ctx.access.has({})
  Throws: TypeError: ctx.access.has is not a function

❌ Method decorators: Extra initializer (instance method)
  Code: ()=>oldAddInitializer(()=>{})
  Expected: throws instanceof TypeError
  Observed: throws Error: attempted to call addInitializer after decoration was finished

❌ Method decorators: Extra initializer (static method)
  Code: ()=>oldAddInitializer(()=>{})
  Expected: throws instanceof TypeError
  Observed: throws Error: attempted to call addInitializer after decoration was finished

❌ Method decorators: Extra initializer (private instance method)
  Code: ()=>oldAddInitializer(()=>{})
  Expected: throws instanceof TypeError
  Observed: throws Error: attempted to call addInitializer after decoration was finished

❌ Method decorators: Extra initializer (private static method)
  Code: ()=>oldAddInitializer(()=>{})
  Expected: throws instanceof TypeError
  Observed: throws Error: attempted to call addInitializer after decoration was finished

❌ Field decorators: Basic (instance field)
  Code: ()=>ctx.access.has({ [key]: false })
  Throws: TypeError: ctx.access.has is not a function

❌ Field decorators: Basic (instance field)
  Code: ()=>ctx.access.has({ bar: true })
  Throws: TypeError: ctx.access.has is not a function

❌ Field decorators: Basic (instance field)
  Code: ()=>ctx.access.get({ [key]: 123 })
  Expected: 123
  Observed: undefined

❌ Field decorators: Basic (instance field)
  Code: ()=>{ const obj = {}; ctx.access.set(obj, 321); return obj[key]; }
  Expected: 321
  Observed: undefined

❌ Field decorators: Basic (instance field)
  Code: ()=>ctx.access.has({ [key]: false })
  Throws: TypeError: ctx.access.has is not a function

❌ Field decorators: Basic (instance field)
  Code: ()=>ctx.access.has({ bar: true })
  Throws: TypeError: ctx.access.has is not a function

❌ Field decorators: Basic (instance field)
  Code: ()=>ctx.access.get({ [key]: 123 })
  Expected: 123
  Observed: undefined

❌ Field decorators: Basic (instance field)
  Code: ()=>{ const obj = {}; ctx.access.set(obj, 321); return obj[key]; }
  Expected: 321
  Observed: undefined

❌ Field decorators: Basic (instance field)
  Code: ()=>ctx.access.has({ [key]: false })
  Throws: TypeError: ctx.access.has is not a function

❌ Field decorators: Basic (instance field)
  Code: ()=>ctx.access.has({ bar: true })
  Throws: TypeError: ctx.access.has is not a function

❌ Field decorators: Basic (instance field)
  Code: ()=>ctx.access.get({ [key]: 123 })
  Expected: 123
  Observed: undefined

❌ Field decorators: Basic (instance field)
  Code: ()=>{ const obj = {}; ctx.access.set(obj, 321); return obj[key]; }
  Expected: 321
  Observed: undefined

❌ Field decorators: Basic (static field)
  Code: ()=>ctx.access.has({ [key]: false })
  Throws: TypeError: ctx.access.has is not a function

❌ Field decorators: Basic (static field)
  Code: ()=>ctx.access.has({ bar: true })
  Throws: TypeError: ctx.access.has is not a function

❌ Field decorators: Basic (static field)
  Code: ()=>ctx.access.get({ [key]: 123 })
  Expected: 123
  Observed: undefined

❌ Field decorators: Basic (static field)
  Code: ()=>{ const obj = {}; ctx.access.set(obj, 321); return obj[key]; }
  Expected: 321
  Observed: undefined

❌ Field decorators: Basic (static field)
  Code: ()=>ctx.access.has({ [key]: false })
  Throws: TypeError: ctx.access.has is not a function

❌ Field decorators: Basic (static field)
  Code: ()=>ctx.access.has({ bar: true })
  Throws: TypeError: ctx.access.has is not a function

❌ Field decorators: Basic (static field)
  Code: ()=>ctx.access.get({ [key]: 123 })
  Expected: 123
  Observed: undefined

❌ Field decorators: Basic (static field)
  Code: ()=>{ const obj = {}; ctx.access.set(obj, 321); return obj[key]; }
  Expected: 321
  Observed: undefined

❌ Field decorators: Basic (static field)
  Code: ()=>ctx.access.has({ [key]: false })
  Throws: TypeError: ctx.access.has is not a function

❌ Field decorators: Basic (static field)
  Code: ()=>ctx.access.has({ bar: true })
  Throws: TypeError: ctx.access.has is not a function

❌ Field decorators: Basic (static field)
  Code: ()=>ctx.access.get({ [key]: 123 })
  Expected: 123
  Observed: undefined

❌ Field decorators: Basic (static field)
  Code: ()=>{ const obj = {}; ctx.access.set(obj, 321); return obj[key]; }
  Expected: 321
  Observed: undefined

❌ Field decorators: Basic (private instance field)
  Code: ()=>ctx.access.has(new Foo)
  Throws: TypeError: ctx.access.has is not a function

❌ Field decorators: Basic (private instance field)
  Code: ()=>ctx.access.has({})
  Throws: TypeError: ctx.access.has is not a function

❌ Field decorators: Basic (private instance field)
  Code: ()=>ctx.access.get(new Foo)
  Throws: TypeError: Cannot read private member #foo from an object whose class did not declare it

❌ Field decorators: Basic (private instance field)
  Code: ()=>{ const obj = new Foo; ctx.access.set(obj, 321); return get$foo(obj); }
  Throws: TypeError: Cannot write private member #foo to an object whose class did not declare it

❌ Field decorators: Basic (private static field)
  Code: ()=>ctx.access.has(Foo)
  Throws: TypeError: ctx.access.has is not a function

❌ Field decorators: Basic (private static field)
  Code: ()=>ctx.access.has({})
  Throws: TypeError: ctx.access.has is not a function

❌ Field decorators: Basic (private static field)
  Code: ()=>ctx.access.get(Foo)
  Throws: TypeError: Cannot read private member #foo from an object whose class did not declare it

❌ Field decorators: Basic (private static field)
  Code: ()=>{ ctx.access.set(Foo, 321); return get$foo(Foo); }
  Throws: TypeError: Cannot write private member #foo to an object whose class did not declare it

❌ Field decorators: Order (instance field)
  Code: ()=>log + ''
  Expected: "0,1,2,3,4,5,6"
  Observed: "0,1,2,3,5,4,6"

❌ Field decorators: Order (static field)
  Code: ()=>log + ''
  Expected: "0,1,2,3,4,5"
  Observed: "0,1,2,4,3,5"

❌ Field decorators: Order (private instance field)
  Code: ()=>log + ''
  Expected: "0,1,2,3,4,5,6"
  Observed: "0,1,2,3,5,4,6"

❌ Field decorators: Order (private static field)
  Code: ()=>log + ''
  Expected: "0,1,2,3,4,5"
  Observed: "0,1,2,4,3,5"

❌ Field decorators: Extra initializer (instance field)
  Code: ()=>oldAddInitializer(()=>{})
  Expected: throws instanceof TypeError
  Observed: throws Error: attempted to call addInitializer after decoration was finished

❌ Field decorators: Extra initializer (instance field)
  Code: ()=>got.this
  Throws: TypeError: Cannot read properties of undefined (reading 'this')

❌ Field decorators: Extra initializer (instance field)
  Code: ()=>got.args.length
  Throws: TypeError: Cannot read properties of undefined (reading 'args')

❌ Field decorators: Extra initializer (static field)
  Code: ()=>oldAddInitializer(()=>{})
  Expected: throws instanceof TypeError
  Observed: throws Error: attempted to call addInitializer after decoration was finished

❌ Field decorators: Extra initializer (static field)
  Code: ()=>got.this
  Throws: TypeError: Cannot read properties of undefined (reading 'this')

❌ Field decorators: Extra initializer (static field)
  Code: ()=>got.args.length
  Throws: TypeError: Cannot read properties of undefined (reading 'args')

❌ Field decorators: Extra initializer (private instance field)
  Code: ()=>oldAddInitializer(()=>{})
  Expected: throws instanceof TypeError
  Observed: throws Error: attempted to call addInitializer after decoration was finished

❌ Field decorators: Extra initializer (private instance field)
  Code: ()=>got.this
  Throws: TypeError: Cannot read properties of undefined (reading 'this')

❌ Field decorators: Extra initializer (private instance field)
  Code: ()=>got.args.length
  Throws: TypeError: Cannot read properties of undefined (reading 'args')

❌ Field decorators: Extra initializer (private static field)
  Code: ()=>oldAddInitializer(()=>{})
  Expected: throws instanceof TypeError
  Observed: throws Error: attempted to call addInitializer after decoration was finished

❌ Field decorators: Extra initializer (private static field)
  Code: ()=>got.this
  Throws: TypeError: Cannot read properties of undefined (reading 'this')

❌ Field decorators: Extra initializer (private static field)
  Code: ()=>got.args.length
  Throws: TypeError: Cannot read properties of undefined (reading 'args')

❌ Getter decorators: Basic (instance getter)
  Code: ()=>ctx.access.has({ [key]: false })
  Throws: TypeError: ctx.access.has is not a function

❌ Getter decorators: Basic (instance getter)
  Code: ()=>ctx.access.has({ bar: true })
  Throws: TypeError: ctx.access.has is not a function

❌ Getter decorators: Basic (instance getter)
  Code: ()=>ctx.access.get({ [key]: 123 })
  Expected: 123
  Observed: undefined

❌ Getter decorators: Basic (instance getter)
  Code: ()=>ctx.access.has({ [key]: false })
  Throws: TypeError: ctx.access.has is not a function

❌ Getter decorators: Basic (instance getter)
  Code: ()=>ctx.access.has({ bar: true })
  Throws: TypeError: ctx.access.has is not a function

❌ Getter decorators: Basic (instance getter)
  Code: ()=>ctx.access.get({ [key]: 123 })
  Expected: 123
  Observed: undefined

❌ Getter decorators: Basic (instance getter)
  Code: ()=>ctx.access.has({ [key]: false })
  Throws: TypeError: ctx.access.has is not a function

❌ Getter decorators: Basic (instance getter)
  Code: ()=>ctx.access.has({ bar: true })
  Throws: TypeError: ctx.access.has is not a function

❌ Getter decorators: Basic (instance getter)
  Code: ()=>ctx.access.get({ [key]: 123 })
  Expected: 123
  Observed: undefined

❌ Getter decorators: Basic (static getter)
  Code: ()=>ctx.access.has({ [key]: false })
  Throws: TypeError: ctx.access.has is not a function

❌ Getter decorators: Basic (static getter)
  Code: ()=>ctx.access.has({ bar: true })
  Throws: TypeError: ctx.access.has is not a function

❌ Getter decorators: Basic (static getter)
  Code: ()=>ctx.access.get({ [key]: 123 })
  Expected: 123
  Observed: undefined

❌ Getter decorators: Basic (static getter)
  Code: ()=>ctx.access.has({ [key]: false })
  Throws: TypeError: ctx.access.has is not a function

❌ Getter decorators: Basic (static getter)
  Code: ()=>ctx.access.has({ bar: true })
  Throws: TypeError: ctx.access.has is not a function

❌ Getter decorators: Basic (static getter)
  Code: ()=>ctx.access.get({ [key]: 123 })
  Expected: 123
  Observed: undefined

❌ Getter decorators: Basic (static getter)
  Code: ()=>ctx.access.has({ [key]: false })
  Throws: TypeError: ctx.access.has is not a function

❌ Getter decorators: Basic (static getter)
  Code: ()=>ctx.access.has({ bar: true })
  Throws: TypeError: ctx.access.has is not a function

❌ Getter decorators: Basic (static getter)
  Code: ()=>ctx.access.get({ [key]: 123 })
  Expected: 123
  Observed: undefined

❌ Getter decorators: Basic (private instance getter)
  Code: ()=>fn.name
  Expected: "get #foo"
  Observed: ""

❌ Getter decorators: Basic (private instance getter)
  Code: ()=>ctx.access.has(new Foo)
  Throws: TypeError: ctx.access.has is not a function

❌ Getter decorators: Basic (private instance getter)
  Code: ()=>ctx.access.has({})
  Throws: TypeError: ctx.access.has is not a function

❌ Getter decorators: Basic (private instance getter)
  Code: ()=>ctx.access.get(new Foo)
  Throws: TypeError: Cannot read private member #bar from an object whose class did not declare it

❌ Getter decorators: Basic (private static getter)
  Code: ()=>fn.name
  Expected: "get #foo"
  Observed: ""

❌ Getter decorators: Basic (private static getter)
  Code: ()=>ctx.access.has(Foo)
  Throws: TypeError: ctx.access.has is not a function

❌ Getter decorators: Basic (private static getter)
  Code: ()=>ctx.access.has({})
  Throws: TypeError: ctx.access.has is not a function

❌ Getter decorators: Basic (private static getter)
  Code: ()=>ctx.access.get(Foo)
  Throws: TypeError: Cannot read private member #bar from an object whose class did not declare it

❌ Getter decorators: Extra initializer (instance getter)
  Code: ()=>oldAddInitializer(()=>{})
  Expected: throws instanceof TypeError
  Observed: throws Error: attempted to call addInitializer after decoration was finished

❌ Getter decorators: Extra initializer (static getter)
  Code: ()=>oldAddInitializer(()=>{})
  Expected: throws instanceof TypeError
  Observed: throws Error: attempted to call addInitializer after decoration was finished

❌ Getter decorators: Extra initializer (private instance getter)
  Code: ()=>oldAddInitializer(()=>{})
  Expected: throws instanceof TypeError
  Observed: throws Error: attempted to call addInitializer after decoration was finished

❌ Getter decorators: Extra initializer (private static getter)
  Code: ()=>oldAddInitializer(()=>{})
  Expected: throws instanceof TypeError
  Observed: throws Error: attempted to call addInitializer after decoration was finished

❌ Setter decorators: Basic (instance setter)
  Code: ()=>ctx.access.has({ [key]: false })
  Throws: TypeError: ctx.access.has is not a function

❌ Setter decorators: Basic (instance setter)
  Code: ()=>ctx.access.has({ bar: true })
  Throws: TypeError: ctx.access.has is not a function

❌ Setter decorators: Basic (instance setter)
  Code: ()=>obj[key]
  Expected: 123
  Observed: undefined

❌ Setter decorators: Basic (instance setter)
  Code: ()=>ctx.access.has({ [key]: false })
  Throws: TypeError: ctx.access.has is not a function

❌ Setter decorators: Basic (instance setter)
  Code: ()=>ctx.access.has({ bar: true })
  Throws: TypeError: ctx.access.has is not a function

❌ Setter decorators: Basic (instance setter)
  Code: ()=>obj[key]
  Expected: 123
  Observed: undefined

❌ Setter decorators: Basic (instance setter)
  Code: ()=>ctx.access.has({ [key]: false })
  Throws: TypeError: ctx.access.has is not a function

❌ Setter decorators: Basic (instance setter)
  Code: ()=>ctx.access.has({ bar: true })
  Throws: TypeError: ctx.access.has is not a function

❌ Setter decorators: Basic (instance setter)
  Code: ()=>obj[key]
  Expected: 123
  Observed: undefined

❌ Setter decorators: Basic (static setter)
  Code: ()=>ctx.access.has({ [key]: false })
  Throws: TypeError: ctx.access.has is not a function

❌ Setter decorators: Basic (static setter)
  Code: ()=>ctx.access.has({ bar: true })
  Throws: TypeError: ctx.access.has is not a function

❌ Setter decorators: Basic (static setter)
  Code: ()=>obj[key]
  Expected: 123
  Observed: undefined

❌ Setter decorators: Basic (static setter)
  Code: ()=>ctx.access.has({ [key]: false })
  Throws: TypeError: ctx.access.has is not a function

❌ Setter decorators: Basic (static setter)
  Code: ()=>ctx.access.has({ bar: true })
  Throws: TypeError: ctx.access.has is not a function

❌ Setter decorators: Basic (static setter)
  Code: ()=>obj[key]
  Expected: 123
  Observed: undefined

❌ Setter decorators: Basic (static setter)
  Code: ()=>ctx.access.has({ [key]: false })
  Throws: TypeError: ctx.access.has is not a function

❌ Setter decorators: Basic (static setter)
  Code: ()=>ctx.access.has({ bar: true })
  Throws: TypeError: ctx.access.has is not a function

❌ Setter decorators: Basic (static setter)
  Code: ()=>obj[key]
  Expected: 123
  Observed: undefined

❌ Setter decorators: Basic (private instance setter)
  Code: ()=>fn.name
  Expected: "set #foo"
  Observed: ""

❌ Setter decorators: Basic (private instance setter)
  Code: ()=>ctx.access.has(new Foo)
  Throws: TypeError: ctx.access.has is not a function

❌ Setter decorators: Basic (private instance setter)
  Code: ()=>ctx.access.has({})
  Throws: TypeError: ctx.access.has is not a function

❌ Setter decorators: Basic (private instance setter)
  Code: ()=>{ const obj = new Foo; ctx.access.set(obj, 123); return obj.bar; }
  Expected: 123
  Observed: 0

❌ Setter decorators: Basic (private static setter)
  Code: ()=>fn.name
  Expected: "set #foo"
  Observed: ""

❌ Setter decorators: Basic (private static setter)
  Code: ()=>ctx.access.has(Foo)
  Throws: TypeError: ctx.access.has is not a function

❌ Setter decorators: Basic (private static setter)
  Code: ()=>ctx.access.has({})
  Throws: TypeError: ctx.access.has is not a function

❌ Setter decorators: Basic (private static setter)
  Code: ()=>{ ctx.access.set(Foo, 123); return Foo.bar; }
  Expected: 123
  Observed: 0

❌ Setter decorators: Extra initializer (instance setter)
  Code: ()=>oldAddInitializer(()=>{})
  Expected: throws instanceof TypeError
  Observed: throws Error: attempted to call addInitializer after decoration was finished

❌ Setter decorators: Extra initializer (static setter)
  Code: ()=>oldAddInitializer(()=>{})
  Expected: throws instanceof TypeError
  Observed: throws Error: attempted to call addInitializer after decoration was finished

❌ Setter decorators: Extra initializer (private instance setter)
  Code: ()=>oldAddInitializer(()=>{})
  Expected: throws instanceof TypeError
  Observed: throws Error: attempted to call addInitializer after decoration was finished

❌ Setter decorators: Extra initializer (private static setter)
  Code: ()=>oldAddInitializer(()=>{})
  Expected: throws instanceof TypeError
  Observed: throws Error: attempted to call addInitializer after decoration was finished

❌ Auto-accessor decorators: Basic (instance auto-accessor)
  Code: ()=>ctx.access.has({ [key]: false })
  Throws: TypeError: ctx.access.has is not a function

❌ Auto-accessor decorators: Basic (instance auto-accessor)
  Code: ()=>ctx.access.has({ bar: true })
  Throws: TypeError: ctx.access.has is not a function

❌ Auto-accessor decorators: Basic (instance auto-accessor)
  Code: ()=>ctx.access.get({ [key]: 123 })
  Throws: TypeError: Cannot read private member #___private_foo_1 from an object whose class did not declare it

❌ Auto-accessor decorators: Basic (instance auto-accessor)
  Code: ()=>{ const obj = {}; ctx.access.set(obj, 123); return obj[key]; }
  Throws: TypeError: Cannot write private member #___private_foo_1 to an object whose class did not declare it

❌ Auto-accessor decorators: Basic (instance auto-accessor)
  Code: ()=>ctx.access.has({ [key]: false })
  Throws: TypeError: ctx.access.has is not a function

❌ Auto-accessor decorators: Basic (instance auto-accessor)
  Code: ()=>ctx.access.has({ bar: true })
  Throws: TypeError: ctx.access.has is not a function

❌ Auto-accessor decorators: Basic (instance auto-accessor)
  Code: ()=>ctx.access.get({ [key]: 123 })
  Throws: TypeError: Cannot read private member #___private_bar_2 from an object whose class did not declare it

❌ Auto-accessor decorators: Basic (instance auto-accessor)
  Code: ()=>{ const obj = {}; ctx.access.set(obj, 123); return obj[key]; }
  Throws: TypeError: Cannot write private member #___private_bar_2 to an object whose class did not declare it

❌ Auto-accessor decorators: Basic (instance auto-accessor)
  Code: ()=>ctx.access.has({ [key]: false })
  Throws: TypeError: ctx.access.has is not a function

❌ Auto-accessor decorators: Basic (instance auto-accessor)
  Code: ()=>ctx.access.has({ bar: true })
  Throws: TypeError: ctx.access.has is not a function

❌ Auto-accessor decorators: Basic (instance auto-accessor)
  Code: ()=>ctx.access.get({ [key]: 123 })
  Throws: TypeError: Cannot read private member #___private_baz_3 from an object whose class did not declare it

❌ Auto-accessor decorators: Basic (instance auto-accessor)
  Code: ()=>{ const obj = {}; ctx.access.set(obj, 123); return obj[key]; }
  Throws: TypeError: Cannot write private member #___private_baz_3 to an object whose class did not declare it

❌ Auto-accessor decorators: Basic (static auto-accessor)
  Code: ()=>ctx.access.has({ [key]: false })
  Throws: TypeError: ctx.access.has is not a function

❌ Auto-accessor decorators: Basic (static auto-accessor)
  Code: ()=>ctx.access.has({ bar: true })
  Throws: TypeError: ctx.access.has is not a function

❌ Auto-accessor decorators: Basic (static auto-accessor)
  Code: ()=>ctx.access.get({ [key]: 123 })
  Throws: TypeError: Cannot read private member #___private_foo_1 from an object whose class did not declare it

❌ Auto-accessor decorators: Basic (static auto-accessor)
  Code: ()=>{ const obj = {}; ctx.access.set(obj, 123); return obj[key]; }
  Throws: TypeError: Cannot write private member #___private_foo_1 to an object whose class did not declare it

❌ Auto-accessor decorators: Basic (static auto-accessor)
  Code: ()=>ctx.access.has({ [key]: false })
  Throws: TypeError: ctx.access.has is not a function

❌ Auto-accessor decorators: Basic (static auto-accessor)
  Code: ()=>ctx.access.has({ bar: true })
  Throws: TypeError: ctx.access.has is not a function

❌ Auto-accessor decorators: Basic (static auto-accessor)
  Code: ()=>ctx.access.get({ [key]: 123 })
  Throws: TypeError: Cannot read private member #___private_bar_2 from an object whose class did not declare it

❌ Auto-accessor decorators: Basic (static auto-accessor)
  Code: ()=>{ const obj = {}; ctx.access.set(obj, 123); return obj[key]; }
  Throws: TypeError: Cannot write private member #___private_bar_2 to an object whose class did not declare it

❌ Auto-accessor decorators: Basic (static auto-accessor)
  Code: ()=>ctx.access.has({ [key]: false })
  Throws: TypeError: ctx.access.has is not a function

❌ Auto-accessor decorators: Basic (static auto-accessor)
  Code: ()=>ctx.access.has({ bar: true })
  Throws: TypeError: ctx.access.has is not a function

❌ Auto-accessor decorators: Basic (static auto-accessor)
  Code: ()=>ctx.access.get({ [key]: 123 })
  Throws: TypeError: Cannot read private member #___private_baz_3 from an object whose class did not declare it

❌ Auto-accessor decorators: Basic (static auto-accessor)
  Code: ()=>{ const obj = {}; ctx.access.set(obj, 123); return obj[key]; }
  Throws: TypeError: Cannot write private member #___private_baz_3 to an object whose class did not declare it

❌ Auto-accessor decorators: Basic (private instance auto-accessor)
  Code: ()=>target.get.name
  Expected: "get #foo"
  Observed: ""

❌ Auto-accessor decorators: Basic (private instance auto-accessor)
  Code: ()=>target.set.name
  Expected: "set #foo"
  Observed: ""

❌ Auto-accessor decorators: Basic (private instance auto-accessor)
  Code: ()=>ctx.access.has(new Foo)
  Throws: TypeError: ctx.access.has is not a function

❌ Auto-accessor decorators: Basic (private instance auto-accessor)
  Code: ()=>ctx.access.has({})
  Throws: TypeError: ctx.access.has is not a function

❌ Auto-accessor decorators: Basic (private instance auto-accessor)
  Code: ()=>ctx.access.get(new Foo)
  Throws: TypeError: Cannot read private member #__foo_1 from an object whose class did not declare it

❌ Auto-accessor decorators: Basic (private instance auto-accessor)
  Code: ()=>{ const obj = new Foo; ctx.access.set(obj, 123); return get$foo(obj); }
  Throws: TypeError: Cannot write private member #__foo_1 to an object whose class did not declare it

❌ Auto-accessor decorators: Basic (private static auto-accessor)
  Code: ()=>target.get.name
  Expected: "get #foo"
  Observed: ""

❌ Auto-accessor decorators: Basic (private static auto-accessor)
  Code: ()=>target.set.name
  Expected: "set #foo"
  Observed: ""

❌ Auto-accessor decorators: Basic (private static auto-accessor)
  Code: ()=>ctx.access.has(Foo)
  Throws: TypeError: ctx.access.has is not a function

❌ Auto-accessor decorators: Basic (private static auto-accessor)
  Code: ()=>ctx.access.has({})
  Throws: TypeError: ctx.access.has is not a function

❌ Auto-accessor decorators: Basic (private static auto-accessor)
  Code: ()=>ctx.access.get(Foo)
  Throws: TypeError: Cannot read private member #__foo_1 from an object whose class did not declare it

❌ Auto-accessor decorators: Basic (private static auto-accessor)
  Code: ()=>{ ctx.access.set(Foo, 123); return get$foo(Foo); }
  Throws: TypeError: Cannot write private member #__foo_1 to an object whose class did not declare it

❌ Auto-accessor decorators: Extra initializer (instance auto-accessor)
  Code: ()=>oldAddInitializer(()=>{})
  Expected: throws instanceof TypeError
  Observed: throws Error: attempted to call addInitializer after decoration was finished

❌ Auto-accessor decorators: Extra initializer (static auto-accessor)
  Code: ()=>oldAddInitializer(()=>{})
  Expected: throws instanceof TypeError
  Observed: throws Error: attempted to call addInitializer after decoration was finished

❌ Auto-accessor decorators: Extra initializer (private instance auto-accessor)
  Code: ()=>oldAddInitializer(()=>{})
  Expected: throws instanceof TypeError
  Observed: throws Error: attempted to call addInitializer after decoration was finished

❌ Auto-accessor decorators: Extra initializer (private static auto-accessor)
  Code: ()=>oldAddInitializer(()=>{})
  Expected: throws instanceof TypeError
  Observed: throws Error: attempted to call addInitializer after decoration was finished

❌ Decorator list evaluation: Computed names (class statement)
  Code: ()=>'' + log
  Expected: "0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21"
  Observed: "0,2,2,4,4,6,6,8,8,10,10,12,12,14,14,16,16,18,20,19,20,1"

❌ Decorator list evaluation: Computed names (class expression)
  Code: ()=>'' + log
  Expected: "0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21"
  Observed: "0,2,2,4,4,6,6,8,8,10,10,12,12,14,14,16,16,18,20,19,20,1"

❌ Decorator list evaluation: "this" (class statement)
  Code: ()=>this.foo(1)
  Throws: TypeError: this.foo is not a function

❌ Decorator list evaluation: "this" (class statement)
  Code: ()=>'' + log
  Expected: "0,1,2,3,4,5,6,7,8,9,10,11"
  Observed: "0,2,3,4,5,6,7,8,9,10,11"

❌ Decorator list evaluation: "this" (class expression)
  Code: ()=>'' + log
  Expected: "0,1,2,3,4,5,6,7,8,9,10,11"
  Observed: "0,2,3,4,5,6,7,8,9,10,11,1"

❌ Decorator list evaluation: "await" (class statement)
  Throws: SyntaxError: The keyword "await" cannot be used here:

❌ Decorator list evaluation: "await" (class expression)
  Code: ()=>'' + log
  Expected: "0,1,2,3,4,5,6,7,8,9,10,11"
  Observed: "0,2,3,4,5,6,7,8,9,10,11,1"

❌ Decorator list evaluation: Outer private name (class statement)
  Code: ()=>'' + log
  Expected: "0,1,2,3,4,5,6,7,8,9,10,11"
  Observed: "0,2,3,4,5,6,7,8,9,10,11,1"

❌ Decorator list evaluation: Outer private name (class expression)
  Code: ()=>'' + log
  Expected: "0,1,2,3,4,5,6,7,8,9,10,11"
  Observed: "0,2,3,4,5,6,7,8,9,10,11,1"

❌ Decorator list evaluation: Inner private name (class statement)
  Throws: TypeError: Cannot read private member #foo from an object whose class did not declare it

❌ Decorator list evaluation: Inner private name (class expression)
  Throws: TypeError: Cannot read private member #foo from an object whose class did not declare it

❌ Decorator list evaluation: Class binding (class statement)
  Code: ()=>fn()
  Expected: throws instanceof ReferenceError
  Observed: returns undefined

❌ Decorator list evaluation: Class binding (class statement)
  Code: ()=>fn()
  Expected: throws instanceof ReferenceError
  Observed: returns undefined

❌ Decorator list evaluation: Class binding (class statement)
  Code: ()=>fn()
  Expected: throws instanceof ReferenceError
  Observed: returns undefined

❌ Decorator list evaluation: Class binding (class statement)
  Code: ()=>fn()
  Expected: throws instanceof ReferenceError
  Observed: returns undefined

❌ Decorator list evaluation: Class binding (class statement)
  Code: ()=>fn()
  Expected: throws instanceof ReferenceError
  Observed: returns undefined

❌ Decorator list evaluation: Class binding (class statement)
  Code: ()=>fn()
  Expected: throws instanceof ReferenceError
  Observed: returns undefined

❌ Decorator list evaluation: Class binding (class statement)
  Code: ()=>fn()
  Expected: throws instanceof ReferenceError
  Observed: returns undefined

❌ Decorator list evaluation: Class binding (class statement)
  Code: ()=>fn()
  Expected: throws instanceof ReferenceError
  Observed: returns undefined

❌ Decorator list evaluation: Class binding (class statement)
  Code: ()=>fn()
  Expected: throws instanceof ReferenceError
  Observed: returns undefined

❌ Decorator list evaluation: Class binding (class statement)
  Code: ()=>fn()
  Expected: throws instanceof ReferenceError
  Observed: returns undefined

❌ Decorator list evaluation: Class binding (class statement)
  Code: ()=>fn()
  Expected: throws instanceof ReferenceError
  Observed: returns undefined

❌ Decorator list evaluation: Class binding (class statement)
  Code: ()=>fn()
  Expected: class
  Observed: null

❌ Decorator list evaluation: Class binding (class statement)
  Code: ()=>fn()
  Expected: class
  Observed: null

❌ Decorator list evaluation: Class binding (class statement)
  Code: ()=>fn()
  Expected: class
  Observed: null

❌ Decorator list evaluation: Class binding (class statement)
  Code: ()=>fn()
  Expected: class
  Observed: null

❌ Decorator list evaluation: Class binding (class statement)
  Code: ()=>fn()
  Expected: class
  Observed: null

❌ Decorator list evaluation: Class binding (class statement)
  Code: ()=>fn()
  Expected: class
  Observed: null

❌ Decorator list evaluation: Class binding (class statement)
  Code: ()=>fn()
  Expected: class
  Observed: null

❌ Decorator list evaluation: Class binding (class statement)
  Code: ()=>fn()
  Expected: class
  Observed: null

❌ Decorator list evaluation: Class binding (class statement)
  Code: ()=>fn()
  Expected: class
  Observed: null

❌ Decorator list evaluation: Class binding (class statement)
  Code: ()=>fn()
  Expected: class
  Observed: null

❌ Decorator metadata: class statement
  Code: ()=>order(foo)
  Expected: "0,1,2,3,,,,,4,5,6,7,,,,,8,,9,,10,"
  Observed: "0,1,2,3,,,,,5,6,7,8,,,,,4,,9,,10,"

❌ Decorator metadata: class statement
  Code: ()=>order(bar)
  Expected: "0,1,2,3,11,12,13,14,4,5,6,7,15,16,17,18,8,19,9,20,10,21"
  Observed: "0,1,2,3,11,12,13,14,5,6,7,8,16,17,18,19,4,15,9,20,10,21"

❌ Decorator metadata: class statement
  Code: ()=>Object.getPrototypeOf(BarOneDec[Symbol.metadata])
  Expected: typeof object
  Observed: null

❌ Decorator metadata: class expression
  Code: ()=>order(foo)
  Expected: "0,1,2,3,,,,,4,5,6,7,,,,,8,,9,,10,"
  Observed: "0,1,2,3,,,,,5,6,7,8,,,,,4,,9,,,"

❌ Decorator metadata: class expression
  Code: ()=>order(bar)
  Expected: "0,1,2,3,11,12,13,14,4,5,6,7,15,16,17,18,8,19,9,20,10,21"
  Observed: "0,1,2,3,11,12,13,14,5,6,7,8,16,17,18,19,4,15,9,20,,"

❌ Decorator metadata: class expression
  Code: ()=>Object.getPrototypeOf(BarOneDec[Symbol.metadata])
  Expected: typeof object
  Observed: typeof object

❌ Initializer order (public members, class statement)
  Code: ()=>log + ''
  Expected: "start,extends,M1,M2,G1,G2,S1,S2,A1,A2,m1,m2,g1,g2,s1,s2,a1,a2,F1,F2,f1,f2,c1,c2,M3,M4,M5,M6,G3,G4,G5,G6,S3,S4,S5,S6,static:start,F7,F8,F3,F4,F5,F6,A7,A8,A3,A4,A5,A6,static:end,c3,c4,c5,c6,after,ctor:start,m3,m4,m5,m6,g3,g4,g5,g6,s3,s4,s5,s6,f7,f8,f3,f4,f5,f6,a7,a8,a3,a4,a5,a6,ctor:end,end"
  Observed: "start,extends,M1,M2,G1,G2,S1,S2,A1,A2,F1,F2,m1,m2,g1,g2,s1,s2,a1,a2,f1,f2,c1,c2,M3,M4,M5,M6,G3,G4,G5,G6,S3,S4,S5,S6,A3,A4,A5,A6,F3,F4,F5,F6,F8,F7,A8,A7,static:start,static:end,c3,c4,c5,c6,after,ctor:start,f8,f7,m3,m4,m5,m6,g3,g4,g5,g6,s3,s4,s5,s6,a3,a4,a5,a6,f3,f4,f5,f6,a8,a7,ctor:end,end"

❌ Initializer order (public members, class expression)
  Code: ()=>log + ''
  Expected: "start,extends,M1,M2,G1,G2,S1,S2,A1,A2,m1,m2,g1,g2,s1,s2,a1,a2,F1,F2,f1,f2,c1,c2,M3,M4,M5,M6,G3,G4,G5,G6,S3,S4,S5,S6,static:start,F7,F8,F3,F4,F5,F6,A7,A8,A3,A4,A5,A6,static:end,c3,c4,c5,c6,after,ctor:start,m3,m4,m5,m6,g3,g4,g5,g6,s3,s4,s5,s6,f7,f8,f3,f4,f5,f6,a7,a8,a3,a4,a5,a6,ctor:end,end"
  Observed: "start,extends,M1,M2,G1,G2,S1,S2,A1,A2,F1,F2,m1,m2,g1,g2,s1,s2,a1,a2,f1,f2,c1,c2,M3,M4,M5,M6,G3,G4,G5,G6,S3,S4,S5,S6,A3,A4,A5,A6,F3,F4,F5,F6,static:start,F8,F7,A8,A7,static:end,c3,c4,c5,c6,after,ctor:start,f8,f7,m3,m4,m5,m6,g3,g4,g5,g6,s3,s4,s5,s6,a3,a4,a5,a6,f3,f4,f5,f6,a8,a7,ctor:end,end"

❌ Initializer order (private members, class statement)
  Code: ()=>log + ''
  Expected: "start,extends,M1,M2,G1,G2,S1,S2,A1,A2,m1,m2,g1,g2,s1,s2,a1,a2,F1,F2,f1,f2,c1,c2,M3,M4,M5,M6,G3,G4,G5,G6,S3,S4,S5,S6,static:start,F7,F8,F3,F4,F5,F6,A7,A8,A3,A4,A5,A6,static:end,c3,c4,c5,c6,after,ctor:start,m3,m4,m5,m6,g3,g4,g5,g6,s3,s4,s5,s6,f7,f8,f3,f4,f5,f6,a7,a8,a3,a4,a5,a6,ctor:end,end"
  Observed: "start,extends,M1,M2,G1,G2,S1,S2,A1,A2,F1,F2,m1,m2,g1,g2,s1,s2,a1,a2,f1,f2,c1,c2,M3,M4,M5,M6,G3,G4,G5,G6,S3,S4,S5,S6,A3,A4,A5,A6,F3,F4,F5,F6,F8,F7,A8,A7,static:start,static:end,c3,c4,c5,c6,after,ctor:start,f8,f7,m3,m4,m5,m6,g3,g4,g5,g6,s3,s4,s5,s6,a3,a4,a5,a6,f3,f4,f5,f6,a8,a7,ctor:end,end"

❌ Initializer order (private members, class expression)
  Code: ()=>log + ''
  Expected: "start,extends,M1,M2,G1,G2,S1,S2,A1,A2,m1,m2,g1,g2,s1,s2,a1,a2,F1,F2,f1,f2,c1,c2,M3,M4,M5,M6,G3,G4,G5,G6,S3,S4,S5,S6,static:start,F7,F8,F3,F4,F5,F6,A7,A8,A3,A4,A5,A6,static:end,c3,c4,c5,c6,after,ctor:start,m3,m4,m5,m6,g3,g4,g5,g6,s3,s4,s5,s6,f7,f8,f3,f4,f5,f6,a7,a8,a3,a4,a5,a6,ctor:end,end"
  Observed: "start,extends,M1,M2,G1,G2,S1,S2,A1,A2,F1,F2,m1,m2,g1,g2,s1,s2,a1,a2,f1,f2,c1,c2,M3,M4,M5,M6,G3,G4,G5,G6,S3,S4,S5,S6,A3,A4,A5,A6,F3,F4,F5,F6,static:start,F8,F7,A8,A7,static:end,c3,c4,c5,c6,after,ctor:start,f8,f7,m3,m4,m5,m6,g3,g4,g5,g6,s3,s4,s5,s6,a3,a4,a5,a6,f3,f4,f5,f6,a8,a7,ctor:end,end"

❌ 247 checks failed