UNPKG

2.55 kBJavaScriptView Raw
1var EXECUTING = require('./browser').STATE_EXECUTING
2var Result = require('./browser_result')
3
4var Collection = function (emitter, browsers) {
5 browsers = browsers || []
6
7 this.add = function (browser) {
8 browsers.push(browser)
9 emitter.emit('browsers_change', this)
10 }
11
12 this.remove = function (browser) {
13 var index = browsers.indexOf(browser)
14
15 if (index === -1) {
16 return false
17 }
18
19 browsers.splice(index, 1)
20 emitter.emit('browsers_change', this)
21
22 return true
23 }
24
25 this.getById = function (browserId) {
26 for (var i = 0; i < browsers.length; i++) {
27 if (browsers[i].id === browserId) {
28 return browsers[i]
29 }
30 }
31
32 return null
33 }
34
35 this.setAllToExecuting = function () {
36 browsers.forEach(function (browser) {
37 browser.state = EXECUTING
38 })
39
40 emitter.emit('browsers_change', this)
41 }
42
43 this.areAllReady = function (nonReadyList) {
44 nonReadyList = nonReadyList || []
45
46 browsers.forEach(function (browser) {
47 if (!browser.isReady()) {
48 nonReadyList.push(browser)
49 }
50 })
51
52 return nonReadyList.length === 0
53 }
54
55 this.serialize = function () {
56 return browsers.map(function (browser) {
57 return browser.serialize()
58 })
59 }
60
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
67 return previous
68 }, {success: 0, failed: 0, error: false, disconnected: false, exitCode: 0})
69
70 // compute exit status code
71 results.exitCode = results.failed || results.error || results.disconnected ? 1 : 0
72
73 return results
74 }
75
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()
80 })
81 }
82
83 this.clone = function () {
84 return new Collection(emitter, browsers.slice())
85 }
86
87 // Array APIs
88 this.map = function (callback, context) {
89 return browsers.map(callback, context)
90 }
91
92 this.forEach = function (callback, context) {
93 return browsers.forEach(callback, context)
94 }
95
96 // this.length
97 Object.defineProperty(this, 'length', {
98 get: function () {
99 return browsers.length
100 }
101 })
102}
103Collection.$inject = ['emitter']
104
105module.exports = Collection