function testValue(value, expected) { if (value !== expected) throw new Error("bad value: expected:(" + expected + "),actual:(" + value +")."); } function identityPairs(array) { return array.map(function (i) { return [i, i]; }); } var map = new Map(identityPairs([0])); var counter = 0; for (var [elm, _] of map) { testValue(elm, counter); map.set(elm + 1, elm + 1); if (elm > 10000) { map.clear(); } ++counter; } testValue(counter, 10002); var map = new Map(identityPairs([0, 1, 2, 3])); var counter = 0; for (var [elm, _] of map) { testValue(elm, counter); map.clear(); ++counter; } testValue(counter, 1); var map = new Map(identityPairs([0, 1, 2, 3])); var exp = [0, 2, 3]; var counter = 0; for (var [elm, _] of map) { testValue(elm, exp[counter]); map.delete(counter + 1); ++counter; } testValue(counter, 3); var map = new Map(identityPairs([0, 1, 2, 3])); var iter = map.keys(); var iter2 = map.keys(); testValue(iter2.next().value, 0); // Consume all output of iter. for (var elm of iter); testValue(iter.next().done, true); testValue(iter.next().value, undefined); map.clear(); map.set(1, 1).set(2, 2).set(3, 3); testValue(iter.next().done, true); testValue(iter.next().value, undefined); testValue(iter2.next().value, 1); testValue(iter2.next().value, 2); testValue(iter2.next().value, 3); var map = new Map(); map.set(1, 1); map.delete(1); map.forEach(function (i) { throw new Error("unreeachable."); }); var map = new Map(); var iter = map[Symbol.iterator](); map.set(1, 1); map.delete(1); for (var [elm, _] of map) { throw new Error("unreeachable."); } var map = new Map(); for (var i = 0; i < 5; ++i) map.set(i, i); testValue(map.size, 5); var iter = map.keys(); testValue(iter.next().value, 0); testValue(iter.next().value, 1); testValue(iter.next().value, 2); testValue(iter.next().value, 3); map.delete(0); map.delete(1); map.delete(2); map.delete(3); // It will cause MapData packing. for (var i = 5; i < 1000; ++i) map.set(i, i); gc(); for (var i = 4; i < 1000; ++i) testValue(iter.next().value, i); testValue(iter.next().value, undefined);