2010-08-30 Adam Barth <abarth@webkit.org>
[WebKit.git] / LayoutTests / html5lib / runner.html
1 <!doctype html>
2 <!--
3 Copyright (c) 2008 Geoffrey Sneddon
4
5 Permission is hereby granted, free of charge, to any person obtaining a copy
6 of this software and associated documentation files (the "Software"), to deal
7 in the Software without restriction, including without limitation the rights
8 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 copies of the Software, and to permit persons to whom the Software is
10 furnished to do so, subject to the following conditions:
11
12 The above copyright notice and this permission notice shall be included in
13 all copies or substantial portions of the Software.
14
15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 THE SOFTWARE.
22 -->
23 <title>html5lib test runner</title>
24 <script src=../resources/dump-as-markup.js></script>
25 <style>
26 .overview:hover {
27 background: #ccc;
28 }
29 iframe {
30 display: none;
31 }
32 </style>
33 <p>Script did not run</p>
34 <iframe></iframe>
35 <script>
36 Markup.noAutoDump();
37
38 var test_files = [
39         'resources/tests1.dat',
40         'resources/tests2.dat',
41         'resources/tests3.dat',
42         'resources/tests4.dat',
43         'resources/tests5.dat',
44         'resources/tests6.dat',
45         'resources/tests7.dat',
46         'resources/tests8.dat',
47         'resources/tests9.dat',
48         'resources/tests10.dat',
49         'resources/tests11.dat',
50         'resources/tests12.dat',
51         'resources/tests14.dat',
52         'resources/tests15.dat',
53         'resources/tests16.dat',
54         'resources/tests17.dat',
55         'resources/tests18.dat',
56         'resources/tests19.dat',
57         'resources/tests20.dat',
58         'resources/tests21.dat',
59         // TODO: Enable this test once it doesn't ASSERT.
60         // 'resources/tests_innerHTML_1.dat',
61         'resources/webkit01.dat',
62         'resources/webkit02.dat',
63         'resources/doctype01.dat',
64         'resources/scriptdata01.dat',
65         'resources/html5test-com.dat',
66         'resources/entities01.dat',
67         'resources/entities02.dat',
68         'resources/comments01.dat',
69         'resources/adoption01.dat',
70         'resources/adoption02.dat',
71         'resources/inbody01.dat',
72         'resources/isindex.dat',
73         'resources/tables01.dat',
74         'resources/tricky01.dat',
75         'resources/scripted/adoption01.dat',
76         'resources/scripted/webkit01.dat'
77     ],
78     tests = [],
79     iframe = document.getElementsByTagName("iframe")[0],
80     stat = document.getElementsByTagName("p")[0].firstChild,
81     file = "",
82     test_number = 1,
83     fail_list = [],
84     log = "";
85
86 iframe.contentWindow.document.open()
87 iframe.contentWindow.document.write("Test");
88 iframe.contentWindow.document.close();
89 var write = iframe.contentWindow.document.lastChild.lastChild.lastChild !== null;
90 var ignoreTitle = iframe.contentWindow.document.getElementsByTagName("title")[0] !== undefined;
91
92 window.onload = function()
93 {
94     stat.data = "Running";
95     run();
96 }
97
98 function run()
99 {
100     var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
101     if (file = test_files.shift())
102     {
103         stat.data = "Retriving " + file;
104         test_number = 1;
105         fail_list = [];
106         log = "";
107         xhr.open("GET", file);
108         xhr.onreadystatechange = function()
109         {
110             if (xhr.readyState === 4)
111             {
112                 tests = xhr.responseText.split(/(?:^|\n\n)#data\n/);
113                 tests.shift();
114                 test();
115             }
116         }
117         xhr.send(null);
118     }
119 }
120
121 function test()
122 {
123     var input, errorsStart, fragmentStart, contextElement, domStart, dom;
124     if (data = tests.shift())
125     {
126         stat.data = "Running test " + test_number + " of " + (test_number + tests.length) + " in " + file;
127         errorsStart = data.indexOf("\n#errors\n");
128         if (errorsStart !== -1)
129         {
130             input = data.substring(0, errorsStart);
131             fragmentStart = data.indexOf("\n#document-fragment\n")
132             domStart = data.indexOf("\n#document\n")
133             if (fragmentStart !== -1)
134             {
135                 contextElement = data.substring(fragmentStart + 20, domStart);
136             }
137             if (domStart !== -1)
138             {
139                 dom = data.substring(domStart + 11);
140                 if (dom.substring(dom.length - 1) === "\n")
141                 {
142                     dom = dom.substring(0, dom.length - 1);
143                 }
144                 run_test(input, contextElement, dom);
145                 return;
146             }
147         }
148         alert("Invalid test: " + data);
149         test();
150         return;
151     }
152     else
153     {
154         stat.data = "Finished running " + file;
155         var overview = document.createElement("p");
156         if (fail_list.length)
157         {
158             overview.innerHTML = file + ":<br>" + fail_list.join("<br>");
159             overview.className = "overview";
160             overview.title = "Click for more details";
161             overview.onclick = function()
162             {
163                 this.nextSibling.style.display = this.nextSibling.style.display == "none" ? "block" : "none";
164             }
165             var detail = document.createElement("pre");
166             detail.appendChild(document.createTextNode(log.substring(2)));
167             detail.style.display = "block";
168             document.body.appendChild(overview);
169             document.body.appendChild(detail);
170         }
171         else
172         {
173             overview.innerHTML = file + ": PASS";
174             document.body.appendChild(overview);
175         }
176         stat.data = "";
177         run();
178     }
179 }
180
181 function run_test(input, contextElement, expected)
182 {
183     if (contextElement)
184     {
185         var element = document.createElement(contextElement);
186         try
187         {
188             element.innerHTML = input;
189         }
190         catch(e) {}
191         process_result(input, element, expected);
192     }
193     else if (write)
194     {
195         iframe.contentWindow.document.open();
196         try
197         {
198             iframe.contentWindow.document.write(input);
199         }
200         catch(e) {}
201         iframe.contentWindow.document.close();
202         if (ignoreTitle)
203         {
204             var title = iframe.contentWindow.document.getElementsByTagName("title")[0];
205             if (!title.innerHTML)
206             {
207                 title.parentElement.removeChild(title);
208             }
209         }
210         process_result(input, iframe.contentWindow.document, expected);
211     }
212     else
213     {
214         iframe.onload = function()
215         {
216             if (ignoreTitle)
217             {
218                 var title = iframe.contentWindow.document.getElementsByTagName("title")[0];
219                 if (!title.innerHTML)
220                 {
221                     title.parentElement.removeChild(title);
222                 }
223             }
224             process_result(input, iframe.contentWindow.document, expected);
225         }
226         iframe.src = "data:text/html," + encodeURIComponent(input);
227     }
228 }
229
230 function process_result(input, result, expected)
231 {
232     result = Markup.get(result);
233     if (result !== expected)
234     {
235         fail_list.push(test_number);
236         log += "\n\nTest " + (test_number) + " of " + (test_number + tests.length) + " in " + file + " failed. Input:\n" + input + "\nGot:\n" + result + "\nExpected:\n" + expected;
237     }
238     test_number++;
239     test();
240 }
241 </script>