Reviewed by Darin.
[WebKit-https.git] / LayoutTests / fast / regex / pcre-test-runner.js
1 if (window.layoutTestController)
2     layoutTestController.dumpAsText();
3
4 var console_messages = null;
5
6 function log(message)
7 {
8     if (!console_messages) {
9         console_messages = document.createElement("pre");
10         document.body.appendChild(console_messages);
11     }
12     console_messages.appendChild(document.createTextNode(message + "\n"));
13 }
14
15 function fetchText(url) {
16     try {
17         var req = new XMLHttpRequest;
18         req.open("GET", url, false);
19         try {
20             req.overrideMimeType("text/plain; charset=utf-8");
21         } catch (ex) {
22         }
23         req.send();
24         return req.responseText;
25     } catch (ex) {
26         log ("FAILED to read " + url);
27     }
28 }
29
30 function replaceEscapes(str) {
31     var pos;
32     var endPos;
33     
34     // \x{41}
35     while ((pos = str.indexOf("\\x{")) != -1) {
36         endPos = pos + 1;
37         while (str[endPos] != "}")
38             ++endPos;
39         var code = parseInt(str.substring(pos + 3, endPos), 16);
40         str = str.substr(0, pos) + String.fromCharCode(code) + str.substr(endPos + 1);
41     }
42
43     // \071
44     while ((pos = str.indexOf("\\0")) != -1) {
45         endPos = pos + 4;
46         var code = parseInt(str.substring(pos + 2, endPos), 8);
47         str = str.substr(0, pos) + String.fromCharCode(code) + str.substr(endPos);
48     }
49
50     // \x7f
51     while ((pos = str.indexOf("\\x")) != -1) {
52         endPos = pos + 4;
53         var code = parseInt(str.substring(pos + 2, endPos), 16);
54         str = str.substr(0, pos) + String.fromCharCode(code) + str.substr(endPos);
55     }
56
57     return str;
58 }
59
60 function runPCRETest(number, name) {
61     log(name + "\n");
62
63     var inputText = fetchText("testinput" + number);
64     var outputText = fetchText("testoutput" + number);
65     
66     var tests = inputText.split(/\n[ \t]*\n/);
67     var results = outputText.split(/\n[ \t]*\n/);
68     if (tests.length != results.length)
69         log("Number of tests in input doesn't match output");
70     
71     var i, j;
72     for (i = 0 ; i < tests.length - 1; ++i) { // -1  to account for "End of ..."
73         var testLines = tests[i].split("\n");
74         var resultLines = results[i].split("\n");
75
76         var linesInRegexp = 1;
77         var regexpText = testLines[0];
78         if (testLines[0].lastIndexOf(testLines[0][0]) == 0) {
79             do {
80                 regexpText += "\n" + testLines[linesInRegexp];
81             } while (testLines[linesInRegexp++].indexOf(regexpText[0]) == -1)
82         }
83
84         log(regexpText);
85
86         regexpText = replaceEscapes(regexpText);
87         for (n = linesInRegexp; n < testLines.length; ++n) {
88            testLines[n] = replaceEscapes(testLines[n]);
89         }
90         for (n = linesInRegexp; n < resultLines.length; ++n) {
91            resultLines[n] = replaceEscapes(resultLines[n]);
92         }
93
94         var regexp = null;
95         try {
96             var reText = regexpText.match(new RegExp("^" + testLines[0][0] + "(.*)" + testLines[0][0] + ".*$"))[1];
97             var reFlags = regexpText.match(new RegExp("^" + testLines[0][0] + ".*" + testLines[0][0] + "([^ \t]*)[ \t]*$"))[1];
98             reFlags = reFlags.replace("8", ""); // No UTF-8 mode, we always work with Unicode.
99             if (!/^[gims]*$/.test(reFlags)) {
100                 // Allowing "s" to better test newline handling, although it's unsupported in JavaScript.
101                 log("Unsupported modifiers: "+ reFlags + "\n");
102                 continue;
103             }
104             regexp = new RegExp(reText, reFlags);
105         } catch (ex) {
106         }
107         if (!regexp) {
108             log("FAILED TO COMPILE\n");
109             continue;
110         }
111         if (regexp.global) {
112             log("Global regex, cannot test matching via JS\n");
113             continue;
114         }
115
116         var resultsRow = linesInRegexp;
117         for (j = linesInRegexp; j < testLines.length; ++j) {
118             var testLine = testLines[j];
119             var failersLine = (/\*\*\* Failers/.test(testLine));
120             var actualResults = regexp.exec(testLine.replace(/^    /, ""));
121             if (resultLines[resultsRow] != testLine)
122                 log('Test results out of sync, "' + resultLines[resultsRow] + '" vs. "' + testLine + '".');
123             ++resultsRow;
124             var expectedResults = null;
125             while (/ *[0-9]+: .*/.test(resultLines[resultsRow])) {
126                 if (!expectedResults)
127                     expectedResults = [];
128                 expectedResults[expectedResults.length] = resultLines[resultsRow++].replace(/ *[0-9]*: /, "");
129             }
130             if (/^No match$/.test(resultLines[resultsRow]))
131                 ++resultsRow;
132             if ((actualResults === null && expectedResults === null) || (actualResults && expectedResults && actualResults.toString() == expectedResults.toString()))
133                 log(testLine + (failersLine ? "" : ": PASS"));
134             else
135                 log(testLine + ': FAIL. Actual results: "' + actualResults + '"');
136         }
137         log("");
138     }
139     log("DONE");
140 }