var EXECUTING = require('./browser').STATE_EXECUTING; var Result = require('./browser_result'); var Collection = function(emitter, browsers) { browsers = browsers || []; this.add = function(browser) { browsers.push(browser); emitter.emit('browsers_change', this); }; this.remove = function(browser) { var index = browsers.indexOf(browser); if (index === -1) { return false; } browsers.splice(index, 1); emitter.emit('browsers_change', this); return true; }; this.getById = function(browserId) { for (var i = 0; i < browsers.length; i++) { if (browsers[i].id === browserId) { return browsers[i]; } } return null; }; this.setAllToExecuting = function() { browsers.forEach(function(browser) { browser.state = EXECUTING; }); emitter.emit('browsers_change', this); }; this.areAllReady = function(nonReadyList) { nonReadyList = nonReadyList || []; browsers.forEach(function(browser) { if (!browser.isReady()) { nonReadyList.push(browser); } }); return nonReadyList.length === 0; }; this.serialize = function() { return browsers.map(function(browser) { return browser.serialize(); }); }; this.getResults = function() { var results = browsers.reduce(function(previous, current) { previous.success += current.lastResult.success; previous.failed += current.lastResult.failed; previous.error = previous.error || current.lastResult.error; previous.disconnected = previous.disconnected || current.lastResult.disconnected; return previous; }, {success: 0, failed: 0, error: false, disconnected: false, exitCode: 0}); // compute exit status code results.exitCode = results.failed || results.error || results.disconnected ? 1 : 0; return results; }; // TODO(vojta): can we remove this? (we clear the results per browser in onBrowserStart) this.clearResults = function() { browsers.forEach(function(browser) { browser.lastResult = new Result(); }); }; this.clone = function() { return new Collection(emitter, browsers.slice()); }; // Array APIs this.map = function(callback, context) { return browsers.map(callback, context); }; this.forEach = function(callback, context) { return browsers.forEach(callback, context); }; // this.length Object.defineProperty(this, 'length', { get: function() { return browsers.length; } }); }; Collection.$inject = ['emitter']; module.exports = Collection;