Rewrite local testdriver processing. Using a listener framework to report test result...
[dygraphs.git] / auto_tests / misc / local.js
1 var DygraphsLocalTester = function() {
2 this.tc = null; // Selected test case
3 this.name = null;
4 this.resultsDiv = null;
5 this.results = [];
6 this.summary = { failed: 0, passed: 0 };
7
8 var self = this;
9 jstestdriver.attachListener({
10 start : function(tc) {
11 self.start_(tc);
12 },
13 finish : function(tc, name, result, e) {
14 self.finish_(tc, name, result, e);
15 }
16 });
17 };
18
19 /**
20 * Call this to replace Dygraphs.warn so it throws an error.
21 *
22 * In some cases we will still allow warnings to be warnings, however.
23 */
24 DygraphsLocalTester.prototype.overrideWarn = function() {
25 // save Dygraph.warn so we can catch warnings.
26 var originalDygraphWarn = Dygraph.warn;
27 Dygraph.warn = function(msg) {
28 // This warning is still
29 if (msg == "Using default labels. Set labels explicitly via 'labels' in the options parameter") {
30 originalDygraphWarn(msg);
31 return;
32 }
33 throw "Warnings not permitted: " + msg;
34 }
35 Dygraph.prototype.warn = Dygraph.warn;
36 };
37
38 DygraphsLocalTester.prototype.processVariables = function() {
39 var splitVariables = function() { // http://www.idealog.us/2006/06/javascript_to_p.html
40 var query = window.location.search.substring(1);
41 var args = {};
42 var vars = query.split("&");
43 for (var i = 0; i < vars.length; i++) {
44 if (vars[i].length > 0) {
45 var pair = vars[i].split("=");
46 args[pair[0]] = pair[1];
47 }
48 }
49 return args;
50 }
51
52 var args = splitVariables();
53 var test = args.test;
54 var command = args.command;
55
56 // args.testCaseName uses the string name of the test.
57 if (args.testCaseName) {
58 var testCases = getAllTestCases();
59 name = args.testCaseName;
60 for (var idx in testCases) {
61 var entry = testCases[idx];
62 if (entry.name == args.testCaseName) {
63 var prototype = entry.testCase;
64 this.tc = new entry.testCase();
65 break;
66 }
67 }
68 } else if (args.testCase) { // The class name of the test.
69 name = args.testCase;
70 eval("tc__= new " + args.testCase + "()");
71 this.tc = tc_;
72 }
73
74 // If the test class is defined.
75 if (this.tc != null) {
76 if (args.command == "runAllTests") {
77 console.log("Running all tests for " + args.testCase);
78 this.tc.runAllTests();
79 } else if (args.command == "runTest") {
80 console.log("Running test " + args.testCase + "." + args.test);
81 this.tc.runTest(args.test);
82 }
83 } else {
84 if (args.command == "runAllTests") {
85 console.log("Running all tests for all test cases");
86 var testCases = getAllTestCases();
87 for (var idx in testCases) {
88 var entry = testCases[idx];
89 var prototype = entry.testCase;
90 this.tc = new entry.testCase();
91 this.tc.runAllTests();
92 }
93 }
94 }
95 this.resultsDiv = this.createResultsDiv();
96 this.postResults();
97 this.resultsDiv.appendChild(document.createElement("hr"));
98 document.getElementById('summary').innerHTML = "(" + this.summary.failed + " failed, " + this.summary.passed + " passed)";
99 }
100
101 DygraphsLocalTester.prototype.createResultsDiv = function() {
102 div = document.createElement("div");
103 div.id='results';
104 div.innerHTML = "Test results: <span id='summary'></span> <a href='#' id='passed'>passed</a> <a href='#' id='failed'>failed</a> <a href='#' id='all'>all</a><br/>";
105
106 var body = document.getElementsByTagName("body")[0];
107 body.insertBefore(div, body.firstChild);
108
109 var setByClassName = function(name, displayStyle) {
110 var elements = div.getElementsByClassName(name);
111 for (var i = 0; i < elements.length; i++) {
112 elements[i].style.display = displayStyle;
113 }
114 }
115
116 var passedAnchor = document.getElementById('passed');
117 var failedAnchor = document.getElementById('failed');
118 var allAnchor = document.getElementById('all');
119 passedAnchor.onclick = function() {
120 setByClassName('fail', 'none');
121 setByClassName('pass', 'block');
122
123 passedAnchor.setAttribute("class", 'activeAnchor');
124 failedAnchor.setAttribute("class", '');
125 };
126 failedAnchor.onclick = function() {
127 setByClassName('fail', 'block');
128 setByClassName('pass', 'none');
129 passedAnchor.setAttribute("class", '');
130 failedAnchor.setAttribute("class", 'activeAnchor');
131 };
132 allAnchor.onclick = function() {
133 setByClassName('fail', 'block');
134 setByClassName('pass', 'block');
135 passedAnchor.setAttribute("class", '');
136 failedAnchor.setAttribute("class", '');
137 };
138 return div;
139 }
140
141 DygraphsLocalTester.prototype.postResults = function() {
142 for (var idx = 0; idx < this.results.length; idx++) {
143 var result = this.results[idx];
144 var elem = document.createElement("div");
145 elem.setAttribute("class", result.result ? 'pass' : 'fail');
146
147 elem.innerHTML = result.name + ': <span class=\'outcome\'>' +
148 (result.result ? 'pass' : 'fail') +
149 '</span>' +
150 ' (' + result.duration + ' ms)';
151 this.resultsDiv.appendChild(elem);
152 }
153 }
154
155 DygraphsLocalTester.prototype.run = function() {
156 var selector = document.getElementById("selector");
157
158 if (selector != null) { // running a test
159 var createAttached = function(name, parent) {
160 var elem = document.createElement(name);
161 parent.appendChild(elem);
162 return elem;
163 }
164
165 var description = createAttached("div", selector);
166 var list = createAttached("ul", selector);
167 var parent = list.parentElement;
168 var createLink = function(parent, text, url) {
169 var li = createAttached("li", parent);
170 var a = createAttached("a", li);
171 a.innerHTML = text;
172 a.href = url;
173 }
174 if (this.tc == null) {
175 description.innerHTML = "Test cases:";
176 var testCases = getAllTestCases();
177 createLink(list, "(run all tests)", document.URL + "?command=runAllTests");
178 for (var idx in testCases) {
179 var entryName = testCases[idx].name;
180 createLink(list, entryName, document.URL + "?testCaseName=" + entryName);
181 }
182 } else {
183 description.innerHTML = "Tests for " + name;
184 var names = this.tc.getTestNames();
185 createLink(list, "Run All Tests", document.URL + "&command=runAllTests");
186 for (var idx in names) {
187 var name = names[idx];
188 createLink(list, name, document.URL + "&test=" + name + "&command=runTest");
189 }
190 }
191 }
192 }
193
194 DygraphsLocalTester.prototype.start_ = function(tc) {
195 this.startms_ = new Date().getTime();
196 }
197
198 DygraphsLocalTester.prototype.finish_ = function(tc, name, result, e) {
199 var endms_ = new Date().getTime();
200 this.results.push({
201 name : tc.name + "." + name,
202 result : result,
203 duration : endms_ - this.startms_
204 });
205 this.summary.passed += result ? 1 : 0;
206 this.summary.failed += result ? 0 : 1;
207 }