[CMake] Have checks are not getting set inside CMake properly
[WebKit-https.git] / PerformanceTests / TailBench9000 / merge-sort.js
1 "use strict";
2
3 function TEST_mergeSort()
4 {
5     function createRNG(seed)
6     {
7         return function() {
8             // Robert Jenkins' 32 bit integer hash function.
9             seed = ((seed + 0x7ed55d16) + (seed << 12))  & 0xffffffff;
10             seed = ((seed ^ 0xc761c23c) ^ (seed >>> 19)) & 0xffffffff;
11             seed = ((seed + 0x165667b1) + (seed << 5))   & 0xffffffff;
12             seed = ((seed + 0xd3a2646c) ^ (seed << 9))   & 0xffffffff;
13             seed = ((seed + 0xfd7046c5) + (seed << 3))   & 0xffffffff;
14             seed = ((seed ^ 0xb55a4f09) ^ (seed >>> 16)) & 0xffffffff;
15             return (seed & 0xfffffff) / 0x10000000;
16         };
17     }
18     
19     let random = createRNG(0x7a11bec8);
20
21     function mergeSorted(array, compare)
22     {
23         if (array.length <= 1)
24             return array;
25         
26         let midIndex = Math.floor(array.length / 2);
27         let left = mergeSorted(array.slice(0, midIndex), compare);
28         let right = mergeSorted(array.slice(midIndex), compare);
29         
30         let result = [];
31         
32         function finish(source, index)
33         {
34             if (index >= source.length)
35                 return;
36             result.push(source[index]);
37             return finish(source, index + 1);
38         }
39         
40         function merge(leftIndex, rightIndex)
41         {
42             if (leftIndex >= left.length)
43                 return finish(right, rightIndex);
44             if (rightIndex >= right.length)
45                 return finish(left, leftIndex);
46             
47             let leftValue = left[leftIndex];
48             let rightValue = right[rightIndex];
49             let comparisonResult = compare(leftValue, rightValue);
50             if (comparisonResult < 0) {
51                 result.push(leftValue);
52                 return merge(leftIndex + 1, rightIndex);
53             }
54             result.push(rightValue);
55             return merge(leftIndex, rightIndex + 1);
56         }
57         
58         merge(0, 0);
59         
60         return result;
61     }
62     
63     function checkSorted(array)
64     {
65         function check(index)
66         {
67             if (index >= array.length - 1)
68                 return;
69             
70             if (array[index] > array[index + 1])
71                 throw new Error("array not sorted at index " + index + ": " + array);
72             
73             return check(index + 1);
74         }
75         
76         check(0);
77     }
78     
79     function checkSpectrum(a, b)
80     {
81         var aMap = new Map();
82         var bMap = new Map();
83         
84         function add(map, value)
85         {
86             let existing = map.get(value);
87             if (existing == null)
88                 existing = 0;
89             map.set(value, existing + 1);
90         }
91         
92         function build(map, array, index)
93         {
94             if (index >= array.length)
95                 return;
96             
97             add(map, array[index]);
98             return build(map, array, index + 1);
99         }
100         
101         build(aMap, a, 0);
102         build(bMap, b, 0);
103         
104         function compare(keys)
105         {
106             let entry = keys.next();
107             if (entry.done)
108                 return;
109             if (aMap.get(entry.value) != bMap.get(entry.value))
110                 throw new Error("arrays don't have the same number of: " + entry.value + " (a = " + a + ", b = " + b + ")");
111             return compare(keys);
112         }
113         
114         compare(aMap.keys());
115     }
116     
117     function buildArray(length, value)
118     {
119         let array = [];
120         
121         function build()
122         {
123             if (array.length >= length)
124                 return;
125             array.push(value(array.length));
126             return build();
127         }
128         
129         build();
130         
131         return array;
132     }
133     
134     let arrays = [
135         buildArray(10, x => x),
136         buildArray(10, x => -x),
137         buildArray(10000, x => random())
138     ];
139     
140     function test(index)
141     {
142         if (index >= arrays.length)
143             return;
144         
145         let array = arrays[index];
146         let sorted = mergeSorted(array, (a, b) => a < b ? -1 : a > b ? 1 : 0);
147         checkSorted(sorted);
148         checkSpectrum(array, sorted);
149         test(index + 1)
150     }
151     
152     test(0);
153 }
154
155 for (var i = 0; i < 100; ++i)
156     TEST_mergeSort();