iterator-proto-surfaces.js (1502B)
1 // Iterator prototype surfaces. 2 3 load(libdir + "asserts.js"); 4 load(libdir + "iteration.js"); 5 6 var iterProto = null; 7 8 function test(constructor) { 9 var iter = new constructor()[Symbol.iterator](); 10 assertDeepEq(Reflect.ownKeys(iter), []); 11 12 // Iterator prototypes only have a .next and @@toStringTag property. 13 var proto1 = Object.getPrototypeOf(iter); 14 assertDeepEq(Reflect.ownKeys(proto1), ['next', Symbol.toStringTag]); 15 16 var desc = Object.getOwnPropertyDescriptor(proto1, 'next'); 17 assertEq(desc.configurable, true); 18 assertEq(desc.enumerable, false); 19 assertEq(desc.writable, true); 20 21 // %IteratorPrototype% 22 var proto2 = Object.getPrototypeOf(proto1); 23 assertEq(Object.getPrototypeOf(proto2), Object.prototype); 24 assertEq(Object.prototype.toString.call(proto2), "[object Iterator]"); 25 26 var expectedKeys = ["map", "filter", "take", "drop", "flatMap", "reduce", "toArray", 27 "forEach", "some", "every", "find", "constructor", 28 Symbol.iterator, Symbol.toStringTag]; 29 if (getBuildConfiguration("explicit-resource-management")) { 30 expectedKeys.splice(expectedKeys.length - 1, 0, Symbol.dispose); 31 } 32 assertDeepEq(Reflect.ownKeys(proto2), expectedKeys); 33 assertEq(proto2[Symbol.iterator](), proto2); 34 35 // Check there's a single %IteratorPrototype% object. 36 if (iterProto === null) 37 iterProto = proto2; 38 else 39 assertEq(iterProto, proto2); 40 } 41 42 test(Array); 43 test(String); 44 test(Map); 45 test(Set);