1 // Copyright 2013 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are
6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided
11 // with the distribution.
12 // * Neither the name of Google Inc. nor the names of its
13 // contributors may be used to endorse or promote products derived
14 // from this software without specific prior written permission.
16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 // Flags: --allow-natives-syntax --harmony-tostring
37 function assertHasOwnProperty(object, name, attrs) {
38 assertTrue(object.hasOwnProperty(name));
39 var desc = Object.getOwnPropertyDescriptor(object, name);
40 assertEquals(desc.writable, !(attrs & READ_ONLY));
41 assertEquals(desc.enumerable, !(attrs & DONT_ENUM));
42 assertEquals(desc.configurable, !(attrs & DONT_DELETE));
46 function TestArrayPrototype() {
47 assertHasOwnProperty(Array.prototype, 'entries', DONT_ENUM);
48 assertHasOwnProperty(Array.prototype, 'keys', DONT_ENUM);
49 assertHasOwnProperty(Array.prototype, Symbol.iterator, DONT_ENUM);
54 function assertIteratorResult(value, done, result) {
55 assertEquals({value: value, done: done}, result);
59 function TestValues() {
60 var array = ['a', 'b', 'c'];
61 var iterator = array[Symbol.iterator]();
62 assertIteratorResult('a', false, iterator.next());
63 assertIteratorResult('b', false, iterator.next());
64 assertIteratorResult('c', false, iterator.next());
65 assertIteratorResult(void 0, true, iterator.next());
68 assertIteratorResult(void 0, true, iterator.next());
73 function TestValuesMutate() {
74 var array = ['a', 'b', 'c'];
75 var iterator = array[Symbol.iterator]();
76 assertIteratorResult('a', false, iterator.next());
77 assertIteratorResult('b', false, iterator.next());
78 assertIteratorResult('c', false, iterator.next());
80 assertIteratorResult('d', false, iterator.next());
81 assertIteratorResult(void 0, true, iterator.next());
87 var array = ['a', 'b', 'c'];
88 var iterator = array.keys();
89 assertIteratorResult(0, false, iterator.next());
90 assertIteratorResult(1, false, iterator.next());
91 assertIteratorResult(2, false, iterator.next());
92 assertIteratorResult(void 0, true, iterator.next());
95 assertIteratorResult(void 0, true, iterator.next());
100 function TestKeysMutate() {
101 var array = ['a', 'b', 'c'];
102 var iterator = array.keys();
103 assertIteratorResult(0, false, iterator.next());
104 assertIteratorResult(1, false, iterator.next());
105 assertIteratorResult(2, false, iterator.next());
107 assertIteratorResult(3, false, iterator.next());
108 assertIteratorResult(void 0, true, iterator.next());
113 function TestEntries() {
114 var array = ['a', 'b', 'c'];
115 var iterator = array.entries();
116 assertIteratorResult([0, 'a'], false, iterator.next());
117 assertIteratorResult([1, 'b'], false, iterator.next());
118 assertIteratorResult([2, 'c'], false, iterator.next());
119 assertIteratorResult(void 0, true, iterator.next());
122 assertIteratorResult(void 0, true, iterator.next());
127 function TestEntriesMutate() {
128 var array = ['a', 'b', 'c'];
129 var iterator = array.entries();
130 assertIteratorResult([0, 'a'], false, iterator.next());
131 assertIteratorResult([1, 'b'], false, iterator.next());
132 assertIteratorResult([2, 'c'], false, iterator.next());
134 assertIteratorResult([3, 'd'], false, iterator.next());
135 assertIteratorResult(void 0, true, iterator.next());
140 function TestArrayIteratorPrototype() {
142 var iterator = array.keys();
144 var ArrayIteratorPrototype = iterator.__proto__;
146 assertEquals(ArrayIteratorPrototype, array[Symbol.iterator]().__proto__);
147 assertEquals(ArrayIteratorPrototype, array.keys().__proto__);
148 assertEquals(ArrayIteratorPrototype, array.entries().__proto__);
150 assertEquals(Object.prototype, ArrayIteratorPrototype.__proto__);
152 assertEquals('Array Iterator', %_ClassOf(array[Symbol.iterator]()));
153 assertEquals('Array Iterator', %_ClassOf(array.keys()));
154 assertEquals('Array Iterator', %_ClassOf(array.entries()));
156 assertFalse(ArrayIteratorPrototype.hasOwnProperty('constructor'));
157 assertArrayEquals(['next'],
158 Object.getOwnPropertyNames(ArrayIteratorPrototype));
159 assertHasOwnProperty(ArrayIteratorPrototype, 'next', DONT_ENUM);
160 assertHasOwnProperty(ArrayIteratorPrototype, Symbol.iterator, DONT_ENUM);
162 assertEquals("[object Array Iterator]",
163 Object.prototype.toString.call(iterator));
164 assertEquals("Array Iterator", ArrayIteratorPrototype[Symbol.toStringTag]);
165 var desc = Object.getOwnPropertyDescriptor(
166 ArrayIteratorPrototype, Symbol.toStringTag);
167 assertTrue(desc.configurable);
168 assertFalse(desc.writable);
169 assertEquals("Array Iterator", desc.value);
171 TestArrayIteratorPrototype();
174 function TestForArrayValues() {
176 var array = [0, 'a', true, false, null, /* hole */, undefined, NaN];
178 for (var value of array[Symbol.iterator]()) {
182 assertEquals(8, buffer.length);
184 for (var i = 0; i < buffer.length; i++) {
185 assertSame(array[i], buffer[i]);
188 TestForArrayValues();
191 function TestForArrayKeys() {
193 var array = [0, 'a', true, false, null, /* hole */, undefined, NaN];
195 for (var key of array.keys()) {
199 assertEquals(8, buffer.length);
201 for (var i = 0; i < buffer.length; i++) {
202 assertEquals(i, buffer[i]);
208 function TestForArrayEntries() {
210 var array = [0, 'a', true, false, null, /* hole */, undefined, NaN];
212 for (var entry of array.entries()) {
216 assertEquals(8, buffer.length);
218 for (var i = 0; i < buffer.length; i++) {
219 assertSame(array[i], buffer[i][1]);
222 for (var i = 0; i < buffer.length; i++) {
223 assertEquals(i, buffer[i][0]);
226 TestForArrayEntries();
229 function TestForArray() {
231 var array = [0, 'a', true, false, null, /* hole */, undefined, NaN];
233 for (var value of array) {
237 assertEquals(8, buffer.length);
239 for (var i = 0; i < buffer.length; i++) {
240 assertSame(array[i], buffer[i]);
243 TestForArrayValues();
246 function TestNonOwnSlots() {
248 var iterator = array[Symbol.iterator]();
249 var object = {__proto__: iterator};
251 assertThrows(function() {