summaryrefslogtreecommitdiff
path: root/deps/v8/test/mjsunit/harmony/super.js
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/test/mjsunit/harmony/super.js')
-rw-r--r--deps/v8/test/mjsunit/harmony/super.js2497
1 files changed, 1321 insertions, 1176 deletions
diff --git a/deps/v8/test/mjsunit/harmony/super.js b/deps/v8/test/mjsunit/harmony/super.js
index 6dcc393cce..988cef22e2 100644
--- a/deps/v8/test/mjsunit/harmony/super.js
+++ b/deps/v8/test/mjsunit/harmony/super.js
@@ -1,36 +1,38 @@
// 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
+// Flags: --harmony-classes --allow-natives-syntax
(function TestSuperNamedLoads() {
function Base() { }
+ function fBase() { }
+ Base.prototype = {
+ f() {
+ return "Base " + this.toString();
+ },
+ x: 15,
+ toString() {
+ return "this is 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());
- var a = super.x;
- assertEquals(15, a);
- 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);
+ Derived.prototype = {
+ __proto__: Base.prototype,
+ toString() { return "this is Derived"; },
+ x: 27,
+ f() {
+ assertEquals("Base this is Derived", super.f());
+ var a = super.x;
+ assertEquals(15, a);
+ assertEquals(15, super.x);
+ assertEquals(27, this.x);
+ return "Derived";
+ }
+ };
assertEquals("Base this is Base", new Base().f());
assertEquals("Derived", new Derived().f());
@@ -38,34 +40,39 @@
(function TestSuperKeyedLoads() {
+ 'use strict';
+
var x = 'x';
var derivedDataProperty = 'derivedDataProperty';
var f = 'f';
- 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]());
- var a = super[x];
- assertEquals(15, a);
- assertEquals(15, super[x]);
- assertEquals(27, this[x]);
- return "Derived"
+ class Base {
+ f() {
+ return "Base " + this.toString();
+ }
+ toString() {
+ return "this is Base";
+ }
}
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);
+
+ function Derived() {
+ this[derivedDataProperty] = "xxx";
+ }
+ Derived.prototype = {
+ __proto__: Base.prototype,
+ toString() { return "this is Derived"; },
+ x: 27,
+ f() {
+ assertEquals("Base this is Derived", super[f]());
+ var a = super[x];
+ assertEquals(15, a);
+ assertEquals(15, super[x]);
+ assertEquals(27, this[x]);
+ return "Derived";
+ }
+ };
assertEquals("Base this is Base", new Base().f());
assertEquals("Derived", new Derived().f());
@@ -76,31 +83,29 @@
var x = 1;
var derivedDataProperty = 2;
var f = 3;
- function Base() { }
- function Derived() {
- this[derivedDataProperty] = 'xxx';
- }
- Derived.prototype = Object.create(Base.prototype);
+ function Base() { }
function fBase() { return "Base " + this.toString(); }
-
- Base.prototype[f] = fBase.toMethod(Base.prototype);
-
- function fDerived() {
- assertEquals("Base this is Derived", super[f]());
- var a = super[x];
- assertEquals(15, a);
- assertEquals(15, super[x]);
- assertEquals(27, this[x]);
-
- return "Derived"
- }
-
+ Base.prototype[f] = %ToMethod(fBase, Base.prototype);
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);
+
+ function Derived() {
+ this[derivedDataProperty] = "xxx";
+ }
+ Derived.prototype = {
+ __proto__: Base.prototype,
+ toString() { return "this is Derived"; },
+ 1: 27,
+ 3() {
+ assertEquals("Base this is Derived", super[f]());
+ var a = super[x];
+ assertEquals(15, a);
+ assertEquals(15, super[x]);
+ assertEquals(27, this[x]);
+ return "Derived";
+ }
+ };
assertEquals("Base this is Base", new Base()[f]());
assertEquals("Derived", new Derived()[f]());
@@ -108,11 +113,17 @@
(function TestSuperKeywordNonMethod() {
- function f() {
- super.unknown();
+ 'use strict';
+
+ class C {
+ f() {
+ super.unknown();
+ }
}
- assertThrows(f, ReferenceError);
+ assertThrows(function() {
+ new C().f();
+ }, TypeError);
}());
@@ -133,15 +144,16 @@
Derived.prototype = {
__proto__: Base.prototype,
constructor: Derived,
- _x: 'derived'
+ _x: 'derived',
+ testGetter() {
+ return super.x;
+ },
+ testGetterStrict() {
+ 'use strict';
+ return super.x;
+ }
};
- Derived.prototype.testGetter = function() {
- return super.x;
- }.toMethod(Derived.prototype);
- Derived.prototype.testGetterStrict = function() {
- 'use strict';
- return super.x;
- }.toMethod(Derived.prototype);
+
derived = new Derived();
assertEquals('derived', derived.testGetter());
derived = new Derived();
@@ -167,44 +179,45 @@
Derived.prototype = {
__proto__: Base.prototype,
constructor: Derived,
- _x: 'derived'
+ _x: 'derived',
+ testGetter() {
+ return super[x];
+ },
+ testGetterStrict() {
+ 'use strict';
+ return super[x];
+ },
+ testGetterWithToString() {
+ var toStringCalled;
+ var o = { toString: function() {
+ toStringCalled++;
+ return 'x';
+ } };
+
+ toStringCalled = 0;
+ assertEquals('derived', super[o]);
+ assertEquals(1, toStringCalled);
+
+ var eToThrow = new Error();
+ var oThrowsInToString = { toString: function() {
+ throw eToThrow;
+ } };
+
+ var ex = null;
+ try {
+ super[oThrowsInToString];
+ } catch(e) { ex = e }
+ assertEquals(eToThrow, ex);
+
+ var oReturnsNumericString = { toString: function() {
+ return "1";
+ } };
+
+ assertEquals(undefined, super[oReturnsNumericString]);
+ assertEquals(undefined, super[1]);
+ }
};
- Derived.prototype.testGetter = function() {
- return super[x];
- }.toMethod(Derived.prototype);
- Derived.prototype.testGetterStrict = function() {
- 'use strict';
- return super[x];
- }.toMethod(Derived.prototype);
- Derived.prototype.testGetterWithToString = function() {
- var toStringCalled;
- var o = { toString: function() {
- toStringCalled++;
- return 'x';
- } };
-
- toStringCalled = 0;
- assertEquals('derived', super[o]);
- assertEquals(1, toStringCalled);
-
- var eToThrow = new Error();
- var oThrowsInToString = { toString: function() {
- throw eToThrow;
- } };
-
- var ex = null;
- try {
- super[oThrowsInToString];
- } catch(e) { ex = e }
- assertEquals(eToThrow, ex);
-
- var oReturnsNumericString = { toString: function() {
- return "1";
- } };
-
- assertEquals(undefined, super[oReturnsNumericString]);
- assertEquals(undefined, super[1]);
- }.toMethod(Derived.prototype);
+
derived = new Derived();
assertEquals('derived', derived.testGetter());
derived = new Derived();
@@ -233,45 +246,51 @@
Derived.prototype = {
__proto__: Base.prototype,
constructor: Derived,
- _x: 'derived'
+ _x: 'derived',
+ testGetter() {
+ return super[x];
+ },
+ testGetterStrict() {
+ 'use strict';
+ return super[x];
+ },
+ testGetterWithToString() {
+ var toStringCalled;
+ var o = {
+ toString: function() {
+ toStringCalled++;
+ return '42';
+ }
+ };
+
+ toStringCalled = 0;
+ assertEquals('derived', super[o]);
+ assertEquals(1, toStringCalled);
+
+ var eToThrow = new Error();
+ var oThrowsInToString = {
+ toString: function() {
+ throw eToThrow;
+ }
+ };
+
+ var ex = null;
+ try {
+ super[oThrowsInToString];
+ } catch(e) { ex = e }
+ assertEquals(eToThrow, ex);
+
+ var oReturnsNumericString = {
+ toString: function() {
+ return "42";
+ }
+ };
+
+ assertEquals('derived', super[oReturnsNumericString]);
+ assertEquals('derived', super[42]);
+ }
};
- Derived.prototype.testGetter = function() {
- return super[x];
- }.toMethod(Derived.prototype);
- Derived.prototype.testGetterStrict = function() {
- 'use strict';
- return super[x];
- }.toMethod(Derived.prototype);
-
- Derived.prototype.testGetterWithToString = function() {
- var toStringCalled;
- var o = { toString: function() {
- toStringCalled++;
- return '42';
- } };
-
- toStringCalled = 0;
- assertEquals('derived', super[o]);
- assertEquals(1, toStringCalled);
-
- var eToThrow = new Error();
- var oThrowsInToString = { toString: function() {
- throw eToThrow;
- } };
-
- var ex = null;
- try {
- super[oThrowsInToString];
- } catch(e) { ex = e }
- assertEquals(eToThrow, ex);
-
- var oReturnsNumericString = { toString: function() {
- return "42";
- } };
-
- assertEquals('derived', super[oReturnsNumericString]);
- assertEquals('derived', super[42]);
- }.toMethod(Derived.prototype);
+
derived = new Derived();
assertEquals('derived', derived.testGetter());
derived = new Derived();
@@ -299,22 +318,24 @@
Derived.prototype = {
__proto__: Base.prototype,
constructor: Derived,
- _x: 'derived'
+ _x: 'derived',
+ testSetter() {
+ assertEquals('foobar', super.x = 'foobar');
+ assertEquals('foobarabc', super.x += 'abc');
+ },
+ testSetterStrict() {
+ 'use strict';
+ assertEquals('foobar', super.x = 'foobar');
+ assertEquals('foobarabc', super.x += 'abc');
+ }
};
- Derived.prototype.testSetter = function() {
- assertEquals('foobar', super.x = 'foobar');
- assertEquals('foobarabc', super.x += 'abc');
- }.toMethod(Derived.prototype);
+
var d = new Derived();
d.testSetter();
assertEquals('base', Base.prototype._x);
assertEquals('foobarabc', d._x);
d._x = '';
- Derived.prototype.testSetterStrict = function() {
- 'use strict';
- assertEquals('foobar', super.x = 'foobar');
- assertEquals('foobarabc', super.x += 'abc');
- }.toMethod(Derived.prototype);
+
d.testSetterStrict();
assertEquals('base', Base.prototype._x);
assertEquals('foobarabc', d._x);
@@ -339,51 +360,56 @@
Derived.prototype = {
__proto__: Base.prototype,
constructor: Derived,
- _x: 'derived'
+ _x: 'derived',
+ testSetter() {
+ assertEquals('foobar', super[x] = 'foobar');
+ assertEquals('foobarabc', super[x] += 'abc');
+ },
+ testSetterStrict() {
+ 'use strict';
+ assertEquals('foobar', super[x] = 'foobar');
+ assertEquals('foobarabc', super[x] += 'abc');
+ },
+ testSetterWithToString() {
+ var toStringCalled;
+ var o = {
+ toString: function() {
+ toStringCalled++;
+ return x;
+ }
+ };
+
+ toStringCalled = 0;
+ super[o] = 'set';
+ assertEquals(1, toStringCalled);
+ assertEquals('set', this._x);
+
+ var eToThrow = new Error();
+ var oThrowsInToString = {
+ toString: function() {
+ throw eToThrow;
+ }
+ };
+
+ var ex = null;
+ try {
+ super[oThrowsInToString] = 'xyz';
+ } catch(e) { ex = e }
+ assertEquals(eToThrow, ex);
+ assertEquals('set', this._x);
+ }
};
- Derived.prototype.testSetter = function() {
- assertEquals('foobar', super[x] = 'foobar');
- assertEquals('foobarabc', super[x] += 'abc');
- }.toMethod(Derived.prototype);
+
var d = new Derived();
d.testSetter();
assertEquals('base', Base.prototype._x);
assertEquals('foobarabc', d._x);
d._x = '';
- Derived.prototype.testSetterStrict = function() {
- 'use strict';
- assertEquals('foobar', super[x] = 'foobar');
- assertEquals('foobarabc', super[x] += 'abc');
- }.toMethod(Derived.prototype);
+
d.testSetterStrict();
assertEquals('base', Base.prototype._x);
assertEquals('foobarabc', d._x);
-
- Derived.prototype.testSetterWithToString = function() {
- var toStringCalled;
- var o = { toString: function() {
- toStringCalled++;
- return x;
- } };
-
- toStringCalled = 0;
- super[o] = 'set';
- assertEquals(1, toStringCalled);
- assertEquals('set', this._x);
-
- var eToThrow = new Error();
- var oThrowsInToString = { toString: function() {
- throw eToThrow;
- } };
-
- var ex = null;
- try {
- super[oThrowsInToString] = 'xyz';
- } catch(e) { ex = e }
- assertEquals(eToThrow, ex);
- assertEquals('set', this._x);
- }.toMethod(Derived.prototype);
d = new Derived();
d.testSetterWithToString();
}());
@@ -408,61 +434,67 @@
Derived.prototype = {
__proto__: Base.prototype,
constructor: Derived,
- _x: 'derived'
+ _x: 'derived',
+ testSetter() {
+ assertEquals('foobar', super[x] = 'foobar');
+ assertEquals('foobarabc', super[x] += 'abc');
+ },
+ testSetterStrict() {
+ 'use strict';
+ assertEquals('foobar', super[x] = 'foobar');
+ assertEquals('foobarabc', super[x] += 'abc');
+ },
+ testSetterWithToString() {
+ var toStringCalled;
+ var o = {
+ toString: function() {
+ toStringCalled++;
+ return 'x';
+ }
+ };
+
+ toStringCalled = 0;
+ super[o] = 'set';
+ assertEquals(1, toStringCalled);
+ assertEquals('set', this._x);
+
+ var eToThrow = new Error();
+ var oThrowsInToString = {
+ toString: function() {
+ throw eToThrow;
+ }
+ };
+
+ var ex = null;
+ try {
+ super[oThrowsInToString] = 'xyz';
+ } catch(e) { ex = e }
+ assertEquals(eToThrow, ex);
+ assertEquals('set', this._x);
+
+ var oReturnsNumericString = {
+ toString: function() {
+ return "1";
+ }
+ };
+
+ assertEquals('abc', super[oReturnsNumericString] = 'abc');
+
+ assertEquals('set', this._x);
+
+ assertEquals(10, super[1] = 10);
+ }
};
- Derived.prototype.testSetter = function() {
- assertEquals('foobar', super[x] = 'foobar');
- assertEquals('foobarabc', super[x] += 'abc');
- }.toMethod(Derived.prototype);
+
var d = new Derived();
d.testSetter();
assertEquals('base', Base.prototype._x);
assertEquals('foobarabc', d._x);
d._x = '';
- Derived.prototype.testSetterStrict = function() {
- 'use strict';
- assertEquals('foobar', super[x] = 'foobar');
- assertEquals('foobarabc', super[x] += 'abc');
- }.toMethod(Derived.prototype);
d.testSetterStrict();
assertEquals('base', Base.prototype._x);
assertEquals('foobarabc', d._x);
-
- Derived.prototype.testSetterWithToString = function() {
- var toStringCalled;
- var o = { toString: function() {
- toStringCalled++;
- return 'x';
- } };
-
- toStringCalled = 0;
- super[o] = 'set';
- assertEquals(1, toStringCalled);
- assertEquals('set', this._x);
-
- var eToThrow = new Error();
- var oThrowsInToString = { toString: function() {
- throw eToThrow;
- } };
-
- var ex = null;
- try {
- super[oThrowsInToString] = 'xyz';
- } catch(e) { ex = e }
- assertEquals(eToThrow, ex);
- assertEquals('set', this._x);
-
- var oReturnsNumericString = { toString: function() {
- return "1";
- } };
-
- assertEquals('abc', super[oReturnsNumericString] = 'abc');
-
- assertEquals('set', this._x);
-
- assertEquals(10, super[1] = 10);
- }.toMethod(Derived.prototype);
d = new Derived();
d.testSetterWithToString();
}());
@@ -479,15 +511,14 @@
Derived.prototype = {
__proto__: Base.prototype,
constructor: Derived,
+ testSetter() {
+ assertEquals('x from Base', super.x);
+ super.x = 'data property';
+ assertEquals('x from Base', super.x);
+ assertEquals('data property', this.x);
+ }
};
- 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();
}());
@@ -504,15 +535,14 @@
Derived.prototype = {
__proto__: Base.prototype,
constructor: Derived,
+ testSetter() {
+ assertEquals('x from Base', super[x]);
+ super[x] = 'data property';
+ assertEquals('x from Base', super[x]);
+ assertEquals('data property', this[x]);
+ }
};
- 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();
}());
@@ -529,15 +559,14 @@
Derived.prototype = {
__proto__: Base.prototype,
constructor: Derived,
+ testSetter() {
+ assertEquals('x from Base', super[x]);
+ super[x] = 'data property';
+ assertEquals('x from Base', super[x]);
+ assertEquals('data property', this[x]);
+ }
};
- 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();
}());
@@ -562,73 +591,74 @@
Derived.prototype = {
__proto__: Base.prototype,
constructor: Derived,
- };
- Derived.prototype.testSetter = function() {
- setCalled = 0;
- getCalled = 0;
- assertEquals('object', typeof this);
- assertTrue(this instanceof Number)
- assertEquals(42, this.valueOf());
- assertEquals(1, super.x);
- assertEquals(1, getCalled);
- assertEquals(0, setCalled);
-
- assertEquals(5, super.x = 5);
- assertEquals(1, getCalled);
- assertEquals(1, setCalled);
-
- 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() {
- 'use strict';
- getCalled = 0;
- setCalled = 0;
- assertTrue(42 === this);
-
- assertEquals(1, super.x);
- assertEquals(1, getCalled);
- assertEquals(0, setCalled);
-
- assertEquals(5, super.x = 5);
- assertEquals(1, getCalled);
- assertEquals(1, setCalled);
-
- assertEquals(6, super.x += 5);
- assertEquals(2, getCalled);
- assertEquals(2, setCalled);
-
- var ex;
- try {
+ testSetter() {
+ setCalled = 0;
+ getCalled = 0;
+ assertEquals('object', typeof this);
+ assertInstanceof(this, Number)
+ assertEquals(42, this.valueOf());
+ assertEquals(1, super.x);
+ assertEquals(1, getCalled);
+ assertEquals(0, setCalled);
+
+ assertEquals(5, super.x = 5);
+ assertEquals(1, getCalled);
+ assertEquals(1, setCalled);
+
+ assertEquals(6, super.x += 5);
+ assertEquals(2, getCalled);
+ assertEquals(2, setCalled);
+
super.newProperty = 15;
- } catch (e) { ex = e; }
- assertTrue(ex instanceof TypeError);
- }.toMethod(Derived.prototype);
+ assertEquals(15, this.newProperty);
+ assertEquals(undefined, super.newProperty);
+ },
+ testSetterStrict() {
+ 'use strict';
+ getCalled = 0;
+ setCalled = 0;
+ assertTrue(42 === this);
+
+ assertEquals(1, super.x);
+ assertEquals(1, getCalled);
+ assertEquals(0, setCalled);
+
+ assertEquals(5, super.x = 5);
+ assertEquals(1, getCalled);
+ assertEquals(1, setCalled);
+
+ assertEquals(6, super.x += 5);
+ assertEquals(2, getCalled);
+ assertEquals(2, setCalled);
+
+ var ex;
+ try {
+ super.newProperty = 15;
+ } catch (e) { ex = e; }
+ assertInstanceof(ex, TypeError);
+ }
+ }
Derived.prototype.testSetter.call(42);
Derived.prototype.testSetterStrict.call(42);
function DerivedFromString() {}
- DerivedFromString.prototype = Object.create(String.prototype);
-
- function f() {
- 'use strict';
- assertTrue(42 === this);
- assertEquals(String.prototype.toString, super.toString);
- var ex;
- try {
- super.toString();
- } catch(e) { ex = e; }
-
- assertTrue(ex instanceof TypeError);
- }
- f.toMethod(DerivedFromString.prototype).call(42);
+ DerivedFromString.prototype = {
+ __proto__: String.prototype,
+ f() {
+ 'use strict';
+ assertTrue(42 === this);
+ assertEquals(String.prototype.toString, super.toString);
+ var ex;
+ try {
+ super.toString();
+ } catch(e) { ex = e; }
+
+ assertInstanceof(ex, TypeError);
+ }
+ };
+
+ DerivedFromString.prototype.f.call(42);
}());
@@ -655,73 +685,73 @@
Derived.prototype = {
__proto__: Base.prototype,
constructor: Derived,
- };
- Derived.prototype.testSetter = function() {
- setCalled = 0;
- getCalled = 0;
- assertEquals('object', typeof this);
- assertTrue(this instanceof Number)
- assertEquals(42, this.valueOf());
- assertEquals(1, super[x]);
- assertEquals(1, getCalled);
- assertEquals(0, setCalled);
-
- assertEquals(5, super[x] = 5);
- assertEquals(1, getCalled);
- assertEquals(1, setCalled);
-
- 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() {
- 'use strict';
- getCalled = 0;
- setCalled = 0;
- assertTrue(42 === this);
-
- assertEquals(1, super[x]);
- assertEquals(1, getCalled);
- assertEquals(0, setCalled);
-
- assertEquals(5, super[x] = 5);
- assertEquals(1, getCalled);
- assertEquals(1, setCalled);
-
- assertEquals(6, super[x] += 5);
- assertEquals(2, getCalled);
- assertEquals(2, setCalled);
-
- var ex;
- try {
+ testSetter() {
+ setCalled = 0;
+ getCalled = 0;
+ assertEquals('object', typeof this);
+ assertInstanceof(this, Number)
+ assertEquals(42, this.valueOf());
+ assertEquals(1, super[x]);
+ assertEquals(1, getCalled);
+ assertEquals(0, setCalled);
+
+ assertEquals(5, super[x] = 5);
+ assertEquals(1, getCalled);
+ assertEquals(1, setCalled);
+
+ assertEquals(6, super[x] += 5);
+ assertEquals(2, getCalled);
+ assertEquals(2, setCalled);
+
super[newProperty] = 15;
- } catch (e) { ex = e; }
- assertTrue(ex instanceof TypeError);
- }.toMethod(Derived.prototype);
+ assertEquals(15, this[newProperty]);
+ assertEquals(undefined, super[newProperty]);
+ },
+ testSetterStrict() {
+ 'use strict';
+ getCalled = 0;
+ setCalled = 0;
+ assertTrue(42 === this);
+
+ assertEquals(1, super[x]);
+ assertEquals(1, getCalled);
+ assertEquals(0, setCalled);
+
+ assertEquals(5, super[x] = 5);
+ assertEquals(1, getCalled);
+ assertEquals(1, setCalled);
+
+ assertEquals(6, super[x] += 5);
+ assertEquals(2, getCalled);
+ assertEquals(2, setCalled);
+
+ var ex;
+ try {
+ super[newProperty] = 15;
+ } catch (e) { ex = e; }
+ assertInstanceof(ex,TypeError);
+ }
+ };
Derived.prototype.testSetter.call(42);
Derived.prototype.testSetterStrict.call(42);
function DerivedFromString() {}
- DerivedFromString.prototype = Object.create(String.prototype);
-
- function f() {
- 'use strict';
- assertTrue(42 === this);
- assertEquals(String.prototype.toString, super[toString]);
- var ex;
- try {
- super[toString]();
- } catch(e) { ex = e; }
-
- assertTrue(ex instanceof TypeError);
- }
- f.toMethod(DerivedFromString.prototype).call(42);
+ DerivedFromString.prototype = {
+ __proto__: String.prototype,
+ f() {
+ 'use strict';
+ assertTrue(42 === this);
+ assertEquals(String.prototype.toString, super[toString]);
+ var ex;
+ try {
+ super[toString]();
+ } catch(e) { ex = e; }
+
+ assertInstanceof(ex, TypeError);
+ }
+ };
+ DerivedFromString.prototype.f.call(42);
}());
@@ -750,54 +780,53 @@
Derived.prototype = {
__proto__: Base.prototype,
constructor: Derived,
- };
- Derived.prototype.testSetter = function() {
- setCalled = 0;
- getCalled = 0;
- assertEquals('object', typeof this);
- assertTrue(this instanceof Number)
- assertEquals(42, this.valueOf());
- assertEquals(1, super[x]);
- assertEquals(1, getCalled);
- assertEquals(0, setCalled);
-
- assertEquals(5, super[x] = 5);
- assertEquals(1, getCalled);
- assertEquals(1, setCalled);
-
- 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() {
- 'use strict';
- getCalled = 0;
- setCalled = 0;
- assertTrue(42 === this);
-
- assertEquals(1, super[x]);
- assertEquals(1, getCalled);
- assertEquals(0, setCalled);
-
- assertEquals(5, super[x] = 5);
- assertEquals(1, getCalled);
- assertEquals(1, setCalled);
-
- assertEquals(6, super[x] += 5);
- assertEquals(2, getCalled);
- assertEquals(2, setCalled);
-
- var ex;
- try {
+ testSetter() {
+ setCalled = 0;
+ getCalled = 0;
+ assertEquals('object', typeof this);
+ assertInstanceof(this, Number)
+ assertEquals(42, this.valueOf());
+ assertEquals(1, super[x]);
+ assertEquals(1, getCalled);
+ assertEquals(0, setCalled);
+
+ assertEquals(5, super[x] = 5);
+ assertEquals(1, getCalled);
+ assertEquals(1, setCalled);
+
+ assertEquals(6, super[x] += 5);
+ assertEquals(2, getCalled);
+ assertEquals(2, setCalled);
+
super[newProperty] = 15;
- } catch (e) { ex = e; }
- assertTrue(ex instanceof TypeError);
- }.toMethod(Derived.prototype);
+ assertEquals(15, this[newProperty]);
+ assertEquals(undefined, super[newProperty]);
+ },
+ testSetterStrict() {
+ 'use strict';
+ getCalled = 0;
+ setCalled = 0;
+ assertTrue(42 === this);
+
+ assertEquals(1, super[x]);
+ assertEquals(1, getCalled);
+ assertEquals(0, setCalled);
+
+ assertEquals(5, super[x] = 5);
+ assertEquals(1, getCalled);
+ assertEquals(1, setCalled);
+
+ assertEquals(6, super[x] += 5);
+ assertEquals(2, getCalled);
+ assertEquals(2, setCalled);
+
+ var ex;
+ try {
+ super[newProperty] = 15;
+ } catch (e) { ex = e; }
+ assertInstanceof(ex, TypeError);
+ }
+ };
Derived.prototype.testSetter.call(42);
Derived.prototype.testSetterStrict.call(42);
@@ -807,28 +836,28 @@
(function TestKeyedNumericSetterOnExotics() {
function Base() {}
function Derived() {}
- Derived.prototype = { __proto__: Base.prototype };
-
- Derived.prototype.callSetterOnArray = function() {
- super[42] = 1;
- }.toMethod(Derived.prototype);
-
- Derived.prototype.callStrictSetterOnString = function() {
- 'use strict';
- assertEquals('string', typeof this);
- assertTrue('abcdef' === this);
- var ex = null;
- try {
- super[5] = 'q';
- } catch(e) { ex = e; }
- assertTrue(ex instanceof TypeError);
-
- ex = null;
- try {
- super[1024] = 'q';
- } catch(e) { ex = e; }
- assertTrue(ex instanceof TypeError);
- }.toMethod(Derived.prototype);
+ Derived.prototype = {
+ __proto__: Base.prototype,
+ callSetterOnArray() {
+ super[42] = 1;
+ },
+ callStrictSetterOnString() {
+ 'use strict';
+ assertEquals('string', typeof this);
+ assertTrue('abcdef' === this);
+ var ex = null;
+ try {
+ super[5] = 'q';
+ } catch(e) { ex = e; }
+ assertInstanceof(ex, TypeError);
+
+ ex = null;
+ try {
+ super[1024] = 'q';
+ } catch(e) { ex = e; }
+ assertInstanceof(ex, TypeError);
+ }
+ };
var x = [];
assertEquals(0, x.length);
@@ -844,23 +873,25 @@
(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);
+ Derived.prototype = {
+ __proto__: Base.prototype,
+ mSloppy() {
+ assertEquals(undefined, super.x);
+ assertEquals(undefined, this.x);
+ super.x = 10;
+ assertEquals(10, this.x);
+ assertEquals(undefined, super.x);
+ },
+ mStrict() {
+ 'use strict';
+ assertEquals(undefined, super.x);
+ assertEquals(undefined, this.x);
+ super.x = 10;
+ assertEquals(10, this.x);
+ assertEquals(undefined, super.x);
+ }
+ };
+
var d = new Derived();
d.mSloppy();
assertEquals(10, d.x);
@@ -874,23 +905,24 @@
var x = 'x';
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);
+ Derived.prototype = {
+ __proto__: Base.prototype,
+ mSloppy() {
+ assertEquals(undefined, super[x]);
+ assertEquals(undefined, this[x]);
+ super[x] = 10;
+ assertEquals(10, this[x]);
+ assertEquals(undefined, super[x]);
+ },
+ mStrict() {
+ 'use strict';
+ assertEquals(undefined, super[x]);
+ assertEquals(undefined, this[x]);
+ super[x] = 10;
+ assertEquals(10, this[x]);
+ assertEquals(undefined, super[x]);
+ }
+ };
var d = new Derived();
d.mSloppy();
assertEquals(10, d.x);
@@ -904,23 +936,24 @@
var x = 42;
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);
+ Derived.prototype = {
+ __proto__: Base.prototype,
+ mSloppy() {
+ assertEquals(undefined, super[x]);
+ assertEquals(undefined, this[x]);
+ super[x] = 10;
+ assertEquals(10, this[x]);
+ assertEquals(undefined, super[x]);
+ },
+ mStrict() {
+ 'use strict';
+ assertEquals(undefined, super[x]);
+ assertEquals(undefined, this[x]);
+ super[x] = 10;
+ assertEquals(10, this[x]);
+ assertEquals(undefined, super[x]);
+ }
+ };
var d = new Derived();
d.mSloppy();
assertEquals(10, d[x]);
@@ -930,53 +963,180 @@
}());
-(function TestSetterCreatingOwnProperties() {
+(function TestSetterCreatingOwnPropertiesReconfigurable() {
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 {
+ 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;
- } 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);
+ 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 = {
+ __proto__: Base.prototype,
+ mSloppy() {
+ 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'));
+
+ assertEquals(15, this.ownReadonlyAccessor);
+ super.ownReadonlyAccessor = 25;
+ assertEquals(15, this.ownReadonlyAccessor);
+ var descr = Object.getOwnPropertyDescriptor(this, 'ownReadonlyAccessor');
+ assertFalse(descr.configurable);
+ assertFalse(descr.enumerable);
+ assertFalse(Base.prototype.hasOwnProperty('ownReadonlyAccessor'));
+
+ super.ownSetter = 35;
+ var descr = Object.getOwnPropertyDescriptor(this, 'ownSetter');
+ assertFalse(descr.configurable);
+ assertFalse(descr.enumerable);
+ assertFalse(Base.prototype.hasOwnProperty('ownSetter'));
+ },
+ mStrict() {
+ 'use strict';
+ var ex;
+ assertEquals(42, this.ownReadOnly);
+ try {
+ 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);
+
+ ex = null;
+ assertEquals(15, this.ownReadonlyAccessor);
+ try {
+ super.ownReadonlyAccessor = 25;
+ } catch (e) {
+ ex = e;
+ }
+ assertInstanceof(ex, TypeError);
+ assertEquals('Cannot redefine property: ownReadonlyAccessor', ex.message);
+ assertEquals(15, this.ownReadonlyAccessor);
+
+ 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();
@@ -1006,156 +1166,233 @@
Derived.prototype = {
__proto__: Base.prototype,
constructor: Derived,
+ testIter() {
+ setCalled = 0;
+ getCalled = 0;
+ for (super.x in [1,2,3]) {}
+ assertEquals(0, getCalled);
+ assertEquals(3, setCalled);
+ assertEquals(["0", "1", "2"], this.x_);
+ },
+ testIterKeyed() {
+ setCalled = 0;
+ getCalled = 0;
+ for (super[x] in [1,2,3]) {}
+ assertEquals(0, getCalled);
+ assertEquals(3, setCalled);
+ assertEquals(["0","1","2"], this.x_);
+
+ this.x_ = [];
+ setCalled = 0;
+ getCalled = 0;
+ var toStringCalled = 0;
+ var o = {toString: function () { toStringCalled++; return x }};
+ for (super[o] in [1,2,3]) {}
+ assertEquals(0, getCalled);
+ assertEquals(3, setCalled);
+ assertEquals(3, toStringCalled);
+ assertEquals(["0","1","2"], this.x_);
+ }
};
- Derived.prototype.testIter = function() {
- setCalled = 0;
- getCalled = 0;
- for (super.x in [1,2,3]) {}
- assertEquals(0, getCalled);
- assertEquals(3, setCalled);
- assertEquals(["0","1","2"], this.x_);
- }.toMethod(Derived.prototype);
-
new Derived().testIter();
var x = 'x';
- Derived.prototype.testIterKeyed = function() {
- setCalled = 0;
- getCalled = 0;
- for (super[x] in [1,2,3]) {}
- assertEquals(0, getCalled);
- assertEquals(3, setCalled);
- assertEquals(["0","1","2"], this.x_);
-
- this.x_ = [];
- setCalled = 0;
- getCalled = 0;
- var toStringCalled = 0;
- var o = {toString: function () { toStringCalled++; return x }};
- for (super[o] in [1,2,3]) {}
- assertEquals(0, getCalled);
- assertEquals(3, setCalled);
- assertEquals(3, toStringCalled);
- assertEquals(["0","1","2"], this.x_);
- }.toMethod(Derived.prototype);
new Derived().testIterKeyed();
}());
-(function TestKeyedSetterCreatingOwnProperties() {
- var ownReadOnly = 'ownReadOnly';
- var ownReadonlyAccessor = 'ownReadonlyAccessor';
- var ownSetter = 'ownSetter';
+function TestKeyedSetterCreatingOwnPropertiesReconfigurable(ownReadOnly,
+ ownReadonlyAccessor, ownSetter) {
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 {
+ Derived.prototype = {
+ __proto__: Base.prototype,
+ mSloppy() {
+ assertEquals(42, this[ownReadOnly]);
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);
+ 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 });
- 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();
-}());
+}
+TestKeyedSetterCreatingOwnPropertiesReconfigurable('ownReadOnly',
+ 'ownReadonlyAccessor',
+ 'ownSetter');
+TestKeyedSetterCreatingOwnPropertiesReconfigurable(42, 43, 44);
-(function TestKeyedNumericSetterCreatingOwnProperties() {
- var ownReadOnly = 42;
- var ownReadonlyAccessor = 43;
- var ownSetter = 44;
+function TestKeyedSetterCreatingOwnPropertiesNonConfigurable(
+ ownReadOnly, ownReadonlyAccessor, ownSetter) {
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 {
+ Derived.prototype = {
+ __proto__: Base.prototype,
+ mSloppy() {
+ assertEquals(42, this[ownReadOnly]);
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);
+ 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));
+
+ assertEquals(15, this[ownReadonlyAccessor]);
+ super[ownReadonlyAccessor] = 25;
+ assertEquals(15, this[ownReadonlyAccessor]);
+ var descr = Object.getOwnPropertyDescriptor(this, ownReadonlyAccessor);
+ assertFalse(descr.configurable);
+ assertFalse(descr.enumerable);
+ assertFalse(Base.prototype.hasOwnProperty(ownReadonlyAccessor));
+
+ super[ownSetter] = 35;
+ var descr = Object.getOwnPropertyDescriptor(this, ownSetter);
+ assertFalse(descr.configurable);
+ assertFalse(descr.enumerable);
+ assertFalse(Base.prototype.hasOwnProperty(ownSetter));
+ },
+ mStrict() {
+ 'use strict';
+ var ex;
+ assertEquals(42, this[ownReadOnly]);
+ try {
+ 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]);
+
+ ex = null;
+ assertEquals(15, this[ownReadonlyAccessor]);
+ try {
+ super[ownReadonlyAccessor] = 25;
+ } catch (e) {
+ ex = e;
+ }
+ assertInstanceof(ex, TypeError);
+ assertEquals('Cannot redefine property: ' + ownReadonlyAccessor,
+ ex.message);
+ assertEquals(15, this[ownReadonlyAccessor]);
+
+ 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();
d.mStrict();
-}());
+}
+TestKeyedSetterCreatingOwnPropertiesNonConfigurable('ownReadOnly',
+ 'ownReadonlyAccessor', 'ownSetter');
+TestKeyedSetterCreatingOwnPropertiesNonConfigurable(42, 43, 44);
(function TestSetterNoProtoWalk() {
@@ -1164,62 +1401,58 @@
var getCalled;
var setCalled;
Derived.prototype = {
- __proto__ : Base.prototype,
+ __proto__: Base.prototype,
get x() { getCalled++; return 42; },
- set x(v) { setCalled++; }
+ set x(v) { setCalled++; },
+ mSloppy() {
+ 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);
+ },
+ mStrict() {
+ '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);
+ }
};
- 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();
}());
@@ -1232,62 +1465,58 @@
var getCalled;
var setCalled;
Derived.prototype = {
- __proto__ : Base.prototype,
+ __proto__: Base.prototype,
get x() { getCalled++; return 42; },
- set x(v) { setCalled++; }
+ set x(v) { setCalled++; },
+ mSloppy() {
+ 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);
+ },
+ mStrict() {
+ '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);
+ }
};
- 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();
}());
@@ -1300,7 +1529,54 @@
var getCalled;
var setCalled;
Derived.prototype = {
- __proto__ : Base.prototype,
+ __proto__: Base.prototype,
+ mSloppy() {
+ 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);
+ },
+ mStrict() {
+ '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);
+ }
};
Object.defineProperty(Derived.prototype, x, {
@@ -1308,57 +1584,6 @@
set: function(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();
}());
@@ -1367,35 +1592,36 @@
(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);
+ Derived.prototype = {
+ __proto__: Derived.prototype,
+ mStrict(){
+ '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);
+ },
+ mSloppy(){
+ 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);
+ }
+ };
var d = new Derived();
Object.defineProperty(d, 'nonEnumConfig',
@@ -1413,36 +1639,36 @@
function Base() {}
function Derived() {}
- Derived.prototype = { __proto__: Base.prototype };
-
- 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);
+ Derived.prototype = {
+ __proto__: Base.prototype,
+ mStrict(){
+ '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);
+ },
+ mSloppy(){
+ 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);
+ }
+ };
var d = new Derived();
Object.defineProperty(d, nonEnumConfig,
@@ -1460,36 +1686,36 @@
function Base() {}
function Derived() {}
- Derived.prototype = { __proto__: Base.prototype };
-
- 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);
+ Derived.prototype = {
+ __proto__: Base.prototype,
+ mStrict(){
+ '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);
+ },
+ mSloppy(){
+ 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);
+ }
+ };
var d = new Derived();
Object.defineProperty(d, nonEnumConfig,
@@ -1519,32 +1745,31 @@
Derived.prototype = {
__proto__: Base.prototype,
constructor: Derived,
- _x: 2
+ _x: 2,
+ testCounts() {
+ assertEquals(2, this._x);
+ assertEquals(2, super.x);
+ super.x++;
+ assertEquals(3, super.x);
+ ++super.x;
+ assertEquals(4, super.x);
+ assertEquals(4, super.x++);
+ assertEquals(5, super.x);
+ assertEquals(6, ++super.x);
+ assertEquals(6, super.x);
+ assertEquals(6, this._x);
+
+ super.x--;
+ assertEquals(5, super.x);
+ --super.x;
+ assertEquals(4, super.x);
+ assertEquals(4, super.x--);
+ assertEquals(3, super.x);
+ assertEquals(2, --super.x);
+ assertEquals(2, super.x);
+ assertEquals(2, this._x);
+ }
};
-
- Derived.prototype.testCounts = function() {
- assertEquals(2, this._x);
- assertEquals(2, super.x);
- super.x++;
- assertEquals(3, super.x);
- ++super.x;
- assertEquals(4, super.x);
- assertEquals(4, super.x++);
- assertEquals(5, super.x);
- assertEquals(6, ++super.x);
- assertEquals(6, super.x);
- assertEquals(6, this._x);
-
- super.x--;
- assertEquals(5, super.x);
- --super.x;
- assertEquals(4, super.x);
- assertEquals(4, super.x--);
- assertEquals(3, super.x);
- assertEquals(2, --super.x);
- assertEquals(2, super.x);
- assertEquals(2, this._x);
- }.toMethod(Derived.prototype);
new Derived().testCounts();
}());
@@ -1568,32 +1793,31 @@
Derived.prototype = {
__proto__: Base.prototype,
constructor: Derived,
- _x: 2
+ _x: 2,
+ testCounts() {
+ assertEquals(2, this._x);
+ assertEquals(2, super[x]);
+ super[x]++;
+ assertEquals(3, super[x]);
+ ++super[x];
+ assertEquals(4, super[x]);
+ assertEquals(4, super[x]++);
+ assertEquals(5, super[x]);
+ assertEquals(6, ++super[x]);
+ assertEquals(6, super[x]);
+ assertEquals(6, this._x);
+
+ super[x]--;
+ assertEquals(5, super[x]);
+ --super[x];
+ assertEquals(4, super[x]);
+ assertEquals(4, super[x]--);
+ assertEquals(3, super[x]);
+ assertEquals(2, --super[x]);
+ assertEquals(2, super[x]);
+ assertEquals(2, this._x);
+ }
};
-
- Derived.prototype.testCounts = function() {
- assertEquals(2, this._x);
- assertEquals(2, super[x]);
- super[x]++;
- assertEquals(3, super[x]);
- ++super[x];
- assertEquals(4, super[x]);
- assertEquals(4, super[x]++);
- assertEquals(5, super[x]);
- assertEquals(6, ++super[x]);
- assertEquals(6, super[x]);
- assertEquals(6, this._x);
-
- super[x]--;
- assertEquals(5, super[x]);
- --super[x];
- assertEquals(4, super[x]);
- assertEquals(4, super[x]--);
- assertEquals(3, super[x]);
- assertEquals(2, --super[x]);
- assertEquals(2, super[x]);
- assertEquals(2, this._x);
- }.toMethod(Derived.prototype);
new Derived().testCounts();
}());
@@ -1616,32 +1840,31 @@
Derived.prototype = {
__proto__: Base.prototype,
constructor: Derived,
- _x: 2
+ _x: 2,
+ testCounts() {
+ assertEquals(2, this._x);
+ assertEquals(2, super[x]);
+ super[x]++;
+ assertEquals(3, super[x]);
+ ++super[x];
+ assertEquals(4, super[x]);
+ assertEquals(4, super[x]++);
+ assertEquals(5, super[x]);
+ assertEquals(6, ++super[x]);
+ assertEquals(6, super[x]);
+ assertEquals(6, this._x);
+
+ super[x]--;
+ assertEquals(5, super[x]);
+ --super[x];
+ assertEquals(4, super[x]);
+ assertEquals(4, super[x]--);
+ assertEquals(3, super[x]);
+ assertEquals(2, --super[x]);
+ assertEquals(2, super[x]);
+ assertEquals(2, this._x);
+ }
};
-
- Derived.prototype.testCounts = function() {
- assertEquals(2, this._x);
- assertEquals(2, super[x]);
- super[x]++;
- assertEquals(3, super[x]);
- ++super[x];
- assertEquals(4, super[x]);
- assertEquals(4, super[x]++);
- assertEquals(5, super[x]);
- assertEquals(6, ++super[x]);
- assertEquals(6, super[x]);
- assertEquals(6, this._x);
-
- super[x]--;
- assertEquals(5, super[x]);
- --super[x];
- assertEquals(4, super[x]);
- assertEquals(4, super[x]--);
- assertEquals(3, super[x]);
- assertEquals(2, --super[x]);
- assertEquals(2, super[x]);
- assertEquals(2, this._x);
- }.toMethod(Derived.prototype);
new Derived().testCounts();
}());
@@ -1650,26 +1873,27 @@
function Base() {}
Object.defineProperty(Base.prototype, 'x', { value : 27, writable: false });
function Derived() {}
-
- Derived.prototype = { __proto__: Base.prototype, constructor: Derived };
-
- Derived.prototype.mSloppy = function() {
- assertEquals(27, super.x);
- assertEquals(27, this.x);
- super.x = 10;
- assertEquals(27, super.x);
- assertEquals(27, this.x);
- }.toMethod(Derived.prototype);
- Derived.prototype.mStrict = function() {
- 'use strict';
- assertEquals(27, super.x);
- assertEquals(27, this.x);
- var ex = null;
- try { super.x = 10; } catch(e) { ex = e; }
- assertTrue(ex instanceof TypeError);
- assertEquals(27, super.x);
- assertEquals(27, this.x);
- }.toMethod(Derived.prototype);
+ Derived.prototype = {
+ __proto__: Base.prototype,
+ constructor: Derived,
+ mSloppy() {
+ assertEquals(27, super.x);
+ assertEquals(27, this.x);
+ super.x = 10;
+ assertEquals(27, super.x);
+ assertEquals(27, this.x);
+ },
+ mStrict() {
+ 'use strict';
+ assertEquals(27, super.x);
+ assertEquals(27, this.x);
+ var ex = null;
+ try { super.x = 10; } catch(e) { ex = e; }
+ assertInstanceof(ex, TypeError);
+ assertEquals(27, super.x);
+ assertEquals(27, this.x);
+ }
+ };
new Derived().mSloppy();
new Derived().mStrict();
}());
@@ -1681,25 +1905,27 @@
Object.defineProperty(Base.prototype, x, { value : 27, writable: false });
function Derived() {}
- Derived.prototype = { __proto__: Base.prototype, constructor: Derived };
-
- Derived.prototype.mSloppy = function() {
- assertEquals(27, super[x]);
- assertEquals(27, this[x]);
- super[x] = 10;
- assertEquals(27, super[x]);
- assertEquals(27, this[x]);
- }.toMethod(Derived.prototype);
- Derived.prototype.mStrict = function() {
- 'use strict';
- assertEquals(27, super[x]);
- assertEquals(27, this[x]);
- var ex = null;
- try { super[x] = 10; } catch(e) { ex = e; }
- assertTrue(ex instanceof TypeError);
- assertEquals(27, super[x]);
- assertEquals(27, this[x]);
- }.toMethod(Derived.prototype);
+ Derived.prototype = {
+ __proto__: Base.prototype,
+ constructor: Derived,
+ mSloppy() {
+ assertEquals(27, super[x]);
+ assertEquals(27, this[x]);
+ super[x] = 10;
+ assertEquals(27, super[x]);
+ assertEquals(27, this[x]);
+ },
+ mStrict() {
+ 'use strict';
+ assertEquals(27, super[x]);
+ assertEquals(27, this[x]);
+ var ex = null;
+ try { super[x] = 10; } catch(e) { ex = e; }
+ assertInstanceof(ex, TypeError);
+ assertEquals(27, super[x]);
+ assertEquals(27, this[x]);
+ }
+ };
new Derived().mSloppy();
new Derived().mStrict();
}());
@@ -1711,55 +1937,51 @@
Object.defineProperty(Base.prototype, x, { value : 27, writable: false });
function Derived() {}
- Derived.prototype = { __proto__: Base.prototype, constructor: Derived };
-
- Derived.prototype.mSloppy = function() {
- assertEquals(27, super[x]);
- assertEquals(27, this[x]);
- super[x] = 10;
- assertEquals(27, super[x]);
- assertEquals(27, this[x]);
- }.toMethod(Derived.prototype);
- Derived.prototype.mStrict = function() {
- 'use strict';
- assertEquals(27, super[x]);
- assertEquals(27, this[x]);
- var ex = null;
- try { super[x] = 10; } catch(e) { ex = e; }
- assertTrue(ex instanceof TypeError);
- assertEquals(27, super[x]);
- assertEquals(27, this[x]);
- }.toMethod(Derived.prototype);
+ Derived.prototype = {
+ __proto__: Base.prototype,
+ constructor: Derived,
+ mSloppy() {
+ assertEquals(27, super[x]);
+ assertEquals(27, this[x]);
+ super[x] = 10;
+ assertEquals(27, super[x]);
+ assertEquals(27, this[x]);
+ },
+ mStrict() {
+ 'use strict';
+ assertEquals(27, super[x]);
+ assertEquals(27, this[x]);
+ var ex = null;
+ try { super[x] = 10; } catch(e) { ex = e; }
+ assertInstanceof(ex, TypeError);
+ assertEquals(27, super[x]);
+ assertEquals(27, this[x]);
+ }
+ };
new Derived().mSloppy();
new Derived().mStrict();
}());
-function Subclass(base, constructor) {
- var homeObject = {
- __proto__: base.prototype,
- constructor: constructor
- };
- constructor.__proto__ = base;
- constructor.prototype = homeObject;
- // not doing toMethod: home object is not required for
- // super constructor calls.
- return constructor;
-}
-
(function TestSuperCall() {
+ 'use strict';
+
var baseCalled = 0;
var derivedCalled = 0;
var derivedDerivedCalled = 0;
- function Base() {
- baseCalled++;
+ class Base {
+ constructor() {
+ baseCalled++;
+ }
}
- var Derived = Subclass(Base, function () {
- super();
- derivedCalled++;
- });
+ class Derived extends Base {
+ constructor() {
+ super();
+ derivedCalled++;
+ }
+ }
assertEquals(Base, Base.prototype.constructor);
assertEquals(Base.prototype, Derived.prototype.__proto__);
@@ -1770,10 +1992,12 @@ function Subclass(base, constructor) {
assertEquals(1, baseCalled);
assertEquals(1, derivedCalled);
- var DerivedDerived = Subclass(Derived, function () {
- super();
- derivedDerivedCalled++;
- });
+ class DerivedDerived extends Derived {
+ constructor() {
+ super();
+ derivedDerivedCalled++;
+ }
+ }
baseCalled = 0;
derivedCalled = 0;
@@ -1783,32 +2007,33 @@ function Subclass(base, constructor) {
assertEquals(1, derivedCalled);
assertEquals(1, derivedDerivedCalled);
- function Base2(v) {
- this.fromBase = v;
+ class Base2 {
+ constructor(v) {
+ this.fromBase = v;
+ }
+ }
+ class Derived2 extends Base2 {
+ constructor(v1, v2) {
+ super(v1);
+ this.fromDerived = v2;
+ }
}
- var Derived2 = Subclass(Base2, function (v1, v2) {
- super(v1);
- this.fromDerived = v2;
- });
var d = new Derived2("base", "derived");
assertEquals("base", d.fromBase);
assertEquals("derived", d.fromDerived);
- function ImplicitSubclassOfFunction() {
- super();
- this.x = 123;
- }
-
- var o = new ImplicitSubclassOfFunction();
- assertEquals(123, o.x);
-
var calls = 0;
- function G() {
- calls++;
+ class G {
+ constructor() {
+ calls++;
+ }
}
- function F() {
- super();
+
+ class F extends Object {
+ constructor() {
+ super();
+ }
}
F.__proto__ = G;
new F();
@@ -1819,103 +2044,23 @@ function Subclass(base, constructor) {
}());
-(function TestNewSuper() {
- var baseCalled = 0;
- var derivedCalled = 0;
-
- function Base() {
- baseCalled++;
- this.x = 15;
- }
-
-
- var Derived = Subclass(Base, function() {
- baseCalled = 0;
- var b = new super();
- assertEquals(1, baseCalled)
- assertEquals(Base.prototype, b.__proto__);
- assertEquals(15, b.x);
- assertEquals(undefined, this.x);
- derivedCalled++;
- });
+(function TestExtendsObject() {
+ 'use strict';
+ class F extends Object { }
+ var f = new F(42);
- derivedCalled = 0;
- new Derived();
- assertEquals(1, derivedCalled);
+ // TODO(dslomov,arv): Fix this. BUG=v8:3886.
+ assertInstanceof(f, Number);
}());
-
(function TestSuperCallErrorCases() {
- function T() {
- super();
+ 'use strict';
+ class T extends Object {
+ constructor() {
+ super();
+ }
}
+
T.__proto__ = null;
- // Spec says ReferenceError here, but for other IsCallable failures
- // we throw TypeError.
- // Filed https://bugs.ecmascript.org/show_bug.cgi?id=3282
assertThrows(function() { new T(); }, TypeError);
-
- function T1() {
- var b = new super();
- }
- T1.__proto = null;
- assertThrows(function() { new T1(); }, TypeError);
-}());
-
-
-(function TestSuperCallSyntacticRestriction() {
- assertThrows(function() {
- function C() {
- var y;
- super();
- }
- new C();
- }, TypeError);
- assertThrows(function() {
- function C() {
- super(this.x);
- }
- new C();
- }, TypeError);
- assertThrows(function() {
- function C() {
- super(this);
- }
- new C();
- }, TypeError);
- assertThrows(function() {
- function C() {
- super(1, 2, Object.getPrototypeOf(this));
- }
- new C();
- }, TypeError);
- assertThrows(function() {
- function C() {
- { super(1, 2); }
- }; new C();
- }, TypeError);
- assertThrows(function() {
- function C() {
- if (1) super();
- }; new C();
- }, TypeError);
-
- function C1() {
- 'use strict';
- super();
- };
- new C1();
-
- function C2() {
- ; 'use strict';;;;;
- super();
- };
- new C2();
-
- function C3() {
- ; 'use strict';;;;;
- // This is a comment.
- super();
- }
- new C3();
}());