Commit | Line | Data |
---|---|---|
6a1aa64f DV |
1 | /** |
2 | * TestRunner: A test runner for SimpleTest | |
3 | * TODO: | |
4 | * | |
5 | * * Avoid moving iframes: That causes reloads on mozilla and opera. | |
6 | * | |
7 | * | |
8 | **/ | |
9 | var TestRunner = {}; | |
10 | TestRunner.logEnabled = false; | |
11 | TestRunner._iframes = {}; | |
12 | TestRunner._iframeDocuments = {}; | |
13 | TestRunner._iframeRows = {}; | |
14 | TestRunner._currentTest = 0; | |
15 | TestRunner._urls = []; | |
16 | TestRunner._testsDiv = DIV(); | |
17 | TestRunner._progressDiv = DIV(); | |
18 | TestRunner._summaryDiv = DIV(null, | |
19 | H1(null, "Tests Summary"), | |
20 | TABLE(null, | |
21 | THEAD(null, | |
22 | TR(null, | |
23 | TH(null, "Test"), | |
24 | TH(null, "Passed"), | |
25 | TH(null, "Failed") | |
26 | ) | |
27 | ), | |
28 | TBODY() | |
29 | ) | |
30 | ); | |
31 | ||
32 | /** | |
33 | * This function is called after generating the summary. | |
34 | **/ | |
35 | TestRunner.onComplete = null; | |
36 | ||
37 | /** | |
38 | * If logEnabled is true, this is the logger that will be used. | |
39 | **/ | |
40 | TestRunner.logger = MochiKit.Logging.logger; | |
41 | ||
42 | /** | |
43 | * Toggle element visibility | |
44 | **/ | |
45 | TestRunner._toggle = function(el) { | |
46 | if (el.className == "noshow") { | |
47 | el.className = ""; | |
48 | el.style.cssText = ""; | |
49 | } else { | |
50 | el.className = "noshow"; | |
51 | el.style.cssText = "width:0px; height:0px; border:0px;"; | |
52 | } | |
53 | }; | |
54 | ||
55 | ||
56 | /** | |
57 | * Creates the iframe that contains a test | |
58 | **/ | |
59 | TestRunner._makeIframe = function (url) { | |
60 | var iframe = document.createElement('iframe'); | |
61 | iframe.src = url; | |
62 | iframe.name = url; | |
63 | iframe.width = "500"; | |
64 | var tbody = TestRunner._summaryDiv.getElementsByTagName("tbody")[0]; | |
65 | var tr = TR(null, TD({'colspan': '3'}, iframe)); | |
66 | iframe._row = tr; | |
67 | tbody.appendChild(tr); | |
68 | return iframe; | |
69 | }; | |
70 | ||
71 | /** | |
72 | * TestRunner entry point. | |
73 | * | |
74 | * The arguments are the URLs of the test to be ran. | |
75 | * | |
76 | **/ | |
77 | TestRunner.runTests = function (/*url...*/) { | |
78 | if (TestRunner.logEnabled) | |
79 | TestRunner.logger.log("SimpleTest START"); | |
80 | ||
81 | var body = document.getElementsByTagName("body")[0]; | |
82 | appendChildNodes(body, | |
83 | TestRunner._testsDiv, | |
84 | TestRunner._progressDiv, | |
85 | TestRunner._summaryDiv | |
86 | ); | |
87 | for (var i = 0; i < arguments.length; i++) { | |
88 | TestRunner._urls.push(arguments[i]); | |
89 | } | |
90 | TestRunner.runNextTest(); | |
91 | }; | |
92 | ||
93 | /** | |
94 | * Run the next test. If no test remains, calls makeSummary | |
95 | **/ | |
96 | TestRunner.runNextTest = function() { | |
97 | if (TestRunner._currentTest < TestRunner._urls.length) { | |
98 | var url = TestRunner._urls[TestRunner._currentTest]; | |
99 | var progress = SPAN(null, | |
100 | "Running ", A({href:url}, url), "..." | |
101 | ); | |
102 | ||
103 | if (TestRunner.logEnabled) | |
104 | TestRunner.logger.log(scrapeText(progress)); | |
105 | ||
106 | TestRunner._progressDiv.appendChild(progress); | |
107 | TestRunner._iframes[url] = TestRunner._makeIframe(url); | |
108 | } else { | |
109 | TestRunner.makeSummary(); | |
110 | if (TestRunner.onComplete) | |
111 | TestRunner.onComplete(); | |
112 | } | |
113 | }; | |
114 | ||
115 | /** | |
116 | * This stub is called by SimpleTest when a test is finished. | |
117 | **/ | |
118 | TestRunner.testFinished = function (doc) { | |
119 | appendChildNodes(TestRunner._progressDiv, SPAN(null, "Done"), BR()); | |
120 | var finishedURL = TestRunner._urls[TestRunner._currentTest]; | |
121 | ||
122 | if (TestRunner.logEnabled) | |
123 | TestRunner.logger.debug("SimpleTest finished " + finishedURL); | |
124 | ||
125 | TestRunner._iframeDocuments[finishedURL] = doc; | |
126 | // TestRunner._iframes[finishedURL].style.display = "none"; | |
127 | TestRunner._toggle(TestRunner._iframes[finishedURL]); | |
128 | TestRunner._currentTest++; | |
129 | TestRunner.runNextTest(); | |
130 | }; | |
131 | ||
132 | /** | |
133 | * Display the summary in the browser | |
134 | **/ | |
135 | TestRunner.makeSummary = function() { | |
136 | if (TestRunner.logEnabled) | |
137 | TestRunner.logger.log("SimpleTest FINISHED"); | |
138 | var rows = []; | |
139 | for (var url in TestRunner._iframeDocuments) { | |
140 | var doc = TestRunner._iframeDocuments[url]; | |
141 | var nOK = withDocument(doc, | |
142 | partial(getElementsByTagAndClassName, 'div', 'test_ok') | |
143 | ).length; | |
144 | var nNotOK = withDocument(doc, | |
145 | partial(getElementsByTagAndClassName, 'div', 'test_not_ok') | |
146 | ).length; | |
147 | var toggle = partial(TestRunner._toggle, TestRunner._iframes[url]); | |
148 | var jsurl = "TestRunner._toggle(TestRunner._iframes['" + url + "'])"; | |
149 | var row = TR( | |
150 | {'style': {'backgroundColor': nNotOK > 0 ? "#f00":"#0f0"}}, | |
151 | TD(null, url), | |
152 | TD(null, nOK), | |
153 | TD(null, nNotOK) | |
154 | ); | |
155 | row.onclick = toggle; | |
156 | var tbody = TestRunner._summaryDiv.getElementsByTagName("tbody")[0]; | |
157 | tbody.insertBefore(row, TestRunner._iframes[url]._row) | |
158 | } | |
159 | }; |