Tests for ES6 arrow function, calling of the super in arrow function

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


PASS isReferenceError is true
PASS b.id is value
PASS isReferenceError is true
PASS d1.id is "b"
PASS d2.id is value
PASS (new D()).id is value
PASS (new E(false)).id is value
PASS typeof (new E(true)).id is 'undefined'
PASS (new F(false)).id is value
PASS typeof (new F(true)).id is 'undefined'
PASS indexOfParentClassInStackError < indexOfnestedArrowInStackError is true
PASS indexOfnestedArrowInStackError < indexOfarrowInChildConstructorInStackError is true
PASS indexOfarrowInChildConstructorInStackError < indexOfChildClassInStackError is true
PASS indexOfChildClassInStackError > 0 is true
PASS indexOfParentClassInStackError > -1 && errorStack.indexOf('ParentClass', indexOfParentClassInStackError + 1) === -1 is true
PASS indexOfnestedArrowInStackError > -1 && errorStack.indexOf('nestedArrow', indexOfnestedArrowInStackError + 1) === -1 is true
PASS indexOfarrowInChildConstructorInStackError > -1 && errorStack.indexOf('arrowInChildConstructor', indexOfarrowInChildConstructorInStackError + 1) === -1 is true
PASS indexOfChildClassInStackError > -1 && errorStack.indexOf('ChildClass', indexOfChildClassInStackError + 1) === -1 is true
PASS (new class extends A { constructor() { ((a = super())=>{})() } }).id is value
PASS (new class extends A { constructor() { ((a = this)=>{ return a; })() } }) threw exception ReferenceError: 'super()' must be called in derived constructor before accessing |this| or returning non-object..
PASS (new class extends A { constructor() { ((a = this, b=super())=>{ return a; })() } }) threw exception ReferenceError: 'super()' must be called in derived constructor before accessing |this| or returning non-object..
PASS (new class extends A { constructor() { ((a = new.target)=>{ return a; })(); super(); } }) did not throw exception.
PASS (new class extends A { constructor() { ((a = new.target, b=super())=>{ return a; })() } }) did not throw exception.
PASS successfullyParsed is true

TEST COMPLETE

