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__); |
+}()); |