Ben Murdoch | 4a90d5f | 2016-03-22 12:00:34 +0000 | [diff] [blame] | 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 | var typedArrayConstructors = [ |
| 6 | Uint8Array, |
| 7 | Int8Array, |
| 8 | Uint16Array, |
| 9 | Int16Array, |
| 10 | Uint32Array, |
| 11 | Int32Array, |
| 12 | Uint8ClampedArray, |
| 13 | Float32Array, |
| 14 | Float64Array |
| 15 | ]; |
| 16 | |
| 17 | function assertArrayLikeEquals(value, expected, type) { |
| 18 | assertEquals(value.__proto__, type.prototype); |
| 19 | // Don't test value.length because we mess with that; |
| 20 | // instead in certain callsites we check that length |
| 21 | // is set appropriately. |
| 22 | for (var i = 0; i < expected.length; ++i) { |
| 23 | // Use Object.is to differentiate between +-0 |
| 24 | assertSame(expected[i], value[i]); |
| 25 | } |
| 26 | } |
| 27 | |
| 28 | for (var constructor of typedArrayConstructors) { |
| 29 | // Test default numerical sorting order |
| 30 | var a = new constructor([100, 7, 45]) |
| 31 | assertEquals(a.sort(), a); |
| 32 | assertArrayLikeEquals(a, [7, 45, 100], constructor); |
| 33 | assertEquals(a.length, 3); |
| 34 | |
| 35 | // For arrays of floats, certain handling of +-0/NaN |
| 36 | if (constructor === Float32Array || constructor === Float64Array) { |
| 37 | var b = new constructor([+0, -0, NaN, -0, NaN, +0]) |
| 38 | b.sort(); |
| 39 | assertArrayLikeEquals(b, [-0, -0, +0, +0, NaN, NaN], constructor); |
| 40 | assertEquals(b.length, 6); |
| 41 | } |
| 42 | |
| 43 | // Custom sort--backwards |
| 44 | a.sort(function(x, y) { return y - x; }); |
| 45 | assertArrayLikeEquals(a, [100, 45, 7], constructor); |
| 46 | |
| 47 | // Basic TypedArray method properties: |
| 48 | // Length field is ignored |
| 49 | Object.defineProperty(a, 'length', {value: 1}); |
| 50 | assertEquals(a.sort(), a); |
| 51 | assertArrayLikeEquals(a, [7, 45, 100], constructor); |
| 52 | assertEquals(a.length, 1); |
| 53 | // Method doesn't work on other objects |
| 54 | assertThrows(function() { a.sort.call([]); }, TypeError); |
| 55 | } |