[ES6] Implement Reflect.enumerate
[WebKit-https.git] / Source / JavaScriptCore / tests / stress / reflect-enumerate.js
1 function shouldBe(actual, expected) {
2     if (actual !== expected)
3         throw new Error('bad value: ' + actual);
4 }
5
6 function shouldThrow(func, message) {
7     var error = null;
8     try {
9         func();
10     } catch (e) {
11         error = e;
12     }
13     if (!error)
14         throw new Error("not thrown.");
15     if (String(error) !== message)
16         throw new Error("bad error: " + String(error));
17 }
18
19 shouldBe(Reflect.enumerate.length, 1);
20
21 shouldThrow(() => {
22     Reflect.enumerate("hello");
23 }, `TypeError: Reflect.enumerate requires the first argument be an object`);
24
25 var iterator = Reflect.enumerate({});
26 var iteratorPrototype = [][Symbol.iterator]().__proto__.__proto__;
27 shouldBe(iterator.__proto__ === iteratorPrototype, true);
28 shouldBe(iterator.hasOwnProperty('next'), true);
29 shouldBe(iterator.next.length, 0);
30 shouldBe(iterator[Symbol.iterator]() === iterator, true);
31
32 function testIterator(object, expected) {
33     var index = 0;
34     for (var name of Reflect.enumerate(object))
35         shouldBe(name === expected[index++], true);
36     shouldBe(index, expected.length);
37 }
38
39 testIterator({ hello:42, 0: 0 }, ['0', 'hello']);
40 testIterator({ 1:1, hello:42, 0: 0 }, ['0', '1', 'hello']);
41 testIterator({ 1:1, hello:42, 0: 0, world: 'ok', 100000:0 }, ['0', '1', '100000', 'hello', 'world']);
42
43 testIterator({ 1:1, hello:42, 0: 0, [Symbol.unscopables]: 42, world: 'ok', 100000:0 }, ['0', '1', '100000', 'hello', 'world']);
44
45 var object = { 1:1, hello:42, 0: 0, [Symbol.unscopables]: 42, world: 'ok', 100000:0 };
46 Object.defineProperty(object, 'hidden', {
47     value: 42,
48     enumerable: false
49 });
50 testIterator(object, ['0', '1', '100000', 'hello', 'world']);
51
52 testIterator({ hello:42, 0: 0, __proto__: { 1: 1, world: 42 } }, ['0', 'hello', '1', 'world']);
53 testIterator({}, []);
54 testIterator([], []);