Tests for calling the constructors of ES6 classes

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


PASS new A did not throw exception.
PASS A() threw exception TypeError: Cannot call a class constructor.
PASS new B did not throw exception.
PASS B() threw exception TypeError: Cannot call a class constructor.
PASS new (class { constructor() {} })() did not throw exception.
PASS (class { constructor() {} })() threw exception TypeError: Cannot call a class constructor.
PASS new (class extends null { constructor() { super() } })() threw exception TypeError: undefined is not an object (evaluating 'super()').
PASS (class extends null { constructor() { super() } })() threw exception TypeError: Cannot call a class constructor.
PASS successfullyParsed is true

TEST COMPLETE

