Chromium Code Reviews| Index: test/mjsunit/harmony/super.js |
| diff --git a/test/mjsunit/harmony/super.js b/test/mjsunit/harmony/super.js |
| index e8d3c9d57f42c908de3487b1fe0882a6bc3b7389..5d3ee2b999385414853c70a5298817c460f1e347 100644 |
| --- a/test/mjsunit/harmony/super.js |
| +++ b/test/mjsunit/harmony/super.js |
| @@ -119,6 +119,30 @@ |
| }()); |
| +(function TestSetterDataProperties() { |
| + function Base() {} |
| + Base.prototype = { |
| + constructor: Base, |
| + x : "x from Base" |
|
arv (Not doing code reviews)
2014/09/30 13:52:17
no ws before :
arv (Not doing code reviews)
2014/09/30 13:52:17
stick to '
|
| + }; |
| + |
| + function Derived() {} |
| + Derived.prototype = { |
| + __proto__: Base.prototype, |
| + constructor: Derived, |
| + }; |
| + |
| + Derived.prototype.testSetter = function() { |
| + assertEquals("x from Base", super.x); |
| + super.x = "data property"; |
| + assertEquals("x from Base", super.x); |
| + assertEquals("data property", this.x); |
| + }.toMethod(Derived.prototype); |
| + |
| + new Derived().testSetter(); |
| +}()); |
| + |
| + |
| (function TestAccessorsOnPrimitives() { |
| var getCalled = 0; |
| var setCalled = 0; |
| @@ -157,6 +181,10 @@ |
| assertEquals(6, super.x += 5); |
| assertEquals(2, getCalled); |
| assertEquals(2, setCalled); |
| + |
| + super.newProperty = 15; |
| + assertEquals(15, this.newProperty); |
| + assertEquals(undefined, super.newProperty); |
| }.toMethod(Derived.prototype); |
| Derived.prototype.testSetterStrict = function() { |
| @@ -176,6 +204,12 @@ |
| assertEquals(6, super.x += 5); |
| assertEquals(2, getCalled); |
| assertEquals(2, setCalled); |
| + |
| + var ex; |
| + try { |
| + super.newProperty = 15; |
|
arv (Not doing code reviews)
2014/09/30 13:52:17
I'm having a hard time seeing why this should thro
|
| + } catch(e) { ex = e; } |
|
arv (Not doing code reviews)
2014/09/30 13:52:17
ws between catch and (
|
| + assertTrue(ex instanceof TypeError); |
| }.toMethod(Derived.prototype); |
| Derived.prototype.testSetter.call(42); |
| @@ -199,25 +233,196 @@ |
| }()); |
| -(function TestSetterFailures() { |
| +(function TestSetterUndefinedProperties() { |
| function Base() {} |
| function Derived() {} |
| Derived.prototype = { __proto__ : Base.prototype }; |
| Derived.prototype.mSloppy = function () { |
| + assertEquals(undefined, super.x); |
| + assertEquals(undefined, this.x); |
| super.x = 10; |
| + assertEquals(10, this.x); |
| assertEquals(undefined, super.x); |
| }.toMethod(Derived.prototype); |
| Derived.prototype.mStrict = function () { |
| 'use strict'; |
| + assertEquals(undefined, super.x); |
| + assertEquals(undefined, this.x); |
| super.x = 10; |
| + assertEquals(10, this.x); |
| + assertEquals(undefined, super.x); |
| }.toMethod(Derived.prototype); |
| var d = new Derived(); |
| d.mSloppy(); |
| - assertEquals(undefined, d.x); |
| + assertEquals(10, d.x); |
| var d1 = new Derived(); |
| - assertThrows(function() { d.mStrict(); }, ReferenceError); |
| - assertEquals(undefined, d.x); |
| + d1.mStrict(); |
| + assertEquals(10, d.x); |
| +}()); |
| + |
| + |
| +(function TestSetterCreatingOwnProperties() { |
| + function Base() {} |
| + function Derived() {} |
| + Derived.prototype = { __proto__ : Base.prototype }; |
| + var setterCalled; |
| + |
| + Derived.prototype.mSloppy = function() { |
| + assertEquals(42, this.ownReadOnly); |
| + super.ownReadOnly = 55; |
| + assertEquals(42, this.ownReadOnly); |
| + |
| + assertEquals(15, this.ownReadonlyAccessor); |
| + super.ownReadonlyAccessor = 55; |
| + assertEquals(15, this.ownReadonlyAccessor); |
| + |
| + setterCalled = 0; |
| + super.ownSetter = 42; |
| + assertEquals(1, setterCalled); |
| + }.toMethod(Derived.prototype); |
| + |
| + Derived.prototype.mStrict = function() { |
| + 'use strict'; |
| + assertEquals(42, this.ownReadOnly); |
| + var ex; |
| + try { |
| + super.ownReadOnly = 55; |
| + } catch(e) { ex = e; } |
| + assertTrue(ex instanceof TypeError); |
| + assertEquals(42, this.ownReadOnly); |
| + |
| + assertEquals(15, this.ownReadonlyAccessor); |
| + ex = null; |
| + try { |
| + super.ownReadonlyAccessor = 55; |
| + } catch(e) { ex = e; } |
| + assertTrue(ex instanceof TypeError); |
| + assertEquals(15, this.ownReadonlyAccessor); |
| + |
| + setterCalled = 0; |
| + super.ownSetter = 42; |
| + assertEquals(1, setterCalled); |
| + }.toMethod(Derived.prototype); |
| + |
| + var d = new Derived(); |
| + Object.defineProperty(d, 'ownReadOnly', { value : 42, writable : false }); |
| + Object.defineProperty(d, 'ownSetter', |
| + { set : function() { setterCalled++; } }); |
| + Object.defineProperty(d, 'ownReadonlyAccessor', |
| + { get : function() { return 15; }}); |
| + d.mSloppy(); |
| + d.mStrict(); |
| +}()); |
| + |
| + |
| +(function TestSetterNoProtoWalk() { |
| + function Base() {} |
| + function Derived() {} |
| + var getCalled; |
| + var setCalled; |
| + Derived.prototype = { |
| + __proto__ : Base.prototype, |
| + get x() { getCalled++; return 42; }, |
| + set x(v) { setCalled++; } |
| + }; |
| + |
| + Derived.prototype.mSloppy = function() { |
| + setCalled = 0; |
| + getCalled = 0; |
| + assertEquals(42, this.x); |
| + assertEquals(1, getCalled); |
| + assertEquals(0, setCalled); |
| + |
| + getCalled = 0; |
| + setCalled = 0; |
| + this.x = 43; |
| + assertEquals(0, getCalled); |
| + assertEquals(1, setCalled); |
| + |
| + getCalled = 0; |
| + setCalled = 0; |
| + super.x = 15; |
| + assertEquals(0, setCalled); |
| + assertEquals(0, getCalled); |
| + |
| + assertEquals(15, this.x); |
| + assertEquals(0, getCalled); |
| + assertEquals(0, setCalled); |
| + |
| + }.toMethod(Derived.prototype); |
| + |
| + Derived.prototype.mStrict = function() { |
| + 'use strict'; |
| + setCalled = 0; |
| + getCalled = 0; |
| + assertEquals(42, this.x); |
| + assertEquals(1, getCalled); |
| + assertEquals(0, setCalled); |
| + |
| + getCalled = 0; |
| + setCalled = 0; |
| + this.x = 43; |
| + assertEquals(0, getCalled); |
| + assertEquals(1, setCalled); |
| + |
| + getCalled = 0; |
| + setCalled = 0; |
| + super.x = 15; |
| + assertEquals(0, setCalled); |
| + assertEquals(0, getCalled); |
| + |
| + assertEquals(15, this.x); |
| + assertEquals(0, getCalled); |
| + assertEquals(0, setCalled); |
| + |
| + }.toMethod(Derived.prototype); |
| + |
| + new Derived().mSloppy(); |
| + new Derived().mStrict(); |
| +}()); |
| + |
| + |
| +(function TestSetterDoesNotReconfigure() { |
| + function Base() {} |
| + function Derived() {} |
| + |
| + Derived.prototype.mStrict = function (){ |
| + 'use strict'; |
| + super.nonEnumConfig = 5; |
| + var d1 = Object.getOwnPropertyDescriptor(this, 'nonEnumConfig'); |
| + assertEquals(5, d1.value); |
| + assertTrue(d1.configurable); |
| + assertFalse(d1.enumerable); |
| + |
| + super.nonEnumNonConfig = 5; |
| + var d1 = Object.getOwnPropertyDescriptor(this, 'nonEnumNonConfig'); |
| + assertEquals(5, d1.value); |
| + assertFalse(d1.configurable); |
| + assertFalse(d1.enumerable); |
| + }.toMethod(Derived.prototype); |
| + |
| + Derived.prototype.mSloppy = function (){ |
| + super.nonEnumConfig = 42; |
| + var d1 = Object.getOwnPropertyDescriptor(this, 'nonEnumConfig'); |
| + assertEquals(42, d1.value); |
| + assertTrue(d1.configurable); |
| + assertFalse(d1.enumerable); |
| + |
| + super.nonEnumNonConfig = 42; |
| + var d1 = Object.getOwnPropertyDescriptor(this, 'nonEnumNonConfig'); |
| + assertEquals(42, d1.value); |
| + assertFalse(d1.configurable); |
| + assertFalse(d1.enumerable); |
| + }.toMethod(Derived.prototype); |
| + |
| + var d = new Derived(); |
| + Object.defineProperty(d, 'nonEnumConfig', |
| + { value : 0, enumerable : false, configurable : true, writable : true }); |
| + Object.defineProperty(d, 'nonEnumNonConfig', |
| + { value : 0, enumerable : false, configurable : false, writable : true }); |
| + d.mStrict(); |
| + d.mSloppy(); |
| }()); |