123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- '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 = util.format('%s: Executed %d of %d', browser, totalExecuted, results.total)
- if (results.failed) {
- msg += util.format(this.X_FAILED, results.failed)
- }
- if (results.skipped) {
- msg += util.format(' (skipped %d)', results.skipped)
- }
- if (browser.isReady) {
- if (results.disconnected) {
- msg += this.FINISHED_DISCONNECTED
- } else if (results.error) {
- msg += this.FINISHED_ERROR
- } else if (!results.failed) {
- msg += this.FINISHED_SUCCESS
- }
- msg += util.format(' (%s / %s)', 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
|