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() { |