Index: test/mjsunit/harmony/super.js |
diff --git a/test/mjsunit/harmony/super.js b/test/mjsunit/harmony/super.js |
index d5296424368412af771fb257327bcf63bd7a7801..bad955efe52b6bbb3ae8ae9f565d5b2136f9c23e 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,11 @@ |
}()); |
-(function TestKeyedSetterCreatingOwnProperties() { |
+(function TestKeyedSetterCreatingOwnPropertiesReconfigurable() { |
var ownReadOnly = 'ownReadOnly'; |
var ownReadonlyAccessor = 'ownReadonlyAccessor'; |
var ownSetter = 'ownSetter'; |
- var setterCalled; |
+ |
function Base() {} |
function Derived() {} |
Derived.prototype = { |
@@ -1088,56 +1221,107 @@ |
mSloppy() { |
assertEquals(42, this[ownReadOnly]); |
super[ownReadOnly] = 55; |
- assertEquals(42, this[ownReadOnly]); |
+ 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] = 55; |
- assertEquals(15, this[ownReadonlyAccessor]); |
- |
- setterCalled = 0; |
- super[ownSetter] = 42; |
- assertEquals(1, setterCalled); |
+ 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]); |
- var ex; |
- try { |
- super[ownReadOnly] = 55; |
- } catch(e) { ex = e; } |
- assertTrue(ex instanceof TypeError); |
- 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]); |
- 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); |
- } |
+ 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 }); |
- Object.defineProperty(d, 'ownSetter', |
- { set : function() { setterCalled++; } }); |
- Object.defineProperty(d, 'ownReadonlyAccessor', |
- { get : function() { return 15; }}); |
+ 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 TestKeyedNumericSetterCreatingOwnProperties() { |
- var ownReadOnly = 42; |
- var ownReadonlyAccessor = 43; |
- var ownSetter = 44; |
+(function TestKeyedSetterCreatingOwnPropertiesNonConfigurable() { |
+ var ownReadOnly = 'ownReadOnly'; |
+ var ownReadonlyAccessor = 'ownReadonlyAccessor'; |
+ var ownSetter = 'ownSetter'; |
var setterCalled; |
+ |
function Base() {} |
function Derived() {} |
Derived.prototype = { |
@@ -1146,50 +1330,152 @@ |
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); |
} |
- } |
+ }; |
var d = new Derived(); |
- Object.defineProperty(d, ownReadOnly, { value : 42, writable : false }); |
- Object.defineProperty(d, ownSetter, |
+ Object.defineProperty(d, 'ownReadOnly', { value : 42, writable : false }); |
+ Object.defineProperty(d, 'ownSetter', |
{ set : function() { setterCalled++; } }); |
- Object.defineProperty(d, ownReadonlyAccessor, |
+ Object.defineProperty(d, 'ownReadonlyAccessor', |
{ get : function() { return 15; }}); |
d.mSloppy(); |
d.mStrict(); |
+ |
}()); |
+// TODO(arv): This is broken |
arv (Not doing code reviews)
2015/02/17 20:41:22
The runtime calls SetElementWithInterceptor. It do
|
+// (function TestKeyedNumericSetterCreatingOwnProperties() { |
+// var ownReadOnly = 42; |
+// var ownReadonlyAccessor = 43; |
+// var ownSetter = 44; |
+// var setterCalled; |
+ |
+// function Base() {} |
+// function Derived() {} |
+// Derived.prototype = { |
+// __proto__: Base.prototype, |
+// mSloppy() { |
+// assertEquals(42, this[ownReadOnly]); |
+// super[ownReadOnly] = 55; |
+// assertEquals(42, this[ownReadOnly]); |
+ |
+// var ex; |
+// assertEquals(15, this[ownReadonlyAccessor]); |
+// 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); |
+// }, |
+// mStrict() { |
+// // 'use strict'; |
+// // assertEquals(42, this[ownReadOnly]); |
+// // var ex; |
+// // try { |
+// // super[ownReadOnly] = 55; |
+// // } catch(e) { ex = e; } |
+// // assertInstanceof(ex, TypeError); |
+// // assertEquals(42, this[ownReadOnly]); |
+ |
+// // assertEquals(15, this[ownReadonlyAccessor]); |
+// // ex = null; |
+// // try { |
+// // super[ownReadonlyAccessor] = 55; |
+// // } catch(e) { ex = e; } |
+// // assertInstanceof(ex, TypeError); |
+// // assertEquals(15, this[ownReadonlyAccessor]); |
+ |
+// // setterCalled = 0; |
+// // super[ownSetter] = 42; |
+// // assertEquals(1, setterCalled); |
+// } |
+// } |
+ |
+// 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() {} |
@@ -1684,7 +1970,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 +2002,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 +2034,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 +2131,7 @@ |
var f = new F(42); |
// TODO(dslomov,arv): Fix this. BUG=v8:3886. |
- assertTrue(f instanceof Number); |
+ assertInstanceof(f, Number); |
}()); |
(function TestSuperCallErrorCases() { |