Initial check-in
[dygraphs.git] / mochikit_v14 / tests / SimpleTest / TestRunner.js
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 };