Map.property.forEach

This commit is contained in:
Leonardo Balter 2015-06-29 14:45:42 -04:00
parent ad60436658
commit a31a62fcc8
18 changed files with 629 additions and 0 deletions

View File

@ -0,0 +1,44 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 23.1.3.5
description: >
Verify the parameters order on the given callback.
info: >
Map.prototype.forEach ( callbackfn [ , thisArg ] )
...
5. If thisArg was supplied, let T be thisArg; else let T be undefined.
6. Let entries be the List that is the value of Ms [[MapData]] internal slot.
7. Repeat for each Record {[[key]], [[value]]} e that is an element of
entries, in original key insertion order
a. If e.[[key]] is not empty, then
i. Let funcResult be Call(callbackfn, T, «e.[[value]], e.[[key]], M»).
...
---*/
var map = new Map();
map.set('foo', 42);
map.set('bar', 'baz');
var results = [];
var callback = function(value, key, thisArg) {
results.push({
value: value,
key: key,
thisArg: thisArg
});
};
map.forEach(callback);
assert.sameValue(results[0].value, 42);
assert.sameValue(results[0].key, 'foo');
assert.sameValue(results[0].thisArg, map);
assert.sameValue(results[1].value, 'baz');
assert.sameValue(results[1].key, 'bar');
assert.sameValue(results[1].thisArg, map);
assert.sameValue(results.length, 2);

View File

@ -0,0 +1,28 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 23.1.3.5
description: >
Returns error from callback result is abrupt.
info: >
Map.prototype.forEach ( callbackfn [ , thisArg ] )
...
5. If thisArg was supplied, let T be thisArg; else let T be undefined.
6. Let entries be the List that is the value of Ms [[MapData]] internal slot.
7. Repeat for each Record {[[key]], [[value]]} e that is an element of
entries, in original key insertion order
a. If e.[[key]] is not empty, then
i. Let funcResult be Call(callbackfn, T, «e.[[value]], e.[[key]], M»).
ii. ReturnIfAbrupt(funcResult).
...
flags: [noStrict]
---*/
var map = new Map([[0, 0]]);
assert.throws(Test262Error, function() {
map.forEach(function() {
throw new Test262Error();
});
});

View File

@ -0,0 +1,35 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 23.1.3.5
description: >
If a thisArg is not provided, undefined will be used as the this value for
each invocation of callbackfn.
info: >
Map.prototype.forEach ( callbackfn [ , thisArg ] )
...
5. If thisArg was supplied, let T be thisArg; else let T be undefined.
6. Let entries be the List that is the value of Ms [[MapData]] internal slot.
7. Repeat for each Record {[[key]], [[value]]} e that is an element of
entries, in original key insertion order
a. If e.[[key]] is not empty, then
i. Let funcResult be Call(callbackfn, T, «e.[[value]], e.[[key]], M»).
...
flags: [noStrict]
---*/
var _this = [];
var map = new Map();
map.set(0, 0);
map.set(1, 1);
map.set(2, 2);
map.forEach(function() {
_this.push(this);
});
assert.sameValue(_this[0], this);
assert.sameValue(_this[1], this);
assert.sameValue(_this[2], this);

View File

@ -0,0 +1,35 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 23.1.3.5
description: >
If a thisArg is not provided, undefined will be used as the this value for
each invocation of callbackfn.
info: >
Map.prototype.forEach ( callbackfn [ , thisArg ] )
...
5. If thisArg was supplied, let T be thisArg; else let T be undefined.
6. Let entries be the List that is the value of Ms [[MapData]] internal slot.
7. Repeat for each Record {[[key]], [[value]]} e that is an element of
entries, in original key insertion order
a. If e.[[key]] is not empty, then
i. Let funcResult be Call(callbackfn, T, «e.[[value]], e.[[key]], M»).
...
flags: [onlyStrict]
---*/
var _this = [];
var map = new Map();
map.set(0, 0);
map.set(1, 1);
map.set(2, 2);
map.forEach(function() {
_this.push(this);
});
assert.sameValue(_this[0], undefined);
assert.sameValue(_this[1], undefined);
assert.sameValue(_this[2], undefined);

View File

@ -0,0 +1,41 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 23.1.3.5
description: >
Map state with deleted values during forEach.
info: >
Map.prototype.forEach ( callbackfn [ , thisArg ] )
...
5. If thisArg was supplied, let T be thisArg; else let T be undefined.
6. Let entries be the List that is the value of Ms [[MapData]] internal slot.
7. Repeat for each Record {[[key]], [[value]]} e that is an element of
entries, in original key insertion order
a. If e.[[key]] is not empty, then
i. Let funcResult be Call(callbackfn, T, «e.[[value]], e.[[key]], M»).
ii. ReturnIfAbrupt(funcResult).
...
---*/
var map = new Map();
map.set('foo', 0);
map.set('bar', 1);
var count = 0;
var results = [];
map.forEach(function(value, key) {
if (count === 0) {
map.delete('bar');
}
results.push({
value: value,
key: key
});
count++;
});
assert.sameValue(results.length, 1);
assert.sameValue(results[0].key, 'foo');
assert.sameValue(results[0].value, 0);

View File

@ -0,0 +1,24 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 23.1.3.5
description: >
Throws a TypeError if `this` is a Set object.
info: >
Map.prototype.forEach ( callbackfn [ , thisArg ] )
...
3. If M does not have a [[MapData]] internal slot, throw a TypeError
exception.
...
features: [Set]
---*/
assert.throws(TypeError, function() {
Map.prototype.forEach.call(new Set(), function() {});
});
assert.throws(TypeError, function() {
var m = new Map();
m.forEach.call(new Set(), function() {});
});

View File

@ -0,0 +1,24 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 23.1.3.5
description: >
Throws a TypeError if `this` is a WeakMap object.
info: >
Map.prototype.forEach ( callbackfn [ , thisArg ] )
...
3. If M does not have a [[MapData]] internal slot, throw a TypeError
exception.
...
features: [WeakMap]
---*/
assert.throws(TypeError, function() {
Map.prototype.forEach.call(new WeakMap(), function() {});
});
assert.throws(TypeError, function() {
var m = new Map();
m.forEach.call(new WeakMap(), function() {});
});

View File

@ -0,0 +1,32 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 23.1.3.5
description: >
Throws a TypeError if `this` object does not have a [[MapData]] internal slot.
info: >
Map.prototype.forEach ( callbackfn [ , thisArg ] )
...
3. If M does not have a [[MapData]] internal slot, throw a TypeError
exception.
...
---*/
var m = new Map();
assert.throws(TypeError, function() {
Map.prototype.forEach.call([], function() {});
});
assert.throws(TypeError, function() {
m.forEach.call([], function() {});
});
assert.throws(TypeError, function() {
Map.prototype.forEach.call({}, function() {});
});
assert.throws(TypeError, function() {
m.forEach.call({}, function() {});
});

View File

@ -0,0 +1,43 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 23.1.3.5
description: >
Throws a TypeError if first argument is not callable.
info: >
Map.prototype.forEach ( callbackfn [ , thisArg ] )
4. If IsCallable(callbackfn) is false, throw a TypeError exception.
...
features: [Symbol]
---*/
var map = new Map();
assert.throws(TypeError, function() {
map.forEach({});
});
assert.throws(TypeError, function() {
map.forEach([]);
});
assert.throws(TypeError, function() {
map.forEach(1);
});
assert.throws(TypeError, function() {
map.forEach('');
});
assert.throws(TypeError, function() {
map.forEach(null);
});
assert.throws(TypeError, function() {
map.forEach(undefined);
});
assert.throws(TypeError, function() {
map.forEach(Symbol());
});

View File

@ -0,0 +1,22 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 23.1.3.5
description: >
Property type and descriptor.
info: >
Map.prototype.forEach ( callbackfn [ , thisArg ] )
17 ECMAScript Standard Built-in Objects
includes: [propertyHelper.js]
---*/
assert.sameValue(
typeof Map.prototype.forEach,
'function',
'`typeof Map.prototype.forEach` is `function`'
);
verifyNotEnumerable(Map.prototype, 'forEach');
verifyWritable(Map.prototype, 'forEach');
verifyConfigurable(Map.prototype, 'forEach');

View File

@ -0,0 +1,51 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 23.1.3.5
description: >
Repeats for each non-empty record, in original key insertion order.
info: >
Map.prototype.forEach ( callbackfn [ , thisArg ] )
...
5. If thisArg was supplied, let T be thisArg; else let T be undefined.
6. Let entries be the List that is the value of Ms [[MapData]] internal slot.
7. Repeat for each Record {[[key]], [[value]]} e that is an element of
entries, in original key insertion order
a. If e.[[key]] is not empty, then
i. Let funcResult be Call(callbackfn, T, «e.[[value]], e.[[key]], M»).
...
---*/
var map = new Map([
['foo', 'valid foo'],
['bar', false],
['baz', 'valid baz']
]);
map.set(0, false);
map.set(1, false);
map.set(2, 'valid 2');
map.delete(1);
map.delete('bar');
// Not setting a new key, just changing the value
map.set(0, 'valid 0');
var results = [];
var callback = function(value) {
results.push(value);
};
map.forEach(callback);
assert.sameValue(results[0], 'valid foo');
assert.sameValue(results[1], 'valid baz');
assert.sameValue(results[2], 'valid 0');
assert.sameValue(results[3], 'valid 2');
assert.sameValue(results.length, 4);
map.clear();
results = [];
map.forEach(callback);
assert.sameValue(results.length, 0);

View File

@ -0,0 +1,49 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 23.1.3.5
description: >
New keys are visited if created during forEach execution.
info: >
Map.prototype.forEach ( callbackfn [ , thisArg ] )
...
5. If thisArg was supplied, let T be thisArg; else let T be undefined.
6. Let entries be the List that is the value of Ms [[MapData]] internal slot.
7. Repeat for each Record {[[key]], [[value]]} e that is an element of
entries, in original key insertion order
a. If e.[[key]] is not empty, then
i. Let funcResult be Call(callbackfn, T, «e.[[value]], e.[[key]], M»).
ii. ReturnIfAbrupt(funcResult).
...
---*/
var map = new Map();
map.set('foo', 0);
map.set('bar', 1);
var count = 0;
var results = [];
map.forEach(function(value, key) {
if (count === 0) {
map.set('baz', 2);
}
results.push({
value: value,
key: key
});
count++;
});
assert.sameValue(count, 3);
assert.sameValue(map.size, 3);
assert.sameValue(results[0].key, 'foo');
assert.sameValue(results[0].value, 0);
assert.sameValue(results[1].key, 'bar');
assert.sameValue(results[1].value, 1);
assert.sameValue(results[2].key, 'baz');
assert.sameValue(results[2].value, 2);

View File

@ -0,0 +1,50 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 23.1.3.5
description: >
New keys are visited if created during forEach execution.
info: >
Map.prototype.forEach ( callbackfn [ , thisArg ] )
...
5. If thisArg was supplied, let T be thisArg; else let T be undefined.
6. Let entries be the List that is the value of Ms [[MapData]] internal slot.
7. Repeat for each Record {[[key]], [[value]]} e that is an element of
entries, in original key insertion order
a. If e.[[key]] is not empty, then
i. Let funcResult be Call(callbackfn, T, «e.[[value]], e.[[key]], M»).
ii. ReturnIfAbrupt(funcResult).
...
---*/
var map = new Map();
map.set('foo', 0);
map.set('bar', 1);
var count = 0;
var results = [];
map.forEach(function(value, key) {
if (count === 0) {
map.delete('foo');
map.set('foo', 'baz');
}
results.push({
value: value,
key: key
});
count++;
});
assert.sameValue(count, 3);
assert.sameValue(map.size, 2);
assert.sameValue(results[0].key, 'foo');
assert.sameValue(results[0].value, 0);
assert.sameValue(results[1].key, 'bar');
assert.sameValue(results[1].value, 1);
assert.sameValue(results[2].key, 'foo');
assert.sameValue(results[2].value, 'baz');

View File

@ -0,0 +1,22 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 23.1.3.5
description: >
Map.prototype.forEach.length value and descriptor.
info: >
Map.prototype.forEach ( callbackfn [ , thisArg ] )
17 ECMAScript Standard Built-in Objects
includes: [propertyHelper.js]
---*/
assert.sameValue(
Map.prototype.forEach.length, 1,
'The value of `Map.prototype.forEach.length` is `1`'
);
verifyNotEnumerable(Map.prototype.forEach, 'length');
verifyNotWritable(Map.prototype.forEach, 'length');
verifyConfigurable(Map.prototype.forEach, 'length');

View File

@ -0,0 +1,22 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 23.1.3.5
description: >
Map.prototype.forEach.name value and descriptor.
info: >
Map.prototype.forEach ( callbackfn [ , thisArg ] )
17 ECMAScript Standard Built-in Objects
includes: [propertyHelper.js]
---*/
assert.sameValue(
Map.prototype.forEach.name, 'forEach',
'The value of `Map.prototype.forEach.name` is `"forEach"`'
);
verifyNotEnumerable(Map.prototype.forEach, 'name');
verifyNotWritable(Map.prototype.forEach, 'name');
verifyConfigurable(Map.prototype.forEach, 'name');

View File

@ -0,0 +1,27 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 23.1.3.5
description: >
Returns undefined.
info: >
Map.prototype.forEach ( callbackfn [ , thisArg ] )
...
8. Return undefined.
---*/
var map = new Map();
var result = map.forEach(function() {
return true;
});
assert.sameValue(result, undefined, 'Empty map#forEach returns undefined');
map.set(1, 1);
result = map.forEach(function() {
return true;
});
assert.sameValue(result, undefined, 'map#forEach returns undefined');

View File

@ -0,0 +1,37 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 23.1.3.5
description: >
If a thisArg parameter is provided, it will be used as the this value for each
invocation of callbackfn.
info: >
Map.prototype.forEach ( callbackfn [ , thisArg ] )
...
5. If thisArg was supplied, let T be thisArg; else let T be undefined.
6. Let entries be the List that is the value of Ms [[MapData]] internal slot.
7. Repeat for each Record {[[key]], [[value]]} e that is an element of
entries, in original key insertion order
a. If e.[[key]] is not empty, then
i. Let funcResult be Call(callbackfn, T, «e.[[value]], e.[[key]], M»).
...
---*/
var expectedThis = {};
var _this = [];
var map = new Map();
map.set(0, 0);
map.set(1, 1);
map.set(2, 2);
var callback = function() {
_this.push(this);
};
map.forEach(callback, expectedThis);
assert.sameValue(_this[0], expectedThis);
assert.sameValue(_this[1], expectedThis);
assert.sameValue(_this[2], expectedThis);

View File

@ -0,0 +1,43 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 23.1.3.5
description: >
Throws a TypeError if `this` is not an Object.
info: >
Map.prototype.forEach ( callbackfn [ , thisArg ] )
1. Let M be the this value.
2. If Type(M) is not Object, throw a TypeError exception.
...
features: [Symbol]
---*/
assert.throws(TypeError, function() {
Map.prototype.forEach.call(false, function() {});
});
assert.throws(TypeError, function() {
Map.prototype.forEach.call(1, function() {});
});
assert.throws(TypeError, function() {
Map.prototype.forEach.call('', function() {});
});
assert.throws(TypeError, function() {
Map.prototype.forEach.call(undefined, function() {});
});
assert.throws(TypeError, function() {
Map.prototype.forEach.call(null, function() {});
});
assert.throws(TypeError, function() {
Map.prototype.forEach.call(Symbol(), function() {});
});
assert.throws(TypeError, function() {
var map = new Map();
map.forEach.call(false, function() {});
});