655f028cd0a1f35d901da1081b2b35336268a796
[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/webkit01.dat',
59         'resources/webkit02.dat',
60         'resources/doctype01.dat',
61         'resources/scriptdata01.dat',
62         'resources/html5test-com.dat',
63         'resources/entities01.dat',
64         'resources/entities02.dat',
65         'resources/comments01.dat',
66         'resources/adoption01.dat',
67         'resources/adoption02.dat',
68         'resources/inbody01.dat',
69         'resources/isindex.dat',
70         'resources/tables01.dat',
71         'resources/tricky01.dat',
72         'resources/scripted/adoption01.dat',
73         'resources/scripted/webkit01.dat'
74     ],
75     tests = [],
76     iframe = document.getElementsByTagName("iframe")[0],
77     stat = document.getElementsByTagName("p")[0].firstChild,
78     file = "",
79     test_number = 1,
80     fail_list = [],
81     log = "";
82
83 iframe.contentWindow.document.open()
84 iframe.contentWindow.document.write("Test");
85 iframe.contentWindow.document.close();
86 var write = iframe.contentWindow.document.lastChild.lastChild.lastChild !== null;
87 var ignoreTitle = iframe.contentWindow.document.getElementsByTagName("title")[0] !== undefined;
88
89 window.onload = function()
90 {
91     stat.data = "Running";
92     run();
93 }
94
95 function run()
96 {
97     var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
98     if (file = test_files.shift())
99     {
100         stat.data = "Retriving " + file;
101         test_number = 1;
102         fail_list = [];
103         log = "";
104         xhr.open("GET", file);
105         xhr.onreadystatechange = function()
106         {
107             if (xhr.readyState === 4)
108             {
109                 tests = xhr.responseText.split(/(?:^|\n\n)#data\n/);
110                 tests.shift();
111                 test();
112             }
113         }
114         xhr.send(null);
115     }
116 }
117
118 function test()
119 {
120     var input, errorsStart, fragmentStart, contextElement, domStart, dom;
121     if (data = tests.shift())
122     {
123         stat.data = "Running test " + test_number + " of " + (test_number + tests.length) + " in " + file;
124         errorsStart = data.indexOf("\n#errors\n");
125         if (errorsStart !== -1)
126         {
127             input = data.substring(0, errorsStart);
128             fragmentStart = data.indexOf("\n#document-fragment\n")
129             domStart = data.indexOf("\n#document\n")
130             if (fragmentStart !== -1)
131             {
132                 contextElement = data.substring(fragmentStart + 20, domStart);
133             }
134             if (domStart !== -1)
135             {
136                 dom = data.substring(domStart + 11);
137                 if (dom.substring(dom.length - 1) === "\n")
138                 {
139                     dom = dom.substring(0, dom.length - 1);
140                 }
141                 run_test(input, contextElement, dom);
142                 return;
143             }
144         }
145         alert("Invalid test: " + data);
146         test();
147         return;
148     }
149     else
150     {
151         stat.data = "Finished running " + file;
152         var overview = document.createElement("p");
153         if (fail_list.length)
154         {
155             overview.innerHTML = file + ":<br>" + fail_list.join("<br>");
156             overview.className = "overview";
157             overview.title = "Click for more details";
158             overview.onclick = function()
159             {
160                 this.nextSibling.style.display = this.nextSibling.style.display == "none" ? "block" : "none";
161             }
162             var detail = document.createElement("pre");
163             detail.appendChild(document.createTextNode(log.substring(2)));
164             detail.style.display = "block";
165             document.body.appendChild(overview);
166             document.body.appendChild(detail);
167         }
168         else
169         {
170             overview.innerHTML = file + ": PASS";
171             document.body.appendChild(overview);
172         }
173         stat.data = "";
174         run();
175     }
176 }
177
178 function run_test(input, contextElement, expected)
179 {
180     if (contextElement)
181     {
182         var element = document.createElement(contextElement);
183         try
184         {
185             element.innerHTML = input;
186         }
187         catch(e) {}
188         process_result(input, element, expected);
189     }
190     else if (write)
191     {
192         iframe.contentWindow.document.open();
193         try
194         {
195             iframe.contentWindow.document.write(input);
196         }
197         catch(e) {}
198         iframe.contentWindow.document.close();
199         if (ignoreTitle)
200         {
201             var title = iframe.contentWindow.document.getElementsByTagName("title")[0];
202             if (!title.innerHTML)
203             {
204                 title.parentElement.removeChild(title);
205             }
206         }
207         process_result(input, iframe.contentWindow.document, expected);
208     }
209     else
210     {
211         iframe.onload = function()
212         {
213             if (ignoreTitle)
214             {
215                 var title = iframe.contentWindow.document.getElementsByTagName("title")[0];
216                 if (!title.innerHTML)
217                 {
218                     title.parentElement.removeChild(title);
219                 }
220             }
221             process_result(input, iframe.contentWindow.document, expected);
222         }
223         iframe.src = "data:text/html," + encodeURIComponent(input);
224     }
225 }
226
227 function process_result(input, result, expected)
228 {
229     result = Markup.get(result);
230     if (result !== expected)
231     {
232         fail_list.push(test_number);
233         log += "\n\nTest " + (test_number) + " of " + (test_number + tests.length) + " in " + file + " failed. Input:\n" + input + "\nGot:\n" + result + "\nExpected:\n" + expected;
234     }
235     test_number++;
236     test();
237 }
238 </script>