| Index: test/mjsunit/harmony/classes-experimental.js
|
| diff --git a/test/mjsunit/harmony/classes-experimental.js b/test/mjsunit/harmony/classes-experimental.js
|
| index ed720d97b6275462e397d3f55e81746a450839f1..36c4dd82465130b767c460bf67fcae9f2077eabc 100644
|
| --- a/test/mjsunit/harmony/classes-experimental.js
|
| +++ b/test/mjsunit/harmony/classes-experimental.js
|
| @@ -5,63 +5,223 @@
|
| // Flags: --experimental-classes --harmony-classes
|
|
|
| 'use strict';
|
| +(function TestArgumentsAccess() {
|
| + class Base {
|
| + constructor() {
|
| + assertEquals(2, arguments.length);
|
| + assertEquals(1, arguments[0]);
|
| + assertEquals(2, arguments[1]);
|
| + }
|
| + }
|
| +
|
| + let b = new Base(1,2);
|
| +
|
| + class Subclass extends Base {
|
| + constructor() {
|
| + assertEquals(2, arguments.length);
|
| + assertEquals(3, arguments[0]);
|
| + assertEquals(4, arguments[1]);
|
| + super(1,2);
|
| + }
|
| + }
|
| +
|
| + let s = new Subclass(3,4);
|
| + assertEquals(0, Subclass.length);
|
| +
|
| + class Subclass2 extends Base {
|
| + constructor(x,y) {
|
| + assertEquals(2, arguments.length);
|
| + assertEquals(3, arguments[0]);
|
| + assertEquals(4, arguments[1]);
|
| + super(1,2);
|
| + }
|
| + }
|
| +
|
| + let s2 = new Subclass2(3,4);
|
| + assertEquals(2, Subclass2.length);
|
| +}());
|
| +
|
| +(function TestThisAccessRestriction() {
|
| + class Base {
|
| + constructor(a, b) {
|
| + let o = new Object();
|
| + o.prp = a + b;
|
| + return o;
|
| + }
|
| + }
|
| +
|
| + class Subclass extends Base {
|
| + constructor(a, b) {
|
| + var exn;
|
| + try {
|
| + this.prp1 = 3;
|
| + } catch (e) {
|
| + exn = e;
|
| + }
|
| + assertTrue(exn instanceof ReferenceError);
|
| + super(a, b);
|
| + assertSame(a + b, this.prp);
|
| + assertSame(undefined, this.prp1);
|
| + assertFalse(this.hasOwnProperty("prp1"));
|
| + return this;
|
| + }
|
| + }
|
| +
|
| + let b = new Base(1, 2);
|
| + assertSame(3, b.prp);
|
| +
|
| +
|
| + let s = new Subclass(2, -1);
|
| + assertSame(1, s.prp);
|
| + assertSame(undefined, s.prp1);
|
| + assertFalse(s.hasOwnProperty("prp1"));
|
| +
|
| + class Subclass2 extends Base {
|
| + constructor(x) {
|
| + super(1,2);
|
| +
|
| + if (x < 0) return;
|
| +
|
| + let called = false;
|
| + function tmp() { called = true; return 3; }
|
| + var exn = null;
|
| + try {
|
| + super(tmp(),4);
|
| + } catch (e) { exn = e; }
|
| + assertTrue(exn instanceof ReferenceError);
|
| + // TODO(dslomov): should be 'true'.
|
| + assertFalse(called);
|
| + }
|
| + }
|
| +
|
| + var s2 = new Subclass2(1);
|
| + assertSame(3, s2.prp);
|
|
|
| -class Base {
|
| - constructor(a, b) {
|
| - let o = new Object();
|
| - o.prp = a + b;
|
| - return o;
|
| + var s3 = new Subclass2(-1);
|
| + assertSame(3, s3.prp);
|
| +
|
| + assertThrows(function() { Subclass.call(new Object(), 1, 2); }, TypeError);
|
| + assertThrows(function() { Base.call(new Object(), 1, 2); }, TypeError);
|
| +
|
| + class BadSubclass extends Base {
|
| + constructor() {}
|
| + }
|
| +
|
| + assertThrows(function() { new BadSubclass(); }, ReferenceError);
|
| +}());
|
| +
|
| +(function TestPrototypeWiring() {
|
| + class Base {
|
| + constructor(x) {
|
| + this.foobar = x;
|
| + }
|
| + }
|
| +
|
| + class Subclass extends Base {
|
| + constructor(x) {
|
| + super(x);
|
| + }
|
| + }
|
| +
|
| + let s = new Subclass(1);
|
| + assertSame(1, s.foobar);
|
| + assertSame(Subclass.prototype, s.__proto__);
|
| +
|
| + let s1 = new Subclass(1, 2);
|
| + assertSame(1, s1.foobar);
|
| + assertTrue(s1.__proto__ === Subclass.prototype);
|
| +
|
| + let s2 = new Subclass();
|
| + assertSame(undefined, s2.foobar);
|
| + assertSame(Subclass.prototype, s2.__proto__);
|
| + assertThrows(function() { Subclass(1); }, TypeError);
|
| + assertThrows(function() { Subclass(1,2,3,4); }, TypeError);
|
| +
|
| + class Subclass2 extends Subclass {
|
| + constructor() {
|
| + super(5, 6, 7);
|
| + }
|
| }
|
| -}
|
| -
|
| -class Subclass extends Base {
|
| - constructor(a, b) {
|
| - var exn;
|
| - try {
|
| - this.prp1 = 3;
|
| - } catch (e) {
|
| - exn = e;
|
| +
|
| + let ss2 = new Subclass2();
|
| + assertSame(5, ss2.foobar);
|
| + assertSame(Subclass2.prototype, ss2.__proto__);
|
| +
|
| + class Subclass3 extends Base {
|
| + constructor(x,y) {
|
| + super(x + y);
|
| }
|
| - assertTrue(exn instanceof ReferenceError);
|
| - super(a, b);
|
| - assertSame(a + b, this.prp);
|
| - assertSame(undefined, this.prp1);
|
| - assertFalse(this.hasOwnProperty("prp1"));
|
| - return this;
|
| }
|
| -}
|
|
|
| -let b = new Base(1, 2);
|
| -assertSame(3, b.prp);
|
| + let ss3 = new Subclass3(27,42-27);
|
| + assertSame(42, ss3.foobar);
|
| + assertSame(Subclass3.prototype, ss3.__proto__);
|
| +}());
|
|
|
| +(function TestSublclassingBuiltins() {
|
| + class ExtendedUint8Array extends Uint8Array {
|
| + constructor() {
|
| + super(10);
|
| + this[0] = 255;
|
| + this[1] = 0xFFA;
|
| + }
|
| + }
|
|
|
| -let s = new Subclass(2, -1);
|
| -assertSame(1, s.prp);
|
| -assertSame(undefined, s.prp1);
|
| -assertFalse(s.hasOwnProperty("prp1"));
|
| + var eua = new ExtendedUint8Array();
|
| + assertEquals(10, eua.length);
|
| + assertEquals(10, eua.byteLength);
|
| + assertEquals(0xFF, eua[0]);
|
| + assertEquals(0xFA, eua[1]);
|
| + assertTrue(eua.__proto__ === ExtendedUint8Array.prototype);
|
| + assertEquals("[object Uint8Array]", Object.prototype.toString.call(eua));
|
| +}());
|
|
|
| -class Subclass2 extends Base {
|
| - constructor(x) {
|
| - super(1,2);
|
| +(function TestSubclassingNull() {
|
| + let N = null;
|
|
|
| - if (x < 0) return;
|
| + class Foo extends N {
|
| + constructor(x,y) {
|
| + assertSame(1, x);
|
| + assertSame(2, y);
|
| + return {};
|
| + }
|
| + }
|
| +
|
| + new Foo(1,2);
|
| +}());
|
| +
|
| +(function TestSubclassBinding() {
|
| + class Base {
|
| + constructor(x, y) {
|
| + this.x = x;
|
| + this.y = y;
|
| + }
|
| + }
|
|
|
| - let called = false;
|
| - function tmp() { called = true; return 3; }
|
| - var exn = null;
|
| - try {
|
| - super(tmp(),4);
|
| - } catch(e) { exn = e; }
|
| - assertTrue(exn !== null);
|
| - assertFalse(called);
|
| + let obj = {};
|
| + class Subclass extends Base {
|
| + constructor(x,y) {
|
| + super(x,y);
|
| + assertTrue(this !== obj);
|
| + }
|
| }
|
| -}
|
|
|
| -var s2 = new Subclass2(1);
|
| -assertSame(3, s2.prp);
|
| + let f = Subclass.bind(obj);
|
| + assertThrows(function () { f(1, 2); }, TypeError);
|
| + let s = new f(1, 2);
|
| + assertSame(1, s.x);
|
| + assertSame(2, s.y);
|
| + assertSame(Subclass.prototype, s.__proto__);
|
|
|
| -var s3 = new Subclass2(-1);
|
| -assertSame(3, s3.prp);
|
| + let s1 = new f(1);
|
| + assertSame(1, s1.x);
|
| + assertSame(undefined, s1.y);
|
| + assertSame(Subclass.prototype, s1.__proto__);
|
|
|
| -assertThrows(function() { Subclass.call(new Object(), 1, 2); }, TypeError);
|
| -assertThrows(function() { Base.call(new Object(), 1, 2); }, TypeError);
|
| + let g = Subclass.bind(obj, 1);
|
| + assertThrows(function () { g(8); }, TypeError);
|
| + let s2 = new g(8);
|
| + assertSame(1, s2.x);
|
| + assertSame(8, s2.y);
|
| + assertSame(Subclass.prototype, s.__proto__);
|
| +}());
|
|
|