1// Copyright 2008 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
28// Tests for non-standard array iteration functions.
29//
30// See
31//
32// <http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array>
33//
34// for an explanation of each of the functions.
35
36//
37// Array.prototype.filter
38//
39(function() {
40  // Simple use.
41  var a = [0,1];
42  assertArrayEquals([0], a.filter(function(n) { return n == 0; }));
43  assertArrayEquals([0,1], a);
44
45  // Use specified object as this object when calling the function.
46  var o = { value: 42 }
47  a = [1,42,3,42,4];
48  assertArrayEquals([42,42], a.filter(function(n) { return this.value == n }, o))
49
50  // Modify original array.
51  a = [1,42,3,42,4];
52  assertArrayEquals([42,42], a.filter(function(n, index, array) { array[index] = 43; return 42 == n; }));
53  assertArrayEquals([43,43,43,43,43], a);
54
55  // Only loop through initial part of array eventhough elements are
56  // added.
57  a = [1,1];
58  assertArrayEquals([], a.filter(function(n, index, array) { array.push(n+1); return n == 2; }));
59  assertArrayEquals([1,1,2,2], a);
60
61  // Respect holes.
62  a = new Array(20);
63  var count = 0;
64  a[2] = 2;
65  a[15] = 2;
66  a[17] = 4;
67  var a = a.filter(function(n) { count++; return n == 2; });
68  assertEquals(3, count);
69  for (var i in a) assertEquals(2, a[i]);
70
71})();
72
73
74//
75// Array.prototype.forEach
76//
77(function() {
78  // Simple use.
79  var a = [0,1];
80  var count = 0;
81  a.forEach(function(n) { count++; });
82  assertEquals(2, count);
83
84  // Use specified object as this object when calling the function.
85  var o = { value: 42 }
86  var result = [];
87  a.forEach(function(n) { result.push(this.value); }, o);
88  assertArrayEquals([42,42], result);
89
90  // Modify original array.
91  a = [0,1];
92  count = 0;
93  a.forEach(function(n, index, array) { array[index] = n + 1; count++; });
94  assertEquals(2, count);
95  assertArrayEquals([1,2], a);
96
97  // Only loop through initial part of array eventhough elements are
98  // added.
99  a = [1,1];
100  count = 0;
101  a.forEach(function(n, index, array) { array.push(n+1); count++; });
102  assertEquals(2, count);
103  assertArrayEquals([1,1,2,2], a);
104
105  // Respect holes.
106  a = new Array(20);
107  count = 0;
108  a[15] = 2;
109  a.forEach(function(n) { count++; });
110  assertEquals(1, count);
111
112})();
113
114
115//
116// Array.prototype.every
117//
118(function() {
119  // Simple use.
120  var a = [0,1];
121  assertFalse(a.every(function(n) { return n == 0 }));
122  a = [0,0];
123  assertTrue(a.every(function(n) { return n == 0 }));
124  assertTrue([].every(function(n) { return n == 0}));
125
126  // Use specified object as this object when calling the function.
127  var o = { value: 42 }
128  a = [0];
129  assertFalse(a.every(function(n) { return this.value == n; }, o));
130  a = [42];
131  assertTrue(a.every(function(n) { return this.value == n; }, o));
132
133  // Modify original array.
134  a = [0,1];
135  assertFalse(a.every(function(n, index, array) { array[index] = n + 1; return n == 1;}));
136  assertArrayEquals([1,1], a);
137
138  // Only loop through initial part of array eventhough elements are
139  // added.
140  a = [1,1];
141  assertTrue(a.every(function(n, index, array) { array.push(n + 1); return n == 1;}));
142  assertArrayEquals([1,1,2,2], a);
143
144  // Respect holes.
145  a = new Array(20);
146  var count = 0;
147  a[2] = 2;
148  a[15] = 2;
149  assertTrue(a.every(function(n) { count++; return n == 2; }));
150  assertEquals(2, count);
151
152})();
153
154//
155// Array.prototype.map
156//
157(function() {
158  var a = [0,1,2,3,4];
159
160  // Simple use.
161  var result = [1,2,3,4,5];
162  assertArrayEquals(result, a.map(function(n) { return n + 1; }));
163  assertEquals(a, a);
164
165  // Use specified object as this object when calling the function.
166  var o = { delta: 42 }
167  result = [42,43,44,45,46];
168  assertArrayEquals(result, a.map(function(n) { return this.delta + n; }, o));
169
170  // Modify original array.
171  a = [0,1,2,3,4];
172  result = [1,2,3,4,5];
173  assertArrayEquals(result, a.map(function(n, index, array) { array[index] = n + 1; return n + 1;}));
174  assertArrayEquals(result, a);
175
176  // Only loop through initial part of array eventhough elements are
177  // added.
178  a = [0,1,2,3,4];
179  result = [1,2,3,4,5];
180  assertArrayEquals(result, a.map(function(n, index, array) { array.push(n); return n + 1;}));
181  assertArrayEquals([0,1,2,3,4,0,1,2,3,4], a);
182
183  // Respect holes.
184  a = new Array(20);
185  a[15] = 2;
186  a = a.map(function(n) { return 2*n; });
187  for (var i in a) assertEquals(4, a[i]);
188
189})();
190
191//
192// Array.prototype.some
193//
194(function() {
195  var a = [0,1,2,3,4];
196
197  // Simple use.
198  assertTrue(a.some(function(n) { return n == 3}));
199  assertFalse(a.some(function(n) { return n == 5}));
200
201  // Use specified object as this object when calling the function.
202  var o = { element: 42 };
203  a = [1,42,3];
204  assertTrue(a.some(function(n) { return this.element == n; }, o));
205  a = [1];
206  assertFalse(a.some(function(n) { return this.element == n; }, o));
207
208  // Modify original array.
209  a = [0,1,2,3];
210  assertTrue(a.some(function(n, index, array) { array[index] = n + 1; return n == 2; }));
211  assertArrayEquals([1,2,3,3], a);
212
213  // Only loop through initial part when elements are added.
214  a = [0,1,2];
215  assertFalse(a.some(function(n, index, array) { array.push(42); return n == 42; }));
216  assertArrayEquals([0,1,2,42,42,42], a);
217
218  // Respect holes.
219  a = new Array(20);
220  var count = 0;
221  a[2] = 42;
222  a[10] = 2;
223  a[15] = 42;
224  assertTrue(a.some(function(n) { count++; return n == 2; }));
225  assertEquals(2, count);
226
227})();
228