Merge branch 'master' of https://github.com/danvk/dygraphs
[dygraphs.git] / phantom-driver.js
index 3b2ae67..a782100 100644 (file)
@@ -4,6 +4,8 @@
 //
 // For more on phantomjs, visit www.phantomjs.org.
 
+var RunAllAutoTests = function(done_callback) {
+
 var page = require('webpage').create();
 
 // NOTE: Cannot include '#' or '?' in this URL.
@@ -20,10 +22,16 @@ page.open(url, function(status) {
   }
 
   var testCase, test;
-  if (phantom.args.length == 1) {
-    var parts = phantom.args[0].split('.');
+  var verbose = false;
+  var optIdx = 0;
+  if (phantom.args.length > 0 && phantom.args[0] === "--verbose") {
+  verbose = true;
+  optIdx = 1;
+  }
+  if (phantom.args.length == optIdx + 1) {
+    var parts = phantom.args[optIdx].split('.');
     if (2 != parts.length) {
-      console.warn('Usage: phantomjs phantom-driver.js [testCase.test]');
+      console.warn('Usage: phantomjs phantom-driver.js [--verbose] [testCase.test]');
       phantom.exit();
     }
     testCase = parts[0];
@@ -37,7 +45,7 @@ page.open(url, function(status) {
     } else if (msg.substr(0, 'Running'.length) == 'Running') {
       loggingOn = false;
     }
-    if (loggingOn) console.log(msg);
+    if (verbose || loggingOn) console.log(msg);
   };
 
   page.onError = function (msg, trace) {
@@ -78,7 +86,7 @@ page.open(url, function(status) {
     for (var test in caseResults) {
       if (caseResults[test] !== true) {
         num_failing++;
-        failures.push(testCase + '.' + test + ' failed');
+        failures.push(testCase + '.' + test);
       } else {
         // console.log(testCase + '.' + test + ' passed');
         num_passing++;
@@ -94,11 +102,103 @@ page.open(url, function(status) {
     console.log('  ' + failures[i] + ' failed.');
   }
 
-  if (num_failing == 0) {
-    console.log('PASS');
-  } else {
+  done_callback(num_failing, num_passing);
+});
+
+};
+
+// Load all "tests/" pages.
+var LoadAllManualTests = function(totally_done_callback) {
+
+var fs = require('fs');
+var tests = fs.list('tests');
+var pages = [];
+
+function make_barrier_closure(n, fn) {
+  var calls = 0;
+  return function() {
+    calls++;
+    if (calls == n) {
+      fn();
+    } else {
+      // console.log('' + calls + ' done, ' + (n - calls) + ' remain');
+    }
+  };
+}
+
+var tasks = [];
+for (var i = 0; i < tests.length; i++) {
+  if (tests[i].substr(-5) != '.html') continue;
+  tasks.push(tests[i]);
+}
+tasks = [ 'independent-series.html' ];
+
+var loaded_page = make_barrier_closure(tasks.length, function() {
+  // Wait 2 secs to allow JS errors to happen after page load.
+  setTimeout(function() {
+    var success = 0, failures = 0;
+    for (var i = 0; i < pages.length; i++) {
+      if (pages[i].success && !pages[i].hasErrors) {
+        success++;
+      } else {
+        failures++;
+      }
+    }
+    console.log('Successfully loaded ' + success + ' / ' +
+                (success + failures) + ' test pages.');
+    totally_done_callback(failures, success);
+  }, 2000);
+});
+
+
+for (var i = 0; i < tasks.length; i++) {
+  var url = 'file://' + fs.absolute('tests/' + tasks[i]);
+  pages.push(function(path, url) {
+    var page = require('webpage').create();
+    page.success = false;
+    page.hasErrors = false;
+    page.onError = function (msg, trace) {
+      console.log(path + ': ' + msg);
+      page.hasErrors = true;
+      trace.forEach(function(item) {
+        console.log('  ', item.file, ':', item.line);
+      });
+    };
+    page.onLoadFinished = function(status) {
+      if (status == 'success') {
+        page.success = true;
+      }
+      if (!page.done) loaded_page();
+      page.done = true;
+    };
+    page.open(url);
+    return page;
+  }(tasks[i], url));
+}
+
+};
+
+
+// First run all auto_tests.
+// If they all pass, load the manual tests.
+RunAllAutoTests(function(num_failing, num_passing) {
+  if (num_failing !== 0) {
     console.log('FAIL');
+    phantom.exit();
+  } else {
+    console.log('PASS');
   }
-
   phantom.exit();
+
+  // This is not yet reliable enough to be useful:
+  /*
+  LoadAllManualTests(function(failing, passing) {
+    if (failing !== 0) {
+      console.log('FAIL');
+    } else {
+      console.log('PASS');
+    }
+    phantom.exit();
+  });
+  */
 });