var path = require('path')
var extend = require('util')._extend
var minimist = require('minimist')
var createPattern = function (path) {
return {pattern: path, included: true, served: true, watched: false}
}
var initMocha = function (files, config) {
var mochaPath = path.dirname(require.resolve('mocha'))
files.unshift(createPattern(path.join(__dirname, 'adapter.js')))
config = config || {}
config.client = config.client || {}
var mochaConfig = config.client.mocha = getMochaOpts(config.client.mocha || {})
if (mochaConfig.require && mochaConfig.require.map) {
mochaConfig.require.map(function (requirePath) {
return files.unshift(createPattern(requirePath))
})
}
files.unshift(createPattern(path.join(mochaPath, 'mocha.js')))
if (mochaConfig.reporter) {
files.unshift(createPattern(path.join(mochaPath, 'mocha.css')))
}
}
initMocha.$inject = ['config.files', 'config']
module.exports = {
'framework:mocha': ['factory', initMocha]
}
function getMochaOpts (mochaConfig) {
var optsPath = typeof mochaConfig.opts === 'string' ? mochaConfig.opts : 'test/mocha.opts'
if (!mochaConfig.opts) {
return mochaConfig
}
delete mochaConfig.opts
var fs = require('fs')
if (!fs.existsSync(optsPath)) {
return mochaConfig
}
return extend(normalizeOpts(minimist(fs.readFileSync(optsPath, 'utf8')
.replace(/\\\s/g, '%20')
.split(/\s/)
.filter(Boolean)
.map(function (value) {
return value.replace(/%20/g, ' ')
}))), mochaConfig)
function normalizeOpts (opts) {
opts = [
'require',
'ui',
'reporter',
'globals',
'grep',
'timeout',
'slow',
'bail',
'ignoreLeaks'
].reduce(function (result, optName) {
if (opts.hasOwnProperty(optName)) {
result[optName] = opts[optName]
}
return result
}, {})
opts.require = [].concat(opts.require || [])
return opts
}
}