@noldova/context.testing 0.0.0-stage → 0.0.2

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 (132) hide show
  1. package/LICENSE +21 -0
  2. package/api/index.d.ts +2015 -0
  3. package/api/index.js +42 -0
  4. package/api/index.js.map +1 -0
  5. package/decorators/category.js +23 -0
  6. package/decorators/category.js.map +1 -0
  7. package/decorators/skip.js +17 -0
  8. package/decorators/skip.js.map +1 -0
  9. package/decorators/test-class.js +12 -0
  10. package/decorators/test-class.js.map +1 -0
  11. package/decorators/test-data.js +23 -0
  12. package/decorators/test-data.js.map +1 -0
  13. package/decorators/test-method.js +12 -0
  14. package/decorators/test-method.js.map +1 -0
  15. package/enums/test-outcome.js +14 -0
  16. package/enums/test-outcome.js.map +1 -0
  17. package/enums/test-worker-message-kind.js +17 -0
  18. package/enums/test-worker-message-kind.js.map +1 -0
  19. package/enums/test-worker-value-kind.js +16 -0
  20. package/enums/test-worker-value-kind.js.map +1 -0
  21. package/exceptions/assert-failed.exception.js +19 -0
  22. package/exceptions/assert-failed.exception.js.map +1 -0
  23. package/exceptions/test-timeout.exception.js +20 -0
  24. package/exceptions/test-timeout.exception.js.map +1 -0
  25. package/exceptions/testing.exception.js +14 -0
  26. package/exceptions/testing.exception.js.map +1 -0
  27. package/interfaces/i-clock.js +9 -0
  28. package/interfaces/i-clock.js.map +1 -0
  29. package/interfaces/i-coverage-range.js +9 -0
  30. package/interfaces/i-coverage-range.js.map +1 -0
  31. package/interfaces/i-coverage-report.js +9 -0
  32. package/interfaces/i-coverage-report.js.map +1 -0
  33. package/interfaces/i-function-coverage.js +9 -0
  34. package/interfaces/i-function-coverage.js.map +1 -0
  35. package/interfaces/i-script-coverage.js +9 -0
  36. package/interfaces/i-script-coverage.js.map +1 -0
  37. package/interfaces/i-source-map-data.js +9 -0
  38. package/interfaces/i-source-map-data.js.map +1 -0
  39. package/interfaces/i-test-progress-listener.js +9 -0
  40. package/interfaces/i-test-progress-listener.js.map +1 -0
  41. package/models/coverage/block-coverage.js +21 -0
  42. package/models/coverage/block-coverage.js.map +1 -0
  43. package/models/coverage/coverage-project.js +23 -0
  44. package/models/coverage/coverage-project.js.map +1 -0
  45. package/models/coverage/coverage-range.js +18 -0
  46. package/models/coverage/coverage-range.js.map +1 -0
  47. package/models/coverage/coverage-result.js +28 -0
  48. package/models/coverage/coverage-result.js.map +1 -0
  49. package/models/coverage/file-coverage.js +45 -0
  50. package/models/coverage/file-coverage.js.map +1 -0
  51. package/models/coverage/function-coverage.js +14 -0
  52. package/models/coverage/function-coverage.js.map +1 -0
  53. package/models/coverage/line-range.js +25 -0
  54. package/models/coverage/line-range.js.map +1 -0
  55. package/models/coverage/mapped-source-line.js +22 -0
  56. package/models/coverage/mapped-source-line.js.map +1 -0
  57. package/models/coverage/source-map-segment.js +18 -0
  58. package/models/coverage/source-map-segment.js.map +1 -0
  59. package/models/decorators/test-data-entry.js +17 -0
  60. package/models/decorators/test-data-entry.js.map +1 -0
  61. package/models/decorators/test-marks.js +16 -0
  62. package/models/decorators/test-marks.js.map +1 -0
  63. package/models/discovery/discovered-test-class.js +36 -0
  64. package/models/discovery/discovered-test-class.js.map +1 -0
  65. package/models/discovery/discovered-test-method.js +42 -0
  66. package/models/discovery/discovered-test-method.js.map +1 -0
  67. package/models/discovery/test-project.js +20 -0
  68. package/models/discovery/test-project.js.map +1 -0
  69. package/models/execution/test-worker-message.js +76 -0
  70. package/models/execution/test-worker-message.js.map +1 -0
  71. package/models/execution/test-worker-record.js +75 -0
  72. package/models/execution/test-worker-record.js.map +1 -0
  73. package/models/execution/test-worker-result.js +45 -0
  74. package/models/execution/test-worker-result.js.map +1 -0
  75. package/models/execution/test-worker-run.js +31 -0
  76. package/models/execution/test-worker-run.js.map +1 -0
  77. package/models/execution/test-worker-start.js +33 -0
  78. package/models/execution/test-worker-start.js.map +1 -0
  79. package/models/execution/test-worker-text.js +17 -0
  80. package/models/execution/test-worker-text.js.map +1 -0
  81. package/models/execution/test-worker-value.js +104 -0
  82. package/models/execution/test-worker-value.js.map +1 -0
  83. package/models/reporting/coverage-report-row.js +22 -0
  84. package/models/reporting/coverage-report-row.js.map +1 -0
  85. package/models/results/test-class-result.js +29 -0
  86. package/models/results/test-class-result.js.map +1 -0
  87. package/models/results/test-method-result.js +59 -0
  88. package/models/results/test-method-result.js.map +1 -0
  89. package/models/results/test-run-result.js +34 -0
  90. package/models/results/test-run-result.js.map +1 -0
  91. package/models/results/test-run-totals.js +36 -0
  92. package/models/results/test-run-totals.js.map +1 -0
  93. package/models/results/test-selection.js +33 -0
  94. package/models/results/test-selection.js.map +1 -0
  95. package/package.json +25 -4
  96. package/resources.js +309 -0
  97. package/resources.js.map +1 -0
  98. package/services/assert.js +92 -0
  99. package/services/assert.js.map +1 -0
  100. package/services/coverage/coverage-analyzer.js +52 -0
  101. package/services/coverage/coverage-analyzer.js.map +1 -0
  102. package/services/coverage/coverage-report.reader.js +126 -0
  103. package/services/coverage/coverage-report.reader.js.map +1 -0
  104. package/services/coverage/file-coverage-analyzer.js +206 -0
  105. package/services/coverage/file-coverage-analyzer.js.map +1 -0
  106. package/services/coverage/source-map.js +135 -0
  107. package/services/coverage/source-map.js.map +1 -0
  108. package/services/discovery/test-discovery.js +198 -0
  109. package/services/discovery/test-discovery.js.map +1 -0
  110. package/services/execution/parallel-test-runner.js +24 -0
  111. package/services/execution/parallel-test-runner.js.map +1 -0
  112. package/services/execution/test-executor.js +116 -0
  113. package/services/execution/test-executor.js.map +1 -0
  114. package/services/execution/test-run-entry-point.js +89 -0
  115. package/services/execution/test-run-entry-point.js.map +1 -0
  116. package/services/execution/test-run-supervisor.js +251 -0
  117. package/services/execution/test-run-supervisor.js.map +1 -0
  118. package/services/execution/test-run-worker-entry-point.js +18 -0
  119. package/services/execution/test-run-worker-entry-point.js.map +1 -0
  120. package/services/execution/test-run-worker.js +116 -0
  121. package/services/execution/test-run-worker.js.map +1 -0
  122. package/services/execution/test-runner.js +58 -0
  123. package/services/execution/test-runner.js.map +1 -0
  124. package/services/reporting/coverage-report-writer.js +81 -0
  125. package/services/reporting/coverage-report-writer.js.map +1 -0
  126. package/services/reporting/test-console-reporter.js +72 -0
  127. package/services/reporting/test-console-reporter.js.map +1 -0
  128. package/services/reporting/test-report-writer.js +111 -0
  129. package/services/reporting/test-report-writer.js.map +1 -0
  130. package/services/timing/system-clock.js +26 -0
  131. package/services/timing/system-clock.js.map +1 -0
  132. package/README.md +0 -3
@@ -0,0 +1,251 @@
1
+ /**
2
+ * @license
3
+ * Copyright (c) Noldova.
4
+ *
5
+ * This source code is licensed under the license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+ // This file uses Node APIs and will change when we replace Node.
9
+ import { availableParallelism } from "node:os";
10
+ import { Worker } from "node:worker_threads";
11
+ import "@noldova/context.core";
12
+ import { ArgumentOutOfRangeException } from "@noldova/context.exceptions";
13
+ import { TestWorkerMessageKind } from "../../enums/test-worker-message-kind.js";
14
+ import { TestingException } from "../../exceptions/testing.exception.js";
15
+ import { TestWorkerMessage } from "../../models/execution/test-worker-message.js";
16
+ import { TestWorkerRun } from "../../models/execution/test-worker-run.js";
17
+ import { TestWorkerStart } from "../../models/execution/test-worker-start.js";
18
+ import { TestClassResult } from "../../models/results/test-class-result.js";
19
+ import { TestRunResult } from "../../models/results/test-run-result.js";
20
+ import { TestSelection } from "../../models/results/test-selection.js";
21
+ import { Resources } from "../../resources.js";
22
+ import { SystemClock } from "../timing/system-clock.js";
23
+ export class TestRunSupervisor {
24
+ timeoutMilliseconds;
25
+ testProjects;
26
+ filters;
27
+ progressListener;
28
+ workerUrl;
29
+ workerCount;
30
+ startLimitMilliseconds;
31
+ createWorker;
32
+ clock;
33
+ runs;
34
+ workers;
35
+ methodResults;
36
+ finishedClassResults;
37
+ classResults;
38
+ isQueued;
39
+ isFailed;
40
+ classCount;
41
+ methodCount;
42
+ selectionValue;
43
+ elapsedMillisecondsValue;
44
+ constructor(timeoutMilliseconds, testProjects, filters, progressListener, workerUrl = new URL(Resources.testRunWorkerFileName, import.meta.url), workerCount = TestRunSupervisor.defaultWorkerCount(), startLimitMilliseconds = Resources.testWorkerStartMilliseconds, createWorker = (url, options) => new Worker(url, options), clock = new SystemClock()) {
45
+ TestRunSupervisor.throwIfLimitsInvalid(timeoutMilliseconds, workerCount);
46
+ ArgumentOutOfRangeException.throwIfNotPositiveInteger(startLimitMilliseconds, Resources.startLimitMillisecondsParameter, Resources.startLimitInvalid);
47
+ if (startLimitMilliseconds > Resources.maximumTimeoutMilliseconds)
48
+ throw new ArgumentOutOfRangeException(Resources.startLimitMillisecondsParameter, startLimitMilliseconds, Resources.timeoutTooLarge);
49
+ this.timeoutMilliseconds = timeoutMilliseconds;
50
+ this.testProjects = testProjects;
51
+ this.filters = filters;
52
+ this.progressListener = progressListener;
53
+ this.workerUrl = workerUrl;
54
+ this.workerCount = workerCount;
55
+ this.startLimitMilliseconds = startLimitMilliseconds;
56
+ this.createWorker = createWorker;
57
+ this.clock = clock;
58
+ this.runs = [];
59
+ this.workers = new Map();
60
+ this.methodResults = new Map();
61
+ this.finishedClassResults = new Map();
62
+ this.classResults = [];
63
+ this.isQueued = false;
64
+ this.isFailed = false;
65
+ this.classCount = 0;
66
+ this.methodCount = 0;
67
+ this.selectionValue = new TestSelection(filters, 0, 0);
68
+ this.elapsedMillisecondsValue = 0;
69
+ }
70
+ get selection() {
71
+ return this.selectionValue;
72
+ }
73
+ get elapsedMilliseconds() {
74
+ return this.elapsedMillisecondsValue;
75
+ }
76
+ static defaultWorkerCount() {
77
+ return Math.max(availableParallelism(), Resources.minimumWorkerCount);
78
+ }
79
+ static throwIfLimitsInvalid(timeoutMilliseconds, workerCount) {
80
+ ArgumentOutOfRangeException.throwIfNotPositiveInteger(timeoutMilliseconds, Resources.timeoutMillisecondsParameter, Resources.timeoutInvalid);
81
+ if (timeoutMilliseconds + Resources.testWorkerGraceMilliseconds > Resources.maximumTimeoutMilliseconds)
82
+ throw new ArgumentOutOfRangeException(Resources.timeoutMillisecondsParameter, timeoutMilliseconds, Resources.timeoutTooLarge);
83
+ ArgumentOutOfRangeException.throwIfNotPositiveInteger(workerCount, Resources.workerCountParameter, Resources.workerCountInvalid);
84
+ }
85
+ async runAsync() {
86
+ const start = this.clock.now();
87
+ await new Promise((resolve, reject) => {
88
+ for (let index = 0; index < this.workerCount; index++)
89
+ this.startWorker(resolve, reject);
90
+ });
91
+ const result = new TestRunResult(this.classResults, this.selection);
92
+ if (result.total !== this.methodCount)
93
+ throw new TestingException(Resources.runResultCountMismatch(result.total, this.methodCount));
94
+ this.elapsedMillisecondsValue = this.clock.now() - start;
95
+ return result;
96
+ }
97
+ startWorker(resolve, reject) {
98
+ const start = new TestWorkerStart(this.testProjects, this.filters, this.timeoutMilliseconds);
99
+ const worker = this.createWorker(this.workerUrl, { workerData: start.toData() });
100
+ const startLimitMilliseconds = Math.max(this.timeoutMilliseconds + Resources.testWorkerGraceMilliseconds, this.startLimitMilliseconds);
101
+ let started;
102
+ let imported;
103
+ let watchdog;
104
+ let isStopping = false;
105
+ const stopAsync = async () => {
106
+ isStopping = true;
107
+ this.clock.clearTimeout(watchdog);
108
+ worker.removeAllListeners(Resources.messageEvent);
109
+ worker.removeAllListeners(Resources.exitEvent);
110
+ await Promise.allSettled([worker.terminate()]);
111
+ };
112
+ const finish = () => {
113
+ this.workers.delete(worker);
114
+ if (this.workers.size === 0 && !this.isFailed)
115
+ resolve();
116
+ };
117
+ const fail = (error) => {
118
+ this.isFailed = true;
119
+ this.runs.length = 0;
120
+ void Promise.all([...this.workers.values()].map(stopWorkerAsync => stopWorkerAsync())).then(() => reject(error));
121
+ };
122
+ // A worker with no run left ends by itself, so its thread writes its coverage. It fails the run when it ends with an error or an exit code
123
+ // other than 0, or does not end within the limit, since its coverage would then be incomplete.
124
+ const end = () => {
125
+ worker.removeAllListeners(Resources.messageEvent);
126
+ worker.removeAllListeners(Resources.exitEvent);
127
+ worker.once(Resources.exitEvent, (code) => {
128
+ this.clock.clearTimeout(watchdog);
129
+ if (code === 0)
130
+ finish();
131
+ else
132
+ fail(new TestingException(Resources.testWorkerEndedAfterItsLastClass(code)));
133
+ });
134
+ this.clock.clearTimeout(watchdog);
135
+ watchdog = this.clock.setTimeout(() => fail(new TestingException(Resources.testWorkerDidNotEnd(Resources.testWorkerEndMilliseconds))), Resources.testWorkerEndMilliseconds);
136
+ worker.postMessage(undefined);
137
+ };
138
+ const replace = (ending) => {
139
+ void stopAsync().then(() => {
140
+ if (!this.isFailed)
141
+ this.timeOut(ending);
142
+ if (this.runs.length === 0)
143
+ finish();
144
+ else {
145
+ this.workers.delete(worker);
146
+ this.startWorker(resolve, reject);
147
+ }
148
+ }).catch(fail);
149
+ };
150
+ const arm = (limitMilliseconds = this.timeoutMilliseconds + Resources.testWorkerGraceMilliseconds) => {
151
+ this.clock.clearTimeout(watchdog);
152
+ watchdog = this.clock.setTimeout(() => Object.isUndefined(started)
153
+ ? fail(new TestingException(Object.isUndefined(imported) ? Resources.testWorkerStalled(limitMilliseconds)
154
+ : Resources.testWorkerStalledAfterImport(limitMilliseconds, imported)))
155
+ : replace(TestWorkerMessage.timedOut(started.classIndex, started.methodIndex, String.empty)), limitMilliseconds);
156
+ };
157
+ const runNext = () => {
158
+ const run = this.runs.shift();
159
+ if (Object.isUndefined(run)) {
160
+ end();
161
+ return;
162
+ }
163
+ worker.postMessage(run.toData());
164
+ arm();
165
+ };
166
+ this.workers.set(worker, stopAsync);
167
+ worker.on(Resources.messageEvent, (value) => {
168
+ try {
169
+ const message = TestWorkerMessage.from(value);
170
+ if (message.kind === TestWorkerMessageKind.Imported) {
171
+ imported = message.filePath;
172
+ arm(startLimitMilliseconds);
173
+ }
174
+ else if (message.kind === TestWorkerMessageKind.Ready) {
175
+ imported = undefined;
176
+ this.queue(message);
177
+ runNext();
178
+ }
179
+ else if (message.kind === TestWorkerMessageKind.Started) {
180
+ started = message;
181
+ arm();
182
+ }
183
+ else if (message.kind === TestWorkerMessageKind.MethodCompleted) {
184
+ this.completeMethod(message);
185
+ started = undefined;
186
+ arm();
187
+ }
188
+ else if (message.kind === TestWorkerMessageKind.ClassCompleted) {
189
+ this.completeClass(message.classIndex, message.filePath);
190
+ started = undefined;
191
+ runNext();
192
+ }
193
+ else
194
+ replace(message);
195
+ }
196
+ catch (error) {
197
+ fail(error);
198
+ }
199
+ });
200
+ worker.on(Resources.errorEvent, (error) => {
201
+ if (!isStopping)
202
+ fail(error);
203
+ });
204
+ worker.on(Resources.exitEvent, (code) => fail(new TestingException(Resources.testWorkerEnded(code))));
205
+ arm(startLimitMilliseconds);
206
+ }
207
+ queue(ready) {
208
+ if (this.isQueued) {
209
+ if (ready.classCount !== this.classCount || ready.methodCount !== this.methodCount || ready.discoveredCount !== this.selection.discovered)
210
+ throw new TestingException(Resources.testWorkerDiscoveryMismatch(this.classCount, this.methodCount, ready.classCount, ready.methodCount));
211
+ return;
212
+ }
213
+ this.isQueued = true;
214
+ this.classCount = ready.classCount;
215
+ this.methodCount = ready.methodCount;
216
+ this.selectionValue = new TestSelection(this.filters, ready.discoveredCount, ready.methodCount);
217
+ for (let classIndex = 0; classIndex < ready.classCount; classIndex++)
218
+ this.runs.push(new TestWorkerRun(classIndex, 0, false));
219
+ }
220
+ timeOut(ending) {
221
+ if (ending.filePath !== String.empty) {
222
+ this.completeClass(ending.classIndex, ending.filePath);
223
+ return;
224
+ }
225
+ const nextMethodIndex = this.getMethodResults(ending.classIndex).length;
226
+ this.runs.unshift(new TestWorkerRun(ending.classIndex, nextMethodIndex, ending.methodIndex === nextMethodIndex));
227
+ }
228
+ completeMethod(message) {
229
+ if (Object.isUndefined(message.result))
230
+ throw new TestingException(Resources.testWorkerDataInvalid);
231
+ this.methodResults.set(message.classIndex, [...this.getMethodResults(message.classIndex), message.result.methodResult]);
232
+ this.progressListener?.onMethodCompleted?.(message.result.methodResult);
233
+ }
234
+ completeClass(classIndex, filePath) {
235
+ const methodResults = this.getMethodResults(classIndex);
236
+ const [firstResult] = methodResults;
237
+ if (Object.isUndefined(firstResult))
238
+ throw new TestingException(Resources.testWorkerDataInvalid);
239
+ this.finishedClassResults.set(classIndex, new TestClassResult(firstResult.packageName, firstResult.className, filePath, methodResults));
240
+ this.methodResults.delete(classIndex);
241
+ for (let classResult = this.finishedClassResults.get(this.classResults.length); !Object.isUndefined(classResult); classResult = this.finishedClassResults.get(this.classResults.length)) {
242
+ this.finishedClassResults.delete(this.classResults.length);
243
+ this.classResults.push(classResult);
244
+ this.progressListener?.onClassCompleted(classResult);
245
+ }
246
+ }
247
+ getMethodResults(classIndex) {
248
+ return this.methodResults.get(classIndex) ?? [];
249
+ }
250
+ }
251
+ //# sourceMappingURL=test-run-supervisor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-run-supervisor.js","sourceRoot":"","sources":["../../../../../src/noldova.context.testing/src/services/execution/test-run-supervisor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * @license
3
+ * Copyright (c) Noldova.
4
+ *
5
+ * This source code is licensed under the license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+ // This file uses Node APIs and will change when we replace Node.
9
+ import { parentPort, workerData } from "node:worker_threads";
10
+ import { TestWorkerStart } from "../../models/execution/test-worker-start.js";
11
+ import { TestRunWorker } from "./test-run-worker.js";
12
+ export class TestRunWorkerEntryPoint {
13
+ async runAsync() {
14
+ await new TestRunWorker(parentPort, TestWorkerStart.from(workerData)).startAsync();
15
+ }
16
+ }
17
+ await new TestRunWorkerEntryPoint().runAsync();
18
+ //# sourceMappingURL=test-run-worker-entry-point.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-run-worker-entry-point.js","sourceRoot":"","sources":["../../../../../src/noldova.context.testing/src/services/execution/test-run-worker-entry-point.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,iEAAiE;AAEjE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAE7D,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAC9E,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,OAAO,uBAAuB;IAC3B,KAAK,CAAC,QAAQ;QACnB,MAAM,IAAI,aAAa,CAAC,UAAW,EAAE,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;IACtF,CAAC;CACF;AAED,MAAM,IAAI,uBAAuB,EAAE,CAAC,QAAQ,EAAE,CAAC"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * @license
3
+ * Copyright (c) Noldova.
4
+ *
5
+ * This source code is licensed under the license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+ import "@noldova/context.core";
9
+ import { TestTimeoutException } from "../../exceptions/test-timeout.exception.js";
10
+ import { TestingException } from "../../exceptions/testing.exception.js";
11
+ import { DiscoveredTestClass } from "../../models/discovery/discovered-test-class.js";
12
+ import { TestWorkerMessage } from "../../models/execution/test-worker-message.js";
13
+ import { TestWorkerResult } from "../../models/execution/test-worker-result.js";
14
+ import { TestWorkerRun } from "../../models/execution/test-worker-run.js";
15
+ import { Resources } from "../../resources.js";
16
+ import { TestDiscovery } from "../discovery/test-discovery.js";
17
+ import { TestReportWriter } from "../reporting/test-report-writer.js";
18
+ import { SystemClock } from "../timing/system-clock.js";
19
+ import { TestExecutor } from "./test-executor.js";
20
+ import { TestRunner } from "./test-runner.js";
21
+ export class TestRunWorker {
22
+ static IGNORE_ABANDONED_REJECTION = () => undefined;
23
+ port;
24
+ start;
25
+ reportWriter;
26
+ executor;
27
+ selected;
28
+ stoppedMethods;
29
+ timedOut;
30
+ classIndex;
31
+ methodIndex;
32
+ isRunningStoppedMethod;
33
+ baseline;
34
+ constructor(port, start, clock = new SystemClock()) {
35
+ this.port = port;
36
+ this.start = start;
37
+ this.reportWriter = new TestReportWriter();
38
+ this.executor = new TestExecutor(start.timeoutMilliseconds, clock);
39
+ this.selected = [];
40
+ this.stoppedMethods = new Set();
41
+ this.timedOut = undefined;
42
+ this.classIndex = 0;
43
+ this.methodIndex = -1;
44
+ this.isRunningStoppedMethod = false;
45
+ this.baseline = [];
46
+ }
47
+ async startAsync() {
48
+ const discovery = new TestDiscovery();
49
+ const discovered = await discovery.discoverAsync(this.start.testProjects, filePath => this.post(TestWorkerMessage.imported(filePath)));
50
+ this.selected = new TestRunner(discovery, this.executor).select(discovered, this.start.filters);
51
+ this.port.on(Resources.messageEvent, (value) => {
52
+ // An empty message means no run is left: closing the port lets the thread end by itself and write its coverage.
53
+ if (Object.isUndefined(value))
54
+ this.port.close();
55
+ else
56
+ void this.runAsync(TestWorkerRun.from(value));
57
+ });
58
+ this.baseline = process.getActiveResourcesInfo();
59
+ this.post(TestWorkerMessage.ready(this.selected.length, TestRunWorker.countMethods(this.selected), TestRunWorker.countMethods(discovered)));
60
+ }
61
+ async runAsync(run) {
62
+ const testClass = this.selected[run.classIndex];
63
+ const methods = testClass?.methods.slice(run.startMethodIndex) ?? [];
64
+ const [startMethod] = methods;
65
+ if (Object.isUndefined(testClass) || Object.isUndefined(startMethod))
66
+ throw new TestingException(Resources.testWorkerDataInvalid);
67
+ this.stoppedMethods = run.isStartMethodStopped ? new Set([startMethod]) : new Set();
68
+ this.classIndex = run.classIndex;
69
+ this.methodIndex = run.startMethodIndex - 1;
70
+ const classResults = await this.executor.executeAsync([new DiscoveredTestClass(testClass.packageName, testClass.className, testClass.filePath, testClass.testClassConstructor, testClass.skipReason, methods, testClass.categories)], this, this.stoppedMethods, () => !Object.isUndefined(this.timedOut));
71
+ if (!Object.isUndefined(this.timedOut)) {
72
+ this.post(this.timedOut);
73
+ return;
74
+ }
75
+ for (const classResult of classResults) {
76
+ const heading = this.reportWriter.formatClassHeading(classResult);
77
+ const openResources = this.findOpenResources();
78
+ if (openResources.length > 0)
79
+ throw new TestingException(Resources.formatTestResourcesOpen(heading, openResources));
80
+ this.post(TestWorkerMessage.classCompleted(this.classIndex, classResult.filePath));
81
+ }
82
+ }
83
+ onMethodStarted(_testClass, method) {
84
+ this.methodIndex++;
85
+ this.isRunningStoppedMethod = this.stoppedMethods.has(method);
86
+ this.post(TestWorkerMessage.started(this.classIndex, this.methodIndex));
87
+ }
88
+ onMethodCompleted(methodResult) {
89
+ this.post(TestWorkerMessage.methodCompleted(this.classIndex, this.methodIndex, new TestWorkerResult(methodResult)));
90
+ if (!(methodResult.failure instanceof TestTimeoutException) || this.isRunningStoppedMethod)
91
+ return;
92
+ this.timedOut = TestWorkerMessage.timedOut(this.classIndex, this.methodIndex, String.empty);
93
+ if (!process.listeners(Resources.unhandledRejectionEvent).includes(TestRunWorker.IGNORE_ABANDONED_REJECTION))
94
+ process.on(Resources.unhandledRejectionEvent, TestRunWorker.IGNORE_ABANDONED_REJECTION);
95
+ }
96
+ onClassCompleted(classResult) {
97
+ if (!Object.isUndefined(this.timedOut))
98
+ this.timedOut = TestWorkerMessage.timedOut(this.timedOut.classIndex, this.timedOut.methodIndex, classResult.filePath);
99
+ }
100
+ static countMethods(testClasses) {
101
+ return testClasses.reduce((count, testClass) => count + testClass.methods.length, 0);
102
+ }
103
+ findOpenResources() {
104
+ const open = process.getActiveResourcesInfo();
105
+ for (const resource of this.baseline) {
106
+ const index = open.indexOf(resource);
107
+ if (index >= 0)
108
+ open.splice(index, 1);
109
+ }
110
+ return open;
111
+ }
112
+ post(message) {
113
+ this.port.postMessage(message.toData());
114
+ }
115
+ }
116
+ //# sourceMappingURL=test-run-worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-run-worker.js","sourceRoot":"","sources":["../../../../../src/noldova.context.testing/src/services/execution/test-run-worker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * @license
3
+ * Copyright (c) Noldova.
4
+ *
5
+ * This source code is licensed under the license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+ import { TestingException } from "../../exceptions/testing.exception.js";
9
+ import { DiscoveredTestClass } from "../../models/discovery/discovered-test-class.js";
10
+ import { TestRunResult } from "../../models/results/test-run-result.js";
11
+ import { TestSelection } from "../../models/results/test-selection.js";
12
+ import { Resources } from "../../resources.js";
13
+ export class TestRunner {
14
+ discovery;
15
+ executor;
16
+ constructor(discovery, executor) {
17
+ this.discovery = discovery;
18
+ this.executor = executor;
19
+ }
20
+ async runAsync(testProjects, filters = [], progressListener) {
21
+ const discovered = await this.discovery.discoverAsync(testProjects);
22
+ const selected = this.select(discovered, filters);
23
+ const classResults = await this.executor.executeAsync(selected, progressListener);
24
+ const selectedCount = TestRunner.countMethods(selected);
25
+ const result = new TestRunResult(classResults, new TestSelection(filters, TestRunner.countMethods(discovered), selectedCount));
26
+ if (result.total !== selectedCount)
27
+ throw new TestingException(Resources.runResultCountMismatch(result.total, selectedCount));
28
+ return result;
29
+ }
30
+ async selectAsync(testProjects, filters = []) {
31
+ return this.select(await this.discovery.discoverAsync(testProjects), filters);
32
+ }
33
+ select(testClasses, filters = []) {
34
+ if (filters.length === 0)
35
+ return [...testClasses];
36
+ const categoryFilters = new Set(filters.filter(t => t.startsWith(Resources.categoryFilterPrefix)).map(t => t.slice(Resources.categoryFilterPrefix.length)));
37
+ const identityFilters = filters.filter(t => !t.startsWith(Resources.categoryFilterPrefix));
38
+ const selected = [];
39
+ for (const testClass of testClasses) {
40
+ if (testClass.categories.some(t => categoryFilters.has(t)) ||
41
+ identityFilters.some(t => testClass.packageName.includes(t) || testClass.filePath.includes(t) || testClass.className.includes(t))) {
42
+ selected.push(testClass);
43
+ continue;
44
+ }
45
+ const matchingMethods = testClass.methods.filter(t => {
46
+ const methodIdentity = `${testClass.className}.${t.displayName}`;
47
+ return t.categories.some(t => categoryFilters.has(t)) || identityFilters.some(t => methodIdentity.includes(t));
48
+ });
49
+ if (matchingMethods.length > 0)
50
+ selected.push(new DiscoveredTestClass(testClass.packageName, testClass.className, testClass.filePath, testClass.testClassConstructor, testClass.skipReason, matchingMethods, testClass.categories));
51
+ }
52
+ return selected;
53
+ }
54
+ static countMethods(testClasses) {
55
+ return testClasses.reduce((count, testClass) => count + testClass.methods.length, 0);
56
+ }
57
+ }
58
+ //# sourceMappingURL=test-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-runner.js","sourceRoot":"","sources":["../../../../../src/noldova.context.testing/src/services/execution/test-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * @license
3
+ * Copyright (c) Noldova.
4
+ *
5
+ * This source code is licensed under the license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+ import { CoverageReportRow } from "../../models/reporting/coverage-report-row.js";
9
+ import { Resources } from "../../resources.js";
10
+ export class CoverageReportWriter {
11
+ formatLines(result, skipCoveredDetails) {
12
+ const fileRows = this.buildFileRows(result, skipCoveredDetails);
13
+ const overallRow = this.buildOverallRow(result);
14
+ const rows = [...fileRows, overallRow];
15
+ const fileWidth = rows.reduce((width, row) => Math.max(width, row.fileCell.length), Resources.coverageFileHeading.length);
16
+ const sourceWidth = rows.reduce((width, row) => Math.max(width, row.sourceCell.length), Resources.coverageHeading.length);
17
+ const blocksWidth = rows.reduce((width, row) => Math.max(width, row.blocksCell.length), Resources.blocksHeading.length);
18
+ const lines = [this.formatHorizontal(fileWidth, sourceWidth, blocksWidth, Resources.tableTopLeft, Resources.tableTopMiddle, Resources.tableTopRight)];
19
+ const headingRow = new CoverageReportRow(Resources.coverageFileHeading, Resources.coverageHeading, Resources.blocksHeading, String.empty, false);
20
+ lines.push(this.formatRow(headingRow, fileWidth, sourceWidth, blocksWidth));
21
+ lines.push(this.formatHorizontal(fileWidth, sourceWidth, blocksWidth, Resources.tableMiddleLeft, Resources.tableMiddle, Resources.tableMiddleRight));
22
+ for (const row of fileRows)
23
+ lines.push(this.formatRow(row, fileWidth, sourceWidth, blocksWidth));
24
+ lines.push(this.formatHorizontal(fileWidth, sourceWidth, blocksWidth, Resources.tableMiddleLeft, Resources.tableMiddle, Resources.tableMiddleRight));
25
+ lines.push(this.formatRow(overallRow, fileWidth, sourceWidth, blocksWidth));
26
+ lines.push(this.formatHorizontal(fileWidth, sourceWidth, blocksWidth, Resources.tableBottomLeft, Resources.tableBottomMiddle, Resources.tableBottomRight));
27
+ return lines;
28
+ }
29
+ buildFileRows(result, skipCoveredDetails) {
30
+ const rows = [];
31
+ const shownFileCoverages = skipCoveredDetails ? result.incompleteFileCoverages : result.fileCoverages;
32
+ let currentProject = String.empty;
33
+ for (const fileCoverage of shownFileCoverages) {
34
+ if (fileCoverage.projectName !== currentProject) {
35
+ currentProject = fileCoverage.projectName;
36
+ rows.push(new CoverageReportRow(currentProject, String.empty, String.empty, String.empty, false));
37
+ }
38
+ const color = fileCoverage.isExecutable ? this.colorOf(fileCoverage.totalLength, fileCoverage.uncoveredLength) : String.empty;
39
+ rows.push(new CoverageReportRow(`${Resources.reportIndent}${fileCoverage.relativePath}`, fileCoverage.isExecutable ? this.formatPercentage(fileCoverage.totalLength, fileCoverage.uncoveredLength) : Resources.coverageNotApplicable, this.formatBlocks(fileCoverage.takenBlockCount, fileCoverage.blockCount), color, false));
40
+ for (const lineRange of fileCoverage.uncoveredLineRanges)
41
+ rows.push(new CoverageReportRow(Resources.uncoveredLines(lineRange.displayText), String.empty, String.empty, Resources.terminalRed, true));
42
+ }
43
+ return rows;
44
+ }
45
+ buildOverallRow(result) {
46
+ const executableFileCoverages = result.executableFileCoverages;
47
+ const fullyCovered = executableFileCoverages.filter(t => t.isFullyCovered).length;
48
+ const hasExecutableFiles = executableFileCoverages.length > 0;
49
+ return new CoverageReportRow(Resources.overallCoverage(fullyCovered, executableFileCoverages.length), hasExecutableFiles ? this.formatPercentage(result.totalLength, result.uncoveredLength) : Resources.coverageNotApplicable, this.formatBlocks(result.takenBlockCount, result.blockCount), hasExecutableFiles ? this.colorOf(result.totalLength, result.uncoveredLength) : String.empty, true);
50
+ }
51
+ percentageOf(totalLength, uncoveredLength) {
52
+ return (1 - uncoveredLength / totalLength) * 100;
53
+ }
54
+ formatPercentage(totalLength, uncoveredLength) {
55
+ return `${this.percentageOf(totalLength, uncoveredLength).toFixed(1)}${Resources.coveragePercentSuffix}`;
56
+ }
57
+ formatBlocks(takenBlockCount, blockCount) {
58
+ return blockCount === 0
59
+ ? Resources.coverageNotApplicable
60
+ : `${takenBlockCount}${Resources.coverageBlockSeparator}${blockCount}`;
61
+ }
62
+ colorOf(totalLength, uncoveredLength) {
63
+ const percentage = this.percentageOf(totalLength, uncoveredLength);
64
+ if (percentage >= Resources.greenThreshold)
65
+ return Resources.terminalGreen;
66
+ return percentage >= Resources.yellowThreshold ? Resources.terminalYellow : Resources.terminalRed;
67
+ }
68
+ colorize(text, color) {
69
+ return color === String.empty ? text : `${color}${text}${Resources.terminalReset}`;
70
+ }
71
+ formatHorizontal(fileWidth, sourceWidth, blocksWidth, left, middle, right) {
72
+ return `${left}${Resources.tableHorizontal.repeat(fileWidth + 2)}${middle}${Resources.tableHorizontal.repeat(sourceWidth + 2)}${middle}${Resources.tableHorizontal.repeat(blocksWidth + 2)}${right}`;
73
+ }
74
+ formatRow(row, fileWidth, sourceWidth, blocksWidth) {
75
+ const fileCell = this.colorize(row.fileCell.padEnd(fileWidth), row.colorsFileCell ? row.color : String.empty);
76
+ const sourceCell = this.colorize(row.sourceCell.padStart(sourceWidth), row.color);
77
+ const blocksCell = this.colorize(row.blocksCell.padStart(blocksWidth), row.color);
78
+ return `${Resources.tableVertical} ${fileCell} ${Resources.tableVertical} ${sourceCell} ${Resources.tableVertical} ${blocksCell} ${Resources.tableVertical}`;
79
+ }
80
+ }
81
+ //# sourceMappingURL=coverage-report-writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coverage-report-writer.js","sourceRoot":"","sources":["../../../../../src/noldova.context.testing/src/services/reporting/coverage-report-writer.ts"],"names":[],"mappings":"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"}