1 var EXECUTING = require('./browser').STATE_EXECUTING
2 var Result = require('./browser_result')
4 var Collection = function (emitter, browsers) {
5 browsers = browsers || []
7 this.add = function (browser) {
9 emitter.emit('browsers_change', this)
12 this.remove = function (browser) {
13 var index = browsers.indexOf(browser)
19 browsers.splice(index, 1)
20 emitter.emit('browsers_change', this)
25 this.getById = function (browserId) {
26 for (var i = 0; i < browsers.length; i++) {
27 if (browsers[i].id === browserId) {
35 this.setAllToExecuting = function () {
36 browsers.forEach(function (browser) {
37 browser.state = EXECUTING
40 emitter.emit('browsers_change', this)
43 this.areAllReady = function (nonReadyList) {
44 nonReadyList = nonReadyList || []
46 browsers.forEach(function (browser) {
47 if (!browser.isReady()) {
48 nonReadyList.push(browser)
52 return nonReadyList.length === 0
55 this.serialize = function () {
56 return browsers.map(function (browser) {
57 return browser.serialize()
61 this.getResults = function () {
62 var results = browsers.reduce(function (previous, current) {
63 previous.success += current.lastResult.success
64 previous.failed += current.lastResult.failed
65 previous.error = previous.error || current.lastResult.error
66 previous.disconnected = previous.disconnected || current.lastResult.disconnected
68 }, {success: 0, failed: 0, error: false, disconnected: false, exitCode: 0})
70 // compute exit status code
71 results.exitCode = results.failed || results.error || results.disconnected ? 1 : 0
76 // TODO(vojta): can we remove this? (we clear the results per browser in onBrowserStart)
77 this.clearResults = function () {
78 browsers.forEach(function (browser) {
79 browser.lastResult = new Result()
83 this.clone = function () {
84 return new Collection(emitter, browsers.slice())
88 this.map = function (callback, context) {
89 return browsers.map(callback, context)
92 this.forEach = function (callback, context) {
93 return browsers.forEach(callback, context)
97 Object.defineProperty(this, 'length', {
99 return browsers.length
103 Collection.$inject = ['emitter']
105 module.exports = Collection