Chromium Code Reviews| Index: test/mjsunit/harmony/super.js |
| diff --git a/test/mjsunit/harmony/super.js b/test/mjsunit/harmony/super.js |
| index d5296424368412af771fb257327bcf63bd7a7801..d3c2e413d3c4af9ce3f77321cd190d7de54fab55 100644 |
| --- a/test/mjsunit/harmony/super.js |
| +++ b/test/mjsunit/harmony/super.js |
| @@ -595,7 +595,7 @@ |
| setCalled = 0; |
| getCalled = 0; |
| assertEquals('object', typeof this); |
| - assertTrue(this instanceof Number) |
| + assertInstanceof(this, Number) |
| assertEquals(42, this.valueOf()); |
| assertEquals(1, super.x); |
| assertEquals(1, getCalled); |
| @@ -635,7 +635,7 @@ |
| try { |
| super.newProperty = 15; |
| } catch (e) { ex = e; } |
| - assertTrue(ex instanceof TypeError); |
| + assertInstanceof(ex, TypeError); |
| } |
| } |
| @@ -654,7 +654,7 @@ |
| super.toString(); |
| } catch(e) { ex = e; } |
| - assertTrue(ex instanceof TypeError); |
| + assertInstanceof(ex, TypeError); |
| } |
| }; |
| @@ -689,7 +689,7 @@ |
| setCalled = 0; |
| getCalled = 0; |
| assertEquals('object', typeof this); |
| - assertTrue(this instanceof Number) |
| + assertInstanceof(this, Number) |
| assertEquals(42, this.valueOf()); |
| assertEquals(1, super[x]); |
| assertEquals(1, getCalled); |
| @@ -729,7 +729,7 @@ |
| try { |
| super[newProperty] = 15; |
| } catch (e) { ex = e; } |
| - assertTrue(ex instanceof TypeError); |
| + assertInstanceof(ex,TypeError); |
| } |
| }; |
| @@ -748,7 +748,7 @@ |
| super[toString](); |
| } catch(e) { ex = e; } |
| - assertTrue(ex instanceof TypeError); |
| + assertInstanceof(ex, TypeError); |
| } |
| }; |
| DerivedFromString.prototype.f.call(42); |
| @@ -784,7 +784,7 @@ |
| setCalled = 0; |
| getCalled = 0; |
| assertEquals('object', typeof this); |
| - assertTrue(this instanceof Number) |
| + assertInstanceof(this, Number) |
| assertEquals(42, this.valueOf()); |
| assertEquals(1, super[x]); |
| assertEquals(1, getCalled); |
| @@ -824,7 +824,7 @@ |
| try { |
| super[newProperty] = 15; |
| } catch (e) { ex = e; } |
| - assertTrue(ex instanceof TypeError); |
| + assertInstanceof(ex, TypeError); |
| } |
| }; |
| @@ -849,13 +849,13 @@ |
| try { |
| super[5] = 'q'; |
| } catch(e) { ex = e; } |
| - assertTrue(ex instanceof TypeError); |
| + assertInstanceof(ex, TypeError); |
| ex = null; |
| try { |
| super[1024] = 'q'; |
| } catch(e) { ex = e; } |
| - assertTrue(ex instanceof TypeError); |
| + assertInstanceof(ex, TypeError); |
| } |
| }; |
| @@ -963,8 +963,110 @@ |
| }()); |
| -(function TestSetterCreatingOwnProperties() { |
| - var setterCalled; |
| +(function TestSetterCreatingOwnPropertiesReconfigurable() { |
| + function Base() {} |
| + function Derived() {} |
| + Derived.prototype = { |
| + __proto__: Base.prototype, |
| + mSloppy() { |
| + assertEquals(42, this.ownReadOnly); |
| + super.ownReadOnly = 55; |
| + assertEquals(55, this.ownReadOnly); |
| + var descr = Object.getOwnPropertyDescriptor(this, 'ownReadOnly'); |
| + assertEquals(55, descr.value); |
| + assertTrue(descr.configurable); |
| + assertFalse(descr.enumerable); |
| + assertFalse(descr.writable); |
| + assertFalse(Base.prototype.hasOwnProperty('ownReadOnly')); |
| + |
| + assertEquals(15, this.ownReadonlyAccessor); |
| + super.ownReadonlyAccessor = 25; |
| + assertEquals(25, this.ownReadonlyAccessor); |
| + var descr = Object.getOwnPropertyDescriptor(this, 'ownReadonlyAccessor'); |
| + assertEquals(25, descr.value); |
| + assertTrue(descr.configurable); |
| + assertFalse(descr.enumerable); |
| + assertTrue(descr.writable); |
| + assertFalse(Base.prototype.hasOwnProperty('ownReadonlyAccessor')); |
| + |
| + super.ownSetter = 35; |
| + assertEquals(35, this.ownSetter); |
| + var descr = Object.getOwnPropertyDescriptor(this, 'ownSetter'); |
| + assertEquals(35, descr.value); |
| + assertTrue(descr.configurable); |
| + assertFalse(descr.enumerable); |
| + assertTrue(descr.writable); |
| + assertFalse(Base.prototype.hasOwnProperty('ownSetter')); |
| + }, |
| + mStrict() { |
| + 'use strict'; |
| + assertEquals(42, this.ownReadOnly); |
| + super.ownReadOnly = 55; |
| + assertEquals(55, this.ownReadOnly); |
| + var descr = Object.getOwnPropertyDescriptor(this, 'ownReadOnly'); |
| + assertEquals(55, descr.value); |
| + assertTrue(descr.configurable); |
| + assertFalse(descr.enumerable); |
| + assertFalse(descr.writable); |
| + assertFalse(Base.prototype.hasOwnProperty('ownReadOnly')); |
| + |
| + assertEquals(15, this.ownReadonlyAccessor); |
| + super.ownReadonlyAccessor = 25; |
| + assertEquals(25, this.ownReadonlyAccessor); |
| + var descr = Object.getOwnPropertyDescriptor(this, 'ownReadonlyAccessor'); |
| + assertEquals(25, descr.value); |
| + assertTrue(descr.configurable); |
| + assertFalse(descr.enumerable); |
| + assertTrue(descr.writable); |
| + assertFalse(Base.prototype.hasOwnProperty('ownReadonlyAccessor')); |
| + |
| + super.ownSetter = 35; |
| + assertEquals(35, this.ownSetter); |
| + var descr = Object.getOwnPropertyDescriptor(this, 'ownSetter'); |
| + assertEquals(35, descr.value); |
| + assertTrue(descr.configurable); |
| + assertFalse(descr.enumerable); |
| + assertTrue(descr.writable); |
| + assertFalse(Base.prototype.hasOwnProperty('ownSetter')); |
| + }, |
| + }; |
| + |
| + var d = new Derived(); |
| + Object.defineProperty(d, 'ownReadOnly', { |
| + value: 42, |
| + writable: false, |
| + configurable: true |
| + }); |
| + Object.defineProperty(d, 'ownSetter', { |
| + set: function() { assertUnreachable(); }, |
| + configurable: true |
| + }); |
| + Object.defineProperty(d, 'ownReadonlyAccessor', { |
| + get: function() { return 15; }, |
| + configurable: true |
| + }); |
| + |
| + d.mSloppy(); |
| + |
| + var d = new Derived(); |
| + Object.defineProperty(d, 'ownReadOnly', { |
| + value: 42, |
| + writable: false, |
| + configurable: true |
| + }); |
| + Object.defineProperty(d, 'ownSetter', { |
| + set: function() { assertUnreachable(); }, |
| + configurable: true |
| + }); |
| + Object.defineProperty(d, 'ownReadonlyAccessor', { |
| + get: function() { return 15; }, |
| + configurable: true |
| + }); |
| + d.mStrict(); |
| +}()); |
| + |
| + |
| +(function TestSetterCreatingOwnPropertiesNonConfigurable() { |
| function Base() {} |
| function Derived() {} |
| Derived.prototype = { |
| @@ -973,43 +1075,74 @@ |
| assertEquals(42, this.ownReadOnly); |
| super.ownReadOnly = 55; |
| assertEquals(42, this.ownReadOnly); |
| + var descr = Object.getOwnPropertyDescriptor(this, 'ownReadOnly'); |
| + assertEquals(42, descr.value); |
| + assertFalse(descr.configurable); |
| + assertFalse(descr.enumerable); |
| + assertFalse(descr.writable); |
| + assertFalse(Base.prototype.hasOwnProperty('ownReadOnly')); |
| + var ex; |
| assertEquals(15, this.ownReadonlyAccessor); |
| - super.ownReadonlyAccessor = 55; |
| + try { |
| + super.ownReadonlyAccessor = 25; |
| + } catch (e) { |
| + ex = e; |
| + } |
| + assertInstanceof(ex, TypeError); |
| + assertEquals('Cannot redefine property: ownReadonlyAccessor', ex.message); |
| assertEquals(15, this.ownReadonlyAccessor); |
| - setterCalled = 0; |
| - super.ownSetter = 42; |
| - assertEquals(1, setterCalled); |
| + ex = null; |
| + try { |
| + super.ownSetter = 35; |
| + } catch (e) { |
| + ex = e; |
| + } |
| + assertInstanceof(ex, TypeError); |
| + assertEquals('Cannot redefine property: ownSetter', ex.message); |
| }, |
| mStrict() { |
| 'use strict'; |
| - assertEquals(42, this.ownReadOnly); |
| var ex; |
| + assertEquals(42, this.ownReadOnly); |
| try { |
| super.ownReadOnly = 55; |
| - } catch(e) { ex = e; } |
| - assertTrue(ex instanceof TypeError); |
| + } catch (e) { |
| + ex = e; |
| + } |
| + assertInstanceof(ex, TypeError); |
| + assertEquals( |
| + "Cannot assign to read only property 'ownReadOnly' of #<Base>", |
| + ex.message); |
| assertEquals(42, this.ownReadOnly); |
| - assertEquals(15, this.ownReadonlyAccessor); |
| ex = null; |
| + assertEquals(15, this.ownReadonlyAccessor); |
| try { |
| - super.ownReadonlyAccessor = 55; |
| - } catch(e) { ex = e; } |
| - assertTrue(ex instanceof TypeError); |
| + super.ownReadonlyAccessor = 25; |
| + } catch (e) { |
| + ex = e; |
| + } |
| + assertInstanceof(ex, TypeError); |
| + assertEquals('Cannot redefine property: ownReadonlyAccessor', ex.message); |
| assertEquals(15, this.ownReadonlyAccessor); |
| - setterCalled = 0; |
| - super.ownSetter = 42; |
| - assertEquals(1, setterCalled); |
| + ex = null; |
| + try { |
| + super.ownSetter = 35; |
| + } catch (e) { |
| + ex = e; |
| + } |
| + assertInstanceof(ex, TypeError); |
| + assertEquals('Cannot redefine property: ownSetter', ex.message); |
| } |
| }; |
| var d = new Derived(); |
| Object.defineProperty(d, 'ownReadOnly', { value : 42, writable : false }); |
| Object.defineProperty(d, 'ownSetter', |
| - { set : function() { setterCalled++; } }); |
| + { set : function() { assertUnreachable(); } }); |
| Object.defineProperty(d, 'ownReadonlyAccessor', |
| { get : function() { return 15; }}); |
| d.mSloppy(); |
| @@ -1076,11 +1209,119 @@ |
| }()); |
| -(function TestKeyedSetterCreatingOwnProperties() { |
| +(function TestKeyedSetterCreatingOwnPropertiesReconfigurable() { |
| + var ownReadOnly = 'ownReadOnly'; |
| + var ownReadonlyAccessor = 'ownReadonlyAccessor'; |
| + var ownSetter = 'ownSetter'; |
| + |
| + function Base() {} |
| + function Derived() {} |
| + Derived.prototype = { |
| + __proto__: Base.prototype, |
| + mSloppy() { |
| + assertEquals(42, this[ownReadOnly]); |
| + super[ownReadOnly] = 55; |
| + assertEquals(55, this[ownReadOnly]); |
| + var descr = Object.getOwnPropertyDescriptor(this, ownReadOnly); |
| + assertEquals(55, descr.value); |
| + assertTrue(descr.configurable); |
| + assertFalse(descr.enumerable); |
| + assertFalse(descr.writable); |
| + assertFalse(Base.prototype.hasOwnProperty(ownReadOnly)); |
| + |
| + assertEquals(15, this[ownReadonlyAccessor]); |
| + super[ownReadonlyAccessor] = 25; |
| + assertEquals(25, this[ownReadonlyAccessor]); |
| + var descr = Object.getOwnPropertyDescriptor(this, ownReadonlyAccessor); |
| + assertEquals(25, descr.value); |
| + assertTrue(descr.configurable); |
| + assertFalse(descr.enumerable); |
| + assertTrue(descr.writable); |
| + assertFalse(Base.prototype.hasOwnProperty(ownReadonlyAccessor)); |
| + |
| + super[ownSetter] = 35; |
| + assertEquals(35, this[ownSetter]); |
| + var descr = Object.getOwnPropertyDescriptor(this, ownSetter); |
| + assertEquals(35, descr.value); |
| + assertTrue(descr.configurable); |
| + assertFalse(descr.enumerable); |
| + assertTrue(descr.writable); |
| + assertFalse(Base.prototype.hasOwnProperty(ownSetter)); |
| + }, |
| + mStrict() { |
| + 'use strict'; |
| + assertEquals(42, this[ownReadOnly]); |
| + super[ownReadOnly] = 55; |
| + assertEquals(55, this[ownReadOnly]); |
| + var descr = Object.getOwnPropertyDescriptor(this, ownReadOnly); |
| + assertEquals(55, descr.value); |
| + assertTrue(descr.configurable); |
| + assertFalse(descr.enumerable); |
| + assertFalse(descr.writable); |
| + assertFalse(Base.prototype.hasOwnProperty(ownReadOnly)); |
| + |
| + assertEquals(15, this[ownReadonlyAccessor]); |
| + super[ownReadonlyAccessor] = 25; |
| + assertEquals(25, this[ownReadonlyAccessor]); |
| + var descr = Object.getOwnPropertyDescriptor(this, 'ownReadonlyAccessor'); |
| + assertEquals(25, descr.value); |
| + assertTrue(descr.configurable); |
| + assertFalse(descr.enumerable); |
| + assertTrue(descr.writable); |
| + assertFalse(Base.prototype.hasOwnProperty('ownReadonlyAccessor')); |
| + |
| + super[ownSetter] = 35; |
| + assertEquals(35, this[ownSetter]); |
| + var descr = Object.getOwnPropertyDescriptor(this, ownSetter); |
| + assertEquals(35, descr.value); |
| + assertTrue(descr.configurable); |
| + assertFalse(descr.enumerable); |
| + assertTrue(descr.writable); |
| + assertFalse(Base.prototype.hasOwnProperty(ownSetter)); |
| + }, |
| + }; |
| + |
| + var d = new Derived(); |
| + Object.defineProperty(d, ownReadOnly, { |
| + value: 42, |
| + writable: false, |
| + configurable: true |
| + }); |
| + Object.defineProperty(d, ownSetter, { |
| + set: function() { assertUnreachable(); }, |
| + configurable: true |
| + }); |
| + Object.defineProperty(d, ownReadonlyAccessor, { |
| + get: function() { return 15; }, |
| + configurable: true |
| + }); |
| + |
| + d.mSloppy(); |
| + |
| + var d = new Derived(); |
| + Object.defineProperty(d, ownReadOnly, { |
| + value: 42, |
| + writable: false, |
| + configurable: true |
| + }); |
| + Object.defineProperty(d, ownSetter, { |
| + set: function() { assertUnreachable(); }, |
| + configurable: true |
| + }); |
| + Object.defineProperty(d, ownReadonlyAccessor, { |
| + get: function() { return 15; }, |
| + configurable: true |
| + }); |
| + d.mStrict(); |
| +})(); |
| + |
| + |
| +(function TestKeyedSetterCreatingOwnPropertiesNonConfigurable() { |
| var ownReadOnly = 'ownReadOnly'; |
| var ownReadonlyAccessor = 'ownReadonlyAccessor'; |
| var ownSetter = 'ownSetter'; |
| var setterCalled; |
| + |
| function Base() {} |
| function Derived() {} |
| Derived.prototype = { |
| @@ -1089,36 +1330,71 @@ |
| assertEquals(42, this[ownReadOnly]); |
| super[ownReadOnly] = 55; |
| assertEquals(42, this[ownReadOnly]); |
| + var descr = Object.getOwnPropertyDescriptor(this, ownReadOnly); |
| + assertEquals(42, descr.value); |
| + assertFalse(descr.configurable); |
| + assertFalse(descr.enumerable); |
| + assertFalse(descr.writable); |
| + assertFalse(Base.prototype.hasOwnProperty(ownReadOnly)); |
| + var ex; |
| assertEquals(15, this[ownReadonlyAccessor]); |
| - super[ownReadonlyAccessor] = 55; |
| + try { |
| + super[ownReadonlyAccessor] = 25; |
| + } catch (e) { |
| + ex = e; |
| + } |
| + assertInstanceof(ex, TypeError); |
| + assertEquals('Cannot redefine property: ownReadonlyAccessor', ex.message); |
| assertEquals(15, this[ownReadonlyAccessor]); |
| setterCalled = 0; |
| - super[ownSetter] = 42; |
| - assertEquals(1, setterCalled); |
| + ex = null; |
| + try { |
| + super[ownSetter] = 35; |
| + } catch (e) { |
| + ex = e; |
| + } |
| + assertInstanceof(ex, TypeError); |
| + assertEquals('Cannot redefine property: ownSetter', ex.message); |
| + assertEquals(0, setterCalled); |
| }, |
| mStrict() { |
| 'use strict'; |
| - assertEquals(42, this[ownReadOnly]); |
| var ex; |
| + assertEquals(42, this.ownReadOnly); |
| try { |
| - super[ownReadOnly] = 55; |
| - } catch(e) { ex = e; } |
| - assertTrue(ex instanceof TypeError); |
| - assertEquals(42, this[ownReadOnly]); |
| + super.ownReadOnly = 55; |
| + } catch (e) { |
| + ex = e; |
| + } |
| + assertInstanceof(ex, TypeError); |
| + assertEquals( |
| + "Cannot assign to read only property 'ownReadOnly' of #<Base>", |
| + ex.message); |
| + assertEquals(42, this.ownReadOnly); |
| - assertEquals(15, this[ownReadonlyAccessor]); |
| ex = null; |
| + assertEquals(15, this[ownReadonlyAccessor]); |
| try { |
| - super[ownReadonlyAccessor] = 55; |
| - } catch(e) { ex = e; } |
| - assertTrue(ex instanceof TypeError); |
| + super[ownReadonlyAccessor] = 25; |
| + } catch (e) { |
| + ex = e; |
| + } |
| + assertInstanceof(ex, TypeError); |
| + assertEquals('Cannot redefine property: ownReadonlyAccessor', ex.message); |
| assertEquals(15, this[ownReadonlyAccessor]); |
| setterCalled = 0; |
| - super[ownSetter] = 42; |
| - assertEquals(1, setterCalled); |
| + ex = null; |
| + try { |
| + super[ownSetter] = 35; |
| + } catch (e) { |
| + ex = e; |
| + } |
| + assertInstanceof(ex, TypeError); |
| + assertEquals('Cannot redefine property: ownSetter', ex.message); |
| + assertEquals(0, setterCalled); |
| } |
| }; |
| @@ -1130,14 +1406,16 @@ |
| { get : function() { return 15; }}); |
| d.mSloppy(); |
| d.mStrict(); |
| + |
| }()); |
| +// TODO(arv): This is broken |
|
adamk
2015/02/17 22:47:45
Is this a stray TODO?
arv (Not doing code reviews)
2015/02/17 22:55:05
Done.
|
| (function TestKeyedNumericSetterCreatingOwnProperties() { |
|
adamk
2015/02/17 22:47:45
Is there any reason this test needs to duplicate a
arv (Not doing code reviews)
2015/02/17 22:55:05
That seems doable. Let me do that.
|
| var ownReadOnly = 42; |
| var ownReadonlyAccessor = 43; |
| var ownSetter = 44; |
| - var setterCalled; |
| + |
| function Base() {} |
| function Derived() {} |
| Derived.prototype = { |
| @@ -1147,42 +1425,66 @@ |
| super[ownReadOnly] = 55; |
| assertEquals(42, this[ownReadOnly]); |
| + var ex; |
| assertEquals(15, this[ownReadonlyAccessor]); |
| - super[ownReadonlyAccessor] = 55; |
| + try { |
| + super[ownReadonlyAccessor] = 55; |
| + } catch (e) { |
| + ex = e; |
| + } |
| + assertInstanceof(ex, TypeError); |
| + assertEquals('Cannot redefine property: 43', ex.message); |
| assertEquals(15, this[ownReadonlyAccessor]); |
| - setterCalled = 0; |
| - super[ownSetter] = 42; |
| - assertEquals(1, setterCalled); |
| + ex = null; |
| + try { |
| + super[ownSetter] = 42; |
| + } catch (e) { |
| + ex = e; |
| + } |
| + assertInstanceof(ex, TypeError); |
| + assertEquals('Cannot redefine property: 44', ex.message); |
| }, |
| mStrict() { |
| 'use strict'; |
| - assertEquals(42, this[ownReadOnly]); |
| var ex; |
| + assertEquals(42, this[ownReadOnly]); |
| try { |
| super[ownReadOnly] = 55; |
| - } catch(e) { ex = e; } |
| - assertTrue(ex instanceof TypeError); |
| + } catch (e) { |
| + ex = e; |
| + } |
| + assertInstanceof(ex, TypeError); |
| + assertEquals("Cannot assign to read only property '42' of #<Base>", |
| + ex.message); |
| assertEquals(42, this[ownReadOnly]); |
| assertEquals(15, this[ownReadonlyAccessor]); |
| - ex = null; |
| try { |
| super[ownReadonlyAccessor] = 55; |
| - } catch(e) { ex = e; } |
| - assertTrue(ex instanceof TypeError); |
| + } catch (e) { |
| + ex = e; |
| + } |
| + assertInstanceof(ex, TypeError); |
| + assertEquals('Cannot redefine property: 43', ex.message); |
| assertEquals(15, this[ownReadonlyAccessor]); |
| - setterCalled = 0; |
| - super[ownSetter] = 42; |
| - assertEquals(1, setterCalled); |
| + ex = null; |
| + try { |
| + super[ownSetter] = 42; |
| + } catch (e) { |
| + ex = e; |
| + } |
| + assertInstanceof(ex, TypeError); |
| + assertEquals('Cannot redefine property: 44', ex.message); |
| + |
| } |
| } |
| var d = new Derived(); |
| Object.defineProperty(d, ownReadOnly, { value : 42, writable : false }); |
| Object.defineProperty(d, ownSetter, |
| - { set : function() { setterCalled++; } }); |
| + { set : function() { assertUnreachable(); } }); |
| Object.defineProperty(d, ownReadonlyAccessor, |
| { get : function() { return 15; }}); |
| d.mSloppy(); |
| @@ -1684,7 +1986,7 @@ |
| assertEquals(27, this.x); |
| var ex = null; |
| try { super.x = 10; } catch(e) { ex = e; } |
| - assertTrue(ex instanceof TypeError); |
| + assertInstanceof(ex, TypeError); |
| assertEquals(27, super.x); |
| assertEquals(27, this.x); |
| } |
| @@ -1716,7 +2018,7 @@ |
| assertEquals(27, this[x]); |
| var ex = null; |
| try { super[x] = 10; } catch(e) { ex = e; } |
| - assertTrue(ex instanceof TypeError); |
| + assertInstanceof(ex, TypeError); |
| assertEquals(27, super[x]); |
| assertEquals(27, this[x]); |
| } |
| @@ -1748,7 +2050,7 @@ |
| assertEquals(27, this[x]); |
| var ex = null; |
| try { super[x] = 10; } catch(e) { ex = e; } |
| - assertTrue(ex instanceof TypeError); |
| + assertInstanceof(ex, TypeError); |
| assertEquals(27, super[x]); |
| assertEquals(27, this[x]); |
| } |
| @@ -1845,7 +2147,7 @@ |
| var f = new F(42); |
| // TODO(dslomov,arv): Fix this. BUG=v8:3886. |
| - assertTrue(f instanceof Number); |
| + assertInstanceof(f, Number); |
| }()); |
| (function TestSuperCallErrorCases() { |