1// Copyright JS Foundation and other contributors, http://js.foundation 2// 3// Licensed under the Apache License, Version 2.0 (the "License"); 4// you may not use this file except in compliance with the License. 5// You may obtain a copy of the License at 6// 7// http://www.apache.org/licenses/LICENSE-2.0 8// 9// Unless required by applicable law or agreed to in writing, software 10// distributed under the License is distributed on an "AS IS" BASIS 11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12// See the License for the specific language governing permissions and 13// limitations under the License. 14 15// This test will not pass on FLOAT32 due to precision issues 16 17var array = [54, undefined, "Lemon", -127]; 18 19var array1 = array.slice(); 20var array2 = array.slice("a", "3"); 21var array3 = array.slice(-2); 22var array4 = array.slice(-12, undefined); 23var array5 = array.slice(undefined, -3); 24var array6 = array.slice(Infinity, NaN); 25var array7 = array.slice(-Infinity, Infinity); 26var array8 = array.slice(NaN, -Infinity); 27 28assert (array1.length == 4); 29assert (array1[0] == 54); 30assert (array1[1] == undefined); 31assert (array1[2] == "Lemon"); 32assert (array1[3] == -127); 33 34assert (array2.length == 3); 35assert (array2[0] == 54); 36assert (array2[1] == undefined); 37assert (array2[2] == "Lemon"); 38 39assert (array3.length == 2); 40assert (array3[0] == "Lemon"); 41assert (array3[1] == -127); 42 43assert (array4.length == 4); 44assert (array4[0] == 54); 45assert (array4[1] == undefined); 46assert (array4[2] == "Lemon"); 47assert (array4[3] == -127); 48 49assert (array5.length == 1); 50assert (array5[0] == 54); 51 52assert (array6.length == 0); 53 54assert (array7.length == 4); 55assert (array7[0] == 54); 56assert (array7[1] == undefined); 57assert (array7[2] == "Lemon"); 58assert (array7[3] == -127); 59 60assert (array8.length == 0); 61 62var array = []; 63array[4294967293] = "foo"; 64array.length = 4294967295; 65var result = array.slice(4294967293, -1) 66assert(result.length === 1) 67assert(result[0] === "foo") 68 69array[0] = "bar"; 70var result = array.slice(-4294967295, -4294967294) 71assert(result.length === 1) 72assert(result[0] === "bar") 73 74var array = []; 75array[0] = "foo"; 76var result = array.slice(4294967296, 4294967297); 77assert(result.length === 0); 78 79array[4294967293] = "bar"; 80var result = array.slice(-4294967297, -4294967296); 81assert(result.length === 0); 82 83var arr = [1,2]; 84Array.prototype[0] = 3; 85var newArr = arr.slice(0, 1); 86delete Array.prototype[0]; 87assert(newArr.hasOwnProperty("0")); 88assert(newArr[0] === 1); 89 90// Checking behavior when unable to get length 91var obj = { slice : Array.prototype.slice }; 92Object.defineProperty(obj, 'length', { 'get' : function () { throw new ReferenceError ("foo"); } }); 93 94try { 95 obj.slice(1, 2); 96 assert (false); 97} catch (e) { 98 assert (e.message === "foo"); 99 assert (e instanceof ReferenceError); 100} 101 102// Checking behavior when unable to get element 103var obj = { length : 1, slice : Array.prototype.slice }; 104Object.defineProperty(obj, '0', { 'get' : function () { throw new ReferenceError ("foo"); } }); 105 106try { 107 obj.slice(0, 1); 108 assert (false); 109} catch (e) { 110 assert (e.message === "foo"); 111 assert (e instanceof ReferenceError); 112} 113 114/* ES v5.1 15.4.4.10.5. 115 Checking behavior when start value throws exception */ 116var arg1 = { }; 117Object.defineProperty(arg1, 'valueOf', { 'get' : function () { throw new ReferenceError ("foo"); } }); 118var obj = { slice : Array.prototype.slice }; 119 120try { 121 obj.slice(arg1); 122 assert(false); 123} catch (e) { 124 assert(e.message === 'foo'); 125 assert(e instanceof ReferenceError); 126} 127 128/* ES v5.1 15.4.4.10.7. 129 Checking behavior when end value throws exception */ 130var arg2 = { }; 131Object.defineProperty(arg2, 'valueOf', { 'get' : function () { throw new ReferenceError ("foo"); } }); 132var obj = { slice : Array.prototype.slice }; 133 134try { 135 obj.slice(0, arg2); 136 assert(false); 137} catch (e) { 138 assert(e.message === 'foo'); 139 assert(e instanceof ReferenceError); 140} 141 142/* ES v5.1 15.4.4.10.10. 143 Checking behavior when unable to get element */ 144var obj = { length : 3, slice : Array.prototype.slice }; 145Object.defineProperty(obj, '1', { 'get' : function () { throw new ReferenceError ("foo"); } }); 146 147try { 148 obj.slice(0, 3); 149 assert (false); 150} catch (e) { 151 assert (e.message === "foo"); 152 assert (e instanceof ReferenceError); 153} 154 155function array_check(result_array, expected_array) { 156 assert(result_array instanceof Array); 157 assert(result_array.length === expected_array.length); 158 for (var idx = 0; idx < expected_array.length; idx++) { 159 assert(result_array[idx] === expected_array[idx]); 160 } 161} 162 163// Remove the buffer 164var array = [1, 2, 3, 4, 5]; 165var value = array.slice(4, { 166 valueOf: function() { 167 array.length = 0; 168 } 169}) 170 171array_check(value, []); 172 173// Extend the buffer 174var array = [1, 2, 3, 4, 5]; 175var value = array.slice(6, { 176 valueOf: function() { 177 array.length = 10; 178 } 179}) 180 181array_check(value, []); 182 183// Reduce the buffer 184var array = [1, 2, 3, 4, 5]; 185var value = array.slice(1, { 186 valueOf: function() { 187 array.length = 3; 188 } 189}) 190 191array_check(value, []); 192