blob: 579d80106355c22b6f73ee8a160023cfe2937f5f [file] [log] [blame]
load("./standalone-pre.js", "caller relative");
var typedArrays = [Int8Array, Uint8Array, Uint8ClampedArray, Int16Array, Uint16Array, Int32Array, Uint32Array, Float32Array, Float64Array];
var signedArrays = [Int8Array, Int16Array, Int32Array, Float32Array, Float64Array];
var intArrays = [Int8Array, Uint8Array, Uint8ClampedArray, Int16Array, Uint16Array, Int32Array, Uint32Array];
var floatArrays = [Float32Array, Float64Array];
function forEachTypedArray(constructors, testFunction /* , initialValues */ ) {
let initialValues = arguments[2];
for (let i = 0; i < constructors.length; ++i) {
let typedArray = constructors[i];
let array;
if (initialValues) {
array = new typedArray(initialValues);
} else
array = new typedArray();
let testResult = testFunction(array, typedArray)
if (testResult !== true)
return testResult;
}
return true;
}
function isSameFunctionForEachTypedArrayPrototype(name) {
function eq(array) { return array[name] === Int32Array.prototype[name]; }
return forEachTypedArray(typedArrays, eq);
}
function hasSameValues(msg, array1, array2) {
if (array1.length !== array2.length) {
debug(msg + " first array: " + array1 + " second array: " + array2);
return false;
}
let allSame = true;
for (let i = 0; i < array1.length; ++i) {
allSame = allSame && Object.is(array1[i], array2[i]);
}
if (!allSame)
debug(msg + " first array: " + array1 + " second array: " + array2);
return allSame;
}
function testPrototypeFunctionHelper(constructors, name, args, init, result, expectedArray) {
function foo(array, constructor) {
let res = eval("array." + name + args);
if (expectedArray) {
if (!hasSameValues("array did not change correctly on " + constructor + ",", array, expectedArray))
return false;
}
if (typeof result === "object")
return hasSameValues(name + " returned the wrong result on " + constructor + ",", res, result);
else {
if (res !== result) {
debug(name + " returned the wrong result on " + constructor + ", returned: " + res + " but expected: " + result);
return false;
}
return true;
}
}
return forEachTypedArray(constructors, foo, init);
}
function testPrototypeFunctionOnSigned(name, args, init, result /* expectedArray */) {
return testPrototypeFunctionHelper(signedArrays, name, args, init, result, arguments[4]);
}
function testPrototypeFunctionOnFloat(name, args, init, result /* expectedArray */) {
return testPrototypeFunctionHelper(floatArrays, name, args, init, result, arguments[4]);
}
function testPrototypeFunction(name, args, init, result /* expectedArray */) {
return testPrototypeFunctionHelper(typedArrays, name, args, init, result, arguments[4]);
}
function testPrototypeReceivesArray(name, thisValues) {
function tester (array, constructor) {
var passed = true;
for (var thisValue of thisValues) {
try {
eval("array." + name).call(thisValue);
passed = false;
debug("did not throw an error when given an invalid |this| on " + constructor);
} catch (err) {}
}
return passed;
}
return forEachTypedArray(typedArrays, tester);
}