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(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 229