'use strict'
const BrowserResult = require('./browser_result')
const helper = require('./helper')
class BrowserCollection {
constructor (emitter, browsers = []) {
this.browsers = browsers
this.emitter = emitter
}
add (browser) {
this.browsers.push(browser)
this.emitter.emit('browsers_change', this)
}
remove (browser) {
if (helper.arrayRemove(this.browsers, browser)) {
this.emitter.emit('browsers_change', this)
return true
}
return false
}
getById (browserId) {
return this.browsers.find((browser) => browser.id === browserId) || null
}
getNonReady () {
return this.browsers.filter((browser) => !browser.isConnected())
}
areAllReady () {
return this.browsers.every((browser) => browser.isConnected())
}
serialize () {
return this.browsers.map((browser) => browser.serialize())
}
calculateExitCode (results, singleRunBrowserNotCaptured, config) {
config = config || {}
if (results.disconnected || singleRunBrowserNotCaptured) {
return 1
}
if (results.skipped && config.failOnSkippedTests) {
return 1
}
if (results.success + results.failed === 0 && !!config.failOnEmptyTestSuite) {
return 1
}
if (results.error) {
return 1
}
if (config.failOnFailingTestSuite === false) {
return 0 // Tests executed without infrastructure error, exit with 0 independent of test status.
}
return results.failed ? 1 : 0
}
getResults (singleRunBrowserNotCaptured, config) {
const results = { success: 0, failed: 0, skipped: 0, error: false, disconnected: false, exitCode: 0 }
this.browsers.forEach((browser) => {
results.success += browser.lastResult.success
results.failed += browser.lastResult.failed
results.skipped += browser.lastResult.skipped
results.error = results.error || browser.lastResult.error
results.disconnected = results.disconnected || browser.lastResult.disconnected
})
results.exitCode = this.calculateExitCode(results, singleRunBrowserNotCaptured, config)
return results
}
clearResults () {
this.browsers.forEach((browser) => {
browser.lastResult = new BrowserResult()
})
}
clone () {
return new BrowserCollection(this.emitter, this.browsers.slice())
}
// Array APIs
map (callback, context) {
return this.browsers.map(callback, context)
}
forEach (callback, context) {
return this.browsers.forEach(callback, context)
}
get length () {
return this.browsers.length
}
}
BrowserCollection.factory = function (emitter) {
return new BrowserCollection(emitter)
}
module.exports = BrowserCollection