/* eslint-disable no-eval */
/* global describe, it, chai, ES6Promise */
var expect
var Runnable
var isNode = typeof require === 'function'
if (isNode) {
expect = require('chai').expect
Runnable = require('mocha').Runnable
} else {
expect = chai.expect
Runnable = window.Mocha.Runnable
ES6Promise.polyfill()
}
/**
* Thunkify a function for `process.nextTick`.
*
* @return {Function}
*/
function defer () {
return new Promise(function (resolve) {
setTimeout(resolve, 0)
})
}
describe('co-mocha', function () {
describe('synchronous', function () {
it('should pass', function (done) {
var test = new Runnable('synchronous', function () {})
test.run(done)
})
it('should fail', function (done) {
var test = new Runnable('synchronous', function () {
throw new Error('You had one job')
})
test.run(function (err) {
expect(err).to.exist
expect(err.message).to.equal('You had one job')
return done()
})
})
})
describe('promise', function () {
it('should pass', function (done) {
var test = new Runnable('promise', function () {
return defer()
})
test.run(done)
})
it('should fail', function (done) {
var test = new Runnable('promise', function () {
return new Promise(function (resolve, reject) {
return setTimeout(function () {
return reject(new Error('You promised me'))
}, 0)
})
})
test.run(function (err) {
expect(err).to.exist
expect(err.message).to.equal('You promised me')
return done()
})
})
})
describe('callback', function () {
it('should pass', function (done) {
var test = new Runnable('callback', function (done) {
return setTimeout(done, 0)
})
test.run(done)
})
it('should fail', function (done) {
var test = new Runnable('callback', function (done) {
return setTimeout(function () {
return done(new Error('You never called me back'))
}, 0)
})
test.run(function (err) {
expect(err).to.exist
expect(err.message).to.equal('You never called me back')
return done()
})
})
})
describe('generators', function () {
var TEST_SOURCE = [
'(function * () {',
' yield defer()',
'})'
].join('\n')
var TEST_ERROR_SOURCE = [
'(function * () {',
' yield defer()',
' throw new Error(\'This generation has failed\')',
'})'
].join('\n')
describe('es6', function () {
try {
eval('(function * () {})')
} catch (e) {
console.log('Generators are not supported natively, skipping...')
return
}
it('visual debugging', function * () {
yield Promise.resolve('This is purely for testing Mocha HTML output')
})
it('should pass', function (done) {
var test = new Runnable('es6', eval(TEST_SOURCE))
test.run(done)
})
it('should fail', function (done) {
var test = new Runnable('es6', eval(TEST_ERROR_SOURCE))
test.run(function (err) {
expect(err).to.exist
expect(err.message).to.equal('This generation has failed')
return done()
})
})
})
if (isNode) {
var traceur = require('traceur')
var regenerator = require('regenerator')
describe('regenerator', function () {
it('should pass', function (done) {
var test = new Runnable('regenerator', eval(regenerator.compile(TEST_SOURCE, {
includeRuntime: true
}).code))
test.run(done)
})
it('should fail', function (done) {
var test = new Runnable('regenerator', eval(
regenerator.compile(TEST_ERROR_SOURCE, {
includeRuntime: true
}).code
))
test.run(function (err) {
expect(err).to.exist
expect(err.message).to.equal('This generation has failed')
return done()
})
})
})
describe('traceur', function () {
it('should pass', function (done) {
var test = new Runnable(
'regenerator', eval(traceur.compile(TEST_SOURCE))
)
test.run(done)
})
it('should fail', function (done) {
var test = new Runnable(
'regenerator', eval(traceur.compile(TEST_ERROR_SOURCE))
)
test.run(function (err) {
expect(err).to.exist
expect(err.message).to.equal('This generation has failed')
return done()
})
})
})
}
})
})