Add a benchmark for string transcoding.
[WebKit-https.git] / LayoutTests / js / regress / script-tests / string-transcoding.js
1 function decodeUTF8(array) {
2     var string = "";
3     for (var i = 0; i < array.length; ++i)
4         string += String.fromCharCode(array[i]);
5     return decodeURIComponent(escape(string));
6 }
7
8 function encodeUTF8(string) {
9     string = unescape(encodeURIComponent(string));
10
11     var array = new Uint8Array(string.length);
12     for (var i = 0; i < array.length; ++i)
13         array[i] = string.charCodeAt(i);
14     return array;
15 }
16
17 function arraysEqual(a, b) {
18     if (a.length != b.length)
19         return false;
20     for (var i = 0; i < a.length; ++i) {
21         if (a[i] != b[i])
22             return false;
23     }
24     return true;
25 }
26
27 function arrayToString(array) {
28     return "[" + Array.prototype.join.call(array, ", ") + "]";
29 }
30
31 function setHeader(s) {
32 }
33
34 function print(s) {
35     document.getElementById("console").innerHTML += "<br/>" + s;
36 }
37
38 function tryArray(array) {
39     try {
40         var string = decodeUTF8(array);
41         try {
42             var array2 = encodeUTF8(string);
43             if (!arraysEqual(array, array2)) {
44                 print("Round trip failed: " + arrayToString(array) + " turned into " + arrayToString(array2));
45                 return;
46             }
47         } catch (e) {
48             print("Threw exception in encode for: " + arrayToString(array));
49             return;
50         }
51     } catch (e) {
52         return;
53     }
54 }
55
56 var array = new Uint8Array(5);
57
58 function doSteps(numSteps) {
59     while (numSteps--) {
60         tryArray(array);
61
62         var done = false;
63         array[0]++;
64         for (var i = 0; i < array.length; ++i) {
65             if (array[i])
66                 break;
67             if (i + 1 == array.length) {
68                 done = true;
69                 break;
70             }
71             array[i + 1]++;
72         }
73
74         if (done)
75             return false;
76     }
77
78     return true;
79 }
80
81 doSteps(5000);