ember-exam 6.0.0 → 7.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/CHANGELOG.md +64 -0
  2. package/README.md +2 -3
  3. package/addon-test-support/-private/async-iterator.js +6 -10
  4. package/addon-test-support/-private/ember-exam-mocha-test-loader.js +2 -2
  5. package/addon-test-support/-private/ember-exam-qunit-test-loader.js +8 -3
  6. package/addon-test-support/-private/filter-test-modules.js +31 -13
  7. package/addon-test-support/-private/get-test-loader.js +13 -5
  8. package/addon-test-support/-private/split-test-modules.js +2 -2
  9. package/addon-test-support/-private/weight-test-modules.js +1 -1
  10. package/addon-test-support/start.js +6 -2
  11. package/index.js +32 -1
  12. package/lib/commands/exam/iterate.js +12 -14
  13. package/lib/commands/exam.js +83 -66
  14. package/lib/commands/index.js +1 -1
  15. package/lib/commands/task/test-server.js +1 -1
  16. package/lib/commands/task/test.js +1 -1
  17. package/lib/utils/config-reader.js +4 -1
  18. package/lib/utils/execution-state-manager.js +30 -17
  19. package/lib/utils/file-system-helper.js +7 -3
  20. package/lib/utils/query-helper.js +1 -1
  21. package/lib/utils/test-page-helper.js +12 -12
  22. package/lib/utils/testem-events.js +70 -26
  23. package/lib/utils/tests-options-validator.js +2 -7
  24. package/package.json +46 -20
  25. package/.codeclimate.yml +0 -20
  26. package/CONTRIBUTING.md +0 -27
  27. package/RELEASE.md +0 -60
  28. package/addon-test-support/.eslintrc +0 -6
  29. package/bin/install-test-framework.sh +0 -5
  30. package/config/deploy.js +0 -29
  31. package/config/environment.js +0 -5
  32. package/lib/.eslintrc +0 -5
  33. package/node-tests/.eslintrc +0 -8
  34. package/node-tests/acceptance/exam-iterate-test.js +0 -176
  35. package/node-tests/acceptance/exam-test.js +0 -612
  36. package/node-tests/fixtures/browser-exit.js +0 -12
  37. package/node-tests/fixtures/failure.js +0 -1
  38. package/node-tests/fixtures/test-helper-with-load.js +0 -23
  39. package/node-tests/unit/commands/exam-test.js +0 -180
  40. package/node-tests/unit/lint-test.js +0 -5
  41. package/node-tests/unit/utils/config-reader-test.js +0 -68
  42. package/node-tests/unit/utils/execution-state-manager-test.js +0 -205
  43. package/node-tests/unit/utils/query-helper-test.js +0 -58
  44. package/node-tests/unit/utils/test-page-helper-test.js +0 -338
  45. package/node-tests/unit/utils/testem-events-test.js +0 -457
  46. package/node-tests/unit/utils/tests-options-validator-test.js +0 -418
  47. package/testem.multiple-test-page.js +0 -23
  48. package/testem.no-test-page.js +0 -19
  49. package/testem.simple-test-page.js +0 -3
package/CHANGELOG.md CHANGED
@@ -1,3 +1,67 @@
1
+ # Changelog
2
+
3
+ ## v7.0.1 (2021-11-02)
4
+ #### :bug: Bug Fix
5
+ * [#760](https://github.com/ember-cli/ember-exam/pull/760) Wait for all browser to completet beforer cleaning up StateManager([@step2yeung](https://github.com/step2yeung))
6
+ * [#750](https://github.com/ember-cli/ember-exam/pull/750) Ember exam failing when browser ID not found, return 0([@step2yeung](https://github.com/step2yeung))
7
+
8
+ #### :house: Internal
9
+ * [#748](https://github.com/ember-cli/ember-exam/pull/748) Add eslint-plugin-qunit per latest addon blueprint internal ([@SergeAstapov](https://github.com/SergeAstapov))
10
+ * [#744](https://github.com/ember-cli/ember-exam/pull/744) Update npmignore file internal([@Turbo87](https://github.com/Turbo87))
11
+ #### Committers: 4
12
+
13
+ - Sergey Astapov ([@SergeAstapov](https://github.com/SergeAstapov))
14
+ - Tobias Bieniek ([@Turbo87](https://github.com/Turbo87))
15
+ - Stephen Yeung ([@step2yeung](https://github.com/step2yeung))
16
+
17
+ ## v7.0.0 (2021-10-22)
18
+
19
+ #### :boom: Breaking Change
20
+ * [#739](https://github.com/ember-cli/ember-exam/pull/739) Update `ember-auto-import` to v2.x ([@Turbo87](https://github.com/Turbo87))
21
+ * [#690](https://github.com/ember-cli/ember-exam/pull/690) Drop support for Node 10 and upgrade deps ([@nlfurniss](https://github.com/nlfurniss))
22
+
23
+ #### :bug: Bug Fix
24
+ * [#688](https://github.com/ember-cli/ember-exam/pull/688) Fix embroider tests ([@nlfurniss](https://github.com/nlfurniss))
25
+
26
+ #### :memo: Documentation
27
+ * [#687](https://github.com/ember-cli/ember-exam/pull/687) Update README.md: Fix typo in flag name ([@bantic](https://github.com/bantic))
28
+ * [#644](https://github.com/ember-cli/ember-exam/pull/644) Docs: Fix information on Load Balancing ([@brkn](https://github.com/brkn))
29
+
30
+ #### :house: Internal
31
+ * [#743](https://github.com/ember-cli/ember-exam/pull/743) CI: Add `release` workflow ([@Turbo87](https://github.com/Turbo87))
32
+ * [#737](https://github.com/ember-cli/ember-exam/pull/737) Use `prettier` to format JS files ([@Turbo87](https://github.com/Turbo87))
33
+ * [#736](https://github.com/ember-cli/ember-exam/pull/736) CI: Disable Ember.js v4 scenarios ([@Turbo87](https://github.com/Turbo87))
34
+ * [#689](https://github.com/ember-cli/ember-exam/pull/689) Set ember edition to Octane to quiet build logging ([@nlfurniss](https://github.com/nlfurniss))
35
+
36
+ #### Committers: 4
37
+ - Berkan Ünal ([@brkn](https://github.com/brkn))
38
+ - Cory Forsyth ([@bantic](https://github.com/bantic))
39
+ - Nathaniel Furniss ([@nlfurniss](https://github.com/nlfurniss))
40
+ - Tobias Bieniek ([@Turbo87](https://github.com/Turbo87))
41
+
42
+
43
+ ## v6.1.0 (2021-02-17)
44
+
45
+ #### :rocket: Enhancement
46
+ * [#652](https://github.com/ember-cli/ember-exam/pull/652) Update to support `ember-qunit@5` ([@thoov](https://github.com/thoov))
47
+
48
+ #### Committers: 1
49
+ - Travis Hoover ([@thoov](https://github.com/thoov))
50
+
51
+
52
+ ## v6.0.1 (2020-10-28)
53
+
54
+ #### :bug: Bug Fix
55
+ * [#617](https://github.com/ember-cli/ember-exam/pull/617) Update @embroider/macros to fix ember-qunit@5.0.0-beta support. ([@rwjblue](https://github.com/rwjblue))
56
+
57
+ #### :house: Internal
58
+ * [#618](https://github.com/ember-cli/ember-exam/pull/618) Swap to GitHub actions for CI. ([@rwjblue](https://github.com/rwjblue))
59
+
60
+ #### Committers: 2
61
+ - Robert Jackson ([@rwjblue](https://github.com/rwjblue))
62
+ - [@dependabot-preview[bot]](https://github.com/apps/dependabot-preview)
63
+
64
+
1
65
  ## v6.0.0 (2020-10-12)
2
66
 
3
67
  #### :boom: Breaking Change
package/README.md CHANGED
@@ -302,7 +302,7 @@ You can also specify the `split` and `partition` options with `load-balance` to
302
302
  $ ember exam --split=<num> --partition=<num> --parallel=<num> --load-balance
303
303
  ```
304
304
 
305
- This command will split test files and load-balance tests from the specified partition across the browsers. For example `ember exam --split=2 -partition=1 --parallel=3 --load-balance`, the complete list of test files are split into two halves. With the first half of the list load balanced against three browsers. The output will look something like below:
305
+ This command will split test files and load-balance tests from the specified partition across the browsers. For example `ember exam --split=2 --partition=1 --parallel=3 --load-balance`, the complete list of test files are split into two halves. With the first half of the list load balanced against three browsers. The output will look something like below:
306
306
 
307
307
  ```bash
308
308
  # ember exam --split=2 --partition=1 --parallel=3 --load-balance
@@ -317,9 +317,8 @@ ok 3 Chrome 66.0 - Exam Partition 1 - browser Id 3 - some the other test
317
317
  1. The `--load-balance` option is currently only supported in CI mode and for that reason no-launch cannot be used with load-balance.
318
318
  2. You must be using `ember-cli` version 3.2.0 or greater for load balancing and test failure reproduction features to work properly.
319
319
  3. You must be using `ember-qunit` version 4.1.1 or greater for this feature to work properly.
320
- 4. You must be using `qunit` version 2.8.0 or greater for this feature to work properly.
320
+ 4. You must be using `qunit` version 2.13.0 or greater for this feature to work properly.
321
321
  5. This feature is not currently supported by Mocha.
322
- 6. `--random[=<seed>]` does not (currently) work with load balancing. This will be fixed once https://github.com/qunitjs/qunit/pull/1417 lands.
323
322
 
324
323
  ##### Test Failure Reproduction
325
324
 
@@ -39,9 +39,7 @@ export default class AsyncIterator {
39
39
  * @return {String} the stringified value of the iterator.
40
40
  */
41
41
  toString() {
42
- return `<AsyncIterator (request: ${this._request} response: ${
43
- this._response
44
- })>`;
42
+ return `<AsyncIterator (request: ${this._request} response: ${this._response})>`;
45
43
  }
46
44
 
47
45
  /**
@@ -113,16 +111,14 @@ export default class AsyncIterator {
113
111
 
114
112
  if (this._emberExamExitOnError) {
115
113
  let err = new Error(
116
- `EmberExam: Promise timed out after ${
117
- this._timeout
118
- } s while waiting for response for ${this._request}`
114
+ `EmberExam: Promise timed out after ${this._timeout} s while waiting for response for ${this._request}`
119
115
  );
120
116
  reject(err);
121
117
  } else {
122
118
  // eslint-disable-next-line no-console
123
- console.error(`EmberExam: Promise timed out after ${
124
- this._timeout
125
- } s while waiting for response for ${this._request}. Closing browser to exit gracefully.`);
119
+ console.error(
120
+ `EmberExam: Promise timed out after ${this._timeout} s while waiting for response for ${this._request}. Closing browser to exit gracefully.`
121
+ );
126
122
  resolve(iteratorCompleteResponse);
127
123
  }
128
124
  }, this._timeout * 1000);
@@ -153,7 +149,7 @@ export default class AsyncIterator {
153
149
  this._current = {
154
150
  resolve,
155
151
  reject,
156
- promise
152
+ promise,
157
153
  };
158
154
 
159
155
  this._makeNextRequest();
@@ -1,6 +1,6 @@
1
1
  import getUrlParams from './get-url-params';
2
2
  import splitTestModules from './split-test-modules';
3
- import { filterTestModules} from './filter-test-modules';
3
+ import { filterTestModules } from './filter-test-modules';
4
4
  import { TestLoader } from 'ember-mocha/test-loader';
5
5
 
6
6
  /**
@@ -28,7 +28,7 @@ export default class EmberExamMochaTestLoader extends TestLoader {
28
28
  * @method load
29
29
  */
30
30
  static load() {
31
- throw new Error('`EmberExamMochaTestLoader` doesn\'t support `load()`.');
31
+ throw new Error("`EmberExamMochaTestLoader` doesn't support `load()`.");
32
32
  }
33
33
 
34
34
  /**
@@ -33,7 +33,7 @@ export default class EmberExamQUnitTestLoader extends TestLoader {
33
33
  * @method load
34
34
  */
35
35
  static load() {
36
- throw new Error('`EmberExamQUnitTestLoader` doesn\'t support `load()`.');
36
+ throw new Error("`EmberExamQUnitTestLoader` doesn't support `load()`.");
37
37
  }
38
38
 
39
39
  /**
@@ -178,8 +178,13 @@ export default class EmberExamQUnitTestLoader extends TestLoader {
178
178
  return nextModuleHandler();
179
179
  }
180
180
  }
181
- }).catch(e => {
182
- if (typeof e === 'object' && e !== null && typeof e.message === 'string') {
181
+ })
182
+ .catch((e) => {
183
+ if (
184
+ typeof e === 'object' &&
185
+ e !== null &&
186
+ typeof e.message === 'string'
187
+ ) {
183
188
  e.message = `EmberExam: Failed to get next test module: ${e.message}`;
184
189
  }
185
190
  throw new Error(`EmberExam: Failed to get next test module: ${e}`);
@@ -10,7 +10,7 @@ const TEST_PATH_REGEX = /\/tests\/(.*?)$/;
10
10
  * @param {*} modulePath
11
11
  */
12
12
  function getRegexFilter(modulePath) {
13
- return MODULE_PATH_REGEXP.exec( modulePath );
13
+ return MODULE_PATH_REGEXP.exec(modulePath);
14
14
  }
15
15
 
16
16
  /**
@@ -23,7 +23,11 @@ function getRegexFilter(modulePath) {
23
23
  */
24
24
  function wildcardFilter(module, moduleFilter) {
25
25
  // Generate a regular expression to handle wildcard from path filter
26
- const moduleFilterRule = ['^.*', moduleFilter.split('*').join('.*'), '$'].join('');
26
+ const moduleFilterRule = [
27
+ '^.*',
28
+ moduleFilter.split('*').join('.*'),
29
+ '$',
30
+ ].join('');
27
31
  return new RegExp(moduleFilterRule).test(module);
28
32
  }
29
33
 
@@ -35,7 +39,10 @@ function wildcardFilter(module, moduleFilter) {
35
39
  * @param {string} moduleFilter
36
40
  */
37
41
  function stringFilter(modules, moduleFilter) {
38
- return modules.filter( module => module.includes(moduleFilter) || wildcardFilter(module, moduleFilter) );
42
+ return modules.filter(
43
+ (module) =>
44
+ module.includes(moduleFilter) || wildcardFilter(module, moduleFilter)
45
+ );
39
46
  }
40
47
 
41
48
  /**
@@ -49,7 +56,9 @@ function regexFilter(modules, modulePathRegexFilter) {
49
56
  const re = new RegExp(modulePathRegexFilter[2], modulePathRegexFilter[3]);
50
57
  const exclude = modulePathRegexFilter[1];
51
58
 
52
- return modules.filter( module => !exclude && re.test(module) || exclude && !re.test(module) );
59
+ return modules.filter(
60
+ (module) => (!exclude && re.test(module)) || (exclude && !re.test(module))
61
+ );
53
62
  }
54
63
 
55
64
  /**
@@ -60,7 +69,7 @@ function regexFilter(modules, modulePathRegexFilter) {
60
69
  */
61
70
  function convertFilePathToModulePath(filePath) {
62
71
  const filePathWithNoExtension = filePath.replace(/\.[^/.]+$/, '');
63
- const testFilePathMatch = TEST_PATH_REGEX.exec( filePathWithNoExtension );
72
+ const testFilePathMatch = TEST_PATH_REGEX.exec(filePathWithNoExtension);
64
73
  if (typeof filePath !== 'undefined' && testFilePathMatch !== null) {
65
74
  return testFilePathMatch[0];
66
75
  }
@@ -78,26 +87,35 @@ function convertFilePathToModulePath(filePath) {
78
87
  */
79
88
  function filterTestModules(modules, modulePath, filePath) {
80
89
  // Generates an array with module filter value seperated by comma (,).
81
- const moduleFilters = (filePath || modulePath).split(',').map( value => value.trim());
90
+ const moduleFilters = (filePath || modulePath)
91
+ .split(',')
92
+ .map((value) => value.trim());
82
93
 
83
94
  const filteredTestModules = moduleFilters.reduce((result, moduleFilter) => {
84
95
  const modulePath = convertFilePathToModulePath(moduleFilter);
85
96
  const modulePathRegex = getRegexFilter(modulePath);
86
97
 
87
98
  if (modulePathRegex) {
88
- return result.concat(regexFilter(modules, modulePathRegex).filter( module => result.indexOf(module) === -1 ));
99
+ return result.concat(
100
+ regexFilter(modules, modulePathRegex).filter(
101
+ (module) => result.indexOf(module) === -1
102
+ )
103
+ );
89
104
  } else {
90
- return result.concat(stringFilter(modules, modulePath).filter( module => result.indexOf(module) === -1 ));
105
+ return result.concat(
106
+ stringFilter(modules, modulePath).filter(
107
+ (module) => result.indexOf(module) === -1
108
+ )
109
+ );
91
110
  }
92
111
  }, []);
93
112
 
94
113
  if (filteredTestModules.length === 0) {
95
- throw new Error(`No tests matched with the filter: ${modulePath || filePath}.`);
114
+ throw new Error(
115
+ `No tests matched with the filter: ${modulePath || filePath}.`
116
+ );
96
117
  }
97
118
  return filteredTestModules;
98
119
  }
99
120
 
100
- export {
101
- convertFilePathToModulePath,
102
- filterTestModules
103
- }
121
+ export { convertFilePathToModulePath, filterTestModules };
@@ -1,4 +1,8 @@
1
- import { dependencySatisfies, macroCondition, importSync } from '@embroider/macros';
1
+ import {
2
+ dependencySatisfies,
3
+ macroCondition,
4
+ importSync,
5
+ } from '@embroider/macros';
2
6
 
3
7
  /**
4
8
  * Returns ember-exam-qunit-test-loader or ember-exam-mocha-test-loader
@@ -8,11 +12,15 @@ import { dependencySatisfies, macroCondition, importSync } from '@embroider/macr
8
12
  * @return {Object}
9
13
  */
10
14
  export default function getTestLoader() {
11
- if (macroCondition(dependencySatisfies('ember-qunit', '*'))){
12
- const EmberExamQUnitTestLoader = importSync('./ember-exam-qunit-test-loader');
15
+ if (macroCondition(dependencySatisfies('ember-qunit', '*'))) {
16
+ const EmberExamQUnitTestLoader = importSync(
17
+ './ember-exam-qunit-test-loader'
18
+ );
13
19
  return EmberExamQUnitTestLoader['default'];
14
- } else if (macroCondition(dependencySatisfies('ember-mocha', '*'))){
15
- const EmberExamMochaTestLoader = importSync('./ember-exam-mocha-test-loader');
20
+ } else if (macroCondition(dependencySatisfies('ember-mocha', '*'))) {
21
+ const EmberExamMochaTestLoader = importSync(
22
+ './ember-exam-mocha-test-loader'
23
+ );
16
24
  return EmberExamMochaTestLoader['default'];
17
25
  }
18
26
 
@@ -51,9 +51,9 @@ export default function splitTestModules(modules, split, partitions) {
51
51
  const partition = parseInt(partitions[i], 10);
52
52
  if (isNaN(partition)) {
53
53
  throw new Error(
54
- 'You must specify numbers for partition (you specified \'' +
54
+ "You must specify numbers for partition (you specified '" +
55
55
  partitions +
56
- '\')'
56
+ "')"
57
57
  );
58
58
  }
59
59
 
@@ -2,7 +2,7 @@ const TEST_TYPE_WEIGHT = {
2
2
  eslint: 1,
3
3
  unit: 10,
4
4
  integration: 20,
5
- acceptance: 150
5
+ acceptance: 150,
6
6
  };
7
7
  const WEIGHT_REGEX = /\/(eslint|unit|integration|acceptance)\//;
8
8
  const DEFAULT_WEIGHT = 50;
@@ -1,5 +1,9 @@
1
1
  import loadEmberExam from 'ember-exam/test-support/load';
2
- import { dependencySatisfies, macroCondition, importSync } from '@embroider/macros';
2
+ import {
3
+ dependencySatisfies,
4
+ macroCondition,
5
+ importSync,
6
+ } from '@embroider/macros';
3
7
 
4
8
  /**
5
9
  * Equivalent to ember-qunit or ember-mocha's loadTest() except this does not create a new TestLoader instance
@@ -32,7 +36,7 @@ export default function start(qunitOptions) {
32
36
  loadTests(testLoader);
33
37
 
34
38
  let emberTestFramework;
35
- if (macroCondition(dependencySatisfies('ember-qunit', '*'))){
39
+ if (macroCondition(dependencySatisfies('ember-qunit', '*'))) {
36
40
  emberTestFramework = importSync('ember-qunit');
37
41
  } else if (macroCondition(dependencySatisfies('ember-mocha', '*'))) {
38
42
  emberTestFramework = importSync('ember-mocha');
package/index.js CHANGED
@@ -2,10 +2,41 @@
2
2
 
3
3
  'use strict';
4
4
 
5
+ const VersionChecker = require('ember-cli-version-checker');
6
+
5
7
  module.exports = {
6
8
  name: require('./package').name,
7
9
 
8
10
  includedCommands() {
9
11
  return require('./lib/commands');
10
- }
12
+ },
13
+
14
+ init() {
15
+ this._super.init.apply(this, arguments);
16
+ let versionChecker = new VersionChecker(this.project);
17
+
18
+ const hasMagicallyProvidedQUnit = versionChecker
19
+ .for('ember-qunit')
20
+ .lt('5.0.0-beta.1');
21
+
22
+ let options = {
23
+ exclude: ['ember-mocha', 'mocha'],
24
+ };
25
+
26
+ // Ember-qunit < 5 provides an AMD shim for qunit but newer versions now use
27
+ // ember-auto-import to include qunit. This means that qunit is no
28
+ // longer available for addons (if the parent app is using ember-qunit > 5) to
29
+ // directly import under embroider unless they are using ember-auto-import
30
+ // themselves. This condidionally falls back to not using ember-auto-import
31
+ // when the parent app is providing qunit because without this we would double
32
+ // include qunit resulting in a runtime error (qunit detects if it as
33
+ // already be added to the window object and errors if so).
34
+ if (hasMagicallyProvidedQUnit) {
35
+ this.options = this.options || {};
36
+ options.exclude.push('qunit');
37
+ this.options.autoImport = options;
38
+ } else {
39
+ this.options.autoImport = options;
40
+ }
41
+ },
11
42
  };
@@ -6,7 +6,7 @@ module.exports = {
6
6
  name: 'exam:iterate',
7
7
 
8
8
  description:
9
- 'Runs your app\'s test suite in a random order for a number of iterations with the \'exam\' command.',
9
+ "Runs your app's test suite in a random order for a number of iterations with the 'exam' command.",
10
10
 
11
11
  works: 'insideProject',
12
12
 
@@ -17,14 +17,14 @@ module.exports = {
17
17
  name: 'options',
18
18
  type: String,
19
19
  default: '',
20
- description: 'A string of options to passthrough to the exam command'
20
+ description: 'A string of options to passthrough to the exam command',
21
21
  },
22
22
  {
23
23
  name: 'path',
24
24
  type: String,
25
25
  default: '',
26
- description: 'The output path of a previous build to run tests against'
27
- }
26
+ description: 'The output path of a previous build to run tests against',
27
+ },
28
28
  ],
29
29
 
30
30
  /**
@@ -83,7 +83,9 @@ module.exports = {
83
83
  _buildForTests() {
84
84
  this._write('\nBuilding app for test iterations.');
85
85
  execa.sync(
86
- './node_modules/.bin/ember', ['build', '--output-path', `${this._outputDir}`], ['stdio', 'inherit']
86
+ './node_modules/.bin/ember',
87
+ ['build', '--output-path', `${this._outputDir}`],
88
+ ['stdio', 'inherit']
87
89
  );
88
90
  },
89
91
 
@@ -92,9 +94,7 @@ module.exports = {
92
94
  */
93
95
  _cleanupBuild() {
94
96
  this._write('\nCleaning up test iterations.\n');
95
- execa.sync(
96
- 'rm', ['-rf', `${this._outputDir}`]
97
- );
97
+ execa.sync('rm', ['-rf', `${this._outputDir}`]);
98
98
  },
99
99
 
100
100
  /**
@@ -114,8 +114,8 @@ module.exports = {
114
114
  chalk.blue('Iteration'),
115
115
  chalk.blue('Seed'),
116
116
  chalk.blue('Exit Code'),
117
- chalk.blue('Command')
118
- ]
117
+ chalk.blue('Command'),
118
+ ],
119
119
  });
120
120
 
121
121
  for (let i = 0; i < numIterations; i++) {
@@ -139,9 +139,7 @@ module.exports = {
139
139
  const chalk = require('chalk');
140
140
  const execSync = require('child_process').execSync;
141
141
 
142
- const seed = Math.random()
143
- .toString(36)
144
- .slice(2);
142
+ const seed = Math.random().toString(36).slice(2);
145
143
  const command =
146
144
  './node_modules/.bin/ember exam --random ' +
147
145
  seed +
@@ -162,5 +160,5 @@ module.exports = {
162
160
 
163
161
  const color = exitCode ? chalk.red : chalk.green;
164
162
  return [color(seed), color(exitCode), color(command)];
165
- }
163
+ },
166
164
  };