diff --git a/__tests__/__outputs__/dart-json.md b/__tests__/__outputs__/dart-json.md
index 31ea24a..7efe01c 100644
--- a/__tests__/__outputs__/dart-json.md
+++ b/__tests__/__outputs__/dart-json.md
@@ -1,40 +1,32 @@
-
-
-### fixtures/dart-json.json
-
+
+## fixtures/dart-json.json ❌
**6** tests were completed in **3.760s** with **1** passed, **4** failed and **1** skipped.
-
-|Suite|Passed|Failed|Skipped|Time|
+|Test suite|Passed|Failed|Skipped|Time|
|:---|---:|---:|---:|---:|
-|[test\main_test.dart](#r0s0-test-maintest-dart)|1✔️|3❌||74ms|
-|[test\second_test.dart](#r0s1-test-secondtest-dart)||1❌|1✖️|51ms|
-
-# Test Suites
-
-## test\main_test.dart ❌
-
-### Test 1
+|[test\main_test.dart](#r0s0)|1✔️|3❌||74ms|
+|[test\second_test.dart](#r0s1)||1❌|1✖️|51ms|
+### test\main_test.dart ❌
+**4** tests were completed in **74ms** with **1** passed, **3** failed and **0** skipped.
+**Test 1**
|Result|Test|Time|
|:---:|:---|---:|
|✔️|Test 1 Passing test|36ms|
-### Test 1 Test 1.1
-
+**Test 1 Test 1.1**
|Result|Test|Time|
|:---:|:---|---:|
|❌|Test 1 Test 1.1 Failing test|20ms|
|❌|Test 1 Test 1.1 Exception in target unit|6ms|
-### Test 2
-
+**Test 2**
|Result|Test|Time|
|:---:|:---|---:|
|❌|Test 2 Exception in test|12ms|
-
-## test\second_test.dart ❌
+### test\second_test.dart ❌
+**2** tests were completed in **51ms** with **0** passed, **1** failed and **1** skipped.
|Result|Test|Time|
|:---:|:---|---:|
|❌|Timeout test|37ms|
-|✖️|Skipped test|14ms|
+|✖️|Skipped test|14ms|
\ No newline at end of file
diff --git a/__tests__/__outputs__/dotnet-trx.md b/__tests__/__outputs__/dotnet-trx.md
index 6cf8ba3..7ae98ef 100644
--- a/__tests__/__outputs__/dotnet-trx.md
+++ b/__tests__/__outputs__/dotnet-trx.md
@@ -1,16 +1,11 @@
-
-
-### fixtures/dotnet-trx.trx
-
+
+## fixtures/dotnet-trx.trx ❌
**7** tests were completed in **1.061s** with **3** passed, **3** failed and **1** skipped.
-
-|Suite|Passed|Failed|Skipped|Time|
+|Test suite|Passed|Failed|Skipped|Time|
|:---|---:|---:|---:|---:|
-|[DotnetTests.XUnitTests.CalculatorTests](#r0s0-DotnetTests-XUnitTests-CalculatorTests)|3✔️|3❌|1✖️|110ms|
-
-# Test Suites
-
-## DotnetTests.XUnitTests.CalculatorTests ❌
+|[DotnetTests.XUnitTests.CalculatorTests](#r0s0)|3✔️|3❌|1✖️|110ms|
+### DotnetTests.XUnitTests.CalculatorTests ❌
+**7** tests were completed in **109.5761ms** with **3** passed, **3** failed and **1** skipped.
|Result|Test|Time|
|:---:|:---|---:|
@@ -20,4 +15,4 @@
|✔️|Passing_Test|0ms|
|✔️|Passing_Test_With_Name|0ms|
|✖️|Skipped_Test|1ms|
-|✔️|Timeout_Test|102ms|
+|✔️|Timeout_Test|102ms|
\ No newline at end of file
diff --git a/__tests__/__outputs__/fluent-validation-test-results.md b/__tests__/__outputs__/fluent-validation-test-results.md
index 2425d47..565f514 100644
--- a/__tests__/__outputs__/fluent-validation-test-results.md
+++ b/__tests__/__outputs__/fluent-validation-test-results.md
@@ -1,10 +1,7 @@

-
-### fixtures/external/FluentValidation.Tests.trx
-
+## fixtures/external/FluentValidation.Tests.trx ✔️
**804** tests were completed in **4.480s** with **803** passed, **0** failed and **1** skipped.
-
-|Suite|Passed|Failed|Skipped|Time|
+|Test suite|Passed|Failed|Skipped|Time|
|:---|---:|---:|---:|---:|
|FluentValidation.Tests.AbstractValidatorTester|35✔️|||12ms|
|FluentValidation.Tests.AccessorCacheTests|4✔️||1✖️|4ms|
@@ -53,7 +50,7 @@
|FluentValidation.Tests.PropertyChainTests|7✔️|||1ms|
|FluentValidation.Tests.RegularExpressionValidatorTests|15✔️|||6ms|
|FluentValidation.Tests.RuleBuilderTests|29✔️|||96ms|
-|FluentValidation.Tests.RuleDependencyTests|14✔️|||2511ms|
+|FluentValidation.Tests.RuleDependencyTests|14✔️|||2.511s|
|FluentValidation.Tests.RulesetTests|21✔️|||14ms|
|FluentValidation.Tests.ScalePrecisionValidatorTests|6✔️|||4ms|
|FluentValidation.Tests.SharedConditionTests|42✔️|||42ms|
diff --git a/__tests__/__outputs__/jest-junit.md b/__tests__/__outputs__/jest-junit.md
index 1bec884..5ddef13 100644
--- a/__tests__/__outputs__/jest-junit.md
+++ b/__tests__/__outputs__/jest-junit.md
@@ -1,40 +1,32 @@
-
-
-### fixtures/jest-junit.xml
-
+
+## fixtures/jest-junit.xml ❌
**6** tests were completed in **1.360s** with **1** passed, **4** failed and **1** skipped.
-
-|Suite|Passed|Failed|Skipped|Time|
+|Test suite|Passed|Failed|Skipped|Time|
|:---|---:|---:|---:|---:|
-|[__tests__\main.test.js](#r0s0-tests-main-test-js)|1✔️|3❌||486ms|
-|[__tests__\second.test.js](#r0s1-tests-second-test-js)||1❌|1✖️|82ms|
-
-# Test Suites
-
-## __tests__\main.test.js ❌
-
-### Test 1
+|[__tests__\main.test.js](#r0s0)|1✔️|3❌||486ms|
+|[__tests__\second.test.js](#r0s1)||1❌|1✖️|82ms|
+### __tests__\main.test.js ❌
+**4** tests were completed in **486ms** with **1** passed, **3** failed and **0** skipped.
+**Test 1**
|Result|Test|Time|
|:---:|:---|---:|
|✔️|Passing test|1ms|
-### Test 1 › Test 1.1
-
+**Test 1 › Test 1.1**
|Result|Test|Time|
|:---:|:---|---:|
|❌|Failing test|2ms|
|❌|Exception in target unit|0ms|
-### Test 2
-
+**Test 2**
|Result|Test|Time|
|:---:|:---|---:|
|❌|Exception in test|0ms|
-
-## __tests__\second.test.js ❌
+### __tests__\second.test.js ❌
+**2** tests were completed in **82ms** with **0** passed, **1** failed and **1** skipped.
|Result|Test|Time|
|:---:|:---|---:|
|❌|Timeout test|4ms|
-|✖️|Skipped test|0ms|
+|✖️|Skipped test|0ms|
\ No newline at end of file
diff --git a/__tests__/__outputs__/jest-test-results.md b/__tests__/__outputs__/jest-test-results.md
index 6a6b325..4814968 100644
--- a/__tests__/__outputs__/jest-test-results.md
+++ b/__tests__/__outputs__/jest-test-results.md
@@ -1,185 +1,182 @@
-
-
-### fixtures/external/jest/jest-test-results.xml
-
+
+## fixtures/external/jest/jest-test-results.xml ❌
**4239** tests were completed in **165.872s** with **4207** passed, **2** failed and **30** skipped.
-
-|Suite|Passed|Failed|Skipped|Time|
+|Test suite|Passed|Failed|Skipped|Time|
|:---|---:|---:|---:|---:|
|e2e/__tests__/asyncAndCallback.test.ts|1✔️|||746ms|
-|e2e/__tests__/asyncRegenerator.test.ts|1✔️|||4127ms|
-|e2e/__tests__/autoClearMocks.test.ts|2✔️|||1681ms|
-|e2e/__tests__/autoResetMocks.test.ts|2✔️|||1666ms|
-|e2e/__tests__/autoRestoreMocks.test.ts|2✔️|||1797ms|
-|e2e/__tests__/babelPluginJestHoist.test.ts|1✔️|||6249ms|
+|e2e/__tests__/asyncRegenerator.test.ts|1✔️|||4.127s|
+|e2e/__tests__/autoClearMocks.test.ts|2✔️|||1.681s|
+|e2e/__tests__/autoResetMocks.test.ts|2✔️|||1.666s|
+|e2e/__tests__/autoRestoreMocks.test.ts|2✔️|||1.797s|
+|e2e/__tests__/babelPluginJestHoist.test.ts|1✔️|||6.249s|
|e2e/__tests__/badSourceMap.test.ts|1✔️|||858ms|
|e2e/__tests__/beforeAllFiltered.ts|1✔️|||958ms|
|e2e/__tests__/beforeEachQueue.ts|1✔️||1✖️|55ms|
|e2e/__tests__/callDoneTwice.test.ts|1✔️|||882ms|
-|e2e/__tests__/chaiAssertionLibrary.ts|1✔️|||1902ms|
-|e2e/__tests__/circularInequality.test.ts|1✔️|||1451ms|
-|e2e/__tests__/circusConcurrentEach.test.ts|2✔️|||1591ms|
+|e2e/__tests__/chaiAssertionLibrary.ts|1✔️|||1.902s|
+|e2e/__tests__/circularInequality.test.ts|1✔️|||1.451s|
+|e2e/__tests__/circusConcurrentEach.test.ts|2✔️|||1.591s|
|e2e/__tests__/circusDeclarationErrors.test.ts|1✔️|||869ms|
-|e2e/__tests__/clearCache.test.ts|2✔️|||1004ms|
-|e2e/__tests__/cliHandlesExactFilenames.test.ts|2✔️|||1230ms|
-|e2e/__tests__/compareDomNodes.test.ts|1✔️|||1407ms|
-|e2e/__tests__/config.test.ts|6✔️|||3945ms|
-|e2e/__tests__/console.test.ts|7✔️|||8072ms|
-|e2e/__tests__/consoleAfterTeardown.test.ts|1✔️|||1341ms|
+|e2e/__tests__/clearCache.test.ts|2✔️|||1.004s|
+|e2e/__tests__/cliHandlesExactFilenames.test.ts|2✔️|||1.230s|
+|e2e/__tests__/compareDomNodes.test.ts|1✔️|||1.407s|
+|e2e/__tests__/config.test.ts|6✔️|||3.945s|
+|e2e/__tests__/console.test.ts|7✔️|||8.072s|
+|e2e/__tests__/consoleAfterTeardown.test.ts|1✔️|||1.341s|
|e2e/__tests__/consoleLogOutputWhenRunInBand.test.ts|1✔️|||793ms|
-|e2e/__tests__/coverageHandlebars.test.ts|1✔️|||1873ms|
-|e2e/__tests__/coverageRemapping.test.ts|1✔️|||12701ms|
-|e2e/__tests__/coverageReport.test.ts|12✔️|||22264ms|
-|e2e/__tests__/coverageThreshold.test.ts|5✔️|||4868ms|
-|e2e/__tests__/coverageTransformInstrumented.test.ts|1✔️|||5029ms|
-|e2e/__tests__/coverageWithoutTransform.test.ts|1✔️|||1075ms|
+|e2e/__tests__/coverageHandlebars.test.ts|1✔️|||1.873s|
+|e2e/__tests__/coverageRemapping.test.ts|1✔️|||12.701s|
+|e2e/__tests__/coverageReport.test.ts|12✔️|||22.264s|
+|e2e/__tests__/coverageThreshold.test.ts|5✔️|||4.868s|
+|e2e/__tests__/coverageTransformInstrumented.test.ts|1✔️|||5.029s|
+|e2e/__tests__/coverageWithoutTransform.test.ts|1✔️|||1.075s|
|e2e/__tests__/createProcessObject.test.ts|1✔️|||908ms|
-|e2e/__tests__/customInlineSnapshotMatchers.test.ts|1✔️|||2206ms|
-|e2e/__tests__/customMatcherStackTrace.test.ts|2✔️|||1539ms|
-|e2e/__tests__/customReporters.test.ts|9✔️|||6553ms|
+|e2e/__tests__/customInlineSnapshotMatchers.test.ts|1✔️|||2.206s|
+|e2e/__tests__/customMatcherStackTrace.test.ts|2✔️|||1.539s|
+|e2e/__tests__/customReporters.test.ts|9✔️|||6.553s|
|e2e/__tests__/customResolver.test.ts|1✔️|||826ms|
-|e2e/__tests__/customTestSequencers.test.ts|3✔️|||2757ms|
+|e2e/__tests__/customTestSequencers.test.ts|3✔️|||2.757s|
|e2e/__tests__/debug.test.ts|1✔️|||899ms|
-|e2e/__tests__/declarationErrors.test.ts|3✔️|||2389ms|
+|e2e/__tests__/declarationErrors.test.ts|3✔️|||2.389s|
|e2e/__tests__/dependencyClash.test.ts|1✔️|||833ms|
-|e2e/__tests__/detectOpenHandles.ts|8✔️|||7528ms|
-|e2e/__tests__/domDiffing.test.ts|1✔️|||1361ms|
+|e2e/__tests__/detectOpenHandles.ts|8✔️|||7.528s|
+|e2e/__tests__/domDiffing.test.ts|1✔️|||1.361s|
|e2e/__tests__/doneInHooks.test.ts|1✔️|||855ms|
|e2e/__tests__/dynamicRequireDependencies.ts|1✔️|||847ms|
-|e2e/__tests__/each.test.ts|7✔️|||4721ms|
-|e2e/__tests__/emptyDescribeWithHooks.test.ts|4✔️|||2886ms|
+|e2e/__tests__/each.test.ts|7✔️|||4.721s|
+|e2e/__tests__/emptyDescribeWithHooks.test.ts|4✔️|||2.886s|
|e2e/__tests__/emptySuiteError.test.ts|1✔️|||885ms|
-|e2e/__tests__/env.test.ts|6✔️|||5221ms|
+|e2e/__tests__/env.test.ts|6✔️|||5.221s|
|e2e/__tests__/environmentAfterTeardown.test.ts|1✔️|||892ms|
|e2e/__tests__/errorOnDeprecated.test.ts|1✔️||24✖️|56ms|
|e2e/__tests__/esmConfigFile.test.ts|3✔️|||526ms|
|e2e/__tests__/executeTestsOnceInMpr.ts|1✔️|||976ms|
|e2e/__tests__/existentRoots.test.ts|4✔️|||627ms|
-|e2e/__tests__/expectAsyncMatcher.test.ts|2✔️|||2732ms|
-|e2e/__tests__/expectInVm.test.ts|1✔️|||1527ms|
-|e2e/__tests__/extraGlobals.test.ts|1✔️|||1011ms|
+|e2e/__tests__/expectAsyncMatcher.test.ts|2✔️|||2.732s|
+|e2e/__tests__/expectInVm.test.ts|1✔️|||1.527s|
+|e2e/__tests__/extraGlobals.test.ts|1✔️|||1.011s|
|e2e/__tests__/failureDetailsProperty.test.ts|1✔️|||907ms|
-|e2e/__tests__/failures.test.ts|7✔️|||10353ms|
-|e2e/__tests__/fakePromises.test.ts|2✔️|||1716ms|
-|e2e/__tests__/fatalWorkerError.test.ts|1✔️|||3167ms|
-|e2e/__tests__/filter.test.ts|7✔️|||5422ms|
-|e2e/__tests__/findRelatedFiles.test.ts|5✔️|||6230ms|
+|e2e/__tests__/failures.test.ts|7✔️|||10.353s|
+|e2e/__tests__/fakePromises.test.ts|2✔️|||1.716s|
+|e2e/__tests__/fatalWorkerError.test.ts|1✔️|||3.167s|
+|e2e/__tests__/filter.test.ts|7✔️|||5.422s|
+|e2e/__tests__/findRelatedFiles.test.ts|5✔️|||6.230s|
|e2e/__tests__/focusedTests.test.ts|1✔️|||888ms|
-|e2e/__tests__/forceExit.test.ts|1✔️|||2208ms|
-|e2e/__tests__/generatorMock.test.ts|1✔️|||1027ms|
+|e2e/__tests__/forceExit.test.ts|1✔️|||2.208s|
+|e2e/__tests__/generatorMock.test.ts|1✔️|||1.027s|
|e2e/__tests__/global-mutation.test.ts|1✔️|||40ms|
|e2e/__tests__/global.test.ts|1✔️|||31ms|
-|e2e/__tests__/globals.test.ts|10✔️|||7505ms|
-|e2e/__tests__/globalSetup.test.ts|10✔️|||13926ms|
-|e2e/__tests__/globalTeardown.test.ts|7✔️|||11886ms|
+|e2e/__tests__/globals.test.ts|10✔️|||7.505s|
+|e2e/__tests__/globalSetup.test.ts|10✔️|||13.926s|
+|e2e/__tests__/globalTeardown.test.ts|7✔️|||11.886s|
|e2e/__tests__/hasteMapMockChanged.test.ts|1✔️|||379ms|
|e2e/__tests__/hasteMapSha1.test.ts|1✔️|||298ms|
|e2e/__tests__/hasteMapSize.test.ts|2✔️|||397ms|
-|e2e/__tests__/importedGlobals.test.ts|1✔️|||1043ms|
-|e2e/__tests__/injectGlobals.test.ts|2✔️|||1860ms|
-|e2e/__tests__/jasmineAsync.test.ts|15✔️|||28291ms|
+|e2e/__tests__/importedGlobals.test.ts|1✔️|||1.043s|
+|e2e/__tests__/injectGlobals.test.ts|2✔️|||1.860s|
+|e2e/__tests__/jasmineAsync.test.ts|15✔️|||28.291s|
|e2e/__tests__/jasmineAsyncWithPendingDuringTest.ts|1✔️||1✖️|72ms|
-|e2e/__tests__/jest.config.js.test.ts|3✔️|||2134ms|
-|e2e/__tests__/jest.config.ts.test.ts|5✔️|||14322ms|
-|[e2e/__tests__/jestChangedFiles.test.ts](#r0s75-e2e-tests-jestChangedFiles-test-ts)|9✔️|1❌||9045ms|
-|e2e/__tests__/jestEnvironmentJsdom.test.ts|1✔️|||1744ms|
-|e2e/__tests__/jestRequireActual.test.ts|1✔️|||1665ms|
-|e2e/__tests__/jestRequireMock.test.ts|1✔️|||2119ms|
+|e2e/__tests__/jest.config.js.test.ts|3✔️|||2.134s|
+|e2e/__tests__/jest.config.ts.test.ts|5✔️|||14.322s|
+|[e2e/__tests__/jestChangedFiles.test.ts](#r0s75)|9✔️|1❌||9.045s|
+|e2e/__tests__/jestEnvironmentJsdom.test.ts|1✔️|||1.744s|
+|e2e/__tests__/jestRequireActual.test.ts|1✔️|||1.665s|
+|e2e/__tests__/jestRequireMock.test.ts|1✔️|||2.119s|
|e2e/__tests__/json.test.ts|2✔️|||29ms|
-|e2e/__tests__/jsonReporter.test.ts|2✔️|||1514ms|
+|e2e/__tests__/jsonReporter.test.ts|2✔️|||1.514s|
|e2e/__tests__/lifecycles.ts|1✔️|||861ms|
|e2e/__tests__/listTests.test.ts|2✔️|||945ms|
-|e2e/__tests__/locationInResults.test.ts|2✔️|||1764ms|
+|e2e/__tests__/locationInResults.test.ts|2✔️|||1.764s|
|e2e/__tests__/logHeapUsage.test.ts|1✔️|||884ms|
-|e2e/__tests__/mockNames.test.ts|8✔️|||6771ms|
-|e2e/__tests__/modernFakeTimers.test.ts|2✔️|||1680ms|
-|e2e/__tests__/moduleNameMapper.test.ts|5✔️|||5395ms|
+|e2e/__tests__/mockNames.test.ts|8✔️|||6.771s|
+|e2e/__tests__/modernFakeTimers.test.ts|2✔️|||1.680s|
+|e2e/__tests__/moduleNameMapper.test.ts|5✔️|||5.395s|
|e2e/__tests__/moduleParentNullInTest.ts|1✔️|||886ms|
-|e2e/__tests__/multiProjectRunner.test.ts|14✔️|||16360ms|
+|e2e/__tests__/multiProjectRunner.test.ts|14✔️|||16.360s|
|e2e/__tests__/nativeAsyncMock.test.ts|1✔️|||55ms|
|e2e/__tests__/nativeEsm.test.ts|2✔️||1✖️|905ms|
|e2e/__tests__/nativeEsmTypescript.test.ts|1✔️|||956ms|
-|e2e/__tests__/nestedEventLoop.test.ts|1✔️|||1422ms|
-|e2e/__tests__/nestedTestDefinitions.test.ts|4✔️|||4641ms|
+|e2e/__tests__/nestedEventLoop.test.ts|1✔️|||1.422s|
+|e2e/__tests__/nestedTestDefinitions.test.ts|4✔️|||4.641s|
|e2e/__tests__/nodePath.test.ts|1✔️|||866ms|
-|e2e/__tests__/noTestFound.test.ts|2✔️|||1063ms|
-|e2e/__tests__/noTestsFound.test.ts|5✔️|||2739ms|
-|[e2e/__tests__/onlyChanged.test.ts](#r0s98-e2e-tests-onlyChanged-test-ts)|8✔️|1❌||22281ms|
-|e2e/__tests__/onlyFailuresNonWatch.test.ts|1✔️|||2893ms|
-|e2e/__tests__/overrideGlobals.test.ts|2✔️|||2046ms|
-|e2e/__tests__/pnp.test.ts|1✔️|||2715ms|
-|e2e/__tests__/presets.test.ts|2✔️|||1966ms|
-|e2e/__tests__/processExit.test.ts|1✔️|||1070ms|
+|e2e/__tests__/noTestFound.test.ts|2✔️|||1.063s|
+|e2e/__tests__/noTestsFound.test.ts|5✔️|||2.739s|
+|[e2e/__tests__/onlyChanged.test.ts](#r0s98)|8✔️|1❌||22.281s|
+|e2e/__tests__/onlyFailuresNonWatch.test.ts|1✔️|||2.893s|
+|e2e/__tests__/overrideGlobals.test.ts|2✔️|||2.046s|
+|e2e/__tests__/pnp.test.ts|1✔️|||2.715s|
+|e2e/__tests__/presets.test.ts|2✔️|||1.966s|
+|e2e/__tests__/processExit.test.ts|1✔️|||1.070s|
|e2e/__tests__/promiseReject.test.ts|1✔️|||967ms|
|e2e/__tests__/regexCharInPath.test.ts|1✔️|||962ms|
|e2e/__tests__/requireAfterTeardown.test.ts|1✔️|||921ms|
-|e2e/__tests__/requireMain.test.ts|1✔️|||1137ms|
+|e2e/__tests__/requireMain.test.ts|1✔️|||1.137s|
|e2e/__tests__/requireMainAfterCreateRequire.test.ts|1✔️|||966ms|
|e2e/__tests__/requireMainIsolateModules.test.ts|1✔️|||976ms|
-|e2e/__tests__/requireMainResetModules.test.ts|2✔️|||1961ms|
+|e2e/__tests__/requireMainResetModules.test.ts|2✔️|||1.961s|
|e2e/__tests__/requireV8Module.test.ts|1✔️|||30ms|
|e2e/__tests__/resetModules.test.ts|1✔️|||926ms|
-|e2e/__tests__/resolve.test.ts|1✔️|||1863ms|
-|e2e/__tests__/resolveGetPaths.test.ts|1✔️|||1155ms|
+|e2e/__tests__/resolve.test.ts|1✔️|||1.863s|
+|e2e/__tests__/resolveGetPaths.test.ts|1✔️|||1.155s|
|e2e/__tests__/resolveNodeModule.test.ts|1✔️|||943ms|
-|e2e/__tests__/resolveNoFileExtensions.test.ts|2✔️|||1263ms|
-|e2e/__tests__/resolveWithPaths.test.ts|1✔️|||1170ms|
+|e2e/__tests__/resolveNoFileExtensions.test.ts|2✔️|||1.263s|
+|e2e/__tests__/resolveWithPaths.test.ts|1✔️|||1.170s|
|e2e/__tests__/runProgrammatically.test.ts|2✔️|||575ms|
-|e2e/__tests__/runTestsByPath.test.ts|1✔️|||1999ms|
-|e2e/__tests__/runtimeInternalModuleRegistry.test.ts|1✔️|||1202ms|
-|e2e/__tests__/selectProjects.test.ts|18✔️|||5236ms|
+|e2e/__tests__/runTestsByPath.test.ts|1✔️|||1.999s|
+|e2e/__tests__/runtimeInternalModuleRegistry.test.ts|1✔️|||1.202s|
+|e2e/__tests__/selectProjects.test.ts|18✔️|||5.236s|
|e2e/__tests__/setImmediate.test.ts|1✔️|||904ms|
-|e2e/__tests__/setupFilesAfterEnvConfig.test.ts|2✔️|||1967ms|
+|e2e/__tests__/setupFilesAfterEnvConfig.test.ts|2✔️|||1.967s|
|e2e/__tests__/showConfig.test.ts|1✔️|||195ms|
-|e2e/__tests__/skipBeforeAfterAll.test.ts|1✔️|||1061ms|
+|e2e/__tests__/skipBeforeAfterAll.test.ts|1✔️|||1.061s|
|e2e/__tests__/snapshot-unknown.test.ts|1✔️|||838ms|
-|e2e/__tests__/snapshot.test.ts|9✔️|||13899ms|
+|e2e/__tests__/snapshot.test.ts|9✔️|||13.899s|
|e2e/__tests__/snapshotMockFs.test.ts|1✔️|||883ms|
|e2e/__tests__/snapshotResolver.test.ts|1✔️|||823ms|
-|e2e/__tests__/snapshotSerializers.test.ts|2✔️|||2065ms|
-|e2e/__tests__/stackTrace.test.ts|7✔️|||4725ms|
+|e2e/__tests__/snapshotSerializers.test.ts|2✔️|||2.065s|
+|e2e/__tests__/stackTrace.test.ts|7✔️|||4.725s|
|e2e/__tests__/stackTraceNoCaptureStackTrace.test.ts|1✔️|||899ms|
-|e2e/__tests__/stackTraceSourceMaps.test.ts|1✔️|||2185ms|
-|e2e/__tests__/stackTraceSourceMapsWithCoverage.test.ts|1✔️|||2444ms|
+|e2e/__tests__/stackTraceSourceMaps.test.ts|1✔️|||2.185s|
+|e2e/__tests__/stackTraceSourceMapsWithCoverage.test.ts|1✔️|||2.444s|
|e2e/__tests__/supportsDashedArgs.ts|2✔️|||968ms|
|e2e/__tests__/symbol.test.ts|1✔️|||49ms|
-|e2e/__tests__/testEnvironment.test.ts|1✔️|||1628ms|
-|e2e/__tests__/testEnvironmentAsync.test.ts|1✔️|||1493ms|
-|e2e/__tests__/testEnvironmentCircus.test.ts|1✔️|||1501ms|
-|e2e/__tests__/testEnvironmentCircusAsync.test.ts|1✔️|||1507ms|
-|e2e/__tests__/testFailureExitCode.test.ts|2✔️|||4476ms|
-|e2e/__tests__/testInRoot.test.ts|1✔️|||1009ms|
+|e2e/__tests__/testEnvironment.test.ts|1✔️|||1.628s|
+|e2e/__tests__/testEnvironmentAsync.test.ts|1✔️|||1.493s|
+|e2e/__tests__/testEnvironmentCircus.test.ts|1✔️|||1.501s|
+|e2e/__tests__/testEnvironmentCircusAsync.test.ts|1✔️|||1.507s|
+|e2e/__tests__/testFailureExitCode.test.ts|2✔️|||4.476s|
+|e2e/__tests__/testInRoot.test.ts|1✔️|||1.009s|
|e2e/__tests__/testNamePattern.test.ts|1✔️|||859ms|
|e2e/__tests__/testNamePatternSkipped.test.ts|1✔️|||991ms|
-|e2e/__tests__/testPathPatternReporterMessage.test.ts|1✔️|||3076ms|
+|e2e/__tests__/testPathPatternReporterMessage.test.ts|1✔️|||3.076s|
|e2e/__tests__/testResultsProcessor.test.ts|1✔️|||910ms|
-|e2e/__tests__/testRetries.test.ts|4✔️|||3277ms|
-|e2e/__tests__/testTodo.test.ts|5✔️|||3573ms|
-|e2e/__tests__/timeouts.test.ts|4✔️|||4029ms|
+|e2e/__tests__/testRetries.test.ts|4✔️|||3.277s|
+|e2e/__tests__/testTodo.test.ts|5✔️|||3.573s|
+|e2e/__tests__/timeouts.test.ts|4✔️|||4.029s|
|e2e/__tests__/timeoutsLegacy.test.ts|1✔️||3✖️|71ms|
-|e2e/__tests__/timerResetMocks.test.ts|2✔️|||1878ms|
-|e2e/__tests__/timerUseRealTimers.test.ts|1✔️|||1018ms|
-|e2e/__tests__/toMatchInlineSnapshot.test.ts|12✔️|||23917ms|
-|e2e/__tests__/toMatchInlineSnapshotWithRetries.test.ts|3✔️|||4670ms|
-|e2e/__tests__/toMatchSnapshot.test.ts|9✔️|||17025ms|
-|e2e/__tests__/toMatchSnapshotWithRetries.test.ts|2✔️|||4435ms|
-|e2e/__tests__/toMatchSnapshotWithStringSerializer.test.ts|3✔️|||3544ms|
-|e2e/__tests__/toThrowErrorMatchingInlineSnapshot.test.ts|4✔️|||3562ms|
-|e2e/__tests__/toThrowErrorMatchingSnapshot.test.ts|5✔️|||3524ms|
-|e2e/__tests__/transform.test.ts|16✔️|||26740ms|
+|e2e/__tests__/timerResetMocks.test.ts|2✔️|||1.878s|
+|e2e/__tests__/timerUseRealTimers.test.ts|1✔️|||1.018s|
+|e2e/__tests__/toMatchInlineSnapshot.test.ts|12✔️|||23.917s|
+|e2e/__tests__/toMatchInlineSnapshotWithRetries.test.ts|3✔️|||4.670s|
+|e2e/__tests__/toMatchSnapshot.test.ts|9✔️|||17.025s|
+|e2e/__tests__/toMatchSnapshotWithRetries.test.ts|2✔️|||4.435s|
+|e2e/__tests__/toMatchSnapshotWithStringSerializer.test.ts|3✔️|||3.544s|
+|e2e/__tests__/toThrowErrorMatchingInlineSnapshot.test.ts|4✔️|||3.562s|
+|e2e/__tests__/toThrowErrorMatchingSnapshot.test.ts|5✔️|||3.524s|
+|e2e/__tests__/transform.test.ts|16✔️|||26.740s|
|e2e/__tests__/transformLinkedModules.test.ts|1✔️|||783ms|
-|e2e/__tests__/typescriptCoverage.test.ts|1✔️|||2893ms|
-|e2e/__tests__/unexpectedToken.test.ts|3✔️|||3411ms|
-|e2e/__tests__/useStderr.test.ts|1✔️|||1352ms|
-|e2e/__tests__/v8Coverage.test.ts|2✔️|||2412ms|
+|e2e/__tests__/typescriptCoverage.test.ts|1✔️|||2.893s|
+|e2e/__tests__/unexpectedToken.test.ts|3✔️|||3.411s|
+|e2e/__tests__/useStderr.test.ts|1✔️|||1.352s|
+|e2e/__tests__/v8Coverage.test.ts|2✔️|||2.412s|
|e2e/__tests__/verbose.test.ts|1✔️|||683ms|
|e2e/__tests__/version.test.ts|1✔️|||138ms|
-|e2e/__tests__/watchModeNoAccess.test.ts|1✔️|||4370ms|
-|e2e/__tests__/watchModeOnlyFailed.test.ts|1✔️|||1394ms|
-|e2e/__tests__/watchModePatterns.test.ts|2✔️|||3503ms|
-|e2e/__tests__/watchModeUpdateSnapshot.test.ts|1✔️|||1075ms|
-|e2e/__tests__/workerForceExit.test.ts|2✔️|||4751ms|
-|e2e/__tests__/wrongEnv.test.ts|5✔️|||3877ms|
+|e2e/__tests__/watchModeNoAccess.test.ts|1✔️|||4.370s|
+|e2e/__tests__/watchModeOnlyFailed.test.ts|1✔️|||1.394s|
+|e2e/__tests__/watchModePatterns.test.ts|2✔️|||3.503s|
+|e2e/__tests__/watchModeUpdateSnapshot.test.ts|1✔️|||1.075s|
+|e2e/__tests__/workerForceExit.test.ts|2✔️|||4.751s|
+|e2e/__tests__/wrongEnv.test.ts|5✔️|||3.877s|
|e2e/custom-test-sequencer/a.test.js|1✔️|||29ms|
|e2e/custom-test-sequencer/b.test.js|1✔️|||21ms|
|e2e/custom-test-sequencer/c.test.js|1✔️|||42ms|
@@ -209,7 +206,7 @@
|examples/module-mock/__tests__/mock_per_test.js|2✔️|||116ms|
|examples/module-mock/__tests__/partial_mock.js|1✔️|||215ms|
|examples/mongodb/__test__/db.test.js|1✔️|||236ms|
-|examples/react-native/__tests__/intro.test.js|4✔️|||8559ms|
+|examples/react-native/__tests__/intro.test.js|4✔️|||8.559s|
|examples/react-testing-library/__tests__/CheckboxWithLabel-test.js|1✔️|||469ms|
|examples/react/__tests__/CheckboxWithLabel-test.js|1✔️|||256ms|
|examples/snapshot/__tests__/clock.react.test.js|1✔️|||62ms|
@@ -231,7 +228,7 @@
|packages/expect/src/__tests__/isError.test.ts|4✔️|||43ms|
|packages/expect/src/__tests__/matchers-toContain.property.test.ts|2✔️|||236ms|
|packages/expect/src/__tests__/matchers-toContainEqual.property.test.ts|2✔️|||287ms|
-|packages/expect/src/__tests__/matchers-toEqual.property.test.ts|2✔️|||1062ms|
+|packages/expect/src/__tests__/matchers-toEqual.property.test.ts|2✔️|||1.062s|
|packages/expect/src/__tests__/matchers-toStrictEqual.property.test.ts|3✔️|||394ms|
|packages/expect/src/__tests__/matchers.test.js|592✔️|||862ms|
|packages/expect/src/__tests__/spyMatchers.test.ts|248✔️|||395ms|
@@ -240,11 +237,11 @@
|packages/expect/src/__tests__/toEqual-dom.test.ts|12✔️|||99ms|
|packages/expect/src/__tests__/toThrowMatchers.test.ts|98✔️|||257ms|
|packages/expect/src/__tests__/utils.test.ts|41✔️|||147ms|
-|packages/jest-circus/src/__tests__/afterAll.test.ts|6✔️|||5755ms|
-|packages/jest-circus/src/__tests__/baseTest.test.ts|2✔️|||2902ms|
+|packages/jest-circus/src/__tests__/afterAll.test.ts|6✔️|||5.755s|
+|packages/jest-circus/src/__tests__/baseTest.test.ts|2✔️|||2.902s|
|packages/jest-circus/src/__tests__/circusItTestError.test.ts|8✔️|||300ms|
|packages/jest-circus/src/__tests__/circusItTodoTestError.test.ts|3✔️|||81ms|
-|packages/jest-circus/src/__tests__/hooks.test.ts|3✔️|||3762ms|
+|packages/jest-circus/src/__tests__/hooks.test.ts|3✔️|||3.762s|
|packages/jest-circus/src/__tests__/hooksError.test.ts|32✔️|||127ms|
|packages/jest-cli/src/__tests__/cli/args.test.ts|17✔️|||345ms|
|packages/jest-cli/src/init/__tests__/init.test.js|24✔️|||119ms|
@@ -264,12 +261,12 @@
|packages/jest-core/src/__tests__/getNoTestsFoundMessage.test.js|5✔️|||61ms|
|packages/jest-core/src/__tests__/globals.test.ts|1✔️|||22ms|
|packages/jest-core/src/__tests__/runJest.test.js|2✔️|||261ms|
-|packages/jest-core/src/__tests__/SearchSource.test.ts|27✔️|||2596ms|
+|packages/jest-core/src/__tests__/SearchSource.test.ts|27✔️|||2.596s|
|packages/jest-core/src/__tests__/SnapshotInteractiveMode.test.js|13✔️|||89ms|
|packages/jest-core/src/__tests__/TestScheduler.test.js|8✔️|||520ms|
|packages/jest-core/src/__tests__/testSchedulerHelper.test.js|12✔️|||48ms|
-|packages/jest-core/src/__tests__/watch.test.js|80✔️|||6755ms|
-|packages/jest-core/src/__tests__/watchFileChanges.test.ts|1✔️|||1514ms|
+|packages/jest-core/src/__tests__/watch.test.js|80✔️|||6.755s|
+|packages/jest-core/src/__tests__/watchFileChanges.test.ts|1✔️|||1.514s|
|packages/jest-core/src/__tests__/watchFilenamePatternMode.test.js|2✔️|||165ms|
|packages/jest-core/src/__tests__/watchTestNamePatternMode.test.js|1✔️|||246ms|
|packages/jest-core/src/lib/__tests__/isValidPath.test.ts|3✔️|||166ms|
@@ -292,7 +289,7 @@
|packages/jest-globals/src/__tests__/index.ts|1✔️|||533ms|
|packages/jest-haste-map/src/__tests__/get_mock_name.test.js|1✔️|||22ms|
|packages/jest-haste-map/src/__tests__/includes_dotfiles.test.ts|1✔️|||337ms|
-|packages/jest-haste-map/src/__tests__/index.test.js|44✔️|||1145ms|
+|packages/jest-haste-map/src/__tests__/index.test.js|44✔️|||1.145s|
|packages/jest-haste-map/src/__tests__/worker.test.js|7✔️|||100ms|
|packages/jest-haste-map/src/crawlers/__tests__/node.test.js|10✔️|||170ms|
|packages/jest-haste-map/src/crawlers/__tests__/watchman.test.js|8✔️|||153ms|
@@ -321,12 +318,12 @@
|packages/jest-message-util/src/__tests__/messages.test.ts|11✔️|||205ms|
|packages/jest-mock/src/__tests__/index.test.ts|84✔️|||509ms|
|packages/jest-regex-util/src/__tests__/index.test.ts|8✔️|||56ms|
-|packages/jest-repl/src/__tests__/jest_repl.test.js|1✔️|||1172ms|
-|packages/jest-repl/src/__tests__/runtime_cli.test.js|4✔️|||4094ms|
+|packages/jest-repl/src/__tests__/jest_repl.test.js|1✔️|||1.172s|
+|packages/jest-repl/src/__tests__/runtime_cli.test.js|4✔️|||4.094s|
|packages/jest-reporters/src/__tests__/CoverageReporter.test.js|12✔️|||397ms|
|packages/jest-reporters/src/__tests__/CoverageWorker.test.js|2✔️|||199ms|
|packages/jest-reporters/src/__tests__/DefaultReporter.test.js|2✔️|||148ms|
-|packages/jest-reporters/src/__tests__/generateEmptyCoverage.test.js|3✔️|||1129ms|
+|packages/jest-reporters/src/__tests__/generateEmptyCoverage.test.js|3✔️|||1.129s|
|packages/jest-reporters/src/__tests__/getResultHeader.test.js|4✔️|||30ms|
|packages/jest-reporters/src/__tests__/getSnapshotStatus.test.js|3✔️|||28ms|
|packages/jest-reporters/src/__tests__/getSnapshotSummary.test.js|4✔️|||49ms|
@@ -337,7 +334,7 @@
|packages/jest-reporters/src/__tests__/VerboseReporter.test.js|11✔️|||425ms|
|packages/jest-resolve-dependencies/src/__tests__/dependency_resolver.test.ts|11✔️|||666ms|
|packages/jest-resolve/src/__tests__/isBuiltinModule.test.ts|4✔️|||36ms|
-|packages/jest-resolve/src/__tests__/resolve.test.ts|16✔️|||1308ms|
+|packages/jest-resolve/src/__tests__/resolve.test.ts|16✔️|||1.308s|
|packages/jest-runner/src/__tests__/testRunner.test.ts|2✔️|||905ms|
|packages/jest-runtime/src/__tests__/instrumentation.test.ts|1✔️|||275ms|
|packages/jest-runtime/src/__tests__/runtime_create_mock_from_module.test.js|3✔️|||606ms|
@@ -347,31 +344,31 @@
|packages/jest-runtime/src/__tests__/runtime_jest_spy_on.test.js|2✔️|||521ms|
|packages/jest-runtime/src/__tests__/runtime_mock.test.js|4✔️|||743ms|
|packages/jest-runtime/src/__tests__/runtime_module_directories.test.js|4✔️|||525ms|
-|packages/jest-runtime/src/__tests__/runtime_node_path.test.js|4✔️|||1088ms|
+|packages/jest-runtime/src/__tests__/runtime_node_path.test.js|4✔️|||1.088s|
|packages/jest-runtime/src/__tests__/runtime_require_actual.test.js|2✔️|||478ms|
|packages/jest-runtime/src/__tests__/runtime_require_cache.test.js|2✔️|||454ms|
|packages/jest-runtime/src/__tests__/runtime_require_mock.test.js|13✔️|||962ms|
|packages/jest-runtime/src/__tests__/runtime_require_module_no_ext.test.js|1✔️|||261ms|
-|packages/jest-runtime/src/__tests__/runtime_require_module_or_mock_transitive_deps.test.js|6✔️|||2366ms|
-|packages/jest-runtime/src/__tests__/runtime_require_module_or_mock.test.js|17✔️|||1223ms|
-|packages/jest-runtime/src/__tests__/runtime_require_module.test.js|27✔️|||2439ms|
+|packages/jest-runtime/src/__tests__/runtime_require_module_or_mock_transitive_deps.test.js|6✔️|||2.366s|
+|packages/jest-runtime/src/__tests__/runtime_require_module_or_mock.test.js|17✔️|||1.223s|
+|packages/jest-runtime/src/__tests__/runtime_require_module.test.js|27✔️|||2.439s|
|packages/jest-runtime/src/__tests__/runtime_require_resolve.test.ts|5✔️|||707ms|
|packages/jest-runtime/src/__tests__/runtime_wrap.js|2✔️|||263ms|
|packages/jest-runtime/src/__tests__/Runtime-sourceMaps.test.js|1✔️|||584ms|
|packages/jest-runtime/src/__tests__/Runtime-statics.test.js|2✔️|||162ms|
|packages/jest-serializer/src/__tests__/index.test.ts|17✔️|||158ms|
|packages/jest-snapshot/src/__tests__/dedentLines.test.ts|17✔️|||94ms|
-|packages/jest-snapshot/src/__tests__/InlineSnapshots.test.ts|22✔️|||1149ms|
+|packages/jest-snapshot/src/__tests__/InlineSnapshots.test.ts|22✔️|||1.149s|
|packages/jest-snapshot/src/__tests__/matcher.test.ts|1✔️|||131ms|
|packages/jest-snapshot/src/__tests__/mockSerializer.test.ts|10✔️|||45ms|
-|packages/jest-snapshot/src/__tests__/printSnapshot.test.ts|71✔️|||1188ms|
+|packages/jest-snapshot/src/__tests__/printSnapshot.test.ts|71✔️|||1.188s|
|packages/jest-snapshot/src/__tests__/SnapshotResolver.test.ts|10✔️|||98ms|
|packages/jest-snapshot/src/__tests__/throwMatcher.test.ts|3✔️|||481ms|
|packages/jest-snapshot/src/__tests__/utils.test.ts|26✔️|||214ms|
|packages/jest-source-map/src/__tests__/getCallsite.test.ts|3✔️|||86ms|
|packages/jest-test-result/src/__tests__/formatTestResults.test.ts|1✔️|||53ms|
|packages/jest-test-sequencer/src/__tests__/test_sequencer.test.js|8✔️|||251ms|
-|packages/jest-transform/src/__tests__/ScriptTransformer.test.ts|22✔️|||1660ms|
+|packages/jest-transform/src/__tests__/ScriptTransformer.test.ts|22✔️|||1.660s|
|packages/jest-transform/src/__tests__/shouldInstrument.test.ts|25✔️|||155ms|
|packages/jest-util/src/__tests__/createProcessObject.test.ts|4✔️|||81ms|
|packages/jest-util/src/__tests__/deepCyclicCopy.test.ts|12✔️|||86ms|
@@ -406,34 +403,32 @@
|packages/pretty-format/src/__tests__/prettyFormat.test.ts|86✔️|||219ms|
|packages/pretty-format/src/__tests__/react.test.tsx|55✔️|||325ms|
|packages/pretty-format/src/__tests__/ReactElement.test.ts|3✔️|||64ms|
-
-# Test Suites
-
-## e2e/__tests__/jestChangedFiles.test.ts ❌
+### e2e/__tests__/jestChangedFiles.test.ts ❌
+**10** tests were completed in **9045ms** with **9** passed, **1** failed and **0** skipped.
|Result|Test|Time|
|:---:|:---|---:|
|✔️|gets hg SCM roots and dedupes them|559ms|
|✔️|gets git SCM roots and dedupes them|416ms|
|✔️|gets mixed git and hg SCM roots and dedupes them|467ms|
-|✔️|gets changed files for git|2298ms|
+|✔️|gets changed files for git|2.298s|
|✔️|monitors only root paths for git|151ms|
|✔️|does not find changes in files with no diff, for git|628ms|
|✔️|handles a bad revision for "changedSince", for git|878ms|
-|❌|gets changed files for hg|2219ms|
+|❌|gets changed files for hg|2.219s|
|✔️|monitors only root paths for hg|281ms|
|✔️|handles a bad revision for "changedSince", for hg|949ms|
-
-## e2e/__tests__/onlyChanged.test.ts ❌
+### e2e/__tests__/onlyChanged.test.ts ❌
+**9** tests were completed in **22281ms** with **8** passed, **1** failed and **0** skipped.
|Result|Test|Time|
|:---:|:---|---:|
-|✔️|run for "onlyChanged" and "changedSince"|1464ms|
-|✔️|run only changed files|5196ms|
-|✔️|report test coverage for only changed files|1889ms|
+|✔️|run for "onlyChanged" and "changedSince"|1.464s|
+|✔️|run only changed files|5.196s|
+|✔️|report test coverage for only changed files|1.889s|
|✔️|report test coverage of source on test file change under only changed files|822ms|
|✔️|do not pickup non-tested files when reporting coverage on only changed files|861ms|
-|✔️|collect test coverage when using onlyChanged|1058ms|
-|✔️|onlyChanged in config is overwritten by --all or testPathPattern|7023ms|
-|❌|gets changed files for hg|3765ms|
-|✔️|path on Windows is case-insensitive|0ms|
+|✔️|collect test coverage when using onlyChanged|1.058s|
+|✔️|onlyChanged in config is overwritten by --all or testPathPattern|7.023s|
+|❌|gets changed files for hg|3.765s|
+|✔️|path on Windows is case-insensitive|0ms|
\ No newline at end of file
diff --git a/src/report/get-report.ts b/src/report/get-report.ts
index 10cdb45..f6fc536 100644
--- a/src/report/get-report.ts
+++ b/src/report/get-report.ts
@@ -1,6 +1,6 @@
import * as core from '@actions/core'
import {TestExecutionResult, TestRunResult, TestSuiteResult} from './test-results'
-import {Align, Icon, link, table} from '../utils/markdown-utils'
+import {Align, formatTime, Icon, link, table} from '../utils/markdown-utils'
import {slug} from '../utils/slugger'
export interface ReportOptions {
@@ -9,35 +9,20 @@ export interface ReportOptions {
}
export function getReport(results: TestRunResult[], options: ReportOptions = {}): string {
+ core.info('Generating check run summary')
+
const maxReportLength = 65535
const sections: string[] = []
applySort(results)
- const badge = getBadge(results)
+ const badge = getReportBadge(results)
sections.push(badge)
- const runsSummary = results.map((tr, i) => getRunSummary(tr, i, options)).join('\n\n')
- sections.push(runsSummary)
-
- if (options.listTests !== 'none') {
- const suitesSummary = results
- .map((tr, runIndex) => {
- const suites = options.listSuites === 'failed' ? tr.failedSuites : tr.suites
- return suites
- .map((ts, suiteIndex) => getSuiteSummary(ts, runIndex, suiteIndex, options))
- .filter(str => str !== '')
- })
- .flat()
- .join('\n')
-
- if (suitesSummary !== '') {
- const suitesSection = `# Test Suites\n\n${suitesSummary}`
- sections.push(suitesSection)
- }
- }
+ const runs = getTestRunsReport(results, options)
+ sections.push(...runs)
- const report = sections.join('\n\n')
+ const report = sections.join('\n')
if (report.length > maxReportLength) {
let msg = `**Check Run summary limit of ${maxReportLength} chars was exceed**`
if (options.listTests !== 'all') {
@@ -47,7 +32,7 @@ export function getReport(results: TestRunResult[], options: ReportOptions = {})
msg += '\n- Consider setting `list-suites` option to `only-failed`'
}
- return `${badge}\n\n${msg}`
+ return `${badge}\n${msg}`
}
return report
@@ -60,96 +45,153 @@ function applySort(results: TestRunResult[]): void {
}
}
-function getBadge(results: TestRunResult[]): string {
+function getReportBadge(results: TestRunResult[]): string {
const passed = results.reduce((sum, tr) => sum + tr.passed, 0)
const skipped = results.reduce((sum, tr) => sum + tr.skipped, 0)
const failed = results.reduce((sum, tr) => sum + tr.failed, 0)
+ return getBadge(passed, failed, skipped)
+}
+
+function getBadge(passed: number, failed: number, skipped: number): string {
+ const text = []
+ if (passed > 0) { text.push(`${passed} passed`) }
+ if (failed > 0) { text.push(`${failed} failed`) }
+ if (skipped > 0) { text.push(`${skipped} skipped`) }
+ let message = text.length > 0 ? text.join(', ') : 'none'
- const passedText = passed > 0 ? `${passed} passed` : null
- const failedText = failed > 0 ? `${failed} failed` : null
- const skippedText = skipped > 0 ? `${skipped} skipped` : null
- const message = [passedText, skippedText, failedText].filter(s => s != null).join(', ') || 'none'
let color = 'success'
if (failed > 0) {
color = 'critical'
} else if (passed === 0 && failed === 0) {
color = 'yellow'
}
-
+ const hint = failed > 0 ? 'Tests failed' : 'Tests passed successfully'
const uri = encodeURIComponent(`tests-${message}-${color}`)
- const text = failed > 0 ? 'Tests failed' : 'Tests passed successfully'
- return ``
+ return ``
}
-function getRunSummary(tr: TestRunResult, runIndex: number, options: ReportOptions): string {
- core.info('Generating check run summary')
+function getTestRunsReport(testRuns: TestRunResult[], options: ReportOptions): string[] {
+ const sections: string[] = []
+
+ if (testRuns.length > 1) {
+ const tableData = testRuns.map((tr, runIndex) => {
+ const time = formatTime(tr.time)
+ const name = tr.path
+ const addr = makeRunSlug(runIndex).link
+ const nameLink = link(name, addr)
+ const passed = tr.passed > 0 ? `${tr.passed}${Icon.success}` : ''
+ const failed = tr.failed > 0 ? `${tr.failed}${Icon.fail}` : ''
+ const skipped = tr.skipped > 0 ? `${tr.skipped}${Icon.skip}` : ''
+ return [nameLink, passed, failed, skipped, time]
+ })
+
+ const resultsTable = table(
+ ['Report', 'Passed', 'Failed', 'Skipped', 'Time'],
+ [Align.Left, Align.Right, Align.Right, Align.Right, Align.Right],
+ ...tableData
+ )
+ sections.push(resultsTable)
+ }
+
+ const suitesReports = testRuns.map((tr, i) => getSuitesReport(tr, i, options)).flat()
+ sections.push(...suitesReports)
+ return sections
+}
+
+function getSuitesReport(tr: TestRunResult, runIndex: number, options: ReportOptions): string[] {
+ const sections: string[] = []
+
const time = `${(tr.time / 1000).toFixed(3)}s`
- const headingLine1 = `### ${tr.path}`
+
+ const slug = makeRunSlug(runIndex)
+ const nameLink = `${tr.path}`
+ const icon = getResultIcon(tr.result)
+ sections.push(`## ${nameLink} ${icon}`)
+
const headingLine2 = `**${tr.tests}** tests were completed in **${time}** with **${tr.passed}** passed, **${tr.failed}** failed and **${tr.skipped}** skipped.`
+ sections.push(headingLine2)
const suites = options.listSuites === 'failed' ? tr.failedSuites : tr.suites
- const suitesSummary = suites.map((s, suiteIndex) => {
- const tsTime = `${Math.round(s.time)}ms`
- const tsName = s.name
- const skipLink = options.listTests === 'none' || (options.listTests === 'failed' && s.result !== 'failed')
- const tsAddr = makeSuiteSlug(runIndex, suiteIndex, tsName).link
- const tsNameLink = skipLink ? tsName : link(tsName, tsAddr)
- const passed = s.passed > 0 ? `${s.passed}${Icon.success}` : ''
- const failed = s.failed > 0 ? `${s.failed}${Icon.fail}` : ''
- const skipped = s.skipped > 0 ? `${s.skipped}${Icon.skip}` : ''
- return [tsNameLink, passed, failed, skipped, tsTime]
- })
-
- const summary =
- suites.length === 0
- ? ''
- : table(
- ['Suite', 'Passed', 'Failed', 'Skipped', 'Time'],
- [Align.Left, Align.Right, Align.Right, Align.Right, Align.Right],
- ...suitesSummary
- )
-
- return [headingLine1, headingLine2, summary].join('\n\n')
+ if (suites.length > 0) {
+ const suitesTable = table(
+ ['Test suite', 'Passed', 'Failed', 'Skipped', 'Time'],
+ [Align.Left, Align.Right, Align.Right, Align.Right, Align.Right],
+ ...suites.map((s, suiteIndex) => {
+ const tsTime = formatTime(s.time)
+ const tsName = s.name
+ const skipLink = options.listTests === 'none' || (options.listTests === 'failed' && s.result !== 'failed')
+ const tsAddr = makeSuiteSlug(runIndex, suiteIndex).link
+ const tsNameLink = skipLink ? tsName : link(tsName, tsAddr)
+ const passed = s.passed > 0 ? `${s.passed}${Icon.success}` : ''
+ const failed = s.failed > 0 ? `${s.failed}${Icon.fail}` : ''
+ const skipped = s.skipped > 0 ? `${s.skipped}${Icon.skip}` : ''
+ return [tsNameLink, passed, failed, skipped, tsTime]
+ })
+ )
+ sections.push(suitesTable)
+ }
+
+ if (options.listTests !== 'none') {
+ const tests = suites
+ .map((ts, suiteIndex) => getTestsReport(ts, runIndex, suiteIndex, options))
+ .flat()
+
+ if (tests.length > 1) {
+ sections.push(...tests)
+ }
+ }
+
+ return sections
}
-function getSuiteSummary(ts: TestSuiteResult, runIndex: number, suiteIndex: number, options: ReportOptions): string {
+function getTestsReport(ts: TestSuiteResult, runIndex: number, suiteIndex: number, options: ReportOptions): string[] {
const groups = options.listTests === 'failed' ? ts.failedGroups : ts.groups
if (groups.length === 0) {
- return ''
+ return []
}
- const icon = getResultIcon(ts.result)
- const content = groups
- .map(grp => {
- const tests = options.listTests === 'failed' ? grp.failedTests : grp.tests
- if (tests.length === 0) {
- return ''
- }
- const header = grp.name ? `### ${grp.name}\n\n` : ''
- const testsTable = table(
- ['Result', 'Test', 'Time'],
- [Align.Center, Align.Left, Align.Right],
- ...grp.tests.map(tc => {
- const name = tc.name
- const time = `${Math.round(tc.time)}ms`
- const result = getResultIcon(tc.result)
- return [result, name, time]
- })
- )
-
- return `${header}${testsTable}\n`
- })
- .join('\n')
+ const sections: string[] = []
const tsName = ts.name
- const tsSlug = makeSuiteSlug(runIndex, suiteIndex, tsName)
+ const tsSlug = makeSuiteSlug(runIndex, suiteIndex)
const tsNameLink = `${tsName}`
- return `## ${tsNameLink} ${icon}\n\n${content}`
+ const icon = getResultIcon(ts.result)
+ sections.push(`### ${tsNameLink} ${icon}`)
+
+ const headingLine2 = `**${ts.tests}** tests were completed in **${ts.time}ms** with **${ts.passed}** passed, **${ts.failed}** failed and **${ts.skipped}** skipped.`
+ sections.push(headingLine2)
+
+ for (const grp of groups) {
+ const tests = options.listTests === 'failed' ? grp.failedTests : grp.tests
+ if (tests.length === 0) {
+ continue
+ }
+ const grpHeader = grp.name ? `\n**${grp.name}**` : ''
+ const testsTable = table(
+ ['Result', 'Test', 'Time'],
+ [Align.Center, Align.Left, Align.Right],
+ ...grp.tests.map(tc => {
+ const name = tc.name
+ const time = formatTime(tc.time)
+ const result = getResultIcon(tc.result)
+ return [result, name, time]
+ })
+ )
+
+ sections.push(grpHeader, testsTable)
+ }
+
+ return sections
+}
+
+function makeRunSlug(runIndex: number): {id: string; link: string} {
+ // use prefix to avoid slug conflicts after escaping the paths
+ return slug(`r${runIndex}`)
}
-function makeSuiteSlug(runIndex: number, suiteIndex: number, name: string): {id: string; link: string} {
+function makeSuiteSlug(runIndex: number, suiteIndex: number): {id: string; link: string} {
// use prefix to avoid slug conflicts after escaping the paths
- return slug(`r${runIndex}s${suiteIndex}-${name}`)
+ return slug(`r${runIndex}s${suiteIndex}`)
}
function getResultIcon(result: TestExecutionResult): string {
diff --git a/src/utils/markdown-utils.ts b/src/utils/markdown-utils.ts
index 1a73770..ab7a697 100644
--- a/src/utils/markdown-utils.ts
+++ b/src/utils/markdown-utils.ts
@@ -38,3 +38,11 @@ export function ellipsis(text: string, maxLength: number): string {
return text.substr(0, maxLength - 3) + '...'
}
+
+export function formatTime(ms: number) {
+ if (ms > 1000) {
+ return `${(ms / 1000).toFixed(3)}s`
+ }
+
+ return `${Math.round(ms)}ms`
+}