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