blob: 767991eafed33f913e2725da6baa46a7939450b1 [file] [log] [blame]
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001// 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
4// met:
5//
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.
15//
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.
27
Emily Bernier958fae72015-03-24 16:35:39 -040028// Flags: --allow-natives-syntax --harmony-tostring
Ben Murdochb8a8cc12014-11-26 15:28:44 +000029
30
31var NONE = 0;
32var READ_ONLY = 1;
33var DONT_ENUM = 2;
34var DONT_DELETE = 4;
35
36
37function 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));
43}
44
45
46function TestArrayPrototype() {
47 assertHasOwnProperty(Array.prototype, 'entries', DONT_ENUM);
48 assertHasOwnProperty(Array.prototype, 'keys', DONT_ENUM);
49 assertHasOwnProperty(Array.prototype, Symbol.iterator, DONT_ENUM);
50}
51TestArrayPrototype();
52
53
54function assertIteratorResult(value, done, result) {
55 assertEquals({value: value, done: done}, result);
56}
57
58
59function 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());
66
67 array.push('d');
68 assertIteratorResult(void 0, true, iterator.next());
69}
70TestValues();
71
72
73function 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());
79 array.push('d');
80 assertIteratorResult('d', false, iterator.next());
81 assertIteratorResult(void 0, true, iterator.next());
82}
83TestValuesMutate();
84
85
86function TestKeys() {
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());
93
94 array.push('d');
95 assertIteratorResult(void 0, true, iterator.next());
96}
97TestKeys();
98
99
100function 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());
106 array.push('d');
107 assertIteratorResult(3, false, iterator.next());
108 assertIteratorResult(void 0, true, iterator.next());
109}
110TestKeysMutate();
111
112
113function 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());
120
121 array.push('d');
122 assertIteratorResult(void 0, true, iterator.next());
123}
124TestEntries();
125
126
127function 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());
133 array.push('d');
134 assertIteratorResult([3, 'd'], false, iterator.next());
135 assertIteratorResult(void 0, true, iterator.next());
136}
137TestEntriesMutate();
138
139
140function TestArrayIteratorPrototype() {
141 var array = [];
142 var iterator = array.keys();
143
144 var ArrayIteratorPrototype = iterator.__proto__;
145
146 assertEquals(ArrayIteratorPrototype, array[Symbol.iterator]().__proto__);
147 assertEquals(ArrayIteratorPrototype, array.keys().__proto__);
148 assertEquals(ArrayIteratorPrototype, array.entries().__proto__);
149
150 assertEquals(Object.prototype, ArrayIteratorPrototype.__proto__);
151
152 assertEquals('Array Iterator', %_ClassOf(array[Symbol.iterator]()));
153 assertEquals('Array Iterator', %_ClassOf(array.keys()));
154 assertEquals('Array Iterator', %_ClassOf(array.entries()));
155
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);
Emily Bernier958fae72015-03-24 16:35:39 -0400161
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);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000170}
171TestArrayIteratorPrototype();
172
173
174function TestForArrayValues() {
175 var buffer = [];
176 var array = [0, 'a', true, false, null, /* hole */, undefined, NaN];
177 var i = 0;
178 for (var value of array[Symbol.iterator]()) {
179 buffer[i++] = value;
180 }
181
182 assertEquals(8, buffer.length);
183
184 for (var i = 0; i < buffer.length; i++) {
185 assertSame(array[i], buffer[i]);
186 }
187}
188TestForArrayValues();
189
190
191function TestForArrayKeys() {
192 var buffer = [];
193 var array = [0, 'a', true, false, null, /* hole */, undefined, NaN];
194 var i = 0;
195 for (var key of array.keys()) {
196 buffer[i++] = key;
197 }
198
199 assertEquals(8, buffer.length);
200
201 for (var i = 0; i < buffer.length; i++) {
202 assertEquals(i, buffer[i]);
203 }
204}
205TestForArrayKeys();
206
207
208function TestForArrayEntries() {
209 var buffer = [];
210 var array = [0, 'a', true, false, null, /* hole */, undefined, NaN];
211 var i = 0;
212 for (var entry of array.entries()) {
213 buffer[i++] = entry;
214 }
215
216 assertEquals(8, buffer.length);
217
218 for (var i = 0; i < buffer.length; i++) {
219 assertSame(array[i], buffer[i][1]);
220 }
221
222 for (var i = 0; i < buffer.length; i++) {
223 assertEquals(i, buffer[i][0]);
224 }
225}
226TestForArrayEntries();
227
228
229function TestForArray() {
230 var buffer = [];
231 var array = [0, 'a', true, false, null, /* hole */, undefined, NaN];
232 var i = 0;
233 for (var value of array) {
234 buffer[i++] = value;
235 }
236
237 assertEquals(8, buffer.length);
238
239 for (var i = 0; i < buffer.length; i++) {
240 assertSame(array[i], buffer[i]);
241 }
242}
243TestForArrayValues();
244
245
246function TestNonOwnSlots() {
247 var array = [0];
248 var iterator = array[Symbol.iterator]();
249 var object = {__proto__: iterator};
250
251 assertThrows(function() {
252 object.next();
253 }, TypeError);
254}
255TestNonOwnSlots();