blob: e60c88f6e71d7d62874f9eef4738e3df999b281f [file] [log] [blame]
// Copyright 2015 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Flags: --allow-natives-syntax
var typedArrayConstructors = [
Uint8Array,
Int8Array,
Uint16Array,
Int16Array,
Uint32Array,
Int32Array,
Uint8ClampedArray,
Float32Array,
Float64Array];
function CheckEachTypedArray(fn) {
typedArrayConstructors.forEach(fn);
}
CheckEachTypedArray(function copyWithinArity(constructor) {
assertEquals(new constructor([]).copyWithin.length, 2);
});
CheckEachTypedArray(function copyWithinTargetAndStart(constructor) {
// works with two arguments
assertArrayEquals([4, 5, 3, 4, 5],
new constructor([1, 2, 3, 4, 5]).copyWithin(0, 3));
assertArrayEquals([1, 4, 5, 4, 5],
new constructor([1, 2, 3, 4, 5]).copyWithin(1, 3));
assertArrayEquals([1, 3, 4, 5, 5],
new constructor([1, 2, 3, 4, 5]).copyWithin(1, 2));
assertArrayEquals([1, 2, 3, 4, 5],
new constructor([1, 2, 3, 4, 5]).copyWithin(2, 2));
});
CheckEachTypedArray(function copyWithinTargetStartAndEnd(constructor) {
// works with three arguments
assertArrayEquals(new constructor([1, 2, 3, 4, 5]).copyWithin(0, 3, 4),
[4, 2, 3, 4, 5]);
assertArrayEquals(new constructor([1, 2, 3, 4, 5]).copyWithin(1, 3, 4),
[1, 4, 3, 4, 5]);
assertArrayEquals(new constructor([1, 2, 3, 4, 5]).copyWithin(1, 2, 4),
[1, 3, 4, 4, 5]);
});
CheckEachTypedArray(function copyWithinNegativeRelativeOffsets(constructor) {
// works with negative arguments
assertArrayEquals([4, 5, 3, 4, 5],
new constructor([1, 2, 3, 4, 5]).copyWithin(0, -2));
assertArrayEquals([4, 2, 3, 4, 5],
new constructor([1, 2, 3, 4, 5]).copyWithin(0, -2, -1));
assertArrayEquals([1, 3, 3, 4, 5],
new constructor([1, 2, 3, 4, 5]).copyWithin(-4, -3, -2));
assertArrayEquals([1, 3, 4, 4, 5],
new constructor([1, 2, 3, 4, 5]).copyWithin(-4, -3, -1));
assertArrayEquals([1, 3, 4, 5, 5],
new constructor([1, 2, 3, 4, 5]).copyWithin(-4, -3));
// test with arguments equal to -this.length
assertArrayEquals([1, 2, 3, 4, 5],
new constructor([1, 2, 3, 4, 5]).copyWithin(-5, 0));
});
CheckEachTypedArray(function mustBeTypedArray(constructor) {
// throws on non-TypedArray values
assertThrows(function() {
return constructor.prototype.copyWithin.call(null, 0, 3);
}, TypeError);
assertThrows(function() {
return constructor.prototype.copyWithin.call(undefined, 0, 3);
}, TypeError);
assertThrows(function() {
return constructor.prototype.copyWithin.call(34, 0, 3);
}, TypeError);
assertThrows(function() {
return constructor.prototype.copyWithin.call([1, 2, 3, 4, 5], 0, 3);
}, TypeError);
});
CheckEachTypedArray(function copyWithinStartLessThanTarget(constructor) {
// test with target > start on 2 arguments
assertArrayEquals([1, 2, 3, 1, 2],
new constructor([1, 2, 3, 4, 5]).copyWithin(3, 0));
// test with target > start on 3 arguments
assertArrayEquals([1, 2, 3, 1, 2],
new constructor([1, 2, 3, 4, 5]).copyWithin(3, 0, 4));
});
CheckEachTypedArray(function copyWithinNonIntegerRelativeOffsets(constructor) {
// test on fractional arguments
assertArrayEquals([4, 5, 3, 4, 5],
new constructor([1, 2, 3, 4, 5]).copyWithin(0.2, 3.9));
});
CheckEachTypedArray(function copyWithinNegativeZeroTarget(constructor) {
// test with -0
assertArrayEquals([4, 5, 3, 4, 5],
new constructor([1, 2, 3, 4, 5]).copyWithin(-0, 3));
});
CheckEachTypedArray(function copyWithinTargetOutsideStart(constructor) {
// test with arguments more than this.length
assertArrayEquals([1, 2, 3, 4, 5],
new constructor([1, 2, 3, 4, 5]).copyWithin(0, 7));
// test with arguments less than -this.length
assertArrayEquals([1, 2, 3, 4, 5],
new constructor([1, 2, 3, 4, 5]).copyWithin(-7, 0));
});
CheckEachTypedArray(function copyWithinEmptyArray(constructor) {
// test on empty array
assertArrayEquals([], new constructor([]).copyWithin(0, 3));
});
CheckEachTypedArray(function copyWithinTargetCutOff(constructor) {
// test with target range being shorter than end - start
assertArrayEquals([1, 2, 2, 3, 4], [1, 2, 3, 4, 5].copyWithin(2, 1, 4));
});
CheckEachTypedArray(function copyWithinOverlappingRanges(constructor) {
// test overlapping ranges
var arr = [1, 2, 3, 4, 5];
arr.copyWithin(2, 1, 4);
assertArrayEquals([1, 2, 2, 2, 3], arr.copyWithin(2, 1, 4));
});
CheckEachTypedArray(function copyWithinDefaultEnd(constructor) {
// undefined as third argument
assertArrayEquals([4, 5, 3, 4, 5],
new constructor([1, 2, 3, 4, 5]).copyWithin(0, 3, undefined));
});
CheckEachTypedArray(function copyWithinLargeArray(constructor) {
var large = 10000;
// test on a large array
var arr = new constructor(large);
assertArrayEquals(arr, arr.copyWithin(45, 9000));
var expected = new Array(large);
// test on numbers
for (var i = 0; i < large; i++) {
arr[i] = Math.random() * 100; // May be cast to an int
expected[i] = arr[i];
if (i >= 9000) {
expected[(i - 9000) + 45] = arr[i];
}
}
assertArrayEquals(expected, arr.copyWithin(45, 9000));
// test array length remains same
assertEquals(large, arr.length);
});
CheckEachTypedArray(function copyWithinNullEnd(constructor) {
// test null on third argument is converted to +0
assertArrayEquals([1, 2, 3, 4, 5],
new constructor([1, 2, 3, 4, 5]).copyWithin(0, 3, null));
});
CheckEachTypedArray(function copyWithinMinusInfinityTarget(constructor) {
var arr = new constructor([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
var expected = [6, 7, 8, 9, 10, 6, 7, 8, 9, 10];
assertArrayEquals(expected, arr.copyWithin(-Infinity, 5));
assertEquals(10, arr.length);
});
CheckEachTypedArray(function copyWithinPositiveInfinityTarget(constructor) {
var arr = new constructor([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
var expected = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
assertArrayEquals(expected, arr.copyWithin(+Infinity, 5));
assertEquals(10, arr.length);
});
CheckEachTypedArray(function copyWithinMinusInfinityStart(constructor) {
var arr = new constructor([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
var expected = [1, 2, 3, 4, 5, 1, 2, 3, 4, 5];
assertArrayEquals(expected, arr.copyWithin(5, -Infinity));
assertEquals(10, arr.length);
});
CheckEachTypedArray(function copyWithinPositiveInfinityStart(constructor) {
var arr = new constructor([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
var expected = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
assertArrayEquals(expected, arr.copyWithin(5, +Infinity));
assertEquals(10, arr.length);
});
CheckEachTypedArray(function copyWithinMinusInfinityEnd(constructor) {
var arr = new constructor([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
var expected = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
assertArrayEquals(expected, arr.copyWithin(5, 0, -Infinity));
assertEquals(10, arr.length);
});
CheckEachTypedArray(function copyWithinPositiveInfinityEnd(constructor) {
var arr = new constructor([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
var expected = [1, 2, 3, 4, 5, 1, 2, 3, 4, 5];
assertArrayEquals(expected, arr.copyWithin(5, 0, +Infinity));
assertEquals(10, arr.length);
});
CheckEachTypedArray(function parametersNotCalledIfDetached(constructor) {
var tmp = {
[Symbol.toPrimitive]() {
assertUnreachable("Parameter should not be processed when " +
"array.[[ViewedArrayBuffer]] is detached.");
return 0;
}
};
var array = new constructor([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
%ArrayBufferDetach(array.buffer);
assertThrows(() => array.copyWithin(tmp, tmp, tmp), TypeError);
assertEquals(0, array.length, "array.[[ViewedArrayBuffer]] is detached");
});