run-qunit.js 2.9 KB
Newer Older
1
/*jslint indent: 2, maxlen: 80 */
Tristan Cavelier's avatar
Tristan Cavelier committed
2
/*global require, phantom, document, setInterval, clearInterval, console */
3

Tristan Cavelier's avatar
Tristan Cavelier committed
4 5
(function () {
  "use strict";
6

Tristan Cavelier's avatar
Tristan Cavelier committed
7
  var system = require('system'), page;
8

Tristan Cavelier's avatar
Tristan Cavelier committed
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
  /**
   * Wait until the test condition is true or a timeout occurs. Useful for
   * waiting on a server response or for a ui change (fadeIn, etc.) to occur.
   *
   * @method waitFor
   * @param {Function} testFx Condition that evaluates to a boolean
   * @param {Function} onReady What to do when testFx condition is fulfilled
   * @param {Number} time_out_millis The max amount of time to wait.
   *                                 If not specified, 10 sec is used.
   */
  function waitFor(testFx, onReady, time_out_millis) {
    var maxtime_out_millis, start, condition, interval;
    maxtime_out_millis = time_out_millis || 10001;
    start = new Date().getTime();
    condition = false;
    interval = setInterval(function () {
      if ((new Date().getTime() - start < maxtime_out_millis) && !condition) {
        // If not time-out yet and condition not yet fulfilled
        condition = testFx();
28
      } else {
Tristan Cavelier's avatar
Tristan Cavelier committed
29 30 31 32 33 34 35 36 37 38 39
        if (!condition) {
          // If condition still not fulfilled (timeout but condition is 'false')
          console.log("'waitFor()' timeout");
          phantom.exit(1);
        } else {
          // Condition fulfilled (timeout and/or condition is 'true')
          console.log("'waitFor()' finished in " +
                      (new Date().getTime() - start) + "ms.");
          onReady();
          clearInterval(interval); //< Stop this interval
        }
40
      }
Tristan Cavelier's avatar
Tristan Cavelier committed
41 42
    }, 100); //< repeat check every 100ms
  }
43

Tristan Cavelier's avatar
Tristan Cavelier committed
44 45 46 47
  if (system.args.length !== 2) {
    console.log('Usage: run-qunit.js URL');
    phantom.exit(1);
  }
48

Tristan Cavelier's avatar
Tristan Cavelier committed
49
  page = require('webpage').create();
50

Tristan Cavelier's avatar
Tristan Cavelier committed
51 52 53 54 55
  // Route "console.log()" calls from within the Page context to the main
  // Phantom context (i.e. current "this")
  page.onConsoleMessage = function (msg) {
    console.log(msg);
  };
56

Tristan Cavelier's avatar
Tristan Cavelier committed
57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
  page.open(system.args[1], function (status) {
    if (status !== "success") {
      console.log("Unable to access network");
      phantom.exit(1);
    }
    waitFor(function () {
      return page.evaluate(function () {
        var el = document.getElementById('qunit-testresult');
        if (el && el.innerText.match('completed')) {
          return true;
        }
        return false;
      });
    }, function () {
      var failedNum = page.evaluate(function () {
        console.log("========================================================");
        console.log(document.documentElement.innerHTML);
        console.log("========================================================");
        var el = document.getElementById('qunit-testresult');
        console.log(el.innerText);
        try {
          return el.getElementsByClassName('failed')[0].innerHTML;
        } catch (ignore) { }
        return 10000;
      });
      phantom.exit((parseInt(failedNum, 10) > 0) ? 1 : 0);
83 84
    });
  });
Tristan Cavelier's avatar
Tristan Cavelier committed
85
}());