163 lines
4.6 KiB
JavaScript
163 lines
4.6 KiB
JavaScript
|
'use strict'
|
||
|
|
||
|
const util = require('util')
|
||
|
|
||
|
const constants = require('../constants')
|
||
|
const helper = require('../helper')
|
||
|
|
||
|
const BaseReporter = function (formatError, reportSlow, useColors, browserConsoleLogOptions, adapter) {
|
||
|
this.adapters = [adapter || process.stdout.write.bind(process.stdout)]
|
||
|
|
||
|
this.USE_COLORS = false
|
||
|
this.EXCLUSIVELY_USE_COLORS = undefined
|
||
|
this.LOG_SINGLE_BROWSER = '%s: %s\n'
|
||
|
this.LOG_MULTI_BROWSER = '%s %s: %s\n'
|
||
|
|
||
|
this.SPEC_FAILURE = '%s %s FAILED' + '\n'
|
||
|
this.SPEC_SLOW = '%s SLOW %s: %s\n'
|
||
|
this.ERROR = '%s ERROR\n'
|
||
|
|
||
|
this.FINISHED_ERROR = ' ERROR'
|
||
|
this.FINISHED_SUCCESS = ' SUCCESS'
|
||
|
this.FINISHED_DISCONNECTED = ' DISCONNECTED'
|
||
|
|
||
|
this.X_FAILED = ' (%d FAILED)'
|
||
|
|
||
|
this.TOTAL_SUCCESS = 'TOTAL: %d SUCCESS\n'
|
||
|
this.TOTAL_FAILED = 'TOTAL: %d FAILED, %d SUCCESS\n'
|
||
|
|
||
|
this.onRunStart = () => {
|
||
|
this._browsers = []
|
||
|
}
|
||
|
|
||
|
this.onBrowserStart = (browser) => {
|
||
|
this._browsers.push(browser)
|
||
|
}
|
||
|
|
||
|
this.renderBrowser = (browser) => {
|
||
|
const results = browser.lastResult
|
||
|
const totalExecuted = results.success + results.failed
|
||
|
let msg = `${browser}: Executed ${totalExecuted} of ${results.total}`
|
||
|
|
||
|
if (results.failed) {
|
||
|
msg += util.format(this.X_FAILED, results.failed)
|
||
|
}
|
||
|
|
||
|
if (results.skipped) {
|
||
|
msg += ` (skipped ${results.skipped})`
|
||
|
}
|
||
|
|
||
|
if (browser.isConnected) {
|
||
|
if (results.disconnected) {
|
||
|
msg += this.FINISHED_DISCONNECTED
|
||
|
} else if (results.error) {
|
||
|
msg += this.FINISHED_ERROR
|
||
|
} else if (!results.failed) {
|
||
|
msg += this.FINISHED_SUCCESS
|
||
|
}
|
||
|
|
||
|
msg += ` (${helper.formatTimeInterval(results.totalTime)} / ${helper.formatTimeInterval(results.netTime)})`
|
||
|
}
|
||
|
|
||
|
return msg
|
||
|
}
|
||
|
|
||
|
this.write = function () {
|
||
|
const msg = util.format.apply(null, Array.prototype.slice.call(arguments))
|
||
|
this.adapters.forEach((adapter) => {
|
||
|
if (!helper.isDefined(adapter.colors)) {
|
||
|
adapter.colors = useColors
|
||
|
}
|
||
|
if (!helper.isDefined(this.EXCLUSIVELY_USE_COLORS) || adapter.colors === this.EXCLUSIVELY_USE_COLORS) {
|
||
|
return adapter(msg)
|
||
|
}
|
||
|
})
|
||
|
}
|
||
|
|
||
|
this.writeCommonMsg = function () {
|
||
|
this.write.apply(this, arguments)
|
||
|
}
|
||
|
|
||
|
this.onBrowserError = (browser, error) => {
|
||
|
this.writeCommonMsg(util.format(this.ERROR, browser) + formatError(error, ' '))
|
||
|
}
|
||
|
|
||
|
this.onBrowserLog = (browser, log, type) => {
|
||
|
if (!browserConsoleLogOptions || !browserConsoleLogOptions.terminal) return
|
||
|
type = type.toUpperCase()
|
||
|
if (browserConsoleLogOptions.level) {
|
||
|
const logPriority = constants.LOG_PRIORITIES.indexOf(browserConsoleLogOptions.level.toUpperCase())
|
||
|
if (constants.LOG_PRIORITIES.indexOf(type) > logPriority) return
|
||
|
}
|
||
|
if (!helper.isString(log)) {
|
||
|
// TODO(vojta): change util to new syntax (config object)
|
||
|
log = util.inspect(log, false, undefined, this.USE_COLORS)
|
||
|
}
|
||
|
if (this._browsers && this._browsers.length === 1) {
|
||
|
this.writeCommonMsg(util.format(this.LOG_SINGLE_BROWSER, type, log))
|
||
|
} else {
|
||
|
this.writeCommonMsg(util.format(this.LOG_MULTI_BROWSER, browser, type, log))
|
||
|
}
|
||
|
}
|
||
|
|
||
|
this.onSpecComplete = (browser, result) => {
|
||
|
if (result.skipped) {
|
||
|
this.specSkipped(browser, result)
|
||
|
} else if (result.success) {
|
||
|
this.specSuccess(browser, result)
|
||
|
} else {
|
||
|
this.specFailure(browser, result)
|
||
|
}
|
||
|
|
||
|
if (reportSlow && result.time > reportSlow) {
|
||
|
const specName = result.suite.join(' ') + ' ' + result.description
|
||
|
const time = helper.formatTimeInterval(result.time)
|
||
|
|
||
|
this.writeCommonMsg(util.format(this.SPEC_SLOW, browser, time, specName))
|
||
|
}
|
||
|
}
|
||
|
|
||
|
this.specSuccess = () => {
|
||
|
}
|
||
|
|
||
|
this.specSkipped = () => {
|
||
|
}
|
||
|
|
||
|
this.specFailure = (browser, result) => {
|
||
|
const specName = result.suite.join(' ') + ' ' + result.description
|
||
|
let msg = util.format(this.SPEC_FAILURE, browser, specName)
|
||
|
|
||
|
result.log.forEach((log) => {
|
||
|
msg += formatError(log, '\t')
|
||
|
})
|
||
|
|
||
|
this.writeCommonMsg(msg)
|
||
|
}
|
||
|
|
||
|
this.onRunComplete = (browsers, results) => {
|
||
|
if (browsers.length >= 1 && !results.error && !results.disconnected) {
|
||
|
if (!results.failed) {
|
||
|
this.write(this.TOTAL_SUCCESS, results.success)
|
||
|
} else {
|
||
|
this.write(this.TOTAL_FAILED, results.failed, results.success)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
BaseReporter.decoratorFactory = function (formatError, reportSlow, useColors, browserConsoleLogOptions) {
|
||
|
return function (self) {
|
||
|
BaseReporter.call(self, formatError, reportSlow, useColors, browserConsoleLogOptions)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
BaseReporter.decoratorFactory.$inject = [
|
||
|
'formatError',
|
||
|
'config.reportSlowerThan',
|
||
|
'config.colors',
|
||
|
'config.browserConsoleLogOptions'
|
||
|
]
|
||
|
|
||
|
// PUBLISH
|
||
|
module.exports = BaseReporter
|