@everyonesoftware/common 7.0.0 → 8.0.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/outputs/{chunk-VF6FBNAU.js → chunk-FEQPKLDH.js} +186 -44
- package/outputs/chunk-FEQPKLDH.js.map +1 -0
- package/outputs/{chunk-MMAX3IZF.js → chunk-OYMWB5SX.js} +106 -14
- package/outputs/chunk-OYMWB5SX.js.map +1 -0
- package/outputs/sourceIndex.cjs +106 -13
- package/outputs/sourceIndex.cjs.map +1 -1
- package/outputs/sourceIndex.d.cts +45 -2
- package/outputs/sourceIndex.d.ts +45 -2
- package/outputs/sourceIndex.js +3 -1
- package/outputs/testIndex.cjs +284 -55
- package/outputs/testIndex.cjs.map +1 -1
- package/outputs/testIndex.d.cts +58 -10
- package/outputs/testIndex.d.ts +58 -10
- package/outputs/testIndex.js +2 -2
- package/outputs/tests.cjs +3526 -3003
- package/outputs/tests.cjs.map +1 -1
- package/outputs/tests.js +2688 -2389
- package/outputs/tests.js.map +1 -1
- package/package.json +1 -1
- package/outputs/chunk-MMAX3IZF.js.map +0 -1
- package/outputs/chunk-VF6FBNAU.js.map +0 -1
|
@@ -22,7 +22,7 @@ import {
|
|
|
22
22
|
isString,
|
|
23
23
|
isUndefinedOrNull,
|
|
24
24
|
join
|
|
25
|
-
} from "./chunk-
|
|
25
|
+
} from "./chunk-OYMWB5SX.js";
|
|
26
26
|
|
|
27
27
|
// tests/test.ts
|
|
28
28
|
var Test = class _Test {
|
|
@@ -167,15 +167,13 @@ var Test = class _Test {
|
|
|
167
167
|
// tests/assertTest.ts
|
|
168
168
|
import * as assert from "assert";
|
|
169
169
|
var AssertTest = class _AssertTest {
|
|
170
|
-
|
|
171
|
-
constructor(name) {
|
|
172
|
-
this.name = name;
|
|
170
|
+
constructor() {
|
|
173
171
|
}
|
|
174
172
|
/**
|
|
175
173
|
* Create a new {@link AssertTest} object.
|
|
176
174
|
*/
|
|
177
|
-
static create(
|
|
178
|
-
return new _AssertTest(
|
|
175
|
+
static create() {
|
|
176
|
+
return new _AssertTest();
|
|
179
177
|
}
|
|
180
178
|
fail(message) {
|
|
181
179
|
PreCondition.assertNotEmpty(message, "message");
|
|
@@ -246,13 +244,13 @@ function test(runner) {
|
|
|
246
244
|
runner.testType("AssertTest", () => {
|
|
247
245
|
runner.testFunction("assertThrows()", () => {
|
|
248
246
|
runner.test("with throwing action", (test2) => {
|
|
249
|
-
const at = AssertTest.create(
|
|
247
|
+
const at = AssertTest.create();
|
|
250
248
|
at.assertThrows(() => {
|
|
251
249
|
throw new Error("abc");
|
|
252
250
|
}, new Error("abc"));
|
|
253
251
|
});
|
|
254
252
|
runner.test("with non-throwing action", (test2) => {
|
|
255
|
-
const at = AssertTest.create(
|
|
253
|
+
const at = AssertTest.create();
|
|
256
254
|
test2.assertThrows(
|
|
257
255
|
() => at.assertThrows(() => {
|
|
258
256
|
}, new Error("oops")),
|
|
@@ -266,27 +264,27 @@ function test(runner) {
|
|
|
266
264
|
});
|
|
267
265
|
runner.testFunction("assertThrowsAsync()", () => {
|
|
268
266
|
runner.test("with throwing sync action", async (test2) => {
|
|
269
|
-
const at = AssertTest.create(
|
|
267
|
+
const at = AssertTest.create();
|
|
270
268
|
await at.assertThrowsAsync(() => {
|
|
271
269
|
throw new Error("abc");
|
|
272
270
|
}, new Error("abc"));
|
|
273
271
|
});
|
|
274
272
|
runner.test("with throwing async action", async (test2) => {
|
|
275
|
-
const at = AssertTest.create(
|
|
273
|
+
const at = AssertTest.create();
|
|
276
274
|
await at.assertThrowsAsync(async () => {
|
|
277
275
|
throw new Error("abc");
|
|
278
276
|
}, new Error("abc"));
|
|
279
277
|
});
|
|
280
278
|
runner.test("with rejected Promise", async (test2) => {
|
|
281
|
-
const at = AssertTest.create(
|
|
279
|
+
const at = AssertTest.create();
|
|
282
280
|
await at.assertThrowsAsync(Promise.reject(new Error("abc")), new Error("abc"));
|
|
283
281
|
});
|
|
284
282
|
runner.test("with throwing action that returns a rejected Promise", async (test2) => {
|
|
285
|
-
const at = AssertTest.create(
|
|
283
|
+
const at = AssertTest.create();
|
|
286
284
|
await at.assertThrowsAsync(() => Promise.reject(new Error("abc")), new Error("abc"));
|
|
287
285
|
});
|
|
288
286
|
runner.test("with non-throwing async action", async (test2) => {
|
|
289
|
-
const at = AssertTest.create(
|
|
287
|
+
const at = AssertTest.create();
|
|
290
288
|
await test2.assertThrowsAsync(
|
|
291
289
|
async () => await at.assertThrowsAsync(async () => {
|
|
292
290
|
}, new Error("oops")),
|
|
@@ -351,12 +349,9 @@ var FailedTest = class _FailedTest {
|
|
|
351
349
|
getTestAction() {
|
|
352
350
|
return this.testAction;
|
|
353
351
|
}
|
|
354
|
-
|
|
352
|
+
getTestError() {
|
|
355
353
|
return this.error;
|
|
356
354
|
}
|
|
357
|
-
getErrorMessage() {
|
|
358
|
-
return this.error instanceof Error && this.error.stack ? this.error.stack : `${this.error}`;
|
|
359
|
-
}
|
|
360
355
|
};
|
|
361
356
|
|
|
362
357
|
// tests/skippedTest.ts
|
|
@@ -509,6 +504,7 @@ var TestRunner = class _TestRunner {
|
|
|
509
504
|
var ConsoleTestRunnerUI = class {
|
|
510
505
|
writeStream;
|
|
511
506
|
styles;
|
|
507
|
+
getErrorStringOptions;
|
|
512
508
|
constructor() {
|
|
513
509
|
this.styles = Map.create();
|
|
514
510
|
}
|
|
@@ -581,6 +577,10 @@ var ConsoleTestRunnerUI = class {
|
|
|
581
577
|
return result;
|
|
582
578
|
});
|
|
583
579
|
}
|
|
580
|
+
setGetErrorStringOptions(options) {
|
|
581
|
+
this.getErrorStringOptions = options;
|
|
582
|
+
return this;
|
|
583
|
+
}
|
|
584
584
|
beforeTestGroup(testGroup) {
|
|
585
585
|
PreCondition.assertNotUndefinedAndNotNull(testGroup, "testGroup");
|
|
586
586
|
return AsyncResult.empty();
|
|
@@ -638,7 +638,8 @@ var ConsoleTestRunnerUI = class {
|
|
|
638
638
|
await this.writeString(`${++counter}) `);
|
|
639
639
|
await this.writeFullTestActionName(failedTest.getTestAction());
|
|
640
640
|
await this.writeLine();
|
|
641
|
-
|
|
641
|
+
const testError = failedTest.getTestError();
|
|
642
|
+
await this.indent(() => this.writeLine(testError.getErrorString(this.getErrorStringOptions)));
|
|
642
643
|
await this.writeLine();
|
|
643
644
|
}
|
|
644
645
|
}
|
|
@@ -711,6 +712,137 @@ var TreeConsoleTestRunnerUI = class _TreeConsoleTestRunnerUI extends ConsoleTest
|
|
|
711
712
|
}
|
|
712
713
|
};
|
|
713
714
|
|
|
715
|
+
// tests/AssertTestCreator.ts
|
|
716
|
+
var AssertTestCreator = class _AssertTestCreator {
|
|
717
|
+
constructor() {
|
|
718
|
+
}
|
|
719
|
+
static create() {
|
|
720
|
+
return new _AssertTestCreator();
|
|
721
|
+
}
|
|
722
|
+
createTest() {
|
|
723
|
+
return AssertTest.create();
|
|
724
|
+
}
|
|
725
|
+
};
|
|
726
|
+
|
|
727
|
+
// tests/TestCreator.ts
|
|
728
|
+
var TestCreator = class {
|
|
729
|
+
/**
|
|
730
|
+
* Create the default {@link TestCreator}.
|
|
731
|
+
*/
|
|
732
|
+
static create() {
|
|
733
|
+
return AssertTestCreator.create();
|
|
734
|
+
}
|
|
735
|
+
};
|
|
736
|
+
|
|
737
|
+
// tests/BasicTestError.ts
|
|
738
|
+
import { fileURLToPath } from "url";
|
|
739
|
+
import path from "path";
|
|
740
|
+
var BasicTestError = class _BasicTestError {
|
|
741
|
+
error;
|
|
742
|
+
constructor(error) {
|
|
743
|
+
PreCondition.assertNotUndefinedAndNotNull(error, "error");
|
|
744
|
+
this.error = error;
|
|
745
|
+
}
|
|
746
|
+
static create(error) {
|
|
747
|
+
return new _BasicTestError(error);
|
|
748
|
+
}
|
|
749
|
+
getError() {
|
|
750
|
+
return this.error;
|
|
751
|
+
}
|
|
752
|
+
getErrorString(options) {
|
|
753
|
+
let result = this.error instanceof Error && this.error.stack ? this.error.stack : `${this.error}`;
|
|
754
|
+
const currentFolderPath = process.cwd();
|
|
755
|
+
if (options?.removeNonProjectPaths ?? false) {
|
|
756
|
+
result = _BasicTestError.removeNonProjectPaths(result, currentFolderPath);
|
|
757
|
+
}
|
|
758
|
+
if (options?.relativeFilePaths ?? false) {
|
|
759
|
+
result = _BasicTestError.makeFilePathsRelative(result, currentFolderPath);
|
|
760
|
+
}
|
|
761
|
+
return result;
|
|
762
|
+
}
|
|
763
|
+
static removeNonProjectPaths(errorString, currentFolderPath) {
|
|
764
|
+
currentFolderPath = currentFolderPath.replaceAll("\\", "/");
|
|
765
|
+
return errorString.split("\n").filter((line) => {
|
|
766
|
+
let keepLine = false;
|
|
767
|
+
const trimmedLine = line.trim();
|
|
768
|
+
const match = trimmedLine.match(/^at .* \((.+)\)$/) ?? trimmedLine.match(/^at (.+)$/);
|
|
769
|
+
if (!match) {
|
|
770
|
+
keepLine = true;
|
|
771
|
+
} else {
|
|
772
|
+
const location = match[1];
|
|
773
|
+
try {
|
|
774
|
+
const filePath = path.resolve(fileURLToPath(location)).replaceAll("\\", "/");
|
|
775
|
+
keepLine = filePath.startsWith(currentFolderPath);
|
|
776
|
+
} catch {
|
|
777
|
+
}
|
|
778
|
+
}
|
|
779
|
+
return keepLine;
|
|
780
|
+
}).join("\n");
|
|
781
|
+
}
|
|
782
|
+
static makeFilePathsRelative(errorString, currentFolderPath) {
|
|
783
|
+
return errorString.split("\n").map((line) => {
|
|
784
|
+
const match = line.match(/^(\s*)at (.+?) \((.+)\)$/) ?? line.match(/^(\s*)at (.+)$/);
|
|
785
|
+
if (match) {
|
|
786
|
+
const hasFunctionName = match.length === 4;
|
|
787
|
+
const indentation = match[1];
|
|
788
|
+
const functionName = hasFunctionName ? match[2] : void 0;
|
|
789
|
+
const location = hasFunctionName ? match[3] : match[2];
|
|
790
|
+
let relativeLocation = location;
|
|
791
|
+
try {
|
|
792
|
+
const pathMatch = location.match(/^(.*?):(\d+):(\d+)$/);
|
|
793
|
+
if (pathMatch) {
|
|
794
|
+
const fullPath = pathMatch[1];
|
|
795
|
+
const lineNumber = pathMatch[2];
|
|
796
|
+
const columnNumber = pathMatch[3];
|
|
797
|
+
let absolutePath;
|
|
798
|
+
if (fullPath.startsWith("file:///")) {
|
|
799
|
+
absolutePath = fileURLToPath(fullPath);
|
|
800
|
+
} else if (/^[A-Za-z]:[\\/]/.test(fullPath) || fullPath.startsWith("/")) {
|
|
801
|
+
absolutePath = fullPath;
|
|
802
|
+
}
|
|
803
|
+
if (absolutePath) {
|
|
804
|
+
let relativePath = path.relative(
|
|
805
|
+
currentFolderPath,
|
|
806
|
+
absolutePath
|
|
807
|
+
);
|
|
808
|
+
relativePath = relativePath.replace(/\\/g, "/");
|
|
809
|
+
relativeLocation = `${relativePath}:${lineNumber}:${columnNumber}`;
|
|
810
|
+
}
|
|
811
|
+
}
|
|
812
|
+
} catch {
|
|
813
|
+
}
|
|
814
|
+
if (relativeLocation !== location) {
|
|
815
|
+
if (functionName) {
|
|
816
|
+
line = `${indentation}at ${functionName} (${relativeLocation})`;
|
|
817
|
+
} else {
|
|
818
|
+
line = `${indentation}at ${relativeLocation}`;
|
|
819
|
+
}
|
|
820
|
+
}
|
|
821
|
+
}
|
|
822
|
+
return line;
|
|
823
|
+
}).join("\n");
|
|
824
|
+
}
|
|
825
|
+
};
|
|
826
|
+
|
|
827
|
+
// tests/BasicTestErrorCreator.ts
|
|
828
|
+
var BasicTestErrorCreator = class _BasicTestErrorCreator {
|
|
829
|
+
constructor() {
|
|
830
|
+
}
|
|
831
|
+
static create() {
|
|
832
|
+
return new _BasicTestErrorCreator();
|
|
833
|
+
}
|
|
834
|
+
createTestError(error) {
|
|
835
|
+
return BasicTestError.create(error);
|
|
836
|
+
}
|
|
837
|
+
};
|
|
838
|
+
|
|
839
|
+
// tests/TestErrorCreator.ts
|
|
840
|
+
var TestErrorCreator = class {
|
|
841
|
+
static create() {
|
|
842
|
+
return BasicTestErrorCreator.create();
|
|
843
|
+
}
|
|
844
|
+
};
|
|
845
|
+
|
|
714
846
|
// tests/consoleTestRunner.ts
|
|
715
847
|
var ConsoleTestRunner = class _ConsoleTestRunner {
|
|
716
848
|
writeStream;
|
|
@@ -721,19 +853,23 @@ var ConsoleTestRunner = class _ConsoleTestRunner {
|
|
|
721
853
|
passedTestCount;
|
|
722
854
|
skippedTests;
|
|
723
855
|
testFailures;
|
|
856
|
+
testCreator;
|
|
857
|
+
testErrorCreator;
|
|
724
858
|
ui;
|
|
725
|
-
constructor(ui) {
|
|
859
|
+
constructor(testCreator, testErrorCreator, ui) {
|
|
726
860
|
this.writeStream = IndentedCharacterWriteStream.create(NodeJSCharacterWriteStream.create(process.stdout));
|
|
727
861
|
this.testActions = List.create();
|
|
728
862
|
this.testActionInsertIndex = 0;
|
|
729
863
|
this.passedTestCount = 0;
|
|
730
864
|
this.skippedTests = List.create();
|
|
731
865
|
this.testFailures = List.create();
|
|
866
|
+
this.testCreator = testCreator || TestCreator.create();
|
|
867
|
+
this.testErrorCreator = testErrorCreator || TestErrorCreator.create();
|
|
732
868
|
this.ui = ui || ConsoleTestRunnerUI.tree();
|
|
733
869
|
this.ui.setWriteStream(this.writeStream);
|
|
734
870
|
}
|
|
735
|
-
static create(ui) {
|
|
736
|
-
return new _ConsoleTestRunner(ui);
|
|
871
|
+
static create(testCreator, testErrorCreator, ui) {
|
|
872
|
+
return new _ConsoleTestRunner(testCreator, testErrorCreator, ui);
|
|
737
873
|
}
|
|
738
874
|
static run(testFunctionOrTestFunctions) {
|
|
739
875
|
let testFunction;
|
|
@@ -782,6 +918,10 @@ var ConsoleTestRunner = class _ConsoleTestRunner {
|
|
|
782
918
|
this.ui.setStyles(styles);
|
|
783
919
|
return this;
|
|
784
920
|
}
|
|
921
|
+
setGetErrorStringOptions(options) {
|
|
922
|
+
this.ui.setGetErrorStringOptions(options);
|
|
923
|
+
return this;
|
|
924
|
+
}
|
|
785
925
|
/**
|
|
786
926
|
* Get the number of {@link TestAction}s that have yet to be executed.
|
|
787
927
|
*/
|
|
@@ -800,7 +940,14 @@ var ConsoleTestRunner = class _ConsoleTestRunner {
|
|
|
800
940
|
}
|
|
801
941
|
insertTestAction(testActionName, testActionType, skip, action) {
|
|
802
942
|
const parentTestAction = this.getCurrentTestAction();
|
|
803
|
-
const testAction = TestAction.create(parentTestAction, testActionName, testActionType, skip,
|
|
943
|
+
const testAction = TestAction.create(parentTestAction, testActionName, testActionType, skip, async () => {
|
|
944
|
+
try {
|
|
945
|
+
await action();
|
|
946
|
+
} catch (error) {
|
|
947
|
+
const testError = this.testErrorCreator.createTestError(error);
|
|
948
|
+
await this.afterFailedTest(testAction, testError);
|
|
949
|
+
}
|
|
950
|
+
});
|
|
804
951
|
this.testActions.insert(this.testActionInsertIndex, testAction);
|
|
805
952
|
this.testActionInsertIndex++;
|
|
806
953
|
}
|
|
@@ -977,12 +1124,7 @@ var ConsoleTestRunner = class _ConsoleTestRunner {
|
|
|
977
1124
|
skip,
|
|
978
1125
|
async () => {
|
|
979
1126
|
this.resetTestActionInsertIndex();
|
|
980
|
-
|
|
981
|
-
await testGroupAction();
|
|
982
|
-
} catch (error) {
|
|
983
|
-
const currentTestGroupAction = this.getCurrentTestAction();
|
|
984
|
-
await this.afterFailedTest(currentTestGroupAction, error);
|
|
985
|
-
}
|
|
1127
|
+
await testGroupAction();
|
|
986
1128
|
}
|
|
987
1129
|
);
|
|
988
1130
|
this.insertTestAction(
|
|
@@ -1002,22 +1144,18 @@ var ConsoleTestRunner = class _ConsoleTestRunner {
|
|
|
1002
1144
|
skip,
|
|
1003
1145
|
async () => {
|
|
1004
1146
|
const currentTestAction = this.getCurrentTestAction();
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
this.currentTest = void 0;
|
|
1016
|
-
}
|
|
1017
|
-
await this.afterPassedTest(currentTestAction);
|
|
1147
|
+
await this.beforeTest(currentTestAction);
|
|
1148
|
+
const skip2 = currentTestAction.getSkip();
|
|
1149
|
+
if (skip2?.getShouldSkip()) {
|
|
1150
|
+
await this.afterSkippedTest(currentTestAction, skip2);
|
|
1151
|
+
} else {
|
|
1152
|
+
this.currentTest = this.testCreator.createTest();
|
|
1153
|
+
try {
|
|
1154
|
+
await testAction(this.currentTest);
|
|
1155
|
+
} finally {
|
|
1156
|
+
this.currentTest = void 0;
|
|
1018
1157
|
}
|
|
1019
|
-
|
|
1020
|
-
await this.afterFailedTest(currentTestAction, error);
|
|
1158
|
+
await this.afterPassedTest(currentTestAction);
|
|
1021
1159
|
}
|
|
1022
1160
|
}
|
|
1023
1161
|
);
|
|
@@ -1057,6 +1195,10 @@ export {
|
|
|
1057
1195
|
TestAction,
|
|
1058
1196
|
TestSkip,
|
|
1059
1197
|
TestRunner,
|
|
1198
|
+
ConsoleTestRunnerUI,
|
|
1199
|
+
FlatConsoleTestRunnerUI,
|
|
1200
|
+
TreeConsoleTestRunnerUI,
|
|
1201
|
+
BasicTestError,
|
|
1060
1202
|
ConsoleTestRunner
|
|
1061
1203
|
};
|
|
1062
|
-
//# sourceMappingURL=chunk-
|
|
1204
|
+
//# sourceMappingURL=chunk-FEQPKLDH.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../tests/test.ts","../tests/assertTest.ts","../tests/assertTestTests.ts","../tests/basicTestSkip.ts","../tests/failedTest.ts","../tests/skippedTest.ts","../tests/testAction.ts","../tests/testSkip.ts","../tests/testRunner.ts","../tests/ConsoleTestRunnerUI.ts","../tests/AssertTestCreator.ts","../tests/TestCreator.ts","../tests/BasicTestError.ts","../tests/BasicTestErrorCreator.ts","../tests/TestErrorCreator.ts","../tests/consoleTestRunner.ts"],"sourcesContent":["import { PromiseAsyncResult } from \"../sources/promiseAsyncResult\";\r\nimport { PreCondition } from \"../sources/preCondition\";\r\nimport { SyncResult } from \"../sources/syncResult\";\r\nimport { isUndefinedOrNull, Type } from \"../sources/types\";\r\nimport { Iterable, JavascriptIterable } from \"../sources\";\r\n\r\n/**\r\n * A type that can be used to make assertions during a test.\r\n */\r\nexport abstract class Test\r\n{\r\n /**\r\n * Fail the current test with the provided message.\r\n * @param message The message that explains why this test failed.\r\n */\r\n public abstract fail(message: string): never;\r\n\r\n /**\r\n * Assert that the provided value is undefined;\r\n * @param value The value to check.\r\n */\r\n public assertUndefined(value: unknown): asserts value is undefined\r\n {\r\n Test.assertUndefined(this, value);\r\n }\r\n\r\n /**\r\n * Assert that the provided value is undefined.\r\n * @param test The current {@link Test}.\r\n * @param value The value to check.\r\n */\r\n public static assertUndefined(test: Test, value: unknown): asserts value is undefined\r\n {\r\n test.assertSame(value, undefined);\r\n }\r\n\r\n /**\r\n * Assert that the provided value is not undefined;\r\n * @param value The value to check.\r\n */\r\n public assertNotUndefined<T>(value: T): asserts value is NonNullable<T>\r\n {\r\n Test.assertNotUndefined(this, value);\r\n }\r\n\r\n /**\r\n * Assert that the provided value is not undefined.\r\n * @param test The current {@link Test}.\r\n * @param value The value to check.\r\n */\r\n public static assertNotUndefined<T>(test: Test, value: unknown): asserts value is NonNullable<T>\r\n {\r\n test.assertNotSame(value, undefined);\r\n }\r\n\r\n /**\r\n * Assert that the provided value is null.\r\n * @param value The value to check.\r\n */\r\n public assertNull(value: unknown): asserts value is null\r\n {\r\n Test.assertNull(this, value);\r\n }\r\n\r\n /**\r\n * Assert that the provided value is null.\r\n * @param value The value to check.\r\n */\r\n public static assertNull(test: Test, value: unknown): asserts value is null\r\n {\r\n test.assertSame(value, null);\r\n }\r\n\r\n /**\r\n * Assert that the provided value is not null.\r\n * @param value The value to check.\r\n */\r\n public assertNotNull<T>(value: T): asserts value is NonNullable<T>\r\n {\r\n Test.assertNull(this, value);\r\n }\r\n\r\n /**\r\n * Assert that the provided value is not null.\r\n * @param value The value to check.\r\n */\r\n public static assertNotNull<T>(test: Test, value: T): asserts value is NonNullable<T>\r\n {\r\n test.assertNotSame(value, null);\r\n }\r\n\r\n /**\r\n * Assert that the provided value is not undefined and not null.\r\n * @param value The value to check.\r\n */\r\n public assertNotUndefinedAndNotNull<T>(value: T): asserts value is NonNullable<T>\r\n {\r\n Test.assertNotUndefinedAndNotNull(this, value);\r\n }\r\n\r\n /**\r\n * Assert that the provided value is not undefined and not null.\r\n * @param value The value to check.\r\n */\r\n public static assertNotUndefinedAndNotNull<T>(test: Test, value: T): asserts value is NonNullable<T>\r\n {\r\n test.assertNotSame(value, null);\r\n test.assertNotSame(value, undefined);\r\n }\r\n\r\n /**\r\n * Assert that the provided collection is not undefined, not null, and not empty.\r\n * @param value The value to check.\r\n */\r\n public assertNotEmpty(value: JavascriptIterable<unknown>): void\r\n {\r\n Test.assertNotEmpty(this, value);\r\n }\r\n\r\n public static assertNotEmpty(test: Test, value: JavascriptIterable<unknown>): void\r\n {\r\n test.assertNotUndefinedAndNotNull(value);\r\n test.assertTrue(Iterable.any(value).await());\r\n }\r\n\r\n /**\r\n * Assert that the provided values point to the same object.\r\n * @param left The first value.\r\n * @param right The second value.\r\n */\r\n public abstract assertSame<T>(left: T, right: T): void;\r\n\r\n /**\r\n * Assert that the provided values don't point to the same object.\r\n * @param left The first value.\r\n * @param right The second value.\r\n */\r\n public abstract assertNotSame<T>(left: T, right: T): void;\r\n\r\n /**\r\n * Assert that the provided values are equal.\r\n * @param left The first value.\r\n * @param right The second value.\r\n * @param message A message that will be shown when the values are not equal.\r\n */\r\n public abstract assertEqual<T>(left: T, right: T, message?: string): void;\r\n\r\n /**\r\n * Assert that the provided values are not equal.\r\n * @param left The first value.\r\n * @param right The second value.\r\n */\r\n public abstract assertNotEqual<T>(left: T, right: T): void;\r\n\r\n /**\r\n * Assert that the provided value is false.\r\n * @param value The value to check.\r\n */\r\n public assertFalse(value: boolean): asserts value is false\r\n {\r\n Test.assertFalse(this, value);\r\n }\r\n\r\n public static assertFalse(test: Test, value: boolean): asserts value is false\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(test, \"test\");\r\n\r\n test.assertSame(value, false);\r\n }\r\n\r\n /**\r\n * Assert that the provided value is true.\r\n * @param value The value to check.\r\n */\r\n public assertTrue(value: boolean): asserts value is true\r\n {\r\n Test.assertTrue(this, value);\r\n }\r\n\r\n /**\r\n * Assert that the provided value is true.\r\n * @param value The value to check.\r\n */\r\n public static assertTrue(test: Test, value: boolean): asserts value is true\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(test, \"test\");\r\n\r\n test.assertSame(value, true);\r\n }\r\n\r\n /**\r\n * Assert that the provided action throws the provided {@link Error} when it is run.\r\n * @param action The action to run.\r\n * @param expectedError The optional expected {@link Error} to compare against the thrown\r\n * {@link Error}. If the expected {@link Error} is not provided, then any {@link Error} will\r\n * satisfy this assertion.\r\n */\r\n public abstract assertThrows(action: SyncResult<unknown> | (() => void), expectedError?: Error): void;\r\n\r\n /**\r\n * Assert that the provided action throws the provided {@link Error} when it is run.\r\n * @param action The action to run.\r\n * @param expectedError The expected {@link Error}.\r\n */\r\n public abstract assertThrowsAsync(action: PromiseLike<unknown> | (() => PromiseLike<unknown>), expectedError: Error): PromiseAsyncResult<void>;\r\n\r\n /**\r\n * Assert that the provided value is an instance of the provided {@link Type}.\r\n * @param value The value to check.\r\n * @param type The {@link Type} to check.\r\n * @param expression The expression that produced the value.\r\n * @param message An optional error message.\r\n */\r\n public assertInstanceOf<T>(value: unknown, type: Type<T>, typeCheck?: (value: unknown) => value is T): asserts value is T\r\n {\r\n return Test.assertInstanceOf(this, value, type, typeCheck);\r\n }\r\n\r\n /**\r\n * Assert that the provided value is an instance of the provided {@link Type}.\r\n * @param value The value to check.\r\n * @param type The {@link Type} to check.\r\n * @param expression The expression that produced the value.\r\n * @param message An optional error message.\r\n */\r\n public static assertInstanceOf<T>(test: Test, value: unknown, type: Type<T>, typeCheck?: (value: unknown) => value is T): asserts value is T\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(type, \"type\");\r\n\r\n if (isUndefinedOrNull(typeCheck))\r\n {\r\n typeCheck = ((value: unknown) => value instanceof type) as (value: unknown) => value is T;\r\n }\r\n\r\n if (!typeCheck(value))\r\n {\r\n test.fail(`Expected value to be of type ${type.name} but found ${value} instead.`);\r\n }\r\n }\r\n}","import * as assert from \"assert\";\r\n\r\nimport { PreCondition } from \"../sources/preCondition\";\r\nimport { isFunction, Type } from \"../sources/types\";\r\nimport { Test } from \"./test\";\r\nimport { SyncResult } from \"../sources/syncResult\";\r\nimport { PromiseAsyncResult } from \"../sources/promiseAsyncResult\";\r\nimport { JavascriptIterable } from \"../sources\";\r\n\r\n/**\r\n * A {@link Test} type that uses the standard \"assert\" module to make assertions.\r\n */\r\nexport class AssertTest implements Test\r\n{\r\n private constructor()\r\n {\r\n }\r\n\r\n /**\r\n * Create a new {@link AssertTest} object.\r\n */\r\n public static create(): AssertTest\r\n {\r\n return new AssertTest();\r\n }\r\n\r\n public fail(message: string): never\r\n {\r\n PreCondition.assertNotEmpty(message, \"message\");\r\n\r\n assert.fail(message);\r\n }\r\n\r\n public assertUndefined(value: unknown): asserts value is undefined\r\n {\r\n Test.assertUndefined(this, value);\r\n }\r\n\r\n public assertNotUndefined<T>(value: T): asserts value is NonNullable<T>\r\n {\r\n Test.assertNotUndefined(this, value);\r\n }\r\n\r\n public assertNull(value: unknown): asserts value is null\r\n {\r\n Test.assertNull(this, value);\r\n }\r\n\r\n public assertNotNull<T>(value: T): asserts value is NonNullable<T>\r\n {\r\n Test.assertNotNull(this, value);\r\n }\r\n\r\n public assertNotUndefinedAndNotNull<T>(value: T): asserts value is NonNullable<T>\r\n {\r\n Test.assertNotUndefinedAndNotNull(this, value);\r\n }\r\n\r\n public assertNotEmpty(value: JavascriptIterable<unknown>): void\r\n {\r\n Test.assertNotEmpty(this, value);\r\n }\r\n\r\n public assertSame<T>(left: T, right: T): void\r\n {\r\n assert.strictEqual(left, right);\r\n }\r\n\r\n public assertNotSame<T>(left: T, right: T): void\r\n {\r\n assert.notStrictEqual(left, right);\r\n }\r\n\r\n public assertEqual<T>(left: T, right: T, message?: string): void\r\n {\r\n assert.deepStrictEqual(left, right, message);\r\n }\r\n\r\n public assertNotEqual<T>(left: T, right: T): void\r\n {\r\n assert.notDeepStrictEqual(left, right);\r\n }\r\n\r\n public assertFalse(value: boolean): void\r\n {\r\n Test.assertFalse(this, value);\r\n }\r\n\r\n public assertTrue(value: boolean): void\r\n {\r\n Test.assertTrue(this, value);\r\n }\r\n\r\n public assertThrows(action: SyncResult<unknown> | (() => void), expectedError?: Error): void\r\n {\r\n if (!isFunction(action))\r\n {\r\n const syncResult: SyncResult<unknown> = action;\r\n action = () => { syncResult.await(); };\r\n }\r\n assert.throws(action, expectedError);\r\n }\r\n\r\n public assertThrowsAsync(action: Promise<unknown> | (() => Promise<unknown>), expectedError: Error): PromiseAsyncResult<void>\r\n {\r\n const promiseOrAsyncAction = isFunction(action)\r\n ? async () => await action()\r\n : action;\r\n return PromiseAsyncResult.create(assert.rejects(promiseOrAsyncAction, expectedError));\r\n }\r\n\r\n public assertInstanceOf<T>(value: unknown, type: Type<T>, typeCheck?: (value: unknown) => value is T): asserts value is T\r\n {\r\n Test.assertInstanceOf(this, value, type, typeCheck);\r\n }\r\n}","import { AssertionError } from \"assert\";\nimport { AssertTest } from \"./assertTest\";\nimport { Test } from \"./test\";\nimport { TestRunner } from \"./testRunner\";\n\nexport function test(runner: TestRunner): void\n{\n runner.testFile(\"assertTest.ts\", () =>\n {\n runner.testType(\"AssertTest\", () =>\n {\n runner.testFunction(\"assertThrows()\", () =>\n {\n runner.test(\"with throwing action\", (test: Test) =>\n {\n const at: AssertTest = AssertTest.create();\n at.assertThrows(() => { throw new Error(\"abc\"); }, new Error(\"abc\"));\n });\n\n runner.test(\"with non-throwing action\", (test: Test) =>\n {\n const at: AssertTest = AssertTest.create();\n test.assertThrows(\n () => at.assertThrows(() => {}, new Error(\"oops\")),\n new AssertionError({\n message: \"Missing expected exception (Error).\",\n operator: \"throws\",\n expected: new Error(\"oops\"),\n }),\n );\n });\n });\n\n runner.testFunction(\"assertThrowsAsync()\", () =>\n {\n runner.test(\"with throwing sync action\", async (test: Test) =>\n {\n const at: AssertTest = AssertTest.create();\n await at.assertThrowsAsync(() => { throw new Error(\"abc\"); }, new Error(\"abc\"));\n });\n\n runner.test(\"with throwing async action\", async (test: Test) =>\n {\n const at: AssertTest = AssertTest.create();\n await at.assertThrowsAsync(async () => { throw new Error(\"abc\"); }, new Error(\"abc\"));\n });\n\n runner.test(\"with rejected Promise\", async (test: Test) =>\n {\n const at: AssertTest = AssertTest.create();\n await at.assertThrowsAsync(Promise.reject(new Error(\"abc\")), new Error(\"abc\"));\n });\n\n runner.test(\"with throwing action that returns a rejected Promise\", async (test: Test) =>\n {\n const at: AssertTest = AssertTest.create();\n await at.assertThrowsAsync(() => Promise.reject(new Error(\"abc\")), new Error(\"abc\"));\n });\n\n runner.test(\"with non-throwing async action\", async (test: Test) =>\n {\n const at: AssertTest = AssertTest.create();\n await test.assertThrowsAsync(\n async () => await at.assertThrowsAsync(async () => {}, new Error(\"oops\")),\n new AssertionError({\n message: \"Missing expected rejection (Error).\",\n operator: \"rejects\",\n expected: new Error(\"oops\"),\n }),\n );\n });\n });\n });\n });\n}","import { PreCondition } from \"../sources/preCondition\";\r\nimport { TestSkip } from \"./testSkip\";\r\n\r\n/**\r\n * A type that is used to mark that a test group or a test should be skipped.\r\n */\r\nexport class BasicTestSkip implements TestSkip\r\n{\r\n private readonly shouldSkip: boolean;\r\n private readonly message: string;\r\n\r\n private constructor(shouldSkip: boolean, message: string)\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(message, \"message\");\r\n\r\n this.shouldSkip = shouldSkip;\r\n this.message = message;\r\n }\r\n\r\n /**\r\n * Create a new {@link TestSkip} with the provided properties.\r\n * @param shouldSkip Whether the tests associated with the new {@link TestSkip}\r\n * should be skipped.\r\n * @param message The message that explains why the tests associated with this {@link TestSkip}\r\n * should be skipped.\r\n */\r\n public static create(shouldSkip?: boolean, message?: string): BasicTestSkip\r\n {\r\n if (shouldSkip === undefined || shouldSkip === null)\r\n {\r\n shouldSkip = true;\r\n }\r\n\r\n if (message === undefined || message === null)\r\n {\r\n message = \"\";\r\n }\r\n\r\n return new BasicTestSkip(shouldSkip, message);\r\n }\r\n\r\n public getShouldSkip(): boolean\r\n {\r\n return this.shouldSkip;\r\n }\r\n\r\n public getMessage(): string\r\n {\r\n return this.message;\r\n }\r\n}","import { PreCondition } from \"../sources/preCondition\";\r\nimport { TestAction } from \"./testAction\";\r\nimport { TestError } from \"./TestError\";\r\n\r\nexport class FailedTest\r\n{\r\n private readonly testAction: TestAction;\r\n private readonly error: TestError;\r\n\r\n private constructor(testAction: TestAction, error: TestError)\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(testAction, \"testAction\");\r\n PreCondition.assertNotUndefinedAndNotNull(error, \"error\");\r\n\r\n this.testAction = testAction;\r\n this.error = error;\r\n }\r\n\r\n public static create(testAction: TestAction, error: TestError): FailedTest\r\n {\r\n return new FailedTest(testAction, error);\r\n }\r\n\r\n public getTestAction(): TestAction\r\n {\r\n return this.testAction;\r\n }\r\n\r\n public getTestError(): TestError\r\n {\r\n return this.error;\r\n }\r\n}","import { PreCondition } from \"../sources/preCondition\";\r\nimport { TestAction } from \"./testAction\";\r\nimport { TestSkip } from \"./testSkip\";\r\n\r\nexport class SkippedTest\r\n{\r\n private readonly skip: TestSkip;\r\n private readonly testAction: TestAction;\r\n\r\n private constructor(skip: TestSkip, testAction: TestAction)\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(skip, \"skip\");\r\n PreCondition.assertNotUndefinedAndNotNull(testAction, \"testAction\");\r\n\r\n this.skip = skip;\r\n this.testAction = testAction;\r\n }\r\n\r\n public static create(skip: TestSkip, testAction: TestAction): SkippedTest\r\n {\r\n return new SkippedTest(skip, testAction);\r\n }\r\n\r\n public getSkipMessage(): string\r\n {\r\n return this.skip.getMessage();\r\n }\r\n\r\n public getTestAction(): TestAction\r\n {\r\n return this.testAction;\r\n }\r\n}","import { JavascriptIterable } from \"../sources/javascript\";\r\nimport { List } from \"../sources/list\";\r\nimport { PreCondition } from \"../sources/preCondition\";\r\nimport { join } from \"../sources/strings\";\r\nimport { TestSkip } from \"./testSkip\";\r\n\r\nexport type TestActionType = \"file\" | \"type\" | \"function\" | \"group\" | \"test\";\r\n\r\nexport class TestAction\r\n{\r\n private readonly parent: TestAction | undefined;\r\n private readonly name: string;\r\n private readonly type: TestActionType;\r\n private readonly skip: TestSkip | undefined;\r\n private readonly action: () => (void | Promise<void>);\r\n\r\n private constructor(parent: TestAction | undefined, name: string, type: TestActionType, skip: TestSkip | undefined, action: () => (void | Promise<void>))\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(name, \"name\");\r\n PreCondition.assertNotEmpty(type, \"type\");\r\n PreCondition.assertNotUndefinedAndNotNull(action, \"action\");\r\n\r\n this.parent = parent;\r\n this.name = name;\r\n this.type = type;\r\n this.skip = skip;\r\n this.action = action;\r\n }\r\n\r\n public static create(parent: TestAction | undefined, name: string, type: TestActionType, skip: TestSkip | undefined, action: () => (void | Promise<void>)): TestAction\r\n {\r\n return new TestAction(parent, name, type, skip, action);\r\n }\r\n\r\n public getParent(): TestAction | undefined\r\n {\r\n return this.parent;\r\n }\r\n\r\n public getName(): string\r\n {\r\n return this.name;\r\n }\r\n\r\n public getFullNameParts(): JavascriptIterable<string>\r\n {\r\n const result: List<string> = List.create();\r\n if (this.parent)\r\n {\r\n result.addAll(this.parent.getFullNameParts());\r\n }\r\n result.add(this.getName());\r\n return result;\r\n }\r\n\r\n public getFullName(): string\r\n {\r\n return join(\" \", this.getFullNameParts());\r\n }\r\n\r\n public getType(): TestActionType\r\n {\r\n return this.type;\r\n }\r\n\r\n public getSkip(): TestSkip | undefined\r\n {\r\n return this.skip || this.parent?.getSkip();\r\n }\r\n\r\n public shouldSkip(): boolean\r\n {\r\n return !!this.getSkip()?.getShouldSkip();\r\n }\r\n\r\n public getAction(): () => (void | Promise<void>)\r\n {\r\n return this.action;\r\n }\r\n \r\n public runAsync(): void | Promise<void>\r\n {\r\n return this.action();\r\n }\r\n}","import { BasicTestSkip } from \"./basicTestSkip\";\r\n\r\n/**\r\n * A type that is used to mark that a test group or a test should be skipped.\r\n */\r\nexport abstract class TestSkip\r\n{\r\n protected constructor()\r\n {\r\n }\r\n\r\n /**\r\n * Create a new {@link TestSkip} with the provided properties.\r\n * @param shouldSkip Whether the tests associated with the new {@link TestSkip}\r\n * should be skipped.\r\n * @param message The message that explains why the tests associated with this {@link TestSkip}\r\n * should be skipped.\r\n */\r\n public static create(shouldSkip?: boolean, message?: string): TestSkip\r\n {\r\n return BasicTestSkip.create(shouldSkip, message);\r\n }\r\n\r\n /**\r\n * Get whether the tests associated with this {@link TestSkip} should be skipped.\r\n */\r\n public abstract getShouldSkip(): boolean;\r\n\r\n /**\r\n * Get the message that explains why the tests associated with this {@link TestSkip}\r\n * should be skipped.\r\n */\r\n public abstract getMessage(): string;\r\n}","import { andList } from \"../sources/english\";\r\nimport { Iterable } from \"../sources/iterable\";\r\nimport { PreCondition } from \"../sources/preCondition\";\r\nimport { ToStringFunctions } from \"../sources/toStringFunctions\";\r\nimport { isBoolean, Type } from \"../sources/types\";\r\nimport { Test } from \"./test\";\r\nimport { TestSkip } from \"./testSkip\";\r\n\r\n/**\r\n * A type that can be used to run tests.\r\n */\r\nexport abstract class TestRunner\r\n{\r\n /**\r\n * Get a {@link string} that concatenates the {@link string} representation of each\r\n * of the provided values into an \"and-list\".\r\n * @param values The values to concatenate.\r\n */\r\n public andList(values: unknown[] | Iterable<unknown>): string\r\n {\r\n return TestRunner.andList(this, values);\r\n }\r\n\r\n /**\r\n * Get a {@link string} that concatenates the {@link string} representation of each\r\n * of the provided values into an \"and-list\".\r\n * @param values The values to concatenate.\r\n */\r\n public static andList(runner: TestRunner, values: unknown[] | Iterable<unknown>): string\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(runner, \"runner\");\r\n PreCondition.assertNotUndefinedAndNotNull(values, \"values\");\r\n\r\n return andList(values.map((value: unknown) => runner.toString(value)));\r\n }\r\n\r\n /**\r\n * Get the {@link string} representation of the provided value.\r\n * @param value The value to get the {@link string} representation of.\r\n */\r\n public toString(value: unknown): string\r\n {\r\n return TestRunner.toString(this, value);\r\n }\r\n\r\n /**\r\n * Get the {@link string} representation of the provided value.\r\n * @param value The value to get the {@link string} representation of.\r\n */\r\n public static toString(_runner: TestRunner, value: unknown): string\r\n {\r\n const toStringFunctions: ToStringFunctions = ToStringFunctions.create();\r\n return toStringFunctions.toString(value);\r\n }\r\n\r\n public skip(message?: string): TestSkip;\r\n /**\r\n * Create a {@link TestSkip} object that will prevent tests from being run.\r\n * @param shouldSkip Whether these tests should be skipped.\r\n * @param message The message that explains why the tests are being skipped.\r\n */\r\n public skip(shouldSkip: boolean, message?: string): TestSkip;\r\n skip(messageOrShouldSkip?: string | boolean | undefined, message?: string): TestSkip\r\n {\r\n let shouldSkip: boolean;\r\n if (!isBoolean(messageOrShouldSkip))\r\n {\r\n shouldSkip = true;\r\n message = messageOrShouldSkip;\r\n }\r\n else\r\n {\r\n shouldSkip = messageOrShouldSkip;\r\n }\r\n return TestRunner.skip(this, shouldSkip, message);\r\n }\r\n\r\n /**\r\n * Create a {@link TestSkip} object that will prevent tests from being run.\r\n * @param shouldSkip Whether these tests should be skipped.\r\n * @param message The message that explains why the tests are being skipped.\r\n */\r\n public static skip(_runner: TestRunner, shouldSkip?: boolean, message?: string): TestSkip\r\n {\r\n return TestSkip.create(shouldSkip, message);\r\n }\r\n\r\n /**\r\n * Create a test group that will test the provided file.\r\n * @param fileName The name of the file that is being tested.\r\n * @param testAction The action that will run the tests.\r\n */\r\n public abstract testFile(fileName: string, testAction: (() => void) | ((test: Test) => void)): void;\r\n /**\r\n * Create a test group that will test the provided file.\r\n * @param fileName The name of the file that is being tested.\r\n * @param skip A value that indicates whether these tests should be skipped.\r\n * @param testAction The action that will run the tests.\r\n */\r\n public abstract testFile(fileName: string, skip: TestSkip | undefined, testAction: (() => void) | ((test: Test) => void)): void;\r\n\r\n /**\r\n * Create a test group that will test the provided type.\r\n * @param type The {@link Type} or name of the type that is being tested.\r\n * @param testAction The action that will run the tests.\r\n */\r\n public abstract testType(typeNameOrType: string | Type<unknown>, testAction: (() => void) | ((test: Test) => void)): void;\r\n /**\r\n * Create a test group that will test the provided type.\r\n * @param type The {@link Type} or name of the type that is being tested.\r\n * @param skip A value that indicates whether these tests should be skipped.\r\n * @param testAction The action that will run the tests.\r\n */\r\n public abstract testType(typeNameOrType: string | Type<unknown>, skip: TestSkip | undefined, testAction: (() => void) | ((test: Test) => void)): void;\r\n\r\n /**\r\n * Create a test group that will test the provided function.\r\n * @param functionSignature The signature of the function that is being tested.\r\n * @param testAction The action that will run the tests.\r\n */\r\n public abstract testFunction(functionSignature: string, testAction: (() => void) | ((test: Test) => void)): void;\r\n /**\r\n * Create a test group that will test the provided function.\r\n * @param functionSignature The signature of the function that is being tested.\r\n * @param testAction The action that will run the tests.\r\n */\r\n public abstract testFunction(functionSignature: string, skip: TestSkip | undefined, testAction: (() => void) | ((test: Test) => void)): void;\r\n\r\n /**\r\n * Create and run a test group with the provided name.\r\n * @param testGroupName The name of the test group to run.\r\n * @param testAction The action that runs the test group.\r\n */\r\n public abstract testGroup(testGroupName: string, testAction: () => void): void;\r\n /**\r\n * Create and run a test group with the provided name.\r\n * @param testGroupName The name of the test group to run.\r\n * @param testAction The action that runs the test group.\r\n */\r\n public abstract testGroup(testGroupName: string, skip: TestSkip | undefined, testAction: () => void): void;\r\n\r\n /**\r\n * Create and run a test with the provided name.\r\n * @param testName The name of the test to run.\r\n * @param testAction The action that runs the test.\r\n */\r\n public abstract test(testName: string, testAction: (test: Test) => void): void;\r\n /**\r\n * Create and run a test with the provided name.\r\n * @param testName The name of the test to run.\r\n * @param testAction The action that runs the test.\r\n */\r\n public abstract test(testName: string, skip: TestSkip | undefined, testAction: (test: Test) => void): void;\r\n}","import { Iterable, AsyncResult, CharacterWriteStream, IndentedCharacterWriteStream, List, Map, MutableMap, NotFoundError, PreCondition, Stack } from \"../sources\";\nimport { FailedTest } from \"./failedTest\";\nimport { SkippedTest } from \"./skippedTest\";\nimport { TestAction, TestActionType } from \"./testAction\";\nimport { GetErrorStringOptions, TestError } from \"./TestError\";\nimport { TestSkip } from \"./testSkip\";\n\nexport type ConsoleTestRunnerStyle = TestActionType | \"passed\" | \"skipped\" | \"failed\";\n\nexport abstract class ConsoleTestRunnerUI\n{\n private writeStream?: IndentedCharacterWriteStream;\n private readonly styles: MutableMap<ConsoleTestRunnerStyle, (text: string) => string>;\n private getErrorStringOptions?: GetErrorStringOptions;\n\n protected constructor()\n {\n this.styles = Map.create();\n }\n\n public static flat(): FlatConsoleTestRunnerUI\n {\n return FlatConsoleTestRunnerUI.create();\n }\n\n public static tree(): TreeConsoleTestRunnerUI\n {\n return TreeConsoleTestRunnerUI.create();\n }\n\n public setWriteStream(writeStream: CharacterWriteStream): this\n {\n PreCondition.assertNotUndefinedAndNotNull(writeStream, \"writeStream\");\n\n this.writeStream = IndentedCharacterWriteStream.create(writeStream);\n\n return this;\n }\n\n public setStyle(style: ConsoleTestRunnerStyle, styleFunction: (text: string) => string): this\n {\n PreCondition.assertNotEmpty(style, \"style\");\n PreCondition.assertNotUndefinedAndNotNull(styleFunction, \"styleFunction\");\n\n this.styles.set(style, styleFunction);\n\n return this;\n }\n\n public setStyles(styles: Partial<Record<ConsoleTestRunnerStyle, (text: string) => string>>): this\n {\n PreCondition.assertNotUndefinedAndNotNull(styles, \"styles\")\n\n for (const entry of Object.entries(styles))\n {\n this.setStyle(entry[0] as ConsoleTestRunnerStyle, entry[1]);\n }\n return this;\n }\n\n private applyStyle(style: ConsoleTestRunnerStyle, text: string): string\n {\n PreCondition.assertNotEmpty(style, \"style\");\n PreCondition.assertNotUndefinedAndNotNull(text, \"text\");\n\n const styleFunction: (text: string) => string = this.styles\n .get(style)\n .catch(NotFoundError, () => { return (text: string) => text; })\n .await();\n return styleFunction(text);\n }\n\n protected addIndentation(): void\n {\n this.writeStream?.addIndentation();\n }\n\n protected removeIndentation(): void\n {\n this.writeStream?.removeIndentation();\n }\n\n protected indent(action: () => number | void | PromiseLike<number | void>): AsyncResult<number>\n {\n return this.writeStream?.indent(action) ?? AsyncResult.value(0);\n }\n\n protected writeString(text: string): AsyncResult<number>\n {\n return this.writeStream?.writeString(text) ?? AsyncResult.value(0);\n }\n\n protected writeLine(text?: string): AsyncResult<number>\n {\n return this.writeStream?.writeLine(text) ?? AsyncResult.value(0);\n }\n\n protected writeTestActionName(testAction: TestAction): AsyncResult<number>\n {\n return this.writeString(this.applyStyle(testAction.getType(), testAction.getName()));\n }\n\n protected writeFullTestActionName(testAction: TestAction): AsyncResult<number>\n {\n return AsyncResult.create(async () =>\n {\n let result: number = 0;\n\n const testActionStack: Stack<TestAction> = Stack.create();\n let currentTestAction: TestAction | undefined = testAction;\n while (currentTestAction)\n {\n testActionStack.add(currentTestAction);\n currentTestAction = currentTestAction.getParent();\n }\n\n while (await testActionStack.any())\n {\n currentTestAction = await testActionStack.remove()!;\n if (currentTestAction.getParent())\n {\n result += await this.writeString(\" \");\n }\n result += await this.writeTestActionName(currentTestAction);\n }\n\n return result;\n });\n }\n\n public setGetErrorStringOptions(options: GetErrorStringOptions | undefined): this\n {\n this.getErrorStringOptions = options;\n\n return this;\n }\n\n public beforeTestGroup(testGroup: TestAction): AsyncResult<void>\n {\n PreCondition.assertNotUndefinedAndNotNull(testGroup, \"testGroup\");\n\n return AsyncResult.empty();\n }\n\n public afterTestGroup(testGroup: TestAction): AsyncResult<void>\n {\n PreCondition.assertNotUndefinedAndNotNull(testGroup, \"testGroup\");\n\n return AsyncResult.empty();\n }\n\n public beforeTest(testAction: TestAction): AsyncResult<void>\n {\n return AsyncResult.empty();\n }\n\n public afterPassedTest(testAction: TestAction): AsyncResult<void>\n {\n return AsyncResult.create(async () =>\n {\n await this.writeLine(` - ${this.applyStyle(\"passed\", \"Passed\")}`);\n });\n }\n\n public afterSkippedTest(testAction: TestAction, skip: TestSkip): AsyncResult<void>\n {\n PreCondition.assertNotUndefinedAndNotNull(testAction, \"testAction\");\n PreCondition.assertNotUndefinedAndNotNull(skip, \"skip\");\n\n return AsyncResult.create(async () =>\n {\n await this.writeLine(` - ${this.applyStyle(\"skipped\", \"Skipped\")}`);\n });\n }\n\n public afterFailedTest(currentTestAction: TestAction, error: TestError): AsyncResult<void>\n {\n PreCondition.assertNotUndefinedAndNotNull(currentTestAction, \"currentTestAction\");\n PreCondition.assertNotUndefinedAndNotNull(error, \"error\");\n\n return AsyncResult.create(async () =>\n {\n await this.writeLine(` - ${this.applyStyle(\"failed\", \"Failed\")}`);\n });\n }\n\n public writeSummary(passedTestCount: number, skippedTests: Iterable<SkippedTest>, failedTests: Iterable<FailedTest>): AsyncResult<void>\n {\n PreCondition.assertGreaterThanOrEqualTo(passedTestCount, 0, \"passedTestCount\");\n PreCondition.assertNotUndefinedAndNotNull(skippedTests, \"skippedTests\");\n PreCondition.assertNotUndefinedAndNotNull(failedTests, \"failedTests\");\n\n return AsyncResult.create(async () =>\n {\n await this.writeLine();\n\n if (await skippedTests.any())\n {\n await this.writeLine(`${this.applyStyle(\"skipped\", \"Skipped Tests\")}:`);\n let counter: number = 0;\n for (const skippedTest of skippedTests)\n {\n await this.writeString(`${++counter}) `);\n await this.writeFullTestActionName(skippedTest.getTestAction());\n await this.writeLine();\n\n const skipMessage: string = skippedTest.getSkipMessage();\n if (skipMessage)\n {\n await this.indent(() => this.writeLine(skipMessage));\n }\n }\n await this.writeLine();\n }\n\n if (await failedTests.any())\n {\n await this.writeLine(`${this.applyStyle(\"failed\", \"Failed Tests\")}:`);\n\n let counter: number = 0;\n for (const failedTest of failedTests)\n {\n await this.writeString(`${++counter}) `);\n await this.writeFullTestActionName(failedTest.getTestAction());\n await this.writeLine();\n\n const testError: TestError = failedTest.getTestError();\n await this.indent(() => this.writeLine(testError.getErrorString(this.getErrorStringOptions)));\n await this.writeLine();\n }\n }\n\n if (passedTestCount > 0)\n {\n await this.writeLine(`${this.applyStyle(\"passed\", \"Passed\")}: ${passedTestCount}`);\n }\n\n if (await skippedTests.any())\n {\n await this.writeLine(`${this.applyStyle(\"skipped\", \"Skipped\")}: ${skippedTests.getCount().await()}`);\n }\n\n if (await failedTests.any())\n {\n await this.writeLine(`${this.applyStyle(\"failed\", \"Failed\")}: ${failedTests.getCount().await()}`);\n }\n });\n }\n}\n\nexport class FlatConsoleTestRunnerUI extends ConsoleTestRunnerUI\n{\n protected constructor()\n {\n super();\n }\n\n public static create(): FlatConsoleTestRunnerUI\n {\n return new FlatConsoleTestRunnerUI();\n }\n\n public beforeTest(testAction: TestAction): AsyncResult<void>\n {\n return AsyncResult.create(async () =>\n {\n await this.writeFullTestActionName(testAction);\n });\n }\n}\n\nexport class TreeConsoleTestRunnerUI extends ConsoleTestRunnerUI\n{\n private testActions: List<TestAction>;\n private testActionWrittenDepth: number;\n\n protected constructor()\n {\n super();\n\n this.testActions = List.create();\n this.testActionWrittenDepth = 0;\n }\n\n public static create(): TreeConsoleTestRunnerUI\n {\n return new TreeConsoleTestRunnerUI();\n }\n\n public beforeTestGroup(testGroup: TestAction): AsyncResult<void>\n {\n return AsyncResult.create(() =>\n {\n this.testActions.add(testGroup);\n });\n }\n\n public afterTestGroup(testGroup: TestAction): AsyncResult<void>\n {\n PreCondition.assertNotUndefinedAndNotNull(testGroup, \"testGroup\");\n PreCondition.assertTrue(this.testActions.any().await(), \"this.testActions.any().await()\");\n\n return AsyncResult.create(() =>\n {\n this.testActions.removeLast().await();\n const testActionCount: number = this.testActions.getCount().await();\n if (this.testActionWrittenDepth > testActionCount)\n {\n this.testActionWrittenDepth--;\n this.removeIndentation();\n }\n });\n }\n\n public beforeTest(testAction: TestAction): AsyncResult<void>\n {\n PreCondition.assertNotUndefinedAndNotNull(testAction, \"testAction\");\n\n return AsyncResult.create(async () =>\n {\n const testActionCount: number = this.testActions.getCount().await();\n while (this.testActionWrittenDepth < testActionCount)\n {\n const testGroup: TestAction = this.testActions.get(this.testActionWrittenDepth).await();\n await this.writeTestActionName(testGroup);\n await this.writeLine();\n this.addIndentation();\n this.testActionWrittenDepth++;\n }\n\n await this.writeTestActionName(testAction);\n });\n }\n}","import { AssertTest } from \"./assertTest\";\nimport { TestCreator } from \"./TestCreator\";\n\n/**\n * An implementation of {@link TestCreator} that creates {@link AssertTest}s.\n */\nexport class AssertTestCreator implements TestCreator\n{\n private constructor()\n {\n }\n\n public static create(): AssertTestCreator\n {\n return new AssertTestCreator();\n }\n\n public createTest(): AssertTest\n {\n return AssertTest.create();\n }\n}","import { AssertTestCreator } from \"./AssertTestCreator\";\nimport { Test } from \"./test\";\n\n/**\n * A type that can create new {@link Test} objects.\n */\nexport abstract class TestCreator\n{\n /**\n * Create the default {@link TestCreator}.\n */\n public static create(): TestCreator\n {\n return AssertTestCreator.create();\n }\n\n /**\n * Create a new {@link Test} object.\n */\n public abstract createTest(): Test;\n}","import { fileURLToPath } from \"url\";\nimport { PreCondition } from \"../sources\";\nimport { GetErrorStringOptions, TestError } from \"./TestError\";\nimport path from \"path\";\n\nexport class BasicTestError implements TestError\n{\n private readonly error: unknown;\n\n private constructor(error: unknown)\n {\n PreCondition.assertNotUndefinedAndNotNull(error, \"error\");\n\n this.error = error;\n }\n\n public static create(error: unknown): BasicTestError\n {\n return new BasicTestError(error);\n }\n\n public getError(): unknown\n {\n return this.error;\n }\n\n public getErrorString(options?: GetErrorStringOptions): string\n {\n let result: string = this.error instanceof Error && this.error.stack ? this.error.stack : `${this.error}`;\n\n const currentFolderPath: string = process.cwd();\n\n if (options?.removeNonProjectPaths ?? false)\n {\n result = BasicTestError.removeNonProjectPaths(result, currentFolderPath);\n }\n\n if (options?.relativeFilePaths ?? false)\n {\n result = BasicTestError.makeFilePathsRelative(result, currentFolderPath);\n }\n\n return result;\n }\n\n public static removeNonProjectPaths(errorString: string, currentFolderPath: string): string\n {\n currentFolderPath = currentFolderPath.replaceAll(\"\\\\\", \"/\");\n return errorString\n .split('\\n')\n .filter((line: string) =>\n {\n let keepLine: boolean = false;\n\n const trimmedLine: string = line.trim();\n\n const match: RegExpMatchArray | null =\n trimmedLine.match(/^at .* \\((.+)\\)$/) ??\n trimmedLine.match(/^at (.+)$/);\n if (!match)\n {\n // If the line isn't a 'at (file-path)' or 'at FunctionSignature\n // (file-path)' line, then we should keep it.\n keepLine = true;\n }\n else\n {\n const location: string = match[1];\n\n // Keep only file URLs inside cwd\n try\n {\n const filePath: string = path.resolve(fileURLToPath(location)).replaceAll(\"\\\\\", \"/\");\n keepLine = filePath.startsWith(currentFolderPath);\n }\n catch\n {\n }\n }\n\n return keepLine;\n })\n .join('\\n');\n }\n\n public static makeFilePathsRelative(errorString: string, currentFolderPath: string): string\n {\n return errorString\n .split('\\n')\n .map((line: string) =>\n {\n const match: RegExpMatchArray | null =\n line.match(/^(\\s*)at (.+?) \\((.+)\\)$/) ??\n line.match(/^(\\s*)at (.+)$/);\n if (match)\n {\n const hasFunctionName: boolean = (match.length === 4);\n const indentation: string = match[1];\n const functionName: string | undefined = hasFunctionName ? match[2] : undefined;\n const location: string = hasFunctionName ? match[3] : match[2];\n\n let relativeLocation: string = location;\n try\n {\n const pathMatch: RegExpMatchArray | null = location.match(/^(.*?):(\\d+):(\\d+)$/);\n if (pathMatch)\n {\n const fullPath: string = pathMatch[1];\n const lineNumber: string = pathMatch[2];\n const columnNumber: string = pathMatch[3];\n\n let absolutePath: string | undefined;\n if (fullPath.startsWith('file:///'))\n {\n absolutePath = fileURLToPath(fullPath);\n }\n else if (/^[A-Za-z]:[\\\\/]/.test(fullPath) || fullPath.startsWith(\"/\"))\n {\n absolutePath = fullPath;\n }\n\n if (absolutePath)\n {\n let relativePath = path.relative(\n currentFolderPath,\n absolutePath\n );\n\n relativePath = relativePath.replace(/\\\\/g, '/');\n\n relativeLocation = `${relativePath}:${lineNumber}:${columnNumber}`;\n }\n }\n }\n catch\n {\n }\n\n if (relativeLocation !== location)\n {\n if (functionName)\n {\n line = `${indentation}at ${functionName} (${relativeLocation})`;\n }\n else\n {\n line = `${indentation}at ${relativeLocation}`;\n }\n }\n }\n return line;\n })\n .join('\\n');\n }\n}","import { BasicTestError } from \"./BasicTestError\";\nimport { TestErrorCreator } from \"./TestErrorCreator\";\n\n/**\n * A {@link TestErrorCreator} that creates {@link BasicTestError}s.\n */\nexport class BasicTestErrorCreator implements TestErrorCreator\n{\n private constructor()\n {\n }\n\n public static create(): BasicTestErrorCreator\n {\n return new BasicTestErrorCreator();\n }\n\n public createTestError(error: unknown)\n {\n return BasicTestError.create(error);\n }\n}","import { BasicTestErrorCreator } from \"./BasicTestErrorCreator\";\nimport { TestError } from \"./TestError\";\n\nexport abstract class TestErrorCreator\n{\n public static create(): TestErrorCreator\n {\n return BasicTestErrorCreator.create();\n }\n\n public abstract createTestError(error: unknown): TestError\n}","import { CharacterWriteStream } from \"../sources/characterWriteStream\";\r\nimport { CurrentProcess } from \"../sources/currentProcess\";\r\nimport { Iterable } from \"../sources/iterable\";\r\nimport { JavascriptIterable } from \"../sources/javascript\";\r\nimport { List } from \"../sources/list\";\r\nimport { NodeJSCharacterWriteStream } from \"../sources/nodeJSCharacterWriteStream\";\r\nimport { PreCondition } from \"../sources/preCondition\";\r\nimport { getName, getParameterCount, isBoolean, isFunction, isJavascriptIterable, isString, Type } from \"../sources/types\";\r\nimport { FailedTest } from \"./failedTest\";\r\nimport { SkippedTest } from \"./skippedTest\";\r\nimport { Test } from \"./test\";\r\nimport { TestAction, TestActionType } from \"./testAction\";\r\nimport { TestRunner } from \"./testRunner\";\r\nimport { TestSkip } from \"./testSkip\";\r\nimport { AsyncResult, IndentedCharacterWriteStream } from \"../sources\";\r\nimport { ConsoleTestRunnerStyle, ConsoleTestRunnerUI } from \"./ConsoleTestRunnerUI\";\r\nimport { ANSIStyles } from \"../sources/ANSIStyles\";\r\nimport { TestCreator } from \"./TestCreator\";\r\nimport { TestErrorCreator } from \"./TestErrorCreator\";\r\nimport { GetErrorStringOptions, TestError } from \"./TestError\";\r\n\r\nexport type ConsoleTestFunction = (runner: ConsoleTestRunner) => (void | Promise<void>);\r\nexport type ConsoleTestFunctionContainer = { test: ConsoleTestFunction };\r\n\r\nexport class ConsoleTestRunner implements TestRunner\r\n{\r\n private writeStream: CharacterWriteStream;\r\n\r\n private readonly testActions: List<TestAction>;\r\n private testActionInsertIndex: number;\r\n private currentTestAction: TestAction | undefined;\r\n private currentTest: Test | undefined;\r\n\r\n private passedTestCount: number;\r\n private readonly skippedTests: List<SkippedTest>;\r\n private readonly testFailures: List<FailedTest>;\r\n\r\n private readonly testCreator: TestCreator;\r\n private readonly testErrorCreator: TestErrorCreator;\r\n private readonly ui: ConsoleTestRunnerUI;\r\n\r\n public constructor(testCreator?: TestCreator, testErrorCreator?: TestErrorCreator, ui?: ConsoleTestRunnerUI)\r\n {\r\n this.writeStream = IndentedCharacterWriteStream.create(NodeJSCharacterWriteStream.create(process.stdout));\r\n\r\n this.testActions = List.create();\r\n this.testActionInsertIndex = 0;\r\n\r\n this.passedTestCount = 0;\r\n this.skippedTests = List.create();\r\n this.testFailures = List.create();\r\n\r\n this.testCreator = testCreator || TestCreator.create();\r\n this.testErrorCreator = testErrorCreator || TestErrorCreator.create();\r\n this.ui = ui || ConsoleTestRunnerUI.tree();\r\n this.ui.setWriteStream(this.writeStream);\r\n }\r\n\r\n public static create(testCreator?: TestCreator, testErrorCreator?: TestErrorCreator, ui?: ConsoleTestRunnerUI): ConsoleTestRunner\r\n {\r\n return new ConsoleTestRunner(testCreator, testErrorCreator, ui);\r\n }\r\n\r\n public static run(testFunction: ConsoleTestFunction | ConsoleTestFunctionContainer): Promise<void>;\r\n public static run(testFunctions: JavascriptIterable<ConsoleTestFunction | ConsoleTestFunctionContainer>): Promise<void>;\r\n static run(testFunctionOrTestFunctions: ConsoleTestFunction | ConsoleTestFunctionContainer | JavascriptIterable<ConsoleTestFunction | ConsoleTestFunctionContainer>): Promise<void>\r\n {\r\n let testFunction: ConsoleTestFunction;\r\n if (isFunction(testFunctionOrTestFunctions))\r\n {\r\n testFunction = testFunctionOrTestFunctions;\r\n }\r\n else if (!isJavascriptIterable(testFunctionOrTestFunctions))\r\n {\r\n testFunction = testFunctionOrTestFunctions.test;\r\n }\r\n else\r\n {\r\n const testFunctions: JavascriptIterable<ConsoleTestFunction | ConsoleTestFunctionContainer> = testFunctionOrTestFunctions;\r\n testFunction = async (runner: ConsoleTestRunner) =>\r\n {\r\n for (const testFunction of testFunctions)\r\n {\r\n if (isFunction(testFunction))\r\n {\r\n await testFunction(runner);\r\n }\r\n else\r\n {\r\n await testFunction.test(runner);\r\n }\r\n }\r\n };\r\n }\r\n\r\n return CurrentProcess.run(async (currentProcess: CurrentProcess) =>\r\n {\r\n const runner: ConsoleTestRunner = ConsoleTestRunner.create()\r\n .setWriteStream(currentProcess.getOutputWriteStream())\r\n .setStyles({\r\n file: t => ANSIStyles.blue(t),\r\n function: t => ANSIStyles.blue(t),\r\n type: t => ANSIStyles.blue(t),\r\n group: t => ANSIStyles.blue(t),\r\n passed: t => ANSIStyles.green(`✓ ${t}`),\r\n skipped: t => ANSIStyles.yellow(`◌ ${t}`),\r\n failed: t => ANSIStyles.red(`✗ ${t}`),\r\n });\r\n\r\n await testFunction(runner);\r\n\r\n await runner.runAsync();\r\n\r\n await runner.printSummary();\r\n });\r\n }\r\n\r\n public setWriteStream(writeStream: CharacterWriteStream): this\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(writeStream, \"writeStream\");\r\n\r\n this.writeStream = IndentedCharacterWriteStream.create(writeStream);\r\n this.ui.setWriteStream(this.writeStream);\r\n\r\n return this;\r\n }\r\n\r\n public setStyle(style: ConsoleTestRunnerStyle, styleFunction: (text: string) => string): this\r\n {\r\n this.ui.setStyle(style, styleFunction);\r\n\r\n return this;\r\n }\r\n\r\n public setStyles(styles: Partial<Record<ConsoleTestRunnerStyle, (text: string) => string>>): this\r\n {\r\n this.ui.setStyles(styles);\r\n\r\n return this;\r\n }\r\n\r\n public setGetErrorStringOptions(options: GetErrorStringOptions): this\r\n {\r\n this.ui.setGetErrorStringOptions(options);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Get the number of {@link TestAction}s that have yet to be executed.\r\n */\r\n public getTestActionCount(): number\r\n {\r\n return this.testActions.getCount().await();\r\n }\r\n\r\n /**\r\n * Get the index in the {@link TestAction} list that new {@link TestAction}s will be\r\n * inserted at.\r\n */\r\n public getTestActionInsertIndex(): number\r\n {\r\n return this.testActionInsertIndex;\r\n }\r\n\r\n private resetTestActionInsertIndex(): void\r\n {\r\n this.testActionInsertIndex = 0;\r\n }\r\n\r\n private insertTestAction(testActionName: string, testActionType: TestActionType, skip: TestSkip | undefined, action: () => (void | Promise<void>))\r\n {\r\n const parentTestAction: TestAction | undefined = this.getCurrentTestAction();\r\n const testAction: TestAction = TestAction.create(parentTestAction, testActionName, testActionType, skip, async () =>\r\n {\r\n try\r\n {\r\n await action();\r\n }\r\n catch (error)\r\n {\r\n const testError: TestError = this.testErrorCreator.createTestError(error);\r\n await this.afterFailedTest(testAction, testError);\r\n }\r\n });\r\n this.testActions.insert(this.testActionInsertIndex, testAction);\r\n this.testActionInsertIndex++;\r\n }\r\n\r\n /**\r\n * Get the number of tests that have been skipped.\r\n */\r\n public getSkippedTestCount(): number\r\n {\r\n return this.skippedTests.getCount().await();\r\n }\r\n\r\n public getSkippedTests(): Iterable<SkippedTest>\r\n {\r\n return this.skippedTests;\r\n }\r\n\r\n /**\r\n * Get the number of tests that have passed.\r\n */\r\n public getPassedTestCount(): number\r\n {\r\n return this.passedTestCount;\r\n }\r\n\r\n public getFailedTestCount(): number\r\n {\r\n return this.testFailures.getCount().await();\r\n }\r\n\r\n public getFailedTests(): Iterable<FailedTest>\r\n {\r\n return this.testFailures;\r\n }\r\n\r\n /**\r\n * Get the {@link TestAction} that is currently executing or undefined if no {@link TestAction}\r\n * is executing.\r\n */\r\n public getCurrentTestAction(): TestAction | undefined\r\n {\r\n return this.currentTestAction;\r\n }\r\n\r\n public getCurrentTest(): Test | undefined\r\n {\r\n return this.currentTest;\r\n }\r\n\r\n private assertNoCurrentTest(): void\r\n {\r\n if (this.currentTest)\r\n {\r\n this.currentTest.fail(\"Can't start a new test group or a new test while running a test.\");\r\n }\r\n }\r\n\r\n public beforeTestGroup(testAction: TestAction): AsyncResult<void>\r\n {\r\n return this.ui.beforeTestGroup(testAction);\r\n }\r\n\r\n public afterTestGroup(testAction: TestAction): AsyncResult<void>\r\n {\r\n return this.ui.afterTestGroup(testAction);\r\n }\r\n\r\n public beforeTest(testAction: TestAction): AsyncResult<void>\r\n {\r\n return this.ui.beforeTest(testAction);\r\n }\r\n\r\n public afterPassedTest(testAction: TestAction): AsyncResult<void>\r\n {\r\n return AsyncResult.create(async () =>\r\n {\r\n await this.ui.afterPassedTest(testAction);\r\n this.passedTestCount++;\r\n });\r\n }\r\n\r\n public afterSkippedTest(testAction: TestAction, skip: TestSkip): AsyncResult<void>\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(testAction, \"testAction\");\r\n\r\n return AsyncResult.create(async () =>\r\n {\r\n await this.ui.afterSkippedTest(testAction, skip);\r\n this.skippedTests.add(SkippedTest.create(skip, testAction));\r\n });\r\n }\r\n\r\n public afterFailedTest(testAction: TestAction, error: TestError): AsyncResult<void>\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(testAction, \"testAction\");\r\n PreCondition.assertNotUndefinedAndNotNull(error, \"error\");\r\n\r\n return AsyncResult.create(async () =>\r\n {\r\n await this.ui.afterFailedTest(testAction, error);\r\n this.testFailures.add(FailedTest.create(testAction, error));\r\n });\r\n }\r\n\r\n public andList(values: unknown[] | Iterable<unknown>): string\r\n {\r\n return TestRunner.andList(this, values);\r\n }\r\n\r\n public toString(value: unknown): string\r\n {\r\n return TestRunner.toString(this, value);\r\n }\r\n\r\n public skip(message?: string): TestSkip;\r\n public skip(shouldSkip: boolean, message?: string): TestSkip;\r\n skip(messageOrShouldSkip?: string | boolean | undefined, message?: string): TestSkip\r\n {\r\n let shouldSkip: boolean;\r\n if (!isBoolean(messageOrShouldSkip))\r\n {\r\n shouldSkip = true;\r\n message = messageOrShouldSkip;\r\n }\r\n else\r\n {\r\n shouldSkip = messageOrShouldSkip;\r\n }\r\n return TestRunner.skip(this, shouldSkip, message);\r\n }\r\n\r\n public testFile(fileName: string, testAction: (() => void) | ((test: Test) => void)): void;\r\n public testFile(fileName: string, skip: TestSkip | undefined, testAction: (() => void) | ((test: Test) => void)): void;\r\n testFile(fileName: string, skipOrTestAction: TestSkip | ((() => void) | ((test: Test) => void)) | undefined, testAction?: (() => void) | ((test: Test) => void)): void\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(fileName, \"fileName\");\r\n PreCondition.assertNotEmpty(fileName, \"fileName\");\r\n let skip: TestSkip | undefined;\r\n if (isFunction(skipOrTestAction))\r\n {\r\n PreCondition.assertUndefined(testAction, \"testAction\");\r\n\r\n skip = undefined;\r\n testAction = skipOrTestAction;\r\n }\r\n else\r\n {\r\n skip = skipOrTestAction;\r\n }\r\n PreCondition.assertNotUndefinedAndNotNull(testAction, \"testAction\");\r\n\r\n this.testGroupOrTest(fileName, \"file\", skip, testAction);\r\n }\r\n\r\n public testType(typeNameOrType: string | Type<unknown>, testAction: (() => void) | ((test: Test) => void)): void;\r\n public testType(typeNameOrType: string | Type<unknown>, skip: TestSkip | undefined, testAction: (() => void) | ((test: Test) => void)): void;\r\n testType(typeNameOrType: string | Type<unknown>, skipOrTestAction: TestSkip | undefined | ((() => void) | ((test: Test) => void)), testAction?: (() => void) | ((test: Test) => void)): void\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(typeNameOrType, \"typeNameOrType\");\r\n let typeName: string;\r\n if (isString(typeNameOrType))\r\n {\r\n typeName = typeNameOrType;\r\n }\r\n else\r\n {\r\n typeName = getName(typeNameOrType);\r\n }\r\n PreCondition.assertNotEmpty(typeName, \"typeName\");\r\n\r\n let skip: TestSkip | undefined;\r\n if (isFunction(skipOrTestAction))\r\n {\r\n PreCondition.assertUndefined(testAction, \"testAction\");\r\n\r\n skip = undefined;\r\n testAction = skipOrTestAction;\r\n }\r\n else\r\n {\r\n skip = skipOrTestAction;\r\n }\r\n PreCondition.assertNotUndefinedAndNotNull(testAction, \"testAction\");\r\n\r\n this.testGroupOrTest(typeName, \"type\", skip, testAction);\r\n }\r\n\r\n public testFunction(functionSignature: string, testAction: (() => void) | ((test: Test) => void)): void;\r\n public testFunction(functionSignature: string, skip: TestSkip | undefined, testAction: (() => void) | ((test: Test) => void)): void;\r\n testFunction(functionSignature: string, skipOrTestAction: TestSkip | undefined | ((() => void) | ((test: Test) => void)), testAction?: (() => void) | ((test: Test) => void)): void\r\n {\r\n PreCondition.assertNotEmpty(functionSignature, \"functionSignature\");\r\n let skip: TestSkip | undefined;\r\n if (isFunction(skipOrTestAction))\r\n {\r\n PreCondition.assertUndefined(testAction, \"testAction\");\r\n\r\n skip = undefined;\r\n testAction = skipOrTestAction;\r\n }\r\n else\r\n {\r\n skip = skipOrTestAction;\r\n }\r\n PreCondition.assertNotUndefinedAndNotNull(testAction, \"testAction\");\r\n\r\n this.testGroupOrTest(functionSignature, \"function\", skip, testAction);\r\n }\r\n\r\n public testGroup(testGroupName: string, testAction: () => (void | Promise<void>)): void;\r\n public testGroup(testGroupName: string, skip: TestSkip | undefined, testAction: () => (void | Promise<void>)): void;\r\n testGroup(testGroupName: string, skipOrTestAction: TestSkip | undefined | (() => (void | Promise<void>)), testAction?: () => (void | Promise<void>)): void\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(testGroupName, \"testGroupName\");\r\n PreCondition.assertNotEmpty(testGroupName, \"testGroupName\");\r\n let skip: TestSkip | undefined;\r\n if (isFunction(skipOrTestAction))\r\n {\r\n PreCondition.assertUndefined(testAction, \"testAction\");\r\n\r\n skip = undefined;\r\n testAction = skipOrTestAction;\r\n }\r\n else\r\n {\r\n skip = skipOrTestAction;\r\n }\r\n PreCondition.assertNotUndefinedAndNotNull(testAction, \"testAction\");\r\n\r\n this.innerTestGroup(testGroupName, \"group\", skip, testAction);\r\n }\r\n\r\n public test(testName: string, testAction: (test: Test) => (void | Promise<void>)): void;\r\n public test(testName: string, skip: TestSkip | undefined, testAction: (test: Test) => (void | Promise<void>)): void;\r\n test(testName: string, skipOrTestAction: TestSkip | undefined | ((test: Test) => (void | Promise<void>)), testAction?: (test: Test) => (void | Promise<void>)): void\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(testName, \"testName\");\r\n PreCondition.assertNotEmpty(testName, \"testName\");\r\n let skip: TestSkip | undefined;\r\n if (isFunction(skipOrTestAction))\r\n {\r\n PreCondition.assertUndefined(testAction, \"testAction\");\r\n\r\n skip = undefined;\r\n testAction = skipOrTestAction;\r\n }\r\n else\r\n {\r\n skip = skipOrTestAction;\r\n }\r\n PreCondition.assertNotUndefinedAndNotNull(testAction, \"testAction\");\r\n\r\n this.innerTest(testName, \"test\", skip, testAction);\r\n }\r\n\r\n private innerTestGroup(testGroupName: string, type: TestActionType, skip: TestSkip | undefined, testGroupAction: () => void): void\r\n {\r\n PreCondition.assertNotEmpty(testGroupName, \"testGroupName\");\r\n PreCondition.assertNotUndefinedAndNotNull(testGroupAction, \"testGroupAction\");\r\n\r\n this.assertNoCurrentTest();\r\n\r\n this.insertTestAction(\r\n testGroupName,\r\n type,\r\n skip,\r\n () => this.beforeTestGroup(this.getCurrentTestAction()!),\r\n )\r\n this.insertTestAction(\r\n testGroupName,\r\n type,\r\n skip,\r\n async () =>\r\n {\r\n this.resetTestActionInsertIndex();\r\n await testGroupAction();\r\n },\r\n );\r\n this.insertTestAction(\r\n testGroupName,\r\n type,\r\n skip,\r\n () => this.afterTestGroup(this.getCurrentTestAction()!),\r\n )\r\n }\r\n\r\n private innerTest(testName: string, testType: TestActionType, skip: TestSkip | undefined, testAction: (test: Test) => void): void\r\n {\r\n PreCondition.assertNotEmpty(testName, \"testName\");\r\n PreCondition.assertNotUndefinedAndNotNull(testAction, \"testAction\");\r\n\r\n this.assertNoCurrentTest();\r\n\r\n this.insertTestAction(\r\n testName,\r\n testType,\r\n skip,\r\n async () =>\r\n {\r\n const currentTestAction: TestAction = this.getCurrentTestAction()!;\r\n await this.beforeTest(currentTestAction);\r\n\r\n const skip: TestSkip | undefined = currentTestAction.getSkip();\r\n if (skip?.getShouldSkip())\r\n {\r\n await this.afterSkippedTest(currentTestAction, skip);\r\n }\r\n else\r\n {\r\n this.currentTest = this.testCreator.createTest();\r\n try\r\n {\r\n await testAction(this.currentTest);\r\n }\r\n finally\r\n {\r\n this.currentTest = undefined;\r\n }\r\n await this.afterPassedTest(currentTestAction);\r\n }\r\n },\r\n );\r\n }\r\n\r\n private testGroupOrTest(name: string, type: TestActionType, skip: TestSkip | undefined, testAction: (() => void) | ((test: Test) => void)): void\r\n {\r\n if (getParameterCount(testAction) === 0)\r\n {\r\n this.innerTestGroup(name, type, skip, <() => void>testAction);\r\n }\r\n else\r\n {\r\n this.innerTest(name, type, skip, <(test: Test) => void>testAction);\r\n }\r\n }\r\n\r\n public async runAsync(): Promise<void>\r\n {\r\n while (this.testActions.any().await())\r\n {\r\n this.resetTestActionInsertIndex();\r\n\r\n this.currentTestAction = this.testActions.removeFirst().await();\r\n try\r\n {\r\n await this.currentTestAction.runAsync();\r\n }\r\n finally\r\n {\r\n this.currentTestAction = undefined;\r\n }\r\n }\r\n this.resetTestActionInsertIndex();\r\n }\r\n\r\n public printSummary(): AsyncResult<void>\r\n {\r\n return this.ui.writeSummary(this.passedTestCount, this.getSkippedTests(), this.getFailedTests());\r\n }\r\n}"],"mappings":"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","names":["test","value","test","text","testFunction","skip"]}
|