blob: f11b51cb8ff1321ef821de604c2941f4920d8ff5 [file] [log] [blame]
ager@chromium.org9258b6b2008-09-11 09:11:10 +00001// Copyright 2008 the V8 project authors. All rights reserved.
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00002// 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(a, 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