xunit.ts 1.0.3 → 1.1.0

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.
package/README.md CHANGED
@@ -85,6 +85,10 @@ You can also run `xunit.ts` from a script in your `package.json`:
85
85
  }
86
86
  ```
87
87
 
88
+ #### Filtering tests
89
+
90
+ The `xunit` command can take one or more `--filter` flags (`-f` alias) followed by a regular expression to match `TestSuiteName.TestMethodName`. See the [full documentation](https://ecoAPM.github.io/xunit.ts) for more details.
91
+
88
92
  ## Output
89
93
 
90
94
  ### Console
@@ -100,10 +104,10 @@ My Test Suite
100
104
  Passed: 1
101
105
  Total: 1
102
106
 
103
- ~/example $ _
107
+ ~/example $ _
104
108
  ```
105
109
 
106
- See the [full documentation](https://ecoAPM.github.io/xunit.ts) for a list of all available output options.
110
+ Results can also be output in JUnit and Sonar XML formats, for import into other systems. See the [full documentation](https://ecoAPM.github.io/xunit.ts) for a list of all available output options.
107
111
 
108
112
  ## Assertions
109
113
 
@@ -1 +1 @@
1
- {"version":3,"file":"CLI.d.ts","sourceRoot":"","sources":["../../src/CLI.ts"],"names":[],"mappings":";AAEA,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,IAAI,MAAM,mBAAmB,CAAC;AACrC,OAAO,MAAM,MAAM,kBAAkB,CAAC;AAGtC,MAAM,CAAC,OAAO,OAAO,GAAG;IAkEX,OAAO,CAAC,QAAQ,CAAC,aAAa;IAA6C,OAAO,CAAC,QAAQ,CAAC,OAAO;IAjE/G,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAmC7B;IAEF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAwB9B;IAEF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAuB;gBAEvB,aAAa,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,kBAAkB,KAAK,MAAM,EAAmB,OAAO,EAAE,OAAO,OAAO;IAGzH,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;CAsB7B"}
1
+ {"version":3,"file":"CLI.d.ts","sourceRoot":"","sources":["../../src/CLI.ts"],"names":[],"mappings":";AAEA,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,IAAI,MAAM,mBAAmB,CAAC;AACrC,OAAO,MAAM,MAAM,kBAAkB,CAAC;AAGtC,MAAM,CAAC,OAAO,OAAO,GAAG;IA4EX,OAAO,CAAC,QAAQ,CAAC,aAAa;IAA6C,OAAO,CAAC,QAAQ,CAAC,OAAO;IA3E/G,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CA2C7B;IAEF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CA0B9B;IAEF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAuB;gBAEvB,aAAa,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,kBAAkB,KAAK,MAAM,EAAmB,OAAO,EAAE,OAAO,OAAO;IAGzH,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;CAuB7B"}
package/dist/src/CLI.js CHANGED
@@ -23,7 +23,7 @@ class CLI {
23
23
  this.process = process;
24
24
  }
25
25
  run() {
26
- var _a;
26
+ var _a, _b;
27
27
  return __awaiter(this, void 0, void 0, function* () {
28
28
  const args = (0, command_line_args_1.default)(CLI.options, { argv: this.process.argv });
29
29
  if (args.help) {
@@ -33,13 +33,14 @@ class CLI {
33
33
  }
34
34
  const runner = this.runnerFactory(args);
35
35
  try {
36
- const results = yield runner.runAll(args.dir);
36
+ const filters = (_a = args.filter) !== null && _a !== void 0 ? _a : [];
37
+ const results = yield runner.runAll(args.dir, filters.map((f) => new RegExp(f)));
37
38
  return Runner_1.default.allTestsPassed(results);
38
39
  }
39
40
  catch (error) {
40
41
  if (error instanceof Error) {
41
42
  this.process.stderr.write(`An unhandled ${error.name} occurred: ${error.message}\n`);
42
- this.process.stderr.write(((_a = error.stack) === null || _a === void 0 ? void 0 : _a.toString()) || "(no call stack)\n");
43
+ this.process.stderr.write(((_b = error.stack) === null || _b === void 0 ? void 0 : _b.toString()) || "(no call stack)\n");
43
44
  }
44
45
  return false;
45
46
  }
@@ -56,6 +57,14 @@ CLI.options = [
56
57
  typeLabel: "<directory>",
57
58
  description: "The path where tests to run are located (-d/--dir flag optional)"
58
59
  },
60
+ {
61
+ name: "filter",
62
+ alias: "f",
63
+ type: String,
64
+ multiple: true,
65
+ typeLabel: "<regex>",
66
+ description: "A regular expression to filter against TestSuiteName.TestMethodName()"
67
+ },
59
68
  {
60
69
  name: "junit",
61
70
  alias: "j",
@@ -74,7 +83,7 @@ CLI.options = [
74
83
  name: "quiet",
75
84
  alias: "q",
76
85
  type: Boolean,
77
- description: "Do not print test results to stdout"
86
+ description: "Do not print individual test results to stdout"
78
87
  },
79
88
  {
80
89
  name: "help",
@@ -91,8 +100,8 @@ CLI.sections = [
91
100
  {
92
101
  header: "Usage",
93
102
  content: [
94
- "<npm run | yarn> xunit [-j|--junit [filename]] [-s|--sonar [filename]]",
95
- "[-q|--quiet] [-d|--dir] <directory>"
103
+ "<npm run | yarn> xunit [-d|--dir] <directory>",
104
+ "[-q|--quiet] [-j|--junit [filename]] [-s|--sonar [filename]] [-f|--filter regex]"
96
105
  ]
97
106
  },
98
107
  {
@@ -100,7 +109,9 @@ CLI.sections = [
100
109
  content: [
101
110
  "npm run xunit dist/tests",
102
111
  "yarn xunit --junit results.xml --dir dist/tests --quiet",
103
- "yarn xunit -q -s -d dist/tests"
112
+ "yarn xunit -q -s -d dist/tests",
113
+ "yarn xunit dist/tests --filter MyTestSuite",
114
+ "yarn xunit dist/tests -f MyTestSuite.JustOneTest",
104
115
  ]
105
116
  },
106
117
  {
@@ -1 +1 @@
1
- {"version":3,"file":"CLI.js","sourceRoot":"","sources":["../../src/CLI.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,4EAAuC;AACvC,8EAAsD;AAEtD,0EAAqC;AACrC,8DAAsC;AACtC,8EAAsD;AAEtD,MAAqB,GAAG;IAkEvB,YAA6B,aAAwD,EAAmB,OAAuB;QAAlG,kBAAa,GAAb,aAAa,CAA2C;QAAmB,YAAO,GAAP,OAAO,CAAgB;IAC/H,CAAC;IAEK,GAAG;;;YACR,MAAM,IAAI,GAAG,IAAA,2BAAI,EAAC,GAAG,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;YAE5D,IAAI,IAAI,CAAC,IAAI,EAAE;gBACd,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBACrC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAChC,OAAO,IAAI,CAAC;aACZ;YAED,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YAExC,IAAI;gBACH,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC9C,OAAO,gBAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;aACtC;YAAC,OAAO,KAAK,EAAE;gBACf,IAAI,KAAK,YAAY,KAAK,EAAE;oBAC3B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,KAAK,CAAC,IAAI,cAAc,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;oBACrF,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,MAAA,KAAK,CAAC,KAAK,0CAAE,QAAQ,EAAE,KAAI,mBAAmB,CAAC,CAAC;iBAC1E;gBACD,OAAO,KAAK,CAAC;aACb;;KACD;;AA1FF,sBA2FC;AA1FwB,WAAO,GAA6B;IAC3D;QACC,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,MAAM;QACZ,aAAa,EAAE,IAAI;QACnB,SAAS,EAAE,aAAa;QACxB,WAAW,EAAE,kEAAkE;KAC/E;IACD;QACC,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,MAAM;QACZ,SAAS,EAAE,eAAe,uBAAa,CAAC,eAAe,GAAG;QAC1D,WAAW,EAAE,qCAAqC;KAClD;IACD;QACC,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,MAAM;QACZ,SAAS,EAAE,eAAe,uBAAa,CAAC,eAAe,GAAG;QAC1D,WAAW,EAAE,oDAAoD;KACjE;IACD;QACC,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,qCAAqC;KAClD;IACD;QACC,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,uDAAuD;KACpE;CACD,CAAC;AAEsB,YAAQ,GAAoB;IACnD;QACC,MAAM,EAAE,UAAU;QAClB,OAAO,EAAE,wEAAwE;KACjF;IACD;QACC,MAAM,EAAE,OAAO;QACf,OAAO,EAAE;YACR,wEAAwE;YACxE,qCAAqC;SACrC;KACD;IACD;QACC,MAAM,EAAE,UAAU;QAClB,OAAO,EAAE;YACR,0BAA0B;YAC1B,yDAAyD;YACzD,gCAAgC;SAChC;KACD;IACD;QACC,MAAM,EAAE,SAAS;QACjB,UAAU,EAAE,GAAG,CAAC,OAAO;KACvB;CACD,CAAC;AAEsB,SAAK,GAAG,IAAA,4BAAK,EAAC,GAAG,CAAC,QAAQ,CAAC,CAAC"}
1
+ {"version":3,"file":"CLI.js","sourceRoot":"","sources":["../../src/CLI.ts"],"names":[],"mappings":"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"}
@@ -36,6 +36,7 @@ export default abstract class TestSuite {
36
36
  private tests;
37
37
  addTest(name: string, info: TestInfo): void;
38
38
  setTests(tests: Record<string, TestInfo>): void;
39
- getTests(): Record<string, TestInfo>;
39
+ getTests(filters: RegExp[]): Record<string, TestInfo>;
40
+ filteredTests(filters: RegExp[]): Record<string, TestInfo>;
40
41
  }
41
42
  //# sourceMappingURL=TestSuite.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"TestSuite.d.ts","sourceRoot":"","sources":["../../../src/Framework/TestSuite.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,YAAY,CAAC;AAGlC;;;;;;;;GAQG;AACH,MAAM,CAAC,OAAO,CAAC,QAAQ,OAAO,SAAS;IACtC,MAAM;;;;;;;;;;;;;;;;;;;;;;;MAAoB;IAE1B,OAAO,CAAC,KAAK,CAAgC;IAE7C,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ;IAOpC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC;IAIxC,QAAQ;CAGR"}
1
+ {"version":3,"file":"TestSuite.d.ts","sourceRoot":"","sources":["../../../src/Framework/TestSuite.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,YAAY,CAAC;AAGlC;;;;;;;;GAQG;AACH,MAAM,CAAC,OAAO,CAAC,QAAQ,OAAO,SAAS;IACtC,MAAM;;;;;;;;;;;;;;;;;;;;;;;MAAoB;IAE1B,OAAO,CAAC,KAAK,CAAgC;IAE7C,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ;IAOpC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC;IAIxC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE;IAM1B,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE;CAQ/B"}
@@ -27,8 +27,18 @@ class TestSuite {
27
27
  setTests(tests) {
28
28
  this.tests = tests;
29
29
  }
30
- getTests() {
31
- return this.tests;
30
+ getTests(filters) {
31
+ return filters.length > 0
32
+ ? this.filteredTests(filters)
33
+ : this.tests;
34
+ }
35
+ filteredTests(filters) {
36
+ const filtered = {};
37
+ const keys = Object.keys(this.tests).filter(k => filters.map(f => { var _a; return f.test(`${this.constructor.name}.${(_a = this.tests[k].value) === null || _a === void 0 ? void 0 : _a.name}`); }).filter(m => m).length > 0);
38
+ keys.forEach(k => {
39
+ return filtered[k] = this.tests[k];
40
+ });
41
+ return filtered;
32
42
  }
33
43
  }
34
44
  exports.default = TestSuite;
@@ -1 +1 @@
1
- {"version":3,"file":"TestSuite.js","sourceRoot":"","sources":["../../../src/Framework/TestSuite.ts"],"names":[],"mappings":";;;;;AACA,+DAA6C;AAE7C;;;;;;;;GAQG;AACH,MAA8B,SAAS;IAAvC;QACC,WAAM,GAAG,oBAAgB,CAAC;QAElB,UAAK,GAA6B,EAAE,CAAC;IAgB9C,CAAC;IAdA,OAAO,CAAC,IAAY,EAAE,IAAc;QACnC,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE;YACpD,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;SAChB;QACD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACzB,CAAC;IAED,QAAQ,CAAC,KAA+B;QACvC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACpB,CAAC;IAED,QAAQ;QACP,OAAO,IAAI,CAAC,KAAK,CAAC;IACnB,CAAC;CACD;AAnBD,4BAmBC"}
1
+ {"version":3,"file":"TestSuite.js","sourceRoot":"","sources":["../../../src/Framework/TestSuite.ts"],"names":[],"mappings":";;;;;AACA,+DAA6C;AAE7C;;;;;;;;GAQG;AACH,MAA8B,SAAS;IAAvC;QACC,WAAM,GAAG,oBAAgB,CAAC;QAElB,UAAK,GAA6B,EAAE,CAAC;IA2B9C,CAAC;IAzBA,OAAO,CAAC,IAAY,EAAE,IAAc;QACnC,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE;YACpD,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;SAChB;QACD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACzB,CAAC;IAED,QAAQ,CAAC,KAA+B;QACvC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACpB,CAAC;IAED,QAAQ,CAAC,OAAiB;QACzB,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC;YACxB,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;YAC7B,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;IACf,CAAC;IAED,aAAa,CAAC,OAAiB;QAC9B,MAAM,QAAQ,GAA6B,EAAE,CAAC;QAC9C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,WAAC,OAAA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,IAAI,MAAA,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,0CAAE,IAAI,EAAE,CAAC,CAAA,EAAA,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC9J,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;YAChB,OAAO,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC;IACjB,CAAC;CACD;AA9BD,4BA8BC"}
@@ -13,7 +13,7 @@ class SonarReporter extends XMLReporter_1.default {
13
13
  file: [
14
14
  {
15
15
  _attr: {
16
- path: file.substr(file.split(path_1.default.sep)[0].length + 1).replace(/\.js$/, ".ts"),
16
+ path: file.substring(file.split(path_1.default.sep)[0].length + 1).replace(/\.js$/, ".ts"),
17
17
  }
18
18
  },
19
19
  ...Object.keys(results.results)
@@ -1 +1 @@
1
- {"version":3,"file":"SonarReporter.js","sourceRoot":"","sources":["../../../src/Reporters/SonarReporter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SonarReporter.js","sourceRoot":"","sources":["../../../src/Reporters/SonarReporter.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,6 @@ export default class Runner {
8
8
  private readonly reporters;
9
9
  constructor(loader: TestSuiteLoader, runner: TestSuiteRunner, reporters: ReadonlyArray<ResultReporter>);
10
10
  static allTestsPassed(results: Record<string, TestSuiteResults>): boolean;
11
- runAll(dir: string): Promise<Record<string, TestSuiteResults>>;
11
+ runAll(dir: string, filters: RegExp[]): Promise<Record<string, TestSuiteResults>>;
12
12
  }
13
13
  //# sourceMappingURL=Runner.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Runner.d.ts","sourceRoot":"","sources":["../../../src/Runners/Runner.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAChD,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAChD,OAAO,cAAc,MAAM,6BAA6B,CAAC;AACzD,OAAO,gBAAgB,MAAM,+BAA+B,CAAC;AAG7D,MAAM,CAAC,OAAO,OAAO,MAAM;IAEd,OAAO,CAAC,QAAQ,CAAC,MAAM;IAAmB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAAmB,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAA7F,MAAM,EAAE,eAAe,EAAmB,MAAM,EAAE,eAAe,EAAmB,SAAS,EAAE,aAAa,CAAC,cAAc,CAAC;IAGzJ,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAAG,OAAO;IAMnE,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;CAWpE"}
1
+ {"version":3,"file":"Runner.d.ts","sourceRoot":"","sources":["../../../src/Runners/Runner.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAChD,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAChD,OAAO,cAAc,MAAM,6BAA6B,CAAC;AACzD,OAAO,gBAAgB,MAAM,+BAA+B,CAAC;AAG7D,MAAM,CAAC,OAAO,OAAO,MAAM;IAEd,OAAO,CAAC,QAAQ,CAAC,MAAM;IAAmB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAAmB,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAA7F,MAAM,EAAE,eAAe,EAAmB,MAAM,EAAE,eAAe,EAAmB,SAAS,EAAE,aAAa,CAAC,cAAc,CAAC;IAGzJ,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAAG,OAAO;IAMnE,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;CAWvF"}
@@ -21,14 +21,14 @@ class Runner {
21
21
  return tests_with_results.length > 0
22
22
  && tests_with_results.filter(result => result.count(ResultType_1.ResultType.Passed) < result.total()).length === 0;
23
23
  }
24
- runAll(dir) {
24
+ runAll(dir, filters) {
25
25
  return __awaiter(this, void 0, void 0, function* () {
26
26
  yield Promise.all(this.reporters.map(r => r.runStarted()));
27
27
  const results = {};
28
- const suites = yield this.loader.loadTestSuites(dir);
28
+ const suites = yield this.loader.loadTestSuites(dir, filters);
29
29
  for (const file of Object.keys(suites)) {
30
30
  const suite = suites[file];
31
- results[file] = yield this.runner.runSuite(suite);
31
+ results[file] = yield this.runner.runSuite(suite, filters);
32
32
  }
33
33
  yield Promise.all(this.reporters.map(r => r.runCompleted(results)));
34
34
  return results;
@@ -1 +1 @@
1
- {"version":3,"file":"Runner.js","sourceRoot":"","sources":["../../../src/Runners/Runner.ts"],"names":[],"mappings":";;;;;;;;;;;AAIA,wDAAqD;AAErD,MAAqB,MAAM;IAE1B,YAA6B,MAAuB,EAAmB,MAAuB,EAAmB,SAAwC;QAA5H,WAAM,GAAN,MAAM,CAAiB;QAAmB,WAAM,GAAN,MAAM,CAAiB;QAAmB,cAAS,GAAT,SAAS,CAA+B;IACzJ,CAAC;IAED,MAAM,CAAC,cAAc,CAAC,OAAyC;QAC9D,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;QACvF,OAAO,kBAAkB,CAAC,MAAM,GAAG,CAAC;eAChC,kBAAkB,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAU,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;IACxG,CAAC;IAEK,MAAM,CAAC,GAAW;;YACvB,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;YAC3D,MAAM,OAAO,GAAqC,EAAE,CAAC;YACrD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;YACrD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;gBACvC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC3B,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;aAClD;YACD,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACpE,OAAO,OAAO,CAAC;QAChB,CAAC;KAAA;CACD;AAtBD,yBAsBC"}
1
+ {"version":3,"file":"Runner.js","sourceRoot":"","sources":["../../../src/Runners/Runner.ts"],"names":[],"mappings":";;;;;;;;;;;AAIA,wDAAqD;AAErD,MAAqB,MAAM;IAE1B,YAA6B,MAAuB,EAAmB,MAAuB,EAAmB,SAAwC;QAA5H,WAAM,GAAN,MAAM,CAAiB;QAAmB,WAAM,GAAN,MAAM,CAAiB;QAAmB,cAAS,GAAT,SAAS,CAA+B;IACzJ,CAAC;IAED,MAAM,CAAC,cAAc,CAAC,OAAyC;QAC9D,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;QACvF,OAAO,kBAAkB,CAAC,MAAM,GAAG,CAAC;eAChC,kBAAkB,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAU,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;IACxG,CAAC;IAEK,MAAM,CAAC,GAAW,EAAE,OAAiB;;YAC1C,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;YAC3D,MAAM,OAAO,GAAqC,EAAE,CAAC;YACrD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAC9D,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;gBACvC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC3B,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;aAC3D;YACD,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACpE,OAAO,OAAO,CAAC;QAChB,CAAC;KAAA;CACD;AAtBD,yBAsBC"}
@@ -3,9 +3,9 @@ import FileSystem from "../IO/FileSystem";
3
3
  export default class TestSuiteLoader {
4
4
  private readonly file_system;
5
5
  constructor(file_system: FileSystem);
6
- static loadTestSuite(file: string): Promise<TestSuite | null>;
6
+ static loadTestSuite(file: string, filters: RegExp[]): Promise<TestSuite | null>;
7
7
  static getModulePath(current_dir: string, file: string): string;
8
8
  static isFromNodeModules(dir: string): boolean;
9
- loadTestSuites(dir: string): Promise<Record<string, TestSuite>>;
9
+ loadTestSuites(dir: string, filters: RegExp[]): Promise<Record<string, TestSuite>>;
10
10
  }
11
11
  //# sourceMappingURL=TestSuiteLoader.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"TestSuiteLoader.d.ts","sourceRoot":"","sources":["../../../src/Runners/TestSuiteLoader.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,wBAAwB,CAAC;AAC/C,OAAO,UAAU,MAAM,kBAAkB,CAAC;AAG1C,MAAM,CAAC,OAAO,OAAO,eAAe;IAEvB,OAAO,CAAC,QAAQ,CAAC,WAAW;gBAAX,WAAW,EAAE,UAAU;WAGvC,aAAa,CAAC,IAAI,EAAE,MAAM;IAavC,MAAM,CAAC,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IAWtD,MAAM,CAAC,iBAAiB,CAAC,GAAG,EAAE,MAAM;IAI9B,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;CAYrE"}
1
+ {"version":3,"file":"TestSuiteLoader.d.ts","sourceRoot":"","sources":["../../../src/Runners/TestSuiteLoader.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,wBAAwB,CAAC;AAC/C,OAAO,UAAU,MAAM,kBAAkB,CAAC;AAG1C,MAAM,CAAC,OAAO,OAAO,eAAe;IAEvB,OAAO,CAAC,QAAQ,CAAC,WAAW;gBAAX,WAAW,EAAE,UAAU;WAGvC,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE;IAiB1D,MAAM,CAAC,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IAWtD,MAAM,CAAC,iBAAiB,CAAC,GAAG,EAAE,MAAM;IAI9B,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;CAcxF"}
@@ -38,14 +38,17 @@ class TestSuiteLoader {
38
38
  constructor(file_system) {
39
39
  this.file_system = file_system;
40
40
  }
41
- static loadTestSuite(file) {
41
+ static loadTestSuite(file, filters) {
42
42
  return __awaiter(this, void 0, void 0, function* () {
43
43
  const module_path = TestSuiteLoader.getModulePath(__dirname, file);
44
44
  const test_class = yield Promise.resolve().then(() => __importStar(require(module_path)));
45
45
  if (!(test_class.default.prototype instanceof TestSuite_1.default)) {
46
46
  return null;
47
47
  }
48
- const tests = test_class.default.prototype.getTests();
48
+ const tests = test_class.default.prototype.getTests(filters);
49
+ if (Object.keys(tests).length === 0) {
50
+ return null;
51
+ }
49
52
  const suite = new test_class.default();
50
53
  suite.setTests(tests);
51
54
  return suite;
@@ -57,20 +60,20 @@ class TestSuiteLoader {
57
60
  : `..${path_1.default.sep}..${path_1.default.sep}..`;
58
61
  const extension = FileSystem_1.default.extension(file);
59
62
  const module_name = extension.length > 0
60
- ? file.substr(0, file.length - extension.length - 1)
63
+ ? file.substring(0, file.length - extension.length - 1)
61
64
  : file;
62
65
  return `${root}${path_1.default.sep}${module_name}`;
63
66
  }
64
67
  static isFromNodeModules(dir) {
65
68
  return dir.indexOf("node_modules") !== -1;
66
69
  }
67
- loadTestSuites(dir) {
70
+ loadTestSuites(dir, filters) {
68
71
  return __awaiter(this, void 0, void 0, function* () {
72
+ const suites = {};
69
73
  const files = (yield this.file_system.getFiles(dir))
70
74
  .filter((file) => FileSystem_1.default.extension(file) === FileSystem_1.default.extension(__filename));
71
- const suites = {};
72
75
  for (const file of files) {
73
- const suite = yield TestSuiteLoader.loadTestSuite(file);
76
+ const suite = yield TestSuiteLoader.loadTestSuite(file, filters);
74
77
  if (suite !== undefined && suite !== null) {
75
78
  suites[file] = suite;
76
79
  }
@@ -1 +1 @@
1
- {"version":3,"file":"TestSuiteLoader.js","sourceRoot":"","sources":["../../../src/Runners/TestSuiteLoader.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uEAA+C;AAC/C,kEAA0C;AAC1C,gDAAwB;AAExB,MAAqB,eAAe;IAEnC,YAA6B,WAAuB;QAAvB,gBAAW,GAAX,WAAW,CAAY;IACpD,CAAC;IAED,MAAM,CAAO,aAAa,CAAC,IAAY;;YACtC,MAAM,WAAW,GAAG,eAAe,CAAC,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YACnE,MAAM,UAAU,GAAG,wDAAa,WAAW,GAAC,CAAC;YAC7C,IAAI,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,YAAY,mBAAS,CAAC,EAAE;gBACzD,OAAO,IAAI,CAAC;aACZ;YAED,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;YACtD,MAAM,KAAK,GAAc,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;YAClD,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACtB,OAAO,KAAK,CAAC;QACd,CAAC;KAAA;IAED,MAAM,CAAC,aAAa,CAAC,WAAmB,EAAE,IAAY;QACrD,MAAM,IAAI,GAAG,eAAe,CAAC,iBAAiB,CAAC,cAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YACxE,CAAC,CAAC,KAAK,cAAI,CAAC,GAAG,KAAK,cAAI,CAAC,GAAG,KAAK,cAAI,CAAC,GAAG,KAAK,cAAI,CAAC,GAAG,IAAI;YAC1D,CAAC,CAAC,KAAK,cAAI,CAAC,GAAG,KAAK,cAAI,CAAC,GAAG,IAAI,CAAC;QAClC,MAAM,SAAS,GAAG,oBAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC7C,MAAM,WAAW,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC;YACvC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;YACpD,CAAC,CAAC,IAAI,CAAC;QACR,OAAO,GAAG,IAAI,GAAG,cAAI,CAAC,GAAG,GAAG,WAAW,EAAE,CAAC;IAC3C,CAAC;IAED,MAAM,CAAC,iBAAiB,CAAC,GAAW;QACnC,OAAO,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3C,CAAC;IAEK,cAAc,CAAC,GAAW;;YAC/B,MAAM,KAAK,GAAG,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;iBAClD,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,oBAAU,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,oBAAU,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;YACpF,MAAM,MAAM,GAA8B,EAAE,CAAC;YAC7C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;gBACzB,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;gBACxD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE;oBAC1C,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;iBACrB;aACD;YACD,OAAO,MAAM,CAAC;QACf,CAAC;KAAA;CACD;AA7CD,kCA6CC"}
1
+ {"version":3,"file":"TestSuiteLoader.js","sourceRoot":"","sources":["../../../src/Runners/TestSuiteLoader.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uEAA+C;AAC/C,kEAA0C;AAC1C,gDAAwB;AAExB,MAAqB,eAAe;IAEnC,YAA6B,WAAuB;QAAvB,gBAAW,GAAX,WAAW,CAAY;IACpD,CAAC;IAED,MAAM,CAAO,aAAa,CAAC,IAAY,EAAE,OAAiB;;YACzD,MAAM,WAAW,GAAG,eAAe,CAAC,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YACnE,MAAM,UAAU,GAAG,wDAAa,WAAW,GAAC,CAAC;YAC7C,IAAI,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,YAAY,mBAAS,CAAC,EAAE;gBACzD,OAAO,IAAI,CAAC;aACZ;YAED,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC7D,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE;gBACpC,OAAO,IAAI,CAAC;aACZ;YAED,MAAM,KAAK,GAAc,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;YAClD,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACtB,OAAO,KAAK,CAAC;QACd,CAAC;KAAA;IAED,MAAM,CAAC,aAAa,CAAC,WAAmB,EAAE,IAAY;QACrD,MAAM,IAAI,GAAG,eAAe,CAAC,iBAAiB,CAAC,cAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YACxE,CAAC,CAAC,KAAK,cAAI,CAAC,GAAG,KAAK,cAAI,CAAC,GAAG,KAAK,cAAI,CAAC,GAAG,KAAK,cAAI,CAAC,GAAG,IAAI;YAC1D,CAAC,CAAC,KAAK,cAAI,CAAC,GAAG,KAAK,cAAI,CAAC,GAAG,IAAI,CAAC;QAClC,MAAM,SAAS,GAAG,oBAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC7C,MAAM,WAAW,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC;YACvC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;YACvD,CAAC,CAAC,IAAI,CAAC;QACR,OAAO,GAAG,IAAI,GAAG,cAAI,CAAC,GAAG,GAAG,WAAW,EAAE,CAAC;IAC3C,CAAC;IAED,MAAM,CAAC,iBAAiB,CAAC,GAAW;QACnC,OAAO,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3C,CAAC;IAEK,cAAc,CAAC,GAAW,EAAE,OAAiB;;YAClD,MAAM,MAAM,GAA8B,EAAE,CAAC;YAE7C,MAAM,KAAK,GAAG,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;iBAClD,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,oBAAU,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,oBAAU,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;YAEpF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;gBACzB,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBACjE,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE;oBAC1C,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;iBACrB;aACD;YACD,OAAO,MAAM,CAAC;QACf,CAAC;KAAA;CACD;AAnDD,kCAmDC"}
@@ -7,7 +7,7 @@ export default class TestSuiteRunner {
7
7
  private readonly runner;
8
8
  private readonly reporters;
9
9
  constructor(runner: TestRunner, reporters: ReadonlyArray<ResultReporter>);
10
- runSuite(suite: TestSuite): Promise<TestSuiteResults>;
10
+ runSuite(suite: TestSuite, filters: RegExp[]): Promise<TestSuiteResults>;
11
11
  runTests(suite: TestSuite, tests: Record<string, TestInfo>): Promise<TestSuiteResults>;
12
12
  }
13
13
  //# sourceMappingURL=TestSuiteRunner.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"TestSuiteRunner.d.ts","sourceRoot":"","sources":["../../../src/Runners/TestSuiteRunner.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,6BAA6B,CAAC;AACzD,OAAO,SAAS,MAAM,wBAAwB,CAAC;AAC/C,OAAO,gBAAgB,MAAM,+BAA+B,CAAC;AAC7D,OAAO,QAAQ,MAAM,uBAAuB,CAAC;AAC7C,OAAO,UAAU,MAAM,cAAc,CAAC;AAEtC,MAAM,CAAC,OAAO,OAAO,eAAe;IAEvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAAc,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAA9C,MAAM,EAAE,UAAU,EAAmB,SAAS,EAAE,aAAa,CAAC,cAAc,CAAC;IAGpG,QAAQ,CAAC,KAAK,EAAE,SAAS;IAQzB,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC;CAehE"}
1
+ {"version":3,"file":"TestSuiteRunner.d.ts","sourceRoot":"","sources":["../../../src/Runners/TestSuiteRunner.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,6BAA6B,CAAC;AACzD,OAAO,SAAS,MAAM,wBAAwB,CAAC;AAC/C,OAAO,gBAAgB,MAAM,+BAA+B,CAAC;AAC7D,OAAO,QAAQ,MAAM,uBAAuB,CAAC;AAC7C,OAAO,UAAU,MAAM,cAAc,CAAC;AAEtC,MAAM,CAAC,OAAO,OAAO,eAAe;IAEvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAAc,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAA9C,MAAM,EAAE,UAAU,EAAmB,SAAS,EAAE,aAAa,CAAC,cAAc,CAAC;IAGpG,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE;IAQ5C,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC;CAehE"}
@@ -18,10 +18,10 @@ class TestSuiteRunner {
18
18
  this.runner = runner;
19
19
  this.reporters = reporters;
20
20
  }
21
- runSuite(suite) {
21
+ runSuite(suite, filters) {
22
22
  return __awaiter(this, void 0, void 0, function* () {
23
23
  yield Promise.all(this.reporters.map(r => r.suiteStarted(suite)));
24
- const tests = suite.getTests();
24
+ const tests = suite.getTests(filters);
25
25
  const results = yield this.runTests(suite, tests);
26
26
  yield Promise.all(this.reporters.map(r => r.suiteCompleted(suite, results)));
27
27
  return results;
@@ -1 +1 @@
1
- {"version":3,"file":"TestSuiteRunner.js","sourceRoot":"","sources":["../../../src/Runners/TestSuiteRunner.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAEA,qFAA6D;AAI7D,MAAqB,eAAe;IAEnC,YAA6B,MAAkB,EAAmB,SAAwC;QAA7E,WAAM,GAAN,MAAM,CAAY;QAAmB,cAAS,GAAT,SAAS,CAA+B;IAC1G,CAAC;IAEK,QAAQ,CAAC,KAAgB;;YAC9B,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAClE,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC/B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAClD,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;YAC7E,OAAO,OAAO,CAAC;QAChB,CAAC;KAAA;IAEK,QAAQ,CAAC,KAAgB,EAAE,KAA+B;;YAC/D,MAAM,OAAO,GAAG,IAAI,0BAAgB,CAAC,KAAK,CAAC,CAAC;YAC5C,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE;gBAC7E,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC;gBACxF,OAAO,OAAO,CAAC;aACf;YAED,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACtC,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE;gBAC9B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;gBACnE,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;aAChC;YAED,OAAO,OAAO,CAAC;QAChB,CAAC;KAAA;CACD;AA5BD,kCA4BC"}
1
+ {"version":3,"file":"TestSuiteRunner.js","sourceRoot":"","sources":["../../../src/Runners/TestSuiteRunner.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAEA,qFAA6D;AAI7D,MAAqB,eAAe;IAEnC,YAA6B,MAAkB,EAAmB,SAAwC;QAA7E,WAAM,GAAN,MAAM,CAAY;QAAmB,cAAS,GAAT,SAAS,CAA+B;IAC1G,CAAC;IAEK,QAAQ,CAAC,KAAgB,EAAE,OAAiB;;YACjD,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAClE,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YACtC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAClD,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;YAC7E,OAAO,OAAO,CAAC;QAChB,CAAC;KAAA;IAEK,QAAQ,CAAC,KAAgB,EAAE,KAA+B;;YAC/D,MAAM,OAAO,GAAG,IAAI,0BAAgB,CAAC,KAAK,CAAC,CAAC;YAC5C,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE;gBAC7E,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC;gBACxF,OAAO,OAAO,CAAC;aACf;YAED,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACtC,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE;gBAC9B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;gBACnE,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;aAChC;YAED,OAAO,OAAO,CAAC;QAChB,CAAC;KAAA;CACD;AA5BD,kCA4BC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xunit.ts",
3
- "version": "1.0.3",
3
+ "version": "1.1.0",
4
4
  "description": "A unit testing framework for TypeScript, following standard xUnit patterns",
5
5
  "main": "dist/xunit.js",
6
6
  "author": "ecoAPM LLC",
@@ -9,7 +9,7 @@
9
9
  "license": "MIT",
10
10
  "dependencies": {
11
11
  "colors": "1.4.0",
12
- "command-line-args": "5.2.0",
12
+ "command-line-args": "5.2.1",
13
13
  "command-line-usage": "6.1.1",
14
14
  "lodash.isequal": "4.5.0",
15
15
  "xml": "1.0.1"
@@ -19,15 +19,15 @@
19
19
  "@types/command-line-args": "5.2.0",
20
20
  "@types/command-line-usage": "5.0.2",
21
21
  "@types/lodash.isequal": "4.5.5",
22
- "@types/node": "17.0.4",
23
- "@types/xml": "1.0.7",
24
- "@typescript-eslint/eslint-plugin": "5.8.0",
25
- "@typescript-eslint/parser": "5.8.0",
26
- "eslint": "8.5.0",
22
+ "@types/node": "17.0.19",
23
+ "@types/xml": "1.0.8",
24
+ "@typescript-eslint/eslint-plugin": "5.12.1",
25
+ "@typescript-eslint/parser": "5.12.1",
26
+ "eslint": "8.9.0",
27
27
  "notosans": "5.0.0",
28
28
  "ts-mockito": "2.6.1",
29
- "ts-node": "10.4.0",
30
- "typescript": "4.5.4"
29
+ "ts-node": "10.5.0",
30
+ "typescript": "4.5.5"
31
31
  },
32
32
  "peerDependencies": {
33
33
  "typescript": "^4.0.0"
@@ -36,6 +36,7 @@
36
36
  "clean": "rm -rf dist",
37
37
  "build": "tsc",
38
38
  "test": "node dist/cli.js dist/tests",
39
+ "xunit": "ts-node cli.ts",
39
40
  "tsdoc": "cp -r node_modules/notosans/* docs/assets && ts-node tsdoc.ts"
40
41
  },
41
42
  "bin": {
package/src/CLI.ts CHANGED
@@ -15,6 +15,14 @@ export default class CLI {
15
15
  typeLabel: "<directory>",
16
16
  description: "The path where tests to run are located (-d/--dir flag optional)"
17
17
  },
18
+ {
19
+ name: "filter",
20
+ alias: "f",
21
+ type: String,
22
+ multiple: true,
23
+ typeLabel: "<regex>",
24
+ description: "A regular expression to filter against TestSuiteName.TestMethodName()"
25
+ },
18
26
  {
19
27
  name: "junit",
20
28
  alias: "j",
@@ -33,7 +41,7 @@ export default class CLI {
33
41
  name: "quiet",
34
42
  alias: "q",
35
43
  type: Boolean,
36
- description: "Do not print test results to stdout"
44
+ description: "Do not print individual test results to stdout"
37
45
  },
38
46
  {
39
47
  name: "help",
@@ -51,8 +59,8 @@ export default class CLI {
51
59
  {
52
60
  header: "Usage",
53
61
  content: [
54
- "<npm run | yarn> xunit [-j|--junit [filename]] [-s|--sonar [filename]]",
55
- "[-q|--quiet] [-d|--dir] <directory>"
62
+ "<npm run | yarn> xunit [-d|--dir] <directory>",
63
+ "[-q|--quiet] [-j|--junit [filename]] [-s|--sonar [filename]] [-f|--filter regex]"
56
64
  ]
57
65
  },
58
66
  {
@@ -60,7 +68,9 @@ export default class CLI {
60
68
  content: [
61
69
  "npm run xunit dist/tests",
62
70
  "yarn xunit --junit results.xml --dir dist/tests --quiet",
63
- "yarn xunit -q -s -d dist/tests"
71
+ "yarn xunit -q -s -d dist/tests",
72
+ "yarn xunit dist/tests --filter MyTestSuite",
73
+ "yarn xunit dist/tests -f MyTestSuite.JustOneTest",
64
74
  ]
65
75
  },
66
76
  {
@@ -75,7 +85,7 @@ export default class CLI {
75
85
  }
76
86
 
77
87
  async run(): Promise<boolean> {
78
- const args = Args(CLI.options, { argv: this.process.argv });
88
+ const args = Args(CLI.options, {argv: this.process.argv});
79
89
 
80
90
  if (args.help) {
81
91
  this.process.stdout.write(CLI.usage);
@@ -86,7 +96,8 @@ export default class CLI {
86
96
  const runner = this.runnerFactory(args);
87
97
 
88
98
  try {
89
- const results = await runner.runAll(args.dir);
99
+ const filters = args.filter ?? [];
100
+ const results = await runner.runAll(args.dir, filters.map((f: string) => new RegExp(f)));
90
101
  return Runner.allTestsPassed(results);
91
102
  } catch (error) {
92
103
  if (error instanceof Error) {
@@ -26,7 +26,18 @@ export default abstract class TestSuite {
26
26
  this.tests = tests;
27
27
  }
28
28
 
29
- getTests() {
30
- return this.tests;
29
+ getTests(filters: RegExp[]) {
30
+ return filters.length > 0
31
+ ? this.filteredTests(filters)
32
+ : this.tests;
33
+ }
34
+
35
+ filteredTests(filters: RegExp[]) {
36
+ const filtered: Record<string, TestInfo> = {};
37
+ const keys = Object.keys(this.tests).filter(k => filters.map(f => f.test(`${this.constructor.name}.${this.tests[k].value?.name}`)).filter(m => m).length > 0);
38
+ keys.forEach(k => {
39
+ return filtered[k] = this.tests[k];
40
+ });
41
+ return filtered;
31
42
  }
32
43
  }
@@ -13,7 +13,7 @@ export default class SonarReporter extends XMLReporter {
13
13
  file: [
14
14
  {
15
15
  _attr: {
16
- path: file.substr(file.split(path.sep)[0].length + 1).replace(/\.js$/, ".ts"),
16
+ path: file.substring(file.split(path.sep)[0].length + 1).replace(/\.js$/, ".ts"),
17
17
  }
18
18
  },
19
19
  ...Object.keys(results.results)
@@ -15,13 +15,13 @@ export default class Runner {
15
15
  && tests_with_results.filter(result => result.count(ResultType.Passed) < result.total()).length === 0;
16
16
  }
17
17
 
18
- async runAll(dir: string): Promise<Record<string, TestSuiteResults>> {
18
+ async runAll(dir: string, filters: RegExp[]): Promise<Record<string, TestSuiteResults>> {
19
19
  await Promise.all(this.reporters.map(r => r.runStarted()));
20
20
  const results: Record<string, TestSuiteResults> = {};
21
- const suites = await this.loader.loadTestSuites(dir);
21
+ const suites = await this.loader.loadTestSuites(dir, filters);
22
22
  for (const file of Object.keys(suites)) {
23
23
  const suite = suites[file];
24
- results[file] = await this.runner.runSuite(suite);
24
+ results[file] = await this.runner.runSuite(suite, filters);
25
25
  }
26
26
  await Promise.all(this.reporters.map(r => r.runCompleted(results)));
27
27
  return results;
@@ -7,14 +7,18 @@ export default class TestSuiteLoader {
7
7
  constructor(private readonly file_system: FileSystem) {
8
8
  }
9
9
 
10
- static async loadTestSuite(file: string) {
10
+ static async loadTestSuite(file: string, filters: RegExp[]) {
11
11
  const module_path = TestSuiteLoader.getModulePath(__dirname, file);
12
12
  const test_class = await import(module_path);
13
13
  if (!(test_class.default.prototype instanceof TestSuite)) {
14
14
  return null;
15
15
  }
16
16
 
17
- const tests = test_class.default.prototype.getTests();
17
+ const tests = test_class.default.prototype.getTests(filters);
18
+ if (Object.keys(tests).length === 0) {
19
+ return null;
20
+ }
21
+
18
22
  const suite: TestSuite = new test_class.default();
19
23
  suite.setTests(tests);
20
24
  return suite;
@@ -26,7 +30,7 @@ export default class TestSuiteLoader {
26
30
  : `..${path.sep}..${path.sep}..`;
27
31
  const extension = FileSystem.extension(file);
28
32
  const module_name = extension.length > 0
29
- ? file.substr(0, file.length - extension.length - 1)
33
+ ? file.substring(0, file.length - extension.length - 1)
30
34
  : file;
31
35
  return `${root}${path.sep}${module_name}`;
32
36
  }
@@ -35,12 +39,14 @@ export default class TestSuiteLoader {
35
39
  return dir.indexOf("node_modules") !== -1;
36
40
  }
37
41
 
38
- async loadTestSuites(dir: string): Promise<Record<string, TestSuite>> {
42
+ async loadTestSuites(dir: string, filters: RegExp[]): Promise<Record<string, TestSuite>> {
43
+ const suites: Record<string, TestSuite> = {};
44
+
39
45
  const files = (await this.file_system.getFiles(dir))
40
46
  .filter((file) => FileSystem.extension(file) === FileSystem.extension(__filename));
41
- const suites: Record<string, TestSuite> = {};
47
+
42
48
  for (const file of files) {
43
- const suite = await TestSuiteLoader.loadTestSuite(file);
49
+ const suite = await TestSuiteLoader.loadTestSuite(file, filters);
44
50
  if (suite !== undefined && suite !== null) {
45
51
  suites[file] = suite;
46
52
  }
@@ -9,9 +9,9 @@ export default class TestSuiteRunner {
9
9
  constructor(private readonly runner: TestRunner, private readonly reporters: ReadonlyArray<ResultReporter>) {
10
10
  }
11
11
 
12
- async runSuite(suite: TestSuite) {
12
+ async runSuite(suite: TestSuite, filters: RegExp[]) {
13
13
  await Promise.all(this.reporters.map(r => r.suiteStarted(suite)));
14
- const tests = suite.getTests();
14
+ const tests = suite.getTests(filters);
15
15
  const results = await this.runTests(suite, tests);
16
16
  await Promise.all(this.reporters.map(r => r.suiteCompleted(suite, results)));
17
17
  return results;