blob: 77ad8970aa7cdba0ef8608e5d162d80e8a412a98 [file] [log] [blame]
/* test Map.prototype.forEach */
load(libdir + 'asserts.js');
load(libdir + 'iteration.js');
// testing success conditions of Map.prototype.forEach
var testMap = new Map();
function callback(value, key, map) {
testMap.set(key, value);
assertEq(map.has(key), true);
assertEq(map.get(key), value);
}
var initialMap = new Map([['a', 1], ['b', 2.3], [false, undefined]]);
initialMap.forEach(callback);
// test that both the Maps are equal and are in same order
var iterator = initialMap[Symbol.iterator]();
var count = 0;
for (var [k, v] of testMap) {
assertEq(initialMap.has(k), true);
assertEq(initialMap.get(k), testMap.get(k));
assertIteratorNext(iterator, [k, testMap.get(k)]);
count++;
}
//check both the Maps we have are equal in size
assertEq(initialMap.size, testMap.size);
assertEq(initialMap.size, count);
var x = { abc: 'test'};
function callback2(value, key, map) {
assertEq(x, this);
}
initialMap = new Map([['a', 1]]);
initialMap.forEach(callback2, x);
// testing failure conditions of Map.prototype.forEach
var s = new Set([1, 2, 3]);
assertThrowsInstanceOf(function() {
Map.prototype.forEach.call(s, callback);
}, TypeError, "Map.prototype.forEach should raise TypeError if not used on a Map");
var fn = 2;
assertThrowsInstanceOf(function() {
initialMap.forEach(fn);
}, TypeError, "Map.prototype.forEach should raise TypeError if callback is not a function");
// testing that Map#forEach uses internal next() function and does not stop when
// StopIteration exception is thrown
var m = new Map([["one", 1]]);
Object.getPrototypeOf(m[Symbol.iterator]()).next = function () { throw "FAIL"; };
assertThrowsInstanceOf(function () {
m.forEach(function () { throw StopIteration; });
}, StopIteration, "Map.prototype.forEach should use intrinsic next method.");