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 or null.
PASS baseWithBadPrototype.prototype = "abc"
PASS x = class extends baseWithBadPrototype { constructor() { } }:::TypeError: The value of the superclass's prototype property is not an object or null.
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: 'super()' must be called in derived constructor before accessing |this| or returning non-object.
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

