%TypedArray%.prototype.indexOf is coercing non-integers or non-floats to numbers...
[WebKit-https.git] / Source / JavaScriptCore / tests / stress / resources / typedarray-test-helper-functions.js
1 load("./resources/standalone-pre.js");
2
3 var typedArrays = [Int8Array, Uint8Array, Uint8ClampedArray, Int16Array, Uint16Array, Int32Array, Uint32Array, Float32Array, Float64Array];
4
5 var signedArrays = [Int8Array, Int16Array, Int32Array, Float32Array, Float64Array];
6
7 var intArrays = [Int8Array, Uint8Array, Uint8ClampedArray, Int16Array, Uint16Array, Int32Array, Uint32Array];
8
9 var floatArrays = [Float32Array, Float64Array];
10
11 function forEachTypedArray(constructors, testFunction /* , initialValues */ ) {
12     let initialValues = arguments[2];
13     for (let i = 0; i < constructors.length; ++i) {
14         let typedArray = constructors[i];
15
16         let array;
17         if (initialValues) {
18             array = new typedArray(initialValues);
19         } else
20             array = new typedArray();
21
22         let testResult = testFunction(array, typedArray)
23         if (testResult !== true)
24             return testResult;
25     }
26
27     return true;
28 }
29
30 function isSameFunctionForEachTypedArrayPrototype(name) {
31     function eq(array) { return array[name] === Int32Array.prototype[name]; }
32     return forEachTypedArray(typedArrays, eq);
33 }
34
35 function hasSameValues(msg, array1, array2) {
36     if (array1.length !== array2.length) {
37         debug(msg +  " first array: " + array1 + " second array: " + array2);
38         return false;
39     }
40
41     let allSame = true;
42     for (let i = 0; i < array1.length; ++i) {
43         allSame = allSame && Object.is(array1[i], array2[i]);
44     }
45
46     if (!allSame)
47         debug(msg +  " first array: " + array1 + " second array: " + array2);
48     return allSame;
49
50 }
51
52 function testPrototypeFunctionHelper(constructors, name, args, init, result, expectedArray) {
53
54     function foo(array, constructor) {
55         let res = eval("array." + name + args);
56
57         if (expectedArray) {
58             if (!hasSameValues("array did not change correctly on " + constructor + ",", array, expectedArray))
59                 return false;
60         }
61
62         if (typeof result === "object")
63             return hasSameValues(name + " returned the wrong result on " + constructor + ",", res, result);
64         else {
65             if (res !== result) {
66                 debug(name + " returned the wrong result on " + constructor + ", returned: " + res + " but expected: " + result);
67                 return false;
68             }
69             return true;
70         }
71     }
72
73     return forEachTypedArray(constructors, foo, init);
74 }
75
76 function testPrototypeFunctionOnSigned(name, args, init, result /* expectedArray */) {
77     return testPrototypeFunctionHelper(signedArrays, name, args, init, result, arguments[4]);
78 }
79
80 function testPrototypeFunctionOnFloat(name, args, init, result /* expectedArray */) {
81     return testPrototypeFunctionHelper(floatArrays, name, args, init, result, arguments[4]);
82 }
83
84 function testPrototypeFunction(name, args, init, result /* expectedArray */) {
85     return testPrototypeFunctionHelper(typedArrays, name, args, init, result, arguments[4]);
86 }
87
88 function testPrototypeReceivesArray(name, thisValues) {
89     function tester (array, constructor) {
90         var passed = true;
91         for (var thisValue of thisValues) {
92             try {
93                 eval("array." + name).call(thisValue);
94                 passed = false;
95                 debug("did not throw an error when given an invalid |this| on " + constructor);
96             } catch (err) {}
97
98         }
99
100         return passed;
101     }
102
103     return forEachTypedArray(typedArrays, tester);
104 }
105