1 // Invoke via: ./test
.sh
3 // or phantomjs phantom-driver.js [testCase.test]
5 // For more on phantomjs, visit www.phantomjs.org.
7 var RunAllAutoTests
= function(done_callback
) {
9 var page
= require('webpage').create();
11 // NOTE: Cannot include '#' or '?' in this URL.
12 var url
= 'auto_tests/misc/local.html';
14 // NOTE: changing the line below to this:
15 // page.open(url, function(status)) {
16 // makes phantomjs hang.
17 page
.open(url
, function(status
) {
18 if (status
!== 'success') {
19 console
.warn('Page status: ' + status
);
27 if (phantom
.args
.length
> 0 && phantom
.args
[0] === "--verbose") {
31 if (phantom
.args
.length
== optIdx
+ 1) {
32 var parts
= phantom
.args
[optIdx
].split('.');
33 if (2 != parts
.length
) {
34 console
.warn('Usage: phantomjs phantom-driver.js [--verbose] [testCase.test]');
41 var loggingOn
= false;
42 page
.onConsoleMessage
= function (msg
) {
43 if (msg
== 'Running ' + test
) {
45 } else if (msg
.substr(0, 'Running'.length
) == 'Running') {
48 if (verbose
|| loggingOn
) console
.log(msg
);
51 page
.onError
= function (msg
, trace
) {
53 trace
.forEach(function(item
) {
54 console
.log(' ', item
.file
, ':', item
.line
);
61 var start
= new Date().getTime();
62 results
= page
.evaluate(function() {
63 // Phantom doesn't like stacktrace.js using the "arguments" object
64 // in stacktrace.js, which it interprets in strict mode.
65 printStackTrace
= undefined
;
67 var testCases
= getAllTestCases();
69 for (var idx
in testCases
) {
70 var entry
= testCases
[idx
];
72 var prototype = entry
.testCase
;
73 var tc
= new entry
.testCase();
74 var result
= tc
.runAllTests();
75 results
[entry
.name
] = result
;
79 var end
= new Date().getTime();
80 var elapsed
= (end
- start
) / 1000;
82 var num_passing
= 0, num_failing
= 0;
84 for (var testCase
in results
) {
85 var caseResults
= results
[testCase
];
86 for (var test
in caseResults
) {
87 if (caseResults
[test
] !== true) {
89 failures
.push(testCase
+ '.' + test
);
91 // console.log(testCase + '.' + test + ' passed');
97 console
.log('Ran ' + (num_passing
+ num_failing
) + ' tests in ' + elapsed
+ 's.');
98 console
.log(num_passing
+ ' test(s) passed');
99 console
.log(num_failing
+ ' test(s) failed:');
100 for (var i
= 0; i
< failures
.length
; i
++) {
101 // TODO(danvk): print an auto_test/misc/local URL that runs
this test
.
102 console
.log(' ' + failures
[i
] + ' failed.');
105 done_callback(num_failing
, num_passing
);
110 // Load all "tests/" pages.
111 var LoadAllManualTests = function(totally_done_callback) {
113 var fs = require('fs');
114 var tests = fs.list('tests');
117 function make_barrier_closure(n, fn) {
124 // console.log('' + calls + ' done, ' + (n - calls) + ' remain');
130 for (var i = 0; i < tests.length; i++) {
131 if (tests[i].substr(-5) != '.html') continue;
132 tasks.push(tests[i]);
134 tasks = [ 'independent-series.html' ];
136 var loaded_page = make_barrier_closure(tasks.length, function() {
137 // Wait 2 secs to allow JS errors to happen after page load.
138 setTimeout(function() {
139 var success = 0, failures = 0;
140 for (var i = 0; i < pages.length; i++) {
141 if (pages[i].success && !pages[i].hasErrors) {
147 console.log('Successfully loaded ' + success + ' / ' +
148 (success + failures) + ' test pages.');
149 totally_done_callback(failures, success);
154 for (var i = 0; i < tasks.length; i++) {
155 var url = 'file://' + fs.absolute('tests/' + tasks[i]);
156 pages.push(function(path, url) {
157 var page = require('webpage').create();
158 page.success = false;
159 page.hasErrors = false;
160 page.onError = function (msg, trace) {
161 console.log(path + ': ' + msg);
162 page.hasErrors = true;
163 trace.forEach(function(item) {
164 console.log(' ', item.file, ':', item.line);
167 page.onLoadFinished = function(status) {
168 if (status == 'success') {
171 if (!page.done) loaded_page();
182 // First run all auto_tests.
183 // If they all pass, load the manual tests.
184 RunAllAutoTests(function(num_failing, num_passing) {
185 if (num_failing !== 0) {
193 // This is not yet reliable enough to be useful:
195 LoadAllManualTests(function(failing, passing) {