/*
 * grunt-contrib-qunit
 * http://gruntjs.com/
 *
 * Copyright (c) 2013 "Cowboy" Ben Alman, contributors
 * Licensed under the MIT license.
 */

(function () {
  'use strict';

  // Don't re-order tests.
  QUnit.config.reorder = false
  // Run tests serially, not in parallel.
  QUnit.config.autorun = false

  // Send messages to the parent PhantomJS process via alert! Good times!!
  function sendMessage() {
    var args = [].slice.call(arguments)
    alert(JSON.stringify(args))
  }

  // These methods connect QUnit to PhantomJS.
  QUnit.log = function (obj) {
    // What is this I don’t even
    if (obj.message === '[object Object], undefined:undefined') { return }
    // Parse some stuff before sending it.
    var actual = QUnit.jsDump.parse(obj.actual)
    var expected = QUnit.jsDump.parse(obj.expected)
    // Send it.
    sendMessage('qunit.log', obj.result, actual, expected, obj.message, obj.source)
  }

  QUnit.testStart = function (obj) {
    sendMessage('qunit.testStart', obj.name)
  }

  QUnit.testDone = function (obj) {
    sendMessage('qunit.testDone', obj.name, obj.failed, obj.passed, obj.total)
  }

  QUnit.moduleStart = function (obj) {
    sendMessage('qunit.moduleStart', obj.name)
  }

  QUnit.begin = function () {
    sendMessage('qunit.begin')
    console.log('Starting test suite')
    console.log('================================================\n')
  }

  QUnit.moduleDone = function (opts) {
    if (opts.failed === 0) {
      console.log('\r\u2714 All tests passed in "' + opts.name + '" module')
    } else {
      console.log('\u2716 ' + opts.failed + ' tests failed in "' + opts.name + '" module')
    }
    sendMessage('qunit.moduleDone', opts.name, opts.failed, opts.passed, opts.total)
  }

  QUnit.done = function (opts) {
    console.log('\n================================================')
    console.log('Tests completed in ' + opts.runtime + ' milliseconds')
    console.log(opts.passed + ' tests of ' + opts.total + ' passed, ' + opts.failed + ' failed.')
    sendMessage('qunit.done', opts.failed, opts.passed, opts.total, opts.runtime)
  }

}())
