Index: test/mjsunit/harmony/super.js |
diff --git a/test/mjsunit/harmony/super.js b/test/mjsunit/harmony/super.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..89fb4b1c1689ef60c1c6aec3813d4b09170d728b |
--- /dev/null |
+++ b/test/mjsunit/harmony/super.js |
@@ -0,0 +1,127 @@ |
+// Copyright 2014 the V8 project authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+// |
+// Flags: --harmony-classes |
+ |
+ |
+(function TestSuperNamedLoads() { |
+ function Base() { } |
+ function Derived() { |
+ this.derivedDataProperty = "xxx"; |
+ } |
+ Derived.prototype = Object.create(Base.prototype); |
+ |
+ function fBase() { return "Base " + this.toString(); } |
+ |
+ Base.prototype.f = fBase.toMethod(Base.prototype); |
+ |
+ function fDerived() { |
+ assertEquals("Base this is Derived", super.f()); |
+ assertEquals(15, super.x); |
+ assertEquals(27, this.x); |
+ |
+ return "Derived" |
+ } |
+ |
+ Base.prototype.x = 15; |
+ Base.prototype.toString = function() { return "this is Base"; }; |
+ Derived.prototype.toString = function() { return "this is Derived"; }; |
+ Derived.prototype.x = 27; |
+ Derived.prototype.f = fDerived.toMethod(Derived.prototype); |
+ |
+ assertEquals("Base this is Base", new Base().f()); |
+ assertEquals("Derived", new Derived().f()); |
+}()); |
+ |
+(function TestSuperKeywordNonMethod() { |
+ function f() { |
+ super.unknown(); |
+ } |
+ |
+ assertThrows(f, ReferenceError); |
+}()); |
+ |
+ |
+(function TestGetter() { |
+ function Base() {} |
+ var derived; |
+ Base.prototype = { |
+ constructor: Base, |
+ get x() { |
+ assertSame(this, derived); |
+ return this._x; |
+ }, |
+ _x: 'base' |
+ }; |
+ |
+ function Derived() {} |
+ Derived.__proto__ = Base; |
+ Derived.prototype = { |
+ __proto__: Base.prototype, |
+ constructor: Derived, |
+ _x: 'derived' |
+ }; |
+ Derived.prototype.testGetter = function() { |
+ return super.x; |
+ }.toMethod(Derived.prototype); |
+ derived = new Derived(); |
+ assertEquals('derived', derived.testGetter()); |
+}()); |
+ |
+/* |
+ * TODO[dslomov]: named stores and keyed loads/stores not implemented yet. |
+(function TestSetter() { |
+ function Base() {} |
+ Base.prototype = { |
+ constructor: Base, |
+ get x() { |
+ return this._x; |
+ }, |
+ set x(v) { |
+ this._x = v; |
+ }, |
+ _x: 'base' |
+ }; |
+ |
+ function Derived() {} |
+ Derived.__proto__ = Base; |
+ Derived.prototype = { |
+ __proto__: Base.prototype, |
+ constructor: Derived, |
+ _x: 'derived' |
+ }; |
+ Derived.prototype.testSetter = function() { |
+ super.x = 'foobar'; |
+ }.toMethod(Derived.prototype); |
+ var d = new Derived(); |
+ d.testSetter(); |
+ assertEquals('base', Base.prototype._x); |
+ assertEquals('foobar', d._x); |
+}()); |
+ |
+ |
+(function TestKeyedGetter() { |
+ function Base() {} |
+ Base.prototype = { |
+ constructor: Base, |
+ _x: 'base' |
+ }; |
+ |
+ Object.defineProperty(Base.prototype, '0', |
+ { get: function() { return this._x; } }); |
+ |
+ function Derived() {} |
+ Derived.__proto__ = Base; |
+ Derived.prototype = { |
+ __proto__: Base.prototype, |
+ constructor: Derived, |
+ _x: 'derived' |
+ }; |
+ Derived.prototype.testGetter = function() { |
+ return super[0]; |
+ }.toMethod(Derived.prototype); |
+ assertEquals('derived', new Derived()[0]); |
+ // assertEquals('derived', new Derived().testGetter()); |
+}()); |
+*/ |