e8414ae4dbcf4beb070cd9dd7d119847ff3759cb
[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 var table = document.createElement("table");
143 this.resultsDiv.appendChild(table);
144 for (var idx = 0; idx < this.results.length; idx++) {
145 var result = this.results[idx];
146 var tr = document.createElement("tr");
147 tr.setAttribute("class", result.result ? 'pass' : 'fail');
148
149 var tdResult = document.createElement("td");
150 tdResult.setAttribute("class", "outcome");
151 tdResult.innerText = result.result ? 'pass' : 'fail';
152 tr.appendChild(tdResult);
153
154 var tdName = document.createElement("td");
155 tdName.innerText = result.name;
156 tr.appendChild(tdName);
157
158 var tdDuration = document.createElement("td");
159 tdDuration.innerText = result.duration;
160 tr.appendChild(tdDuration);
161
162 table.appendChild(tr);
163 }
164 }
165
166 DygraphsLocalTester.prototype.run = function() {
167 var selector = document.getElementById("selector");
168
169 if (selector != null) { // running a test
170 var createAttached = function(name, parent) {
171 var elem = document.createElement(name);
172 parent.appendChild(elem);
173 return elem;
174 }
175
176 var description = createAttached("div", selector);
177 var list = createAttached("ul", selector);
178 var parent = list.parentElement;
179 var createLink = function(parent, text, url) {
180 var li = createAttached("li", parent);
181 var a = createAttached("a", li);
182 a.innerHTML = text;
183 a.href = url;
184 }
185 if (this.tc == null) {
186 description.innerHTML = "Test cases:";
187 var testCases = getAllTestCases();
188 createLink(list, "(run all tests)", document.URL + "?command=runAllTests");
189 for (var idx in testCases) {
190 var entryName = testCases[idx].name;
191 createLink(list, entryName, document.URL + "?testCaseName=" + entryName);
192 }
193 } else {
194 description.innerHTML = "Tests for " + name;
195 var names = this.tc.getTestNames();
196 createLink(list, "Run All Tests", document.URL + "&command=runAllTests");
197 for (var idx in names) {
198 var name = names[idx];
199 createLink(list, name, document.URL + "&test=" + name + "&command=runTest");
200 }
201 }
202 }
203 }
204
205 DygraphsLocalTester.prototype.start_ = function(tc) {
206 this.startms_ = new Date().getTime();
207 }
208
209 DygraphsLocalTester.prototype.finish_ = function(tc, name, result, e) {
210 var endms_ = new Date().getTime();
211 this.results.push({
212 name : tc.name + "." + name,
213 result : result,
214 duration : endms_ - this.startms_
215 });
216 this.summary.passed += result ? 1 : 0;
217 this.summary.failed += result ? 0 : 1;
218 }