run-qunit.js 2.01 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 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 83 84 85 86 87
var fs = require('fs')
var suites = require('system').args.slice(1)

function print(s) {
  fs.write('/dev/stdout', s, 'w')
}

var page = require('webpage').create()
page.onConsoleMessage = function(msg) {
  console.log(msg)
}
page.onError = function(msg) {
  console.error('ERROR: ' + msg)
}

var timeoutId = null
function deferTimeout() {
  if (timeoutId) clearTimeout(timeoutId)
  timeoutId = setTimeout(function() {
    console.error('Timeout')
    phantom.exit(1)
  }, 3000)
}

var endresult = 0

function runSuite() {
  var suite = suites.shift()
  if (!suite) {
    phantom.exit(endresult)
    return
  }

  page.open(suite, function() {
    deferTimeout()

    var interval = setInterval(function() {
      var tests = page.evaluate(function() {
        var results = []
        var els = document.getElementById('qunit-tests').children

        for (var i = 0; i < els.length; i++) {
          var test = els[i]
          if (test.className !== 'running' && !test.recorded) {
            test.recorded = true
            if (test.className === 'pass') results.push('.')
            else if (test.className === 'fail') results.push('F')
          }
        }

        return results
      })

      for (var i = 0; i < tests.length; i++) {
        deferTimeout()
        print(tests[i])
      }

      var result = page.evaluate(function() {
        var testresult = document.getElementById('qunit-testresult')
        var els = document.getElementById('qunit-tests').children

        if (testresult.innerText.match(/completed/)) {
          console.log('')

          for (var i = 0; i < els.length; i++) {
            var test = els[i]
            if (test.className === 'fail') {
              console.error(test.innerText)
            }
          }

          console.log(testresult.innerText)
          return parseInt(testresult.getElementsByClassName('failed')[0].innerText)
        }
      })

      if (result != null) {
        endresult = result
        clearInterval(interval)
        runSuite()
      }
    }, 100)
  })
}

runSuite()