| Index: test/mjsunit/harmony/unscopables.js
|
| diff --git a/test/mjsunit/harmony/unscopables.js b/test/mjsunit/harmony/unscopables.js
|
| deleted file mode 100644
|
| index 678536dba425a952e9c9acdada1a09ea8f111d53..0000000000000000000000000000000000000000
|
| --- a/test/mjsunit/harmony/unscopables.js
|
| +++ /dev/null
|
| @@ -1,664 +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: --harmony-unscopables
|
| -// Flags: --harmony-collections
|
| -
|
| -var global = this;
|
| -var globalProto = Object.getPrototypeOf(global);
|
| -
|
| -// Number of objects being tested. There is an assert ensuring this is correct.
|
| -var objectCount = 21;
|
| -
|
| -
|
| -function runTest(f) {
|
| - function restore(object, oldProto) {
|
| - delete object[Symbol.unscopables];
|
| - delete object.x;
|
| - delete object.x_;
|
| - delete object.y;
|
| - delete object.z;
|
| - Object.setPrototypeOf(object, oldProto);
|
| - }
|
| -
|
| - function getObject(i) {
|
| - var objects = [
|
| - {},
|
| - [],
|
| - function() {},
|
| - function() {
|
| - return arguments;
|
| - }(),
|
| - function() {
|
| - 'use strict';
|
| - return arguments;
|
| - }(),
|
| - Object(1),
|
| - Object(true),
|
| - Object('bla'),
|
| - new Date,
|
| - new RegExp,
|
| - new Set,
|
| - new Map,
|
| - new WeakMap,
|
| - new WeakSet,
|
| - new ArrayBuffer(10),
|
| - new Int32Array(5),
|
| - Object,
|
| - Function,
|
| - Date,
|
| - RegExp,
|
| - global
|
| - ];
|
| -
|
| - assertEquals(objectCount, objects.length);
|
| - return objects[i];
|
| - }
|
| -
|
| - // Tests depends on this not being there to start with.
|
| - delete Array.prototype[Symbol.unscopables];
|
| -
|
| - if (f.length === 1) {
|
| - for (var i = 0; i < objectCount; i++) {
|
| - var object = getObject(i);
|
| - var oldObjectProto = Object.getPrototypeOf(object);
|
| - f(object);
|
| - restore(object, oldObjectProto);
|
| - }
|
| - } else {
|
| - for (var i = 0; i < objectCount; i++) {
|
| - for (var j = 0; j < objectCount; j++) {
|
| - var object = getObject(i);
|
| - var proto = getObject(j);
|
| - if (object === proto) {
|
| - continue;
|
| - }
|
| - var oldObjectProto = Object.getPrototypeOf(object);
|
| - var oldProtoProto = Object.getPrototypeOf(proto);
|
| - f(object, proto);
|
| - restore(object, oldObjectProto);
|
| - restore(proto, oldProtoProto);
|
| - }
|
| - }
|
| - }
|
| -}
|
| -
|
| -// Test array first, since other tests are changing
|
| -// Array.prototype[Symbol.unscopables].
|
| -function TestArrayPrototypeUnscopables() {
|
| - var descr = Object.getOwnPropertyDescriptor(Array.prototype,
|
| - Symbol.unscopables);
|
| - assertFalse(descr.enumerable);
|
| - assertFalse(descr.writable);
|
| - assertTrue(descr.configurable);
|
| - assertEquals(null, Object.getPrototypeOf(descr.value));
|
| -
|
| - var copyWithin = 'local copyWithin';
|
| - var entries = 'local entries';
|
| - var fill = 'local fill';
|
| - var find = 'local find';
|
| - var findIndex = 'local findIndex';
|
| - var keys = 'local keys';
|
| - var values = 'local values';
|
| -
|
| - var array = [];
|
| - array.toString = 42;
|
| -
|
| - with (array) {
|
| - assertEquals('local copyWithin', copyWithin);
|
| - assertEquals('local entries', entries);
|
| - assertEquals('local fill', fill);
|
| - assertEquals('local find', find);
|
| - assertEquals('local findIndex', findIndex);
|
| - assertEquals('local keys', keys);
|
| - assertEquals('local values', values);
|
| - assertEquals(42, toString);
|
| - }
|
| -}
|
| -TestArrayPrototypeUnscopables();
|
| -
|
| -
|
| -
|
| -function TestBasics(object) {
|
| - var x = 1;
|
| - var y = 2;
|
| - var z = 3;
|
| - object.x = 4;
|
| - object.y = 5;
|
| -
|
| - with (object) {
|
| - assertEquals(4, x);
|
| - assertEquals(5, y);
|
| - assertEquals(3, z);
|
| - }
|
| -
|
| - object[Symbol.unscopables] = {x: true};
|
| - with (object) {
|
| - assertEquals(1, x);
|
| - assertEquals(5, y);
|
| - assertEquals(3, z);
|
| - }
|
| -
|
| - object[Symbol.unscopables] = {x: 0, y: true};
|
| - with (object) {
|
| - assertEquals(1, x);
|
| - assertEquals(2, y);
|
| - assertEquals(3, z);
|
| - }
|
| -}
|
| -runTest(TestBasics);
|
| -
|
| -
|
| -function TestUnscopableChain(object) {
|
| - var x = 1;
|
| - object.x = 2;
|
| -
|
| - with (object) {
|
| - assertEquals(2, x);
|
| - }
|
| -
|
| - object[Symbol.unscopables] = {
|
| - __proto__: {x: true}
|
| - };
|
| - with (object) {
|
| - assertEquals(1, x);
|
| - }
|
| -}
|
| -runTest(TestUnscopableChain);
|
| -
|
| -
|
| -function TestBasicsSet(object) {
|
| - var x = 1;
|
| - object.x = 2;
|
| -
|
| - with (object) {
|
| - assertEquals(2, x);
|
| - }
|
| -
|
| - object[Symbol.unscopables] = {x: true};
|
| - with (object) {
|
| - assertEquals(1, x);
|
| - x = 3;
|
| - assertEquals(3, x);
|
| - }
|
| -
|
| - assertEquals(3, x);
|
| - assertEquals(2, object.x);
|
| -}
|
| -runTest(TestBasicsSet);
|
| -
|
| -
|
| -function TestOnProto(object, proto) {
|
| - var x = 1;
|
| - var y = 2;
|
| - var z = 3;
|
| - proto.x = 4;
|
| -
|
| - Object.setPrototypeOf(object, proto);
|
| - object.y = 5;
|
| -
|
| - with (object) {
|
| - assertEquals(4, x);
|
| - assertEquals(5, y);
|
| - assertEquals(3, z);
|
| - }
|
| -
|
| - proto[Symbol.unscopables] = {x: true};
|
| - with (object) {
|
| - assertEquals(1, x);
|
| - assertEquals(5, y);
|
| - assertEquals(3, z);
|
| - }
|
| -
|
| - object[Symbol.unscopables] = {y: true};
|
| - with (object) {
|
| - assertEquals(4, x);
|
| - assertEquals(2, y);
|
| - assertEquals(3, z);
|
| - }
|
| -
|
| - proto[Symbol.unscopables] = {y: true};
|
| - object[Symbol.unscopables] = {x: true};
|
| - with (object) {
|
| - assertEquals(1, x);
|
| - assertEquals(5, y);
|
| - assertEquals(3, z);
|
| - }
|
| -}
|
| -runTest(TestOnProto);
|
| -
|
| -
|
| -function TestSetBlockedOnProto(object, proto) {
|
| - var x = 1;
|
| - object.x = 2;
|
| -
|
| - with (object) {
|
| - assertEquals(2, x);
|
| - }
|
| -
|
| - Object.setPrototypeOf(object, proto);
|
| - proto[Symbol.unscopables] = {x: true};
|
| - with (object) {
|
| - assertEquals(1, x);
|
| - x = 3;
|
| - assertEquals(3, x);
|
| - }
|
| -
|
| - assertEquals(3, x);
|
| - assertEquals(2, object.x);
|
| -}
|
| -runTest(TestSetBlockedOnProto);
|
| -
|
| -
|
| -function TestNonObject(object) {
|
| - var x = 1;
|
| - var y = 2;
|
| - object.x = 3;
|
| - object.y = 4;
|
| -
|
| - object[Symbol.unscopables] = 'xy';
|
| - with (object) {
|
| - assertEquals(3, x);
|
| - assertEquals(4, y);
|
| - }
|
| -
|
| - object[Symbol.unscopables] = null;
|
| - with (object) {
|
| - assertEquals(3, x);
|
| - assertEquals(4, y);
|
| - }
|
| -}
|
| -runTest(TestNonObject);
|
| -
|
| -
|
| -function TestChangeDuringWith(object) {
|
| - var x = 1;
|
| - var y = 2;
|
| - object.x = 3;
|
| - object.y = 4;
|
| -
|
| - with (object) {
|
| - assertEquals(3, x);
|
| - assertEquals(4, y);
|
| - object[Symbol.unscopables] = {x: true};
|
| - assertEquals(1, x);
|
| - assertEquals(4, y);
|
| - }
|
| -}
|
| -runTest(TestChangeDuringWith);
|
| -
|
| -
|
| -function TestChangeDuringWithWithPossibleOptimization(object) {
|
| - var x = 1;
|
| - object.x = 2;
|
| - with (object) {
|
| - for (var i = 0; i < 1000; i++) {
|
| - if (i === 500) object[Symbol.unscopables] = {x: true};
|
| - assertEquals(i < 500 ? 2: 1, x);
|
| - }
|
| - }
|
| -}
|
| -TestChangeDuringWithWithPossibleOptimization({});
|
| -
|
| -
|
| -function TestChangeDuringWithWithPossibleOptimization2(object) {
|
| - var x = 1;
|
| - object.x = 2;
|
| - object[Symbol.unscopables] = {x: true};
|
| - with (object) {
|
| - for (var i = 0; i < 1000; i++) {
|
| - if (i === 500) delete object[Symbol.unscopables];
|
| - assertEquals(i < 500 ? 1 : 2, x);
|
| - }
|
| - }
|
| -}
|
| -TestChangeDuringWithWithPossibleOptimization2({});
|
| -
|
| -
|
| -function TestChangeDuringWithWithPossibleOptimization3(object) {
|
| - var x = 1;
|
| - object.x = 2;
|
| - object[Symbol.unscopables] = {};
|
| - with (object) {
|
| - for (var i = 0; i < 1000; i++) {
|
| - if (i === 500) object[Symbol.unscopables].x = true;
|
| - assertEquals(i < 500 ? 2 : 1, x);
|
| - }
|
| - }
|
| -}
|
| -TestChangeDuringWithWithPossibleOptimization3({});
|
| -
|
| -
|
| -function TestChangeDuringWithWithPossibleOptimization4(object) {
|
| - var x = 1;
|
| - object.x = 2;
|
| - object[Symbol.unscopables] = {x: true};
|
| - with (object) {
|
| - for (var i = 0; i < 1000; i++) {
|
| - if (i === 500) delete object[Symbol.unscopables].x;
|
| - assertEquals(i < 500 ? 1 : 2, x);
|
| - }
|
| - }
|
| -}
|
| -TestChangeDuringWithWithPossibleOptimization4({});
|
| -
|
| -
|
| -function TestAccessorReceiver(object, proto) {
|
| - var x = 'local';
|
| -
|
| - Object.defineProperty(proto, 'x', {
|
| - get: function() {
|
| - assertEquals(object, this);
|
| - return this.x_;
|
| - },
|
| - configurable: true
|
| - });
|
| - proto.x_ = 'proto';
|
| -
|
| - Object.setPrototypeOf(object, proto);
|
| - proto.x_ = 'object';
|
| -
|
| - with (object) {
|
| - assertEquals('object', x);
|
| - }
|
| -}
|
| -runTest(TestAccessorReceiver);
|
| -
|
| -
|
| -function TestUnscopablesGetter(object) {
|
| - // This test gets really messy when object is the global since the assert
|
| - // functions are properties on the global object and the call count gets
|
| - // completely different.
|
| - if (object === global) return;
|
| -
|
| - var x = 'local';
|
| - object.x = 'object';
|
| -
|
| - var callCount = 0;
|
| - Object.defineProperty(object, Symbol.unscopables, {
|
| - get: function() {
|
| - callCount++;
|
| - return {};
|
| - },
|
| - configurable: true
|
| - });
|
| - with (object) {
|
| - assertEquals('object', x);
|
| - }
|
| - // Once for HasBinding
|
| - assertEquals(1, callCount);
|
| -
|
| - callCount = 0;
|
| - Object.defineProperty(object, Symbol.unscopables, {
|
| - get: function() {
|
| - callCount++;
|
| - return {x: true};
|
| - },
|
| - configurable: true
|
| - });
|
| - with (object) {
|
| - assertEquals('local', x);
|
| - }
|
| - // Once for HasBinding
|
| - assertEquals(1, callCount);
|
| -
|
| - callCount = 0;
|
| - Object.defineProperty(object, Symbol.unscopables, {
|
| - get: function() {
|
| - callCount++;
|
| - return callCount == 1 ? {} : {x: true};
|
| - },
|
| - configurable: true
|
| - });
|
| - with (object) {
|
| - x = 1;
|
| - }
|
| - // Once for HasBinding
|
| - assertEquals(1, callCount);
|
| - assertEquals(1, object.x);
|
| - assertEquals('local', x);
|
| - with (object) {
|
| - x = 2;
|
| - }
|
| - // One more HasBinding.
|
| - assertEquals(2, callCount);
|
| - assertEquals(1, object.x);
|
| - assertEquals(2, x);
|
| -}
|
| -runTest(TestUnscopablesGetter);
|
| -
|
| -
|
| -var global = this;
|
| -function TestUnscopablesGetter2() {
|
| - var x = 'local';
|
| -
|
| - var globalProto = Object.getPrototypeOf(global);
|
| - var protos = [{}, [], function() {}, global];
|
| - var objects = [{}, [], function() {}];
|
| -
|
| - protos.forEach(function(proto) {
|
| - objects.forEach(function(object) {
|
| - Object.defineProperty(proto, 'x', {
|
| - get: function() {
|
| - assertEquals(object, this);
|
| - return 'proto';
|
| - },
|
| - configurable: true
|
| - });
|
| -
|
| - object.__proto__ = proto;
|
| - Object.defineProperty(object, 'x', {
|
| - get: function() {
|
| - assertEquals(object, this);
|
| - return 'object';
|
| - },
|
| - configurable: true
|
| - });
|
| -
|
| - with (object) {
|
| - assertEquals('object', x);
|
| - }
|
| -
|
| - object[Symbol.unscopables] = {x: true};
|
| - with (object) {
|
| - assertEquals('local', x);
|
| - }
|
| -
|
| - delete proto[Symbol.unscopables];
|
| - delete object[Symbol.unscopables];
|
| - });
|
| - });
|
| -
|
| - delete global.x;
|
| - Object.setPrototypeOf(global, globalProto);
|
| -}
|
| -TestUnscopablesGetter2();
|
| -
|
| -
|
| -function TestSetterOnBlacklisted(object, proto) {
|
| - var x = 'local';
|
| - Object.defineProperty(proto, 'x', {
|
| - set: function(x) {
|
| - assertUnreachable();
|
| - },
|
| - get: function() {
|
| - return 'proto';
|
| - },
|
| - configurable: true
|
| - });
|
| - Object.setPrototypeOf(object, proto);
|
| - Object.defineProperty(object, 'x', {
|
| - get: function() {
|
| - return this.x_;
|
| - },
|
| - set: function(x) {
|
| - this.x_ = x;
|
| - },
|
| - configurable: true
|
| - });
|
| - object.x_ = 1;
|
| -
|
| - with (object) {
|
| - x = 2;
|
| - assertEquals(2, x);
|
| - }
|
| -
|
| - assertEquals(2, object.x);
|
| -
|
| - object[Symbol.unscopables] = {x: true};
|
| -
|
| - with (object) {
|
| - x = 3;
|
| - assertEquals(3, x);
|
| - }
|
| -
|
| - assertEquals(2, object.x);
|
| -}
|
| -runTest(TestSetterOnBlacklisted);
|
| -
|
| -
|
| -function TestObjectsAsUnscopables(object, unscopables) {
|
| - var x = 1;
|
| - object.x = 2;
|
| -
|
| - with (object) {
|
| - assertEquals(2, x);
|
| - object[Symbol.unscopables] = unscopables;
|
| - assertEquals(2, x);
|
| - }
|
| -}
|
| -runTest(TestObjectsAsUnscopables);
|
| -
|
| -
|
| -function TestAccessorOnUnscopables(object) {
|
| - var x = 1;
|
| - object.x = 2;
|
| -
|
| - var unscopables = {
|
| - get x() {
|
| - assertUnreachable();
|
| - }
|
| - };
|
| -
|
| - with (object) {
|
| - assertEquals(2, x);
|
| - object[Symbol.unscopables] = unscopables;
|
| - assertEquals(1, x);
|
| - }
|
| -}
|
| -runTest(TestAccessorOnUnscopables);
|
| -
|
| -
|
| -function TestLengthUnscopables(object, proto) {
|
| - var length = 2;
|
| - with (object) {
|
| - assertEquals(1, length);
|
| - object[Symbol.unscopables] = {length: true};
|
| - assertEquals(2, length);
|
| - delete object[Symbol.unscopables];
|
| - assertEquals(1, length);
|
| - }
|
| -}
|
| -TestLengthUnscopables([1], Array.prototype);
|
| -TestLengthUnscopables(function(x) {}, Function.prototype);
|
| -TestLengthUnscopables(new String('x'), String.prototype);
|
| -
|
| -
|
| -function TestFunctionNameUnscopables(object) {
|
| - var name = 'local';
|
| - with (object) {
|
| - assertEquals('f', name);
|
| - object[Symbol.unscopables] = {name: true};
|
| - assertEquals('local', name);
|
| - delete object[Symbol.unscopables];
|
| - assertEquals('f', name);
|
| - }
|
| -}
|
| -TestFunctionNameUnscopables(function f() {});
|
| -
|
| -
|
| -function TestFunctionPrototypeUnscopables() {
|
| - var prototype = 'local';
|
| - var f = function() {};
|
| - var g = function() {};
|
| - Object.setPrototypeOf(f, g);
|
| - var fp = f.prototype;
|
| - var gp = g.prototype;
|
| - with (f) {
|
| - assertEquals(fp, prototype);
|
| - f[Symbol.unscopables] = {prototype: true};
|
| - assertEquals('local', prototype);
|
| - delete f[Symbol.unscopables];
|
| - assertEquals(fp, prototype);
|
| - }
|
| -}
|
| -TestFunctionPrototypeUnscopables(function() {});
|
| -
|
| -
|
| -function TestFunctionArgumentsUnscopables() {
|
| - var func = function() {
|
| - var arguments = 'local';
|
| - var args = func.arguments;
|
| - with (func) {
|
| - assertEquals(args, arguments);
|
| - func[Symbol.unscopables] = {arguments: true};
|
| - assertEquals('local', arguments);
|
| - delete func[Symbol.unscopables];
|
| - assertEquals(args, arguments);
|
| - }
|
| - }
|
| - func(1);
|
| -}
|
| -TestFunctionArgumentsUnscopables();
|
| -
|
| -
|
| -function TestArgumentsLengthUnscopables() {
|
| - var func = function() {
|
| - var length = 'local';
|
| - with (arguments) {
|
| - assertEquals(1, length);
|
| - arguments[Symbol.unscopables] = {length: true};
|
| - assertEquals('local', length);
|
| - }
|
| - }
|
| - func(1);
|
| -}
|
| -TestArgumentsLengthUnscopables();
|
| -
|
| -
|
| -function TestFunctionCallerUnscopables() {
|
| - var func = function() {
|
| - var caller = 'local';
|
| - with (func) {
|
| - assertEquals(TestFunctionCallerUnscopables, caller);
|
| - func[Symbol.unscopables] = {caller: true};
|
| - assertEquals('local', caller);
|
| - delete func[Symbol.unscopables];
|
| - assertEquals(TestFunctionCallerUnscopables, caller);
|
| - }
|
| - }
|
| - func(1);
|
| -}
|
| -TestFunctionCallerUnscopables();
|
| -
|
| -
|
| -function TestGetUnscopablesGetterThrows() {
|
| - var object = {
|
| - get x() {
|
| - assertUnreachable();
|
| - }
|
| - };
|
| - function CustomError() {}
|
| - Object.defineProperty(object, Symbol.unscopables, {
|
| - get: function() {
|
| - throw new CustomError();
|
| - }
|
| - });
|
| - assertThrows(function() {
|
| - with (object) {
|
| - x;
|
| - }
|
| - }, CustomError);
|
| -}
|
| -TestGetUnscopablesGetterThrows();
|
|
|