• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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