Tests for ES6 class syntax "extends"

On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".


PASS (new Base) instanceof Base
PASS Object.getPrototypeOf(new Base):::Base.prototype
PASS (new Derived) instanceof Derived
PASS Object.getPrototypeOf(new Derived):::Derived.prototype
PASS Object.getPrototypeOf(Derived.prototype):::Base.prototype
PASS (new Derived).baseMethod():::"base"
PASS (new Derived).overridenMethod():::"derived"
PASS Derived.staticBaseMethod():::"base"
PASS Derived.staticOverridenMethod():::"derived"
PASS x = class extends:::SyntaxError: Unexpected end of script
PASS x = class extends:::SyntaxError: Unexpected end of script
PASS x = class extends Base {:::SyntaxError: Unexpected end of script
PASS x = class extends Base { }
PASS x = class extends Base { constructor() { } }
PASS x.__proto__:::Base
PASS Object.getPrototypeOf(x):::Base
PASS x.prototype.__proto__:::Base.prototype
PASS Object.getPrototypeOf(x.prototype):::Base.prototype
PASS x = class extends null { constructor() { } }; x.__proto__:::Function.prototype
PASS x.__proto__:::Function.prototype
PASS x = class extends 3 { constructor() { } }; x.__proto__:::TypeError: The superclass is not a constructor.
PASS x = class extends "abc" { constructor() { } }; x.__proto__:::TypeError: The superclass is not a constructor.
PASS baseWithBadPrototype = function () {}; baseWithBadPrototype.prototype = 3; new baseWithBadPrototype
PASS x = class extends baseWithBadPrototype { constructor() { } }:::TypeError: The value of the superclass's prototype property is not an object.
PASS baseWithBadPrototype.prototype = "abc"
PASS x = class extends baseWithBadPrototype { constructor() { } }:::TypeError: The value of the superclass's prototype property is not an object.
PASS baseWithBadPrototype.prototype = null; x = class extends baseWithBadPrototype { constructor() { } }
PASS x = 1; c = class extends ++x { constructor() { } };:::SyntaxError: Unexpected token '++'
PASS x = 1; c = class extends x++ { constructor() { } };:::SyntaxError: Unexpected token '++'. Expected opening '{' at the start of a class body.
PASS x = 1; c = class extends (++x) { constructor() { } };:::TypeError: The superclass is not a constructor.
PASS x = 1; c = class extends (x++) { constructor() { } };:::TypeError: The superclass is not a constructor.
PASS x = 1; try { c = class extends (++x) { constructor() { } } } catch (e) { }; x:::2
PASS x = 1; try { c = class extends (x++) { constructor() { } } } catch (e) { }; x:::2
PASS namespace = {}; namespace.A = class { }; namespace.B = class extends namespace.A { }
PASS namespace = {}; namespace.A = class A { }; namespace.B = class B extends namespace.A { }
PASS namespace = {}; namespace.A = class { constructor() { } }; namespace.B = class extends namespace.A { constructor() { } }
PASS namespace = {}; namespace.A = class A { constructor() { } }; namespace.B = class B extends namespace.A { constructor() { } }
PASS namespace = {}; namespace.A = class { constructor() { } }; namespace.B = class extends (namespace.A) { constructor() { } }
PASS namespace = {}; namespace.A = class { constructor() { } }; namespace.B = class extends namespace["A"] { constructor() { } }
PASS namespace = {}; namespace.A = class { constructor() { } }; function getClassA() { return namespace.A }; namespace.B = class extends getClassA() { constructor() { } }
PASS namespace = {}; namespace.A = class { constructor() { } }; function getClass(prop) { return namespace[prop] }; namespace.B = class extends getClass("A") { constructor() { } }
PASS namespace = {}; namespace.A = class { constructor() { } }; namespace.B = class extends (false||null||namespace.A) { constructor() { } }
PASS namespace = {}; namespace.A = class { constructor() { } }; namespace.B = class extends false||null||namespace.A { constructor() { } }:::SyntaxError: Unexpected token '||'. Expected opening '{' at the start of a class body.
PASS x = 1; namespace = {}; namespace.A = class { constructor() { } }; namespace.B = class extends (x++, namespace.A) { constructor() { } };
PASS x = 1; namespace = {}; namespace.A = class { constructor() { } }; namespace.B = class extends (namespace.A, x++) { constructor() { } };:::TypeError: The superclass is not a constructor.
PASS namespace = {}; namespace.A = class { constructor() { } }; namespace.B = class extends new namespace.A { constructor() { } }:::TypeError: The superclass is not a constructor.
PASS namespace = {}; namespace.A = class { constructor() { } }; namespace.B = class extends new namespace.A() { constructor() { } }:::TypeError: The superclass is not a constructor.
PASS x = 1; namespace = {}; namespace.A = class { constructor() { } }; try { namespace.B = class extends (x++, namespace.A) { constructor() { } } } catch (e) { } x:::2
PASS x = 1; namespace = {}; namespace.A = class { constructor() { } }; try { namespace.B = class extends (namespace.A, x++) { constructor() { } } } catch (e) { } x:::2
PASS Object.getPrototypeOf((class { constructor () { } }).prototype):::Object.prototype
PASS Object.getPrototypeOf((class extends null { constructor () { super(); } }).prototype):::null
PASS new (class extends undefined { constructor () { this } }):::TypeError: The superclass is not a constructor.
PASS x = undefined; new (class extends x { constructor () { super(); } }):::TypeError: The superclass is not a constructor.
PASS class x {}; new (class extends null { constructor () { return new x; } }) instanceof x
PASS new (class extends null { constructor () { this; } }):::ReferenceError: Cannot access uninitialized variable.
PASS new (class extends null { constructor () { super(); } }):::TypeError: function is not a constructor (evaluating 'super()')
PASS x = {}; new (class extends null { constructor () { return x } }):::x
PASS y = 12; class C extends null { constructor () { return y; } }; new C;:::TypeError: Cannot return a non-object type in the constructor of a derived class.
PASS class x {}; new (class extends null { constructor () { return new x; } }) instanceof x
PASS x = null; Object.getPrototypeOf((class extends x { }).prototype):::null
PASS Object.prototype.isPrototypeOf(class { })
PASS Function.prototype.isPrototypeOf(class { })
PASS successfullyParsed

TEST COMPLETE

