| Index: test/mjsunit/harmony/super.js
|
| diff --git a/test/mjsunit/harmony/super.js b/test/mjsunit/harmony/super.js
|
| deleted file mode 100644
|
| index 651f3dca3f2da6617ad774815d61b9cc941d4a90..0000000000000000000000000000000000000000
|
| --- a/test/mjsunit/harmony/super.js
|
| +++ /dev/null
|
| @@ -1,2259 +0,0 @@
|
| -// 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: --allow-natives-syntax
|
| -// Flags: --harmony-spread-calls --harmony-destructuring
|
| -// Flags: --harmony-rest-parameters --harmony-sloppy
|
| -
|
| -(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 = {
|
| - __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());
|
| -}());
|
| -
|
| -
|
| -(function TestSuperKeyedLoads() {
|
| - 'use strict';
|
| -
|
| - var x = 'x';
|
| - var derivedDataProperty = 'derivedDataProperty';
|
| - var f = 'f';
|
| -
|
| - class Base {
|
| - f() {
|
| - return "Base " + this.toString();
|
| - }
|
| - toString() {
|
| - return "this is Base";
|
| - }
|
| - }
|
| -
|
| - Base.prototype[x] = 15;
|
| -
|
| - 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());
|
| -}());
|
| -
|
| -
|
| -(function TestSuperKeywordNonMethod() {
|
| - 'use strict';
|
| -
|
| - class C {
|
| - f() {
|
| - super.unknown();
|
| - }
|
| - }
|
| -
|
| - assertThrows(function() {
|
| - new C().f();
|
| - }, TypeError);
|
| -}());
|
| -
|
| -
|
| -(function TestGetter() {
|
| - function Base() {}
|
| - var derived;
|
| - Base.prototype = {
|
| - constructor: Base,
|
| - get x() {
|
| - assertSame(this, derived);
|
| - return this._x;
|
| - },
|
| - _x: 'base'
|
| - };
|
| -
|
| - function Derived() {}
|
| - Derived.__proto__ = Base;
|
| - Derived.prototype = {
|
| - __proto__: Base.prototype,
|
| - constructor: Derived,
|
| - _x: 'derived',
|
| - testGetter() {
|
| - return super.x;
|
| - },
|
| - testGetterStrict() {
|
| - 'use strict';
|
| - return super.x;
|
| - }
|
| - };
|
| -
|
| - derived = new Derived();
|
| - assertEquals('derived', derived.testGetter());
|
| - derived = new Derived();
|
| - assertEquals('derived', derived.testGetterStrict());
|
| -}());
|
| -
|
| -
|
| -(function TestGetterKeyed() {
|
| - var x = 'x';
|
| - function Base() {}
|
| - var derived;
|
| - Base.prototype = {
|
| - constructor: Base,
|
| - get x() {
|
| - assertSame(this, derived);
|
| - return this._x;
|
| - },
|
| - _x: 'base'
|
| - };
|
| -
|
| - function Derived() {}
|
| - Derived.__proto__ = Base;
|
| - Derived.prototype = {
|
| - __proto__: Base.prototype,
|
| - constructor: 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 = new Derived();
|
| - assertEquals('derived', derived.testGetter());
|
| - derived = new Derived();
|
| - assertEquals('derived', derived.testGetterStrict());
|
| - derived = new Derived();
|
| - derived.testGetterWithToString();
|
| -}());
|
| -
|
| -
|
| -(function TestGetterNumericKeyed() {
|
| - var x = 42;
|
| - function Base() {}
|
| - var derived;
|
| - Base.prototype = {
|
| - constructor: Base,
|
| - _x: 'base'
|
| - };
|
| -
|
| - Object.defineProperty(Base.prototype, x, { get: function() {
|
| - assertSame(this, derived);
|
| - return this._x;
|
| - }});
|
| -
|
| - function Derived() {}
|
| - Derived.__proto__ = Base;
|
| - Derived.prototype = {
|
| - __proto__: Base.prototype,
|
| - constructor: 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 = new Derived();
|
| - assertEquals('derived', derived.testGetter());
|
| - derived = new Derived();
|
| - assertEquals('derived', derived.testGetterStrict());
|
| - derived = new Derived();
|
| - derived.testGetterWithToString();
|
| -}());
|
| -
|
| -
|
| -(function TestSetter() {
|
| - function Base() {}
|
| - Base.prototype = {
|
| - constructor: Base,
|
| - get x() {
|
| - return this._x;
|
| - },
|
| - set x(v) {
|
| - this._x = v;
|
| - },
|
| - _x: 'base'
|
| - };
|
| -
|
| - function Derived() {}
|
| - Derived.__proto__ = Base;
|
| - Derived.prototype = {
|
| - __proto__: Base.prototype,
|
| - constructor: 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');
|
| - }
|
| - };
|
| -
|
| - var d = new Derived();
|
| - d.testSetter();
|
| - assertEquals('base', Base.prototype._x);
|
| - assertEquals('foobarabc', d._x);
|
| - d._x = '';
|
| -
|
| - d.testSetterStrict();
|
| - assertEquals('base', Base.prototype._x);
|
| - assertEquals('foobarabc', d._x);
|
| -}());
|
| -
|
| -
|
| -(function TestSetterNumericKeyed() {
|
| - var x = 42;
|
| - function Base() {}
|
| - Base.prototype = {
|
| - constructor: Base,
|
| - _x: 'base'
|
| - };
|
| -
|
| - Object.defineProperty(Base.prototype, x,
|
| - { get: function() { return this._x; },
|
| - set: function(v) { this._x = v; }
|
| - });
|
| -
|
| - function Derived() {}
|
| - Derived.__proto__ = Base;
|
| - Derived.prototype = {
|
| - __proto__: Base.prototype,
|
| - constructor: 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 d = new Derived();
|
| - d.testSetter();
|
| - assertEquals('base', Base.prototype._x);
|
| - assertEquals('foobarabc', d._x);
|
| - d._x = '';
|
| -
|
| - d.testSetterStrict();
|
| - assertEquals('base', Base.prototype._x);
|
| - assertEquals('foobarabc', d._x);
|
| -
|
| - d = new Derived();
|
| - d.testSetterWithToString();
|
| -}());
|
| -
|
| -
|
| -(function TestSetterKeyed() {
|
| - var x = 'x';
|
| - function Base() {}
|
| - Base.prototype = {
|
| - constructor: Base,
|
| - get x() {
|
| - return this._x;
|
| - },
|
| - set x(v) {
|
| - this._x = v;
|
| - },
|
| - _x: 'base'
|
| - };
|
| -
|
| - function Derived() {}
|
| - Derived.__proto__ = Base;
|
| - Derived.prototype = {
|
| - __proto__: Base.prototype,
|
| - constructor: 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);
|
| - }
|
| - };
|
| -
|
| - var d = new Derived();
|
| - d.testSetter();
|
| - assertEquals('base', Base.prototype._x);
|
| - assertEquals('foobarabc', d._x);
|
| - d._x = '';
|
| - d.testSetterStrict();
|
| - assertEquals('base', Base.prototype._x);
|
| - assertEquals('foobarabc', d._x);
|
| -
|
| - d = new Derived();
|
| - d.testSetterWithToString();
|
| -}());
|
| -
|
| -
|
| -(function TestSetterDataProperties() {
|
| - function Base() {}
|
| - Base.prototype = {
|
| - constructor: Base,
|
| - x: 'x from Base'
|
| - };
|
| -
|
| - function Derived() {}
|
| - 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);
|
| - }
|
| - };
|
| -
|
| - new Derived().testSetter();
|
| -}());
|
| -
|
| -
|
| -(function TestKeyedSetterDataProperties() {
|
| - var x = 'x';
|
| - function Base() {}
|
| - Base.prototype = {
|
| - constructor: Base,
|
| - x: 'x from Base'
|
| - };
|
| -
|
| - function Derived() {}
|
| - 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]);
|
| - }
|
| - };
|
| -
|
| - new Derived().testSetter();
|
| -}());
|
| -
|
| -
|
| -(function TestKeyedNumericSetterDataProperties() {
|
| - var x = 42;
|
| - function Base() {}
|
| - Base.prototype = {
|
| - constructor: Base,
|
| - 42: 'x from Base'
|
| - };
|
| -
|
| - function Derived() {}
|
| - 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]);
|
| - }
|
| - };
|
| -
|
| - new Derived().testSetter();
|
| -}());
|
| -
|
| -
|
| -(function TestAccessorsOnPrimitives() {
|
| - var getCalled = 0;
|
| - var setCalled = 0;
|
| - function Base() {}
|
| - Base.prototype = {
|
| - constructor: Base,
|
| - get x() {
|
| - getCalled++;
|
| - return 1;
|
| - },
|
| - set x(v) {
|
| - setCalled++;
|
| - return v;
|
| - },
|
| - };
|
| -
|
| - function Derived() {}
|
| - Derived.prototype = {
|
| - __proto__: Base.prototype,
|
| - constructor: Derived,
|
| - 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;
|
| - 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 = {
|
| - __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);
|
| -}());
|
| -
|
| -
|
| -(function TestKeyedAccessorsOnPrimitives() {
|
| - var x = 'x';
|
| - var newProperty = 'newProperty';
|
| - var toString = 'toString';
|
| - var getCalled = 0;
|
| - var setCalled = 0;
|
| - function Base() {}
|
| - Base.prototype = {
|
| - constructor: Base,
|
| - get x() {
|
| - getCalled++;
|
| - return 1;
|
| - },
|
| - set x(v) {
|
| - setCalled++;
|
| - return v;
|
| - },
|
| - };
|
| -
|
| - function Derived() {}
|
| - Derived.prototype = {
|
| - __proto__: Base.prototype,
|
| - constructor: Derived,
|
| - 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;
|
| - 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 = {
|
| - __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);
|
| -}());
|
| -
|
| -
|
| -(function TestNumericKeyedAccessorsOnPrimitives() {
|
| - var x = 42;
|
| - var newProperty = 43;
|
| - var getCalled = 0;
|
| - var setCalled = 0;
|
| - function Base() {}
|
| - Base.prototype = {
|
| - constructor: Base,
|
| - };
|
| -
|
| - Object.defineProperty(Base.prototype, x, {
|
| - get: function() {
|
| - getCalled++;
|
| - return 1;
|
| - },
|
| - set: function(v) {
|
| - setCalled++;
|
| - return v;
|
| - }
|
| - });
|
| -
|
| - function Derived() {}
|
| - Derived.prototype = {
|
| - __proto__: Base.prototype,
|
| - constructor: Derived,
|
| - 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;
|
| - 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 TestKeyedNumericSetterOnExotics() {
|
| - function Base() {}
|
| - function Derived() {}
|
| - 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);
|
| - Derived.prototype.callSetterOnArray.call(x);
|
| - assertEquals(43, x.length);
|
| - assertEquals(1, x[42]);
|
| -
|
| - var s = 'abcdef';
|
| - Derived.prototype.callStrictSetterOnString.call(s)
|
| -}());
|
| -
|
| -
|
| -(function TestSetterUndefinedProperties() {
|
| - function Base() {}
|
| - function Derived() {}
|
| - 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);
|
| - var d1 = new Derived();
|
| - d1.mStrict();
|
| - assertEquals(10, d.x);
|
| -}());
|
| -
|
| -
|
| -(function TestKeyedSetterUndefinedProperties() {
|
| - var x = 'x';
|
| - function Base() {}
|
| - function Derived() {}
|
| - 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);
|
| - var d1 = new Derived();
|
| - d1.mStrict();
|
| - assertEquals(10, d.x);
|
| -}());
|
| -
|
| -
|
| -(function TestKeyedNumericSetterUndefinedProperties() {
|
| - var x = 42;
|
| - function Base() {}
|
| - function Derived() {}
|
| - 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]);
|
| - var d1 = new Derived();
|
| - d1.mStrict();
|
| - assertEquals(10, d[x]);
|
| -}());
|
| -
|
| -
|
| -(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 = {
|
| - __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 object '#<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() { assertUnreachable(); } });
|
| - Object.defineProperty(d, 'ownReadonlyAccessor',
|
| - { get : function() { return 15; }});
|
| - d.mSloppy();
|
| - d.mStrict();
|
| -}());
|
| -
|
| -
|
| -(function TestSetterInForIn() {
|
| - var setCalled = 0;
|
| - var getCalled = 0;
|
| - function Base() {}
|
| - Base.prototype = {
|
| - constructor: Base,
|
| - get x() {
|
| - getCalled++;
|
| - return 1;
|
| - },
|
| - set x(v) {
|
| - setCalled++;
|
| - this.x_.push(v);
|
| - },
|
| - };
|
| -
|
| - function Derived() {
|
| - this.x_ = [];
|
| - }
|
| - 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_);
|
| - }
|
| - };
|
| -
|
| - new Derived().testIter();
|
| -
|
| - var x = 'x';
|
| -
|
| - new Derived().testIterKeyed();
|
| -}());
|
| -
|
| -
|
| -function TestKeyedSetterCreatingOwnPropertiesReconfigurable(ownReadOnly,
|
| - ownReadonlyAccessor, 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();
|
| -}
|
| -TestKeyedSetterCreatingOwnPropertiesReconfigurable('ownReadOnly',
|
| - 'ownReadonlyAccessor',
|
| - 'ownSetter');
|
| -TestKeyedSetterCreatingOwnPropertiesReconfigurable(42, 43, 44);
|
| -
|
| -
|
| -function TestKeyedSetterCreatingOwnPropertiesNonConfigurable(
|
| - ownReadOnly, ownReadonlyAccessor, ownSetter) {
|
| - 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 object '#<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() { assertUnreachable(); } });
|
| - Object.defineProperty(d, ownReadonlyAccessor,
|
| - { get : function() { return 15; }});
|
| - d.mSloppy();
|
| - d.mStrict();
|
| -}
|
| -TestKeyedSetterCreatingOwnPropertiesNonConfigurable('ownReadOnly',
|
| - 'ownReadonlyAccessor', 'ownSetter');
|
| -TestKeyedSetterCreatingOwnPropertiesNonConfigurable(42, 43, 44);
|
| -
|
| -
|
| -(function TestSetterNoProtoWalk() {
|
| - function Base() {}
|
| - function Derived() {}
|
| - var getCalled;
|
| - var setCalled;
|
| - Derived.prototype = {
|
| - __proto__: Base.prototype,
|
| - get x() { getCalled++; return 42; },
|
| - 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);
|
| - }
|
| - };
|
| -
|
| - new Derived().mSloppy();
|
| - new Derived().mStrict();
|
| -}());
|
| -
|
| -
|
| -(function TestKeyedSetterNoProtoWalk() {
|
| - var x = 'x';
|
| - function Base() {}
|
| - function Derived() {}
|
| - var getCalled;
|
| - var setCalled;
|
| - Derived.prototype = {
|
| - __proto__: Base.prototype,
|
| - get x() { getCalled++; return 42; },
|
| - 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);
|
| - }
|
| - };
|
| -
|
| - new Derived().mSloppy();
|
| - new Derived().mStrict();
|
| -}());
|
| -
|
| -
|
| -(function TestKeyedNumericSetterNoProtoWalk() {
|
| - var x = 42;
|
| - function Base() {}
|
| - function Derived() {}
|
| - var getCalled;
|
| - var setCalled;
|
| - Derived.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, {
|
| - get: function() { getCalled++; return 42; },
|
| - set: function(v) { setCalled++; }
|
| - });
|
| -
|
| - new Derived().mSloppy();
|
| - new Derived().mStrict();
|
| -}());
|
| -
|
| -
|
| -(function TestSetterDoesNotReconfigure() {
|
| - function Base() {}
|
| - function Derived() {}
|
| - 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',
|
| - { value : 0, enumerable : false, configurable : true, writable : true });
|
| - Object.defineProperty(d, 'nonEnumNonConfig',
|
| - { value : 0, enumerable : false, configurable : false, writable : true });
|
| - d.mStrict();
|
| - d.mSloppy();
|
| -}());
|
| -
|
| -
|
| -(function TestKeyedSetterDoesNotReconfigure() {
|
| - var nonEnumConfig = 'nonEnumConfig';
|
| - var nonEnumNonConfig = 'nonEnumNonConfig';
|
| - function Base() {}
|
| - function Derived() {}
|
| -
|
| - 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,
|
| - { value : 0, enumerable : false, configurable : true, writable : true });
|
| - Object.defineProperty(d, nonEnumNonConfig,
|
| - { value : 0, enumerable : false, configurable : false, writable : true });
|
| - d.mStrict();
|
| - d.mSloppy();
|
| -}());
|
| -
|
| -
|
| -(function TestKeyedNumericSetterDoesNotReconfigure() {
|
| - var nonEnumConfig = 42;
|
| - var nonEnumNonConfig = 43;
|
| - function Base() {}
|
| - function Derived() {}
|
| -
|
| - 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,
|
| - { value : 0, enumerable : false, configurable : true, writable : true });
|
| - Object.defineProperty(d, nonEnumNonConfig,
|
| - { value : 0, enumerable : false, configurable : false, writable : true });
|
| - d.mStrict();
|
| - d.mSloppy();
|
| -}());
|
| -
|
| -
|
| -(function TestCountOperations() {
|
| - function Base() {}
|
| - Base.prototype = {
|
| - constructor: Base,
|
| - get x() {
|
| - return this._x;
|
| - },
|
| - set x(v) {
|
| - this._x = v;
|
| - },
|
| - _x: 1
|
| - };
|
| -
|
| - function Derived() {}
|
| - Derived.__proto__ = Base;
|
| - Derived.prototype = {
|
| - __proto__: Base.prototype,
|
| - constructor: Derived,
|
| - _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);
|
| - }
|
| - };
|
| - new Derived().testCounts();
|
| -}());
|
| -
|
| -
|
| -(function TestKeyedCountOperations() {
|
| - var x = 'x';
|
| - function Base() {}
|
| - Base.prototype = {
|
| - constructor: Base,
|
| - get x() {
|
| - return this._x;
|
| - },
|
| - set x(v) {
|
| - this._x = v;
|
| - },
|
| - _x: 1
|
| - };
|
| -
|
| - function Derived() {}
|
| - Derived.__proto__ = Base;
|
| - Derived.prototype = {
|
| - __proto__: Base.prototype,
|
| - constructor: Derived,
|
| - _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);
|
| - }
|
| - };
|
| - new Derived().testCounts();
|
| -}());
|
| -
|
| -
|
| -(function TestKeyedNumericCountOperations() {
|
| - var x = 42;
|
| - function Base() {}
|
| - Base.prototype = {
|
| - constructor: Base,
|
| - _x: 1
|
| - };
|
| -
|
| - Object.defineProperty(Base.prototype, x, {
|
| - get: function() { return this._x; },
|
| - set: function(v) { this._x = v;; }
|
| - });
|
| -
|
| - function Derived() {}
|
| - Derived.__proto__ = Base;
|
| - Derived.prototype = {
|
| - __proto__: Base.prototype,
|
| - constructor: Derived,
|
| - _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);
|
| - }
|
| - };
|
| - new Derived().testCounts();
|
| -}());
|
| -
|
| -
|
| -(function TestSetterSuperNonWritable() {
|
| - function Base() {}
|
| - Object.defineProperty(Base.prototype, 'x', { value : 27, writable: false });
|
| - function Derived() {}
|
| - 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 TestSetterKeyedSuperNonWritable() {
|
| - var x = 'xyz';
|
| - function Base() {}
|
| - Object.defineProperty(Base.prototype, x, { value : 27, writable: false });
|
| - function Derived() {}
|
| -
|
| - 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 TestSetterKeyedNumericSuperNonWritable() {
|
| - var x = 42;
|
| - function Base() {}
|
| - Object.defineProperty(Base.prototype, x, { value : 27, writable: false });
|
| - function Derived() {}
|
| -
|
| - 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 TestSuperCall() {
|
| - 'use strict';
|
| -
|
| - var baseCalled = 0;
|
| - var derivedCalled = 0;
|
| - var derivedDerivedCalled = 0;
|
| -
|
| - class Base {
|
| - constructor() {
|
| - baseCalled++;
|
| - }
|
| - }
|
| -
|
| - class Derived extends Base {
|
| - constructor() {
|
| - let r = super();
|
| - assertEquals(this, r);
|
| - derivedCalled++;
|
| - }
|
| - }
|
| -
|
| - assertEquals(Base, Base.prototype.constructor);
|
| - assertEquals(Base.prototype, Derived.prototype.__proto__);
|
| -
|
| - baseCalled = 0;
|
| - derivedCalled = 0;
|
| - new Derived();
|
| - assertEquals(1, baseCalled);
|
| - assertEquals(1, derivedCalled);
|
| -
|
| - class DerivedDerived extends Derived {
|
| - constructor() {
|
| - let r = super();
|
| - assertEquals(this, r);
|
| - derivedDerivedCalled++;
|
| - }
|
| - }
|
| -
|
| - baseCalled = 0;
|
| - derivedCalled = 0;
|
| - derivedDerivedCalled = 0;
|
| - new DerivedDerived();
|
| - assertEquals(1, baseCalled);
|
| - assertEquals(1, derivedCalled);
|
| - assertEquals(1, derivedDerivedCalled);
|
| -
|
| - class Base2 {
|
| - constructor(v) {
|
| - this.fromBase = v;
|
| - }
|
| - }
|
| - class Derived2 extends Base2 {
|
| - constructor(v1, v2) {
|
| - let r = super(v1);
|
| - assertEquals(this, r);
|
| - this.fromDerived = v2;
|
| - }
|
| - }
|
| -
|
| - var d = new Derived2("base", "derived");
|
| - assertEquals("base", d.fromBase);
|
| - assertEquals("derived", d.fromDerived);
|
| -
|
| - var calls = 0;
|
| - class G {
|
| - constructor() {
|
| - calls++;
|
| - }
|
| - }
|
| -
|
| - class F extends Object {
|
| - constructor() {
|
| - super();
|
| - }
|
| - }
|
| - F.__proto__ = G;
|
| - new F();
|
| - assertEquals(1, calls);
|
| - F.__proto__ = function() {};
|
| - new F();
|
| - assertEquals(1, calls);
|
| -}());
|
| -
|
| -
|
| -(function TestExtendsObject() {
|
| - 'use strict';
|
| - class F extends Object { }
|
| - var f = new F(42);
|
| -
|
| - // TODO(dslomov,arv): Fix this. BUG=v8:3886.
|
| - assertInstanceof(f, Number);
|
| -}());
|
| -
|
| -
|
| -(function TestSuperCallErrorCases() {
|
| - 'use strict';
|
| - class T extends Object {
|
| - constructor() {
|
| - super();
|
| - }
|
| - }
|
| -
|
| - T.__proto__ = null;
|
| - assertThrows(function() { new T(); }, TypeError);
|
| -}());
|
| -
|
| -
|
| -(function TestSuperPropertyInEval() {
|
| - 'use strict';
|
| - let y = 3;
|
| - class Base {
|
| - m() { return 1; }
|
| - get x() { return 2; }
|
| - }
|
| - class Derived extends Base {
|
| - evalM() {
|
| - assertEquals(1, eval('super.m()'));
|
| - }
|
| - evalX() {
|
| - assertEquals(2, eval('super.x'));
|
| - }
|
| - globalEval1() {
|
| - assertThrows('super.x', SyntaxError);
|
| - assertThrows('super.m()', SyntaxError);
|
| - }
|
| - globalEval2() {
|
| - super.x;
|
| - assertThrows('super.x', SyntaxError);
|
| - assertThrows('super.m()', SyntaxError);
|
| - }
|
| - }
|
| - let d = new Derived();
|
| - d.globalEval1();
|
| - d.globalEval2();
|
| - d.evalM();
|
| - d.evalX();
|
| -})();
|
| -
|
| -
|
| -(function TestSuperPropertyInArrow() {
|
| - 'use strict';
|
| - let y = 3;
|
| - class Base {
|
| - m() { return 1; }
|
| - get x() { return 2; }
|
| - }
|
| - class Derived extends Base {
|
| - arrow() {
|
| - assertSame(super.x, (() => super.x)());
|
| - assertSame(super.m(), (() => super.m())());
|
| - return (() => super.m())();
|
| - }
|
| - }
|
| - let d = new Derived();
|
| - assertSame(1, d.arrow());
|
| -})();
|
| -
|
| -
|
| -(function TestSuperInOtherScopes() {
|
| - var p = {x: 99};
|
| - var o0 = {__proto__: p, f() { return eval("'use strict'; super.x") }};
|
| - assertEquals(p.x, o0.f());
|
| - var o1 = {__proto__: p, f() { with ({}) return super.x }};
|
| - assertEquals(p.x, o1.f());
|
| - var o2 = {__proto__: p, f({a}) { return super.x }};
|
| - assertEquals(p.x, o2.f({}));
|
| - var o3 = {__proto__: p, f(...a) { return super.x }};
|
| - assertEquals(p.x, o3.f());
|
| - var o4 = {__proto__: p, f() { 'use strict'; { let x; return super.x } }};
|
| - assertEquals(p.x, o4.f());
|
| -})();
|
| -
|
| -
|
| -(function TestSuperCallInOtherScopes() {
|
| - class C {constructor() { this.x = 99 }}
|
| - class D0 extends C {constructor() { eval("'use strict'; super()") }}
|
| - assertEquals(99, (new D0).x);
|
| - class D2 extends C {constructor({a}) { super() }}
|
| - assertEquals(99, (new D2({})).x);
|
| - class D3 extends C {constructor(...a) { super() }}
|
| - assertEquals(99, (new D3()).x);
|
| - class D4 extends C {constructor() { { let x; super() } }}
|
| - assertEquals(99, (new D4).x);
|
| -})();
|
| -
|
| -
|
| -(function TestSuperCallInEval() {
|
| - 'use strict';
|
| - class Base {
|
| - constructor(x) {
|
| - this.x = x;
|
| - }
|
| - }
|
| - class Derived extends Base {
|
| - constructor(x) {
|
| - let r = eval('super(x)');
|
| - assertEquals(this, r);
|
| - }
|
| - }
|
| - let d = new Derived(42);
|
| - assertSame(42, d.x);
|
| -})();
|
| -
|
| -
|
| -(function TestSuperCallInArrow() {
|
| - 'use strict';
|
| - class Base {
|
| - constructor(x) {
|
| - this.x = x;
|
| - }
|
| - }
|
| - class Derived extends Base {
|
| - constructor(x) {
|
| - let r = (() => super(x))();
|
| - assertEquals(this, r);
|
| - }
|
| - }
|
| - let d = new Derived(42);
|
| - assertSame(42, d.x);
|
| -})();
|
| -
|
| -
|
| -(function TestSuperCallEscapes() {
|
| - 'use strict';
|
| - class Base {
|
| - constructor(x) {
|
| - this.x = x;
|
| - }
|
| - }
|
| -
|
| - let f;
|
| - class Derived extends Base {
|
| - constructor() {
|
| - f = () => super(2);
|
| - }
|
| - }
|
| - assertThrows(function() {
|
| - new Derived();
|
| - }, ReferenceError);
|
| -
|
| - let o = f();
|
| - assertEquals(2, o.x);
|
| - assertInstanceof(o, Derived);
|
| -
|
| - assertThrows(function() {
|
| - f();
|
| - }, ReferenceError);
|
| -})();
|
| -
|
| -
|
| -(function TestSuperCallInLoop() {
|
| - 'use strict';
|
| - class Base {
|
| - constructor(x) {
|
| - this.x = x;
|
| - }
|
| - }
|
| - class Derived extends Base {
|
| - constructor(x, n) {
|
| - for (var i = 0; i < n; ++i) {
|
| - super(x);
|
| - }
|
| - }
|
| - }
|
| -
|
| - let o = new Derived(23, 1);
|
| - assertEquals(23, o.x);
|
| - assertInstanceof(o, Derived);
|
| -
|
| - assertThrows("new Derived(42, 0)", ReferenceError);
|
| - assertThrows("new Derived(65, 2)", ReferenceError);
|
| -})();
|
| -
|
| -
|
| -(function TestSuperCallReentrant() {
|
| - 'use strict';
|
| - class Base {
|
| - constructor(fun) {
|
| - this.x = fun();
|
| - }
|
| - }
|
| - class Derived extends Base {
|
| - constructor(x) {
|
| - let f = () => super(() => x)
|
| - super(f);
|
| - }
|
| - }
|
| - assertThrows("new Derived(23)", ReferenceError);
|
| -})();
|
| -
|
| -
|
| -(function TestSuperCallSpreadInEval() {
|
| - 'use strict';
|
| - class Base {
|
| - constructor(x) {
|
| - this.x = x;
|
| - }
|
| - }
|
| - class Derived extends Base {
|
| - constructor(x) {
|
| - let r = eval('super(...[x])');
|
| - assertEquals(this, r);
|
| - }
|
| - }
|
| - let d = new Derived(42);
|
| - assertSame(42, d.x);
|
| -})();
|
| -
|
| -
|
| -(function TestSuperCallSpreadInArrow() {
|
| - 'use strict';
|
| - class Base {
|
| - constructor(x) {
|
| - this.x = x;
|
| - }
|
| - }
|
| - class Derived extends Base {
|
| - constructor(x) {
|
| - let r = (() => super(...[x]))();
|
| - assertEquals(this, r);
|
| - }
|
| - }
|
| - let d = new Derived(42);
|
| - assertSame(42, d.x);
|
| -})();
|
|
|