OLD | NEW |
| (Empty) |
1 // Copyright 2015 the V8 project authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 // Flags: --harmony-array-includes | |
6 | |
7 // Largely ported from | |
8 // https://github.com/tc39/Array.prototype.includes/tree/master/test/built-ins/T
ypedArray/prototype/includes | |
9 // using https://www.npmjs.org/package/test262-to-mjsunit with further edits | |
10 | |
11 | |
12 function testTypedArrays(callback) { | |
13 [ | |
14 Uint8Array, | |
15 Int8Array, | |
16 Uint16Array, | |
17 Int16Array, | |
18 Uint32Array, | |
19 Int32Array, | |
20 Uint8ClampedArray, | |
21 Float32Array, | |
22 Float64Array | |
23 ] | |
24 .forEach(callback); | |
25 } | |
26 | |
27 testTypedArrays.floatOnly = function (callback) { | |
28 [Float32Array, Float64Array].forEach(callback); | |
29 }; | |
30 | |
31 | |
32 // %TypedArray%.prototype.includes throws a TypeError when used on non-typed | |
33 // arrays | |
34 (function() { | |
35 var taIncludes = Uint8Array.prototype.includes; | |
36 | |
37 assertThrows(function() { | |
38 taIncludes.call({ | |
39 length: 2, | |
40 0: 1, | |
41 1: 2 | |
42 }, 2); | |
43 }, TypeError); | |
44 | |
45 assertThrows(function() { | |
46 taIncludes.call([1, 2, 3], 2); | |
47 }, TypeError); | |
48 | |
49 assertThrows(function() { | |
50 taIncludes.call(null, 2); | |
51 }, TypeError); | |
52 | |
53 assertThrows(function() { | |
54 taIncludes.call(undefined, 2); | |
55 }, TypeError); | |
56 })(); | |
57 | |
58 | |
59 // %TypedArray%.prototype.includes should terminate if ToNumber ends up being | |
60 // called on a symbol fromIndex | |
61 (function() { | |
62 testTypedArrays(function(TypedArrayConstructor) { | |
63 var ta = new TypedArrayConstructor([1, 2, 3]); | |
64 | |
65 assertThrows(function() { | |
66 ta.includes(2, Symbol()); | |
67 }, TypeError); | |
68 }); | |
69 })(); | |
70 | |
71 | |
72 // %TypedArray%.prototype.includes should terminate if an exception occurs | |
73 // converting the fromIndex to a number | |
74 (function() { | |
75 function Test262Error() {} | |
76 | |
77 var fromIndex = { | |
78 valueOf: function() { | |
79 throw new Test262Error(); | |
80 } | |
81 }; | |
82 | |
83 testTypedArrays(function(TypedArrayConstructor) { | |
84 var ta = new TypedArrayConstructor([1, 2, 3]); | |
85 | |
86 assertThrows(function() { | |
87 ta.includes(2, fromIndex); | |
88 }, Test262Error); | |
89 }); | |
90 })(); | |
91 | |
92 | |
93 // %TypedArray%.prototype.includes should search the whole array, as the | |
94 // optional second argument fromIndex defaults to 0 | |
95 (function() { | |
96 testTypedArrays(function(TypedArrayConstructor) { | |
97 var ta = new TypedArrayConstructor([1, 2, 3]); | |
98 assertTrue(ta.includes(1)); | |
99 assertTrue(ta.includes(2)); | |
100 assertTrue(ta.includes(3)); | |
101 }); | |
102 })(); | |
103 | |
104 | |
105 // %TypedArray%.prototype.includes returns false if fromIndex is greater or | |
106 // equal to the length of the array | |
107 (function() { | |
108 testTypedArrays(function(TypedArrayConstructor) { | |
109 var ta = new TypedArrayConstructor([1, 2]); | |
110 assertFalse(ta.includes(2, 3)); | |
111 assertFalse(ta.includes(2, 2)); | |
112 }); | |
113 })(); | |
114 | |
115 | |
116 // %TypedArray%.prototype.includes searches the whole array if the computed | |
117 // index from the given negative fromIndex argument is less than 0 | |
118 (function() { | |
119 testTypedArrays(function(TypedArrayConstructor) { | |
120 var ta = new TypedArrayConstructor([1, 3]); | |
121 assertTrue(ta.includes(1, -4)); | |
122 assertTrue(ta.includes(1, -4)); | |
123 }); | |
124 })(); | |
125 | |
126 | |
127 // %TypedArray%.prototype.includes should use a negative value as the offset | |
128 // from the end of the array to compute fromIndex | |
129 (function() { | |
130 testTypedArrays(function(TypedArrayConstructor) { | |
131 var ta = new TypedArrayConstructor([12, 13]); | |
132 assertTrue(ta.includes(13, -1)); | |
133 assertFalse(ta.includes(12, -1)); | |
134 assertTrue(ta.includes(12, -2)); | |
135 }); | |
136 })(); | |
137 | |
138 | |
139 // %TypedArray%.prototype.includes converts its fromIndex parameter to an | |
140 // integer | |
141 (function() { | |
142 testTypedArrays(function(TypedArrayConstructor) { | |
143 var ta = new TypedArrayConstructor([1, 2, 3]); | |
144 assertFalse(ta.includes(1, 3.3)); | |
145 assertTrue(ta.includes(1, -Infinity)); | |
146 assertTrue(ta.includes(3, 2.9)); | |
147 assertTrue(ta.includes(3, NaN)); | |
148 | |
149 var numberLike = { | |
150 valueOf: function() { | |
151 return 2; | |
152 } | |
153 }; | |
154 | |
155 assertFalse(ta.includes(1, numberLike)); | |
156 assertFalse(ta.includes(1, "2")); | |
157 assertTrue(ta.includes(3, numberLike)); | |
158 assertTrue(ta.includes(3, "2")); | |
159 }); | |
160 })(); | |
161 | |
162 | |
163 // %TypedArray%.prototype.includes should have length 1 | |
164 (function() { | |
165 assertEquals(1, Uint8Array.prototype.includes.length); | |
166 })(); | |
167 | |
168 | |
169 // %TypedArray%.prototype.includes should have name property with value | |
170 // 'includes' | |
171 (function() { | |
172 assertEquals("includes", Uint8Array.prototype.includes.name); | |
173 })(); | |
174 | |
175 | |
176 // %TypedArray%.prototype.includes should always return false on zero-length | |
177 // typed arrays | |
178 (function() { | |
179 testTypedArrays(function(TypedArrayConstructor) { | |
180 var ta = new TypedArrayConstructor([]); | |
181 assertFalse(ta.includes(2)); | |
182 assertFalse(ta.includes()); | |
183 assertFalse(ta.includes(undefined)); | |
184 assertFalse(ta.includes(NaN)); | |
185 }); | |
186 })(); | |
187 | |
188 | |
189 // %TypedArray%.prototype.includes should use the SameValueZero algorithm to | |
190 // compare | |
191 (function() { | |
192 testTypedArrays.floatOnly(function(FloatArrayConstructor) { | |
193 assertTrue(new FloatArrayConstructor([1, 2, NaN]).includes(NaN)); | |
194 assertTrue(new FloatArrayConstructor([1, 2, -0]).includes(+0)); | |
195 assertTrue(new FloatArrayConstructor([1, 2, -0]).includes(-0)); | |
196 assertTrue(new FloatArrayConstructor([1, 2, +0]).includes(-0)); | |
197 assertTrue(new FloatArrayConstructor([1, 2, +0]).includes(+0)); | |
198 assertFalse(new FloatArrayConstructor([1, 2, -Infinity]).includes(+Infinity)
); | |
199 assertTrue(new FloatArrayConstructor([1, 2, -Infinity]).includes(-Infinity))
; | |
200 assertFalse(new FloatArrayConstructor([1, 2, +Infinity]).includes(-Infinity)
); | |
201 assertTrue(new FloatArrayConstructor([1, 2, +Infinity]).includes(+Infinity))
; | |
202 }); | |
203 })(); | |
OLD | NEW |