Merge branch 'dev' into mocha-json

This commit is contained in:
Michal Dorner 2021-04-01 00:05:41 +02:00
commit ee126813a2
No known key found for this signature in database
GPG key ID: 9EEE04B48DA36786
24 changed files with 3653 additions and 1304 deletions

View file

@ -1,5 +1,10 @@
# Changelog # Changelog
## v1.3.1
- [Fix: parsing of .NET duration string without milliseconds](https://github.com/dorny/test-reporter/pull/84)
- [Fix: dart-json - remove group name from test case names](https://github.com/dorny/test-reporter/pull/85)
- [Fix: net-trx parser crashing on missing duration attribute](https://github.com/dorny/test-reporter/pull/86)
## v1.3.0 ## v1.3.0
- [Add support for java-junit](https://github.com/dorny/test-reporter/pull/80) - [Add support for java-junit](https://github.com/dorny/test-reporter/pull/80)
- [Fix: Handle test reports with no test cases](https://github.com/dorny/test-reporter/pull/70) - [Fix: Handle test reports with no test cases](https://github.com/dorny/test-reporter/pull/70)

View file

@ -304,4 +304,4 @@ Unfortunately there are some known issues and limitations caused by GitHub API:
## License ## License
The scripts and documentation in this project are released under the [MIT License](https://github.com/dorny/test-reporter/blob/master/LICENSE) The scripts and documentation in this project are released under the [MIT License](https://github.com/dorny/test-reporter/blob/main/LICENSE)

View file

@ -1,32 +1,28 @@
![Tests failed](https://img.shields.io/badge/tests-1%20passed%2C%204%20failed%2C%201%20skipped-critical) ![Tests failed](https://img.shields.io/badge/tests-1%20passed%2C%204%20failed%2C%201%20skipped-critical)
## <a id="user-content-r0" href="#r0">fixtures/dart-json.json</a> ## ❌ <a id="user-content-r0" href="#r0">fixtures/dart-json.json</a>
**6** tests were completed in **3.760s** with **1** passed, **4** failed and **1** skipped. **6** tests were completed in **4s** with **1** passed, **4** failed and **1** skipped.
|Test suite|Passed|Failed|Skipped|Time| |Test suite|Passed|Failed|Skipped|Time|
|:---|---:|---:|---:|---:| |:---|---:|---:|---:|---:|
|[test/main_test.dart](#r0s0)|1✔|3❌||74ms| |[test/main_test.dart](#r0s0)|1✔|3❌||74ms|
|[test/second_test.dart](#r0s1)||1❌|1✖|51ms| |[test/second_test.dart](#r0s1)||1❌|1✖|51ms|
### <a id="user-content-r0s0" href="#r0s0">test/main_test.dart</a> ### ❌ <a id="user-content-r0s0" href="#r0s0">test/main_test.dart</a>
**4** tests were completed in **74ms** with **1** passed, **3** failed and **0** skipped. ```
Test 1
**Test 1** ✔️ Passing test
|Result|Test|Time| Test 1 Test 1.1
|:---:|:---|---:| ❌ Failing test
|✔️|Test 1 Passing test|36ms| Expected: <2>
Actual: <1>
**Test 1 Test 1.1**
|Result|Test|Time| ❌ Exception in target unit
|:---:|:---|---:| Exception: Some error
|❌|Test 1 Test 1.1 Failing test|20ms| Test 2
|❌|Test 1 Test 1.1 Exception in target unit|6ms| ❌ Exception in test
Exception: Some error
**Test 2** ```
|Result|Test|Time| ### ❌ <a id="user-content-r0s1" href="#r0s1">test/second_test.dart</a>
|:---:|:---|---:| ```
|❌|Test 2 Exception in test|12ms| ❌ Timeout test
### <a id="user-content-r0s1" href="#r0s1">test/second_test.dart</a> TimeoutException after 0:00:00.000001: Test timed out after 0 seconds.
**2** tests were completed in **51ms** with **0** passed, **1** failed and **1** skipped. ✖️ Skipped test
```
|Result|Test|Time|
|:---:|:---|---:|
|❌|Timeout test|37ms|
|✖️|Skipped test|14ms|

View file

@ -1,18 +1,21 @@
![Tests failed](https://img.shields.io/badge/tests-3%20passed%2C%203%20failed%2C%201%20skipped-critical) ![Tests failed](https://img.shields.io/badge/tests-3%20passed%2C%203%20failed%2C%201%20skipped-critical)
## <a id="user-content-r0" href="#r0">fixtures/dotnet-trx.trx</a> ## ❌ <a id="user-content-r0" href="#r0">fixtures/dotnet-trx.trx</a>
**7** tests were completed in **1.061s** with **3** passed, **3** failed and **1** skipped. **7** tests were completed in **1s** with **3** passed, **3** failed and **1** skipped.
|Test suite|Passed|Failed|Skipped|Time| |Test suite|Passed|Failed|Skipped|Time|
|:---|---:|---:|---:|---:| |:---|---:|---:|---:|---:|
|[DotnetTests.XUnitTests.CalculatorTests](#r0s0)|3✔|3❌|1✖|110ms| |[DotnetTests.XUnitTests.CalculatorTests](#r0s0)|3✔|3❌|1✖|110ms|
### <a id="user-content-r0s0" href="#r0s0">DotnetTests.XUnitTests.CalculatorTests</a> ### ❌ <a id="user-content-r0s0" href="#r0s0">DotnetTests.XUnitTests.CalculatorTests</a>
**7** tests were completed in **110ms** with **3** passed, **3** failed and **1** skipped. ```
❌ Exception_In_TargetTest
|Result|Test|Time| System.DivideByZeroException : Attempted to divide by zero.
|:---:|:---|---:| ❌ Exception_In_Test
|❌|Exception_In_TargetTest|0ms| System.Exception : Test
|❌|Exception_In_Test|2ms| ❌ Failing_Test
|❌|Failing_Test|3ms| Assert.Equal() Failure
|✔️|Passing_Test|0ms| Expected: 3
|✔️|Passing_Test_With_Name|0ms| Actual: 2
|✖️|Skipped_Test|1ms| ✔️ Passing_Test
|✔️|Timeout_Test|102ms| ✔️ Passing_Test_With_Name
✖️ Skipped_Test
✔️ Timeout_Test
```

File diff suppressed because it is too large Load diff

View file

@ -1,32 +1,26 @@
![Tests failed](https://img.shields.io/badge/tests-1%20passed%2C%204%20failed%2C%201%20skipped-critical) ![Tests failed](https://img.shields.io/badge/tests-1%20passed%2C%204%20failed%2C%201%20skipped-critical)
## <a id="user-content-r0" href="#r0">fixtures/jest-junit.xml</a> ## ❌ <a id="user-content-r0" href="#r0">fixtures/jest-junit.xml</a>
**6** tests were completed in **1.360s** with **1** passed, **4** failed and **1** skipped. **6** tests were completed in **1s** with **1** passed, **4** failed and **1** skipped.
|Test suite|Passed|Failed|Skipped|Time| |Test suite|Passed|Failed|Skipped|Time|
|:---|---:|---:|---:|---:| |:---|---:|---:|---:|---:|
|[__tests__\main.test.js](#r0s0)|1✔|3❌||486ms| |[__tests__\main.test.js](#r0s0)|1✔|3❌||486ms|
|[__tests__\second.test.js](#r0s1)||1❌|1✖|82ms| |[__tests__\second.test.js](#r0s1)||1❌|1✖|82ms|
### <a id="user-content-r0s0" href="#r0s0">__tests__\main.test.js</a> ### ❌ <a id="user-content-r0s0" href="#r0s0">__tests__\main.test.js</a>
**4** tests were completed in **486ms** with **1** passed, **3** failed and **0** skipped. ```
Test 1
**Test 1** ✔️ Passing test
|Result|Test|Time| Test 1 Test 1.1
|:---:|:---|---:| ❌ Failing test
|✔️|Passing test|1ms| Error: expect(received).toBeTruthy()
❌ Exception in target unit
**Test 1 Test 1.1** Error: Some error
|Result|Test|Time| Test 2
|:---:|:---|---:| ❌ Exception in test
|❌|Failing test|2ms| Error: Some error
|❌|Exception in target unit|0ms| ```
### ❌ <a id="user-content-r0s1" href="#r0s1">__tests__\second.test.js</a>
**Test 2** ```
|Result|Test|Time| ❌ Timeout test
|:---:|:---|---:| : Timeout - Async callback was not invoked within the 1 ms timeout specified by jest.setTimeout.Timeout - Async callback was not invoked within the 1 ms timeout specified by jest.setTimeout.Error:
|❌|Exception in test|0ms| ✖️ Skipped test
### <a id="user-content-r0s1" href="#r0s1">__tests__\second.test.js</a> ```
**2** tests were completed in **82ms** with **0** passed, **1** failed and **1** skipped.
|Result|Test|Time|
|:---:|:---|---:|
|❌|Timeout test|4ms|
|✖️|Skipped test|0ms|

View file

@ -1,182 +1,182 @@
![Tests failed](https://img.shields.io/badge/tests-4207%20passed%2C%202%20failed%2C%2030%20skipped-critical) ![Tests failed](https://img.shields.io/badge/tests-4207%20passed%2C%202%20failed%2C%2030%20skipped-critical)
## <a id="user-content-r0" href="#r0">fixtures/external/jest/jest-test-results.xml</a> ## ❌ <a id="user-content-r0" href="#r0">fixtures/external/jest/jest-test-results.xml</a>
**4239** tests were completed in **165.872s** with **4207** passed, **2** failed and **30** skipped. **4239** tests were completed in **166s** with **4207** passed, **2** failed and **30** skipped.
|Test suite|Passed|Failed|Skipped|Time| |Test suite|Passed|Failed|Skipped|Time|
|:---|---:|---:|---:|---:| |:---|---:|---:|---:|---:|
|e2e/__tests__/asyncAndCallback.test.ts|1✔|||746ms| |e2e/__tests__/asyncAndCallback.test.ts|1✔|||746ms|
|e2e/__tests__/asyncRegenerator.test.ts|1✔|||4.127s| |e2e/__tests__/asyncRegenerator.test.ts|1✔|||4s|
|e2e/__tests__/autoClearMocks.test.ts|2✔|||1.681s| |e2e/__tests__/autoClearMocks.test.ts|2✔|||2s|
|e2e/__tests__/autoResetMocks.test.ts|2✔|||1.666s| |e2e/__tests__/autoResetMocks.test.ts|2✔|||2s|
|e2e/__tests__/autoRestoreMocks.test.ts|2✔|||1.797s| |e2e/__tests__/autoRestoreMocks.test.ts|2✔|||2s|
|e2e/__tests__/babelPluginJestHoist.test.ts|1✔|||6.249s| |e2e/__tests__/babelPluginJestHoist.test.ts|1✔|||6s|
|e2e/__tests__/badSourceMap.test.ts|1✔|||858ms| |e2e/__tests__/badSourceMap.test.ts|1✔|||858ms|
|e2e/__tests__/beforeAllFiltered.ts|1✔|||958ms| |e2e/__tests__/beforeAllFiltered.ts|1✔|||958ms|
|e2e/__tests__/beforeEachQueue.ts|1✔||1✖|55ms| |e2e/__tests__/beforeEachQueue.ts|1✔||1✖|55ms|
|e2e/__tests__/callDoneTwice.test.ts|1✔|||882ms| |e2e/__tests__/callDoneTwice.test.ts|1✔|||882ms|
|e2e/__tests__/chaiAssertionLibrary.ts|1✔|||1.902s| |e2e/__tests__/chaiAssertionLibrary.ts|1✔|||2s|
|e2e/__tests__/circularInequality.test.ts|1✔|||1.451s| |e2e/__tests__/circularInequality.test.ts|1✔|||1s|
|e2e/__tests__/circusConcurrentEach.test.ts|2✔|||1.591s| |e2e/__tests__/circusConcurrentEach.test.ts|2✔|||2s|
|e2e/__tests__/circusDeclarationErrors.test.ts|1✔|||869ms| |e2e/__tests__/circusDeclarationErrors.test.ts|1✔|||869ms|
|e2e/__tests__/clearCache.test.ts|2✔|||1.004s| |e2e/__tests__/clearCache.test.ts|2✔|||1s|
|e2e/__tests__/cliHandlesExactFilenames.test.ts|2✔|||1.230s| |e2e/__tests__/cliHandlesExactFilenames.test.ts|2✔|||1s|
|e2e/__tests__/compareDomNodes.test.ts|1✔|||1.407s| |e2e/__tests__/compareDomNodes.test.ts|1✔|||1s|
|e2e/__tests__/config.test.ts|6✔|||3.945s| |e2e/__tests__/config.test.ts|6✔|||4s|
|e2e/__tests__/console.test.ts|7✔|||8.072s| |e2e/__tests__/console.test.ts|7✔|||8s|
|e2e/__tests__/consoleAfterTeardown.test.ts|1✔|||1.341s| |e2e/__tests__/consoleAfterTeardown.test.ts|1✔|||1s|
|e2e/__tests__/consoleLogOutputWhenRunInBand.test.ts|1✔|||793ms| |e2e/__tests__/consoleLogOutputWhenRunInBand.test.ts|1✔|||793ms|
|e2e/__tests__/coverageHandlebars.test.ts|1✔|||1.873s| |e2e/__tests__/coverageHandlebars.test.ts|1✔|||2s|
|e2e/__tests__/coverageRemapping.test.ts|1✔|||12.701s| |e2e/__tests__/coverageRemapping.test.ts|1✔|||13s|
|e2e/__tests__/coverageReport.test.ts|12✔|||22.264s| |e2e/__tests__/coverageReport.test.ts|12✔|||22s|
|e2e/__tests__/coverageThreshold.test.ts|5✔|||4.868s| |e2e/__tests__/coverageThreshold.test.ts|5✔|||5s|
|e2e/__tests__/coverageTransformInstrumented.test.ts|1✔|||5.029s| |e2e/__tests__/coverageTransformInstrumented.test.ts|1✔|||5s|
|e2e/__tests__/coverageWithoutTransform.test.ts|1✔|||1.075s| |e2e/__tests__/coverageWithoutTransform.test.ts|1✔|||1s|
|e2e/__tests__/createProcessObject.test.ts|1✔|||908ms| |e2e/__tests__/createProcessObject.test.ts|1✔|||908ms|
|e2e/__tests__/customInlineSnapshotMatchers.test.ts|1✔|||2.206s| |e2e/__tests__/customInlineSnapshotMatchers.test.ts|1✔|||2s|
|e2e/__tests__/customMatcherStackTrace.test.ts|2✔|||1.539s| |e2e/__tests__/customMatcherStackTrace.test.ts|2✔|||2s|
|e2e/__tests__/customReporters.test.ts|9✔|||6.553s| |e2e/__tests__/customReporters.test.ts|9✔|||7s|
|e2e/__tests__/customResolver.test.ts|1✔|||826ms| |e2e/__tests__/customResolver.test.ts|1✔|||826ms|
|e2e/__tests__/customTestSequencers.test.ts|3✔|||2.757s| |e2e/__tests__/customTestSequencers.test.ts|3✔|||3s|
|e2e/__tests__/debug.test.ts|1✔|||899ms| |e2e/__tests__/debug.test.ts|1✔|||899ms|
|e2e/__tests__/declarationErrors.test.ts|3✔|||2.389s| |e2e/__tests__/declarationErrors.test.ts|3✔|||2s|
|e2e/__tests__/dependencyClash.test.ts|1✔|||833ms| |e2e/__tests__/dependencyClash.test.ts|1✔|||833ms|
|e2e/__tests__/detectOpenHandles.ts|8✔|||7.528s| |e2e/__tests__/detectOpenHandles.ts|8✔|||8s|
|e2e/__tests__/domDiffing.test.ts|1✔|||1.361s| |e2e/__tests__/domDiffing.test.ts|1✔|||1s|
|e2e/__tests__/doneInHooks.test.ts|1✔|||855ms| |e2e/__tests__/doneInHooks.test.ts|1✔|||855ms|
|e2e/__tests__/dynamicRequireDependencies.ts|1✔|||847ms| |e2e/__tests__/dynamicRequireDependencies.ts|1✔|||847ms|
|e2e/__tests__/each.test.ts|7✔|||4.721s| |e2e/__tests__/each.test.ts|7✔|||5s|
|e2e/__tests__/emptyDescribeWithHooks.test.ts|4✔|||2.886s| |e2e/__tests__/emptyDescribeWithHooks.test.ts|4✔|||3s|
|e2e/__tests__/emptySuiteError.test.ts|1✔|||885ms| |e2e/__tests__/emptySuiteError.test.ts|1✔|||885ms|
|e2e/__tests__/env.test.ts|6✔|||5.221s| |e2e/__tests__/env.test.ts|6✔|||5s|
|e2e/__tests__/environmentAfterTeardown.test.ts|1✔|||892ms| |e2e/__tests__/environmentAfterTeardown.test.ts|1✔|||892ms|
|e2e/__tests__/errorOnDeprecated.test.ts|1✔||24✖|56ms| |e2e/__tests__/errorOnDeprecated.test.ts|1✔||24✖|56ms|
|e2e/__tests__/esmConfigFile.test.ts|3✔|||526ms| |e2e/__tests__/esmConfigFile.test.ts|3✔|||526ms|
|e2e/__tests__/executeTestsOnceInMpr.ts|1✔|||976ms| |e2e/__tests__/executeTestsOnceInMpr.ts|1✔|||976ms|
|e2e/__tests__/existentRoots.test.ts|4✔|||627ms| |e2e/__tests__/existentRoots.test.ts|4✔|||627ms|
|e2e/__tests__/expectAsyncMatcher.test.ts|2✔|||2.732s| |e2e/__tests__/expectAsyncMatcher.test.ts|2✔|||3s|
|e2e/__tests__/expectInVm.test.ts|1✔|||1.527s| |e2e/__tests__/expectInVm.test.ts|1✔|||2s|
|e2e/__tests__/extraGlobals.test.ts|1✔|||1.011s| |e2e/__tests__/extraGlobals.test.ts|1✔|||1s|
|e2e/__tests__/failureDetailsProperty.test.ts|1✔|||907ms| |e2e/__tests__/failureDetailsProperty.test.ts|1✔|||907ms|
|e2e/__tests__/failures.test.ts|7✔|||10.353s| |e2e/__tests__/failures.test.ts|7✔|||10s|
|e2e/__tests__/fakePromises.test.ts|2✔|||1.716s| |e2e/__tests__/fakePromises.test.ts|2✔|||2s|
|e2e/__tests__/fatalWorkerError.test.ts|1✔|||3.167s| |e2e/__tests__/fatalWorkerError.test.ts|1✔|||3s|
|e2e/__tests__/filter.test.ts|7✔|||5.422s| |e2e/__tests__/filter.test.ts|7✔|||5s|
|e2e/__tests__/findRelatedFiles.test.ts|5✔|||6.230s| |e2e/__tests__/findRelatedFiles.test.ts|5✔|||6s|
|e2e/__tests__/focusedTests.test.ts|1✔|||888ms| |e2e/__tests__/focusedTests.test.ts|1✔|||888ms|
|e2e/__tests__/forceExit.test.ts|1✔|||2.208s| |e2e/__tests__/forceExit.test.ts|1✔|||2s|
|e2e/__tests__/generatorMock.test.ts|1✔|||1.027s| |e2e/__tests__/generatorMock.test.ts|1✔|||1s|
|e2e/__tests__/global-mutation.test.ts|1✔|||40ms| |e2e/__tests__/global-mutation.test.ts|1✔|||40ms|
|e2e/__tests__/global.test.ts|1✔|||31ms| |e2e/__tests__/global.test.ts|1✔|||31ms|
|e2e/__tests__/globals.test.ts|10✔|||7.505s| |e2e/__tests__/globals.test.ts|10✔|||8s|
|e2e/__tests__/globalSetup.test.ts|10✔|||13.926s| |e2e/__tests__/globalSetup.test.ts|10✔|||14s|
|e2e/__tests__/globalTeardown.test.ts|7✔|||11.886s| |e2e/__tests__/globalTeardown.test.ts|7✔|||12s|
|e2e/__tests__/hasteMapMockChanged.test.ts|1✔|||379ms| |e2e/__tests__/hasteMapMockChanged.test.ts|1✔|||379ms|
|e2e/__tests__/hasteMapSha1.test.ts|1✔|||298ms| |e2e/__tests__/hasteMapSha1.test.ts|1✔|||298ms|
|e2e/__tests__/hasteMapSize.test.ts|2✔|||397ms| |e2e/__tests__/hasteMapSize.test.ts|2✔|||397ms|
|e2e/__tests__/importedGlobals.test.ts|1✔|||1.043s| |e2e/__tests__/importedGlobals.test.ts|1✔|||1s|
|e2e/__tests__/injectGlobals.test.ts|2✔|||1.860s| |e2e/__tests__/injectGlobals.test.ts|2✔|||2s|
|e2e/__tests__/jasmineAsync.test.ts|15✔|||28.291s| |e2e/__tests__/jasmineAsync.test.ts|15✔|||28s|
|e2e/__tests__/jasmineAsyncWithPendingDuringTest.ts|1✔||1✖|72ms| |e2e/__tests__/jasmineAsyncWithPendingDuringTest.ts|1✔||1✖|72ms|
|e2e/__tests__/jest.config.js.test.ts|3✔|||2.134s| |e2e/__tests__/jest.config.js.test.ts|3✔|||2s|
|e2e/__tests__/jest.config.ts.test.ts|5✔|||14.322s| |e2e/__tests__/jest.config.ts.test.ts|5✔|||14s|
|[e2e/__tests__/jestChangedFiles.test.ts](#r0s75)|9✔|1❌||9.045s| |[e2e/__tests__/jestChangedFiles.test.ts](#r0s75)|9✔|1❌||9s|
|e2e/__tests__/jestEnvironmentJsdom.test.ts|1✔|||1.744s| |e2e/__tests__/jestEnvironmentJsdom.test.ts|1✔|||2s|
|e2e/__tests__/jestRequireActual.test.ts|1✔|||1.665s| |e2e/__tests__/jestRequireActual.test.ts|1✔|||2s|
|e2e/__tests__/jestRequireMock.test.ts|1✔|||2.119s| |e2e/__tests__/jestRequireMock.test.ts|1✔|||2s|
|e2e/__tests__/json.test.ts|2✔|||29ms| |e2e/__tests__/json.test.ts|2✔|||29ms|
|e2e/__tests__/jsonReporter.test.ts|2✔|||1.514s| |e2e/__tests__/jsonReporter.test.ts|2✔|||2s|
|e2e/__tests__/lifecycles.ts|1✔|||861ms| |e2e/__tests__/lifecycles.ts|1✔|||861ms|
|e2e/__tests__/listTests.test.ts|2✔|||945ms| |e2e/__tests__/listTests.test.ts|2✔|||945ms|
|e2e/__tests__/locationInResults.test.ts|2✔|||1.764s| |e2e/__tests__/locationInResults.test.ts|2✔|||2s|
|e2e/__tests__/logHeapUsage.test.ts|1✔|||884ms| |e2e/__tests__/logHeapUsage.test.ts|1✔|||884ms|
|e2e/__tests__/mockNames.test.ts|8✔|||6.771s| |e2e/__tests__/mockNames.test.ts|8✔|||7s|
|e2e/__tests__/modernFakeTimers.test.ts|2✔|||1.680s| |e2e/__tests__/modernFakeTimers.test.ts|2✔|||2s|
|e2e/__tests__/moduleNameMapper.test.ts|5✔|||5.395s| |e2e/__tests__/moduleNameMapper.test.ts|5✔|||5s|
|e2e/__tests__/moduleParentNullInTest.ts|1✔|||886ms| |e2e/__tests__/moduleParentNullInTest.ts|1✔|||886ms|
|e2e/__tests__/multiProjectRunner.test.ts|14✔|||16.360s| |e2e/__tests__/multiProjectRunner.test.ts|14✔|||16s|
|e2e/__tests__/nativeAsyncMock.test.ts|1✔|||55ms| |e2e/__tests__/nativeAsyncMock.test.ts|1✔|||55ms|
|e2e/__tests__/nativeEsm.test.ts|2✔||1✖|905ms| |e2e/__tests__/nativeEsm.test.ts|2✔||1✖|905ms|
|e2e/__tests__/nativeEsmTypescript.test.ts|1✔|||956ms| |e2e/__tests__/nativeEsmTypescript.test.ts|1✔|||956ms|
|e2e/__tests__/nestedEventLoop.test.ts|1✔|||1.422s| |e2e/__tests__/nestedEventLoop.test.ts|1✔|||1s|
|e2e/__tests__/nestedTestDefinitions.test.ts|4✔|||4.641s| |e2e/__tests__/nestedTestDefinitions.test.ts|4✔|||5s|
|e2e/__tests__/nodePath.test.ts|1✔|||866ms| |e2e/__tests__/nodePath.test.ts|1✔|||866ms|
|e2e/__tests__/noTestFound.test.ts|2✔|||1.063s| |e2e/__tests__/noTestFound.test.ts|2✔|||1s|
|e2e/__tests__/noTestsFound.test.ts|5✔|||2.739s| |e2e/__tests__/noTestsFound.test.ts|5✔|||3s|
|[e2e/__tests__/onlyChanged.test.ts](#r0s98)|8✔|1❌||22.281s| |[e2e/__tests__/onlyChanged.test.ts](#r0s98)|8✔|1❌||22s|
|e2e/__tests__/onlyFailuresNonWatch.test.ts|1✔|||2.893s| |e2e/__tests__/onlyFailuresNonWatch.test.ts|1✔|||3s|
|e2e/__tests__/overrideGlobals.test.ts|2✔|||2.046s| |e2e/__tests__/overrideGlobals.test.ts|2✔|||2s|
|e2e/__tests__/pnp.test.ts|1✔|||2.715s| |e2e/__tests__/pnp.test.ts|1✔|||3s|
|e2e/__tests__/presets.test.ts|2✔|||1.966s| |e2e/__tests__/presets.test.ts|2✔|||2s|
|e2e/__tests__/processExit.test.ts|1✔|||1.070s| |e2e/__tests__/processExit.test.ts|1✔|||1s|
|e2e/__tests__/promiseReject.test.ts|1✔|||967ms| |e2e/__tests__/promiseReject.test.ts|1✔|||967ms|
|e2e/__tests__/regexCharInPath.test.ts|1✔|||962ms| |e2e/__tests__/regexCharInPath.test.ts|1✔|||962ms|
|e2e/__tests__/requireAfterTeardown.test.ts|1✔|||921ms| |e2e/__tests__/requireAfterTeardown.test.ts|1✔|||921ms|
|e2e/__tests__/requireMain.test.ts|1✔|||1.137s| |e2e/__tests__/requireMain.test.ts|1✔|||1s|
|e2e/__tests__/requireMainAfterCreateRequire.test.ts|1✔|||966ms| |e2e/__tests__/requireMainAfterCreateRequire.test.ts|1✔|||966ms|
|e2e/__tests__/requireMainIsolateModules.test.ts|1✔|||976ms| |e2e/__tests__/requireMainIsolateModules.test.ts|1✔|||976ms|
|e2e/__tests__/requireMainResetModules.test.ts|2✔|||1.961s| |e2e/__tests__/requireMainResetModules.test.ts|2✔|||2s|
|e2e/__tests__/requireV8Module.test.ts|1✔|||30ms| |e2e/__tests__/requireV8Module.test.ts|1✔|||30ms|
|e2e/__tests__/resetModules.test.ts|1✔|||926ms| |e2e/__tests__/resetModules.test.ts|1✔|||926ms|
|e2e/__tests__/resolve.test.ts|1✔|||1.863s| |e2e/__tests__/resolve.test.ts|1✔|||2s|
|e2e/__tests__/resolveGetPaths.test.ts|1✔|||1.155s| |e2e/__tests__/resolveGetPaths.test.ts|1✔|||1s|
|e2e/__tests__/resolveNodeModule.test.ts|1✔|||943ms| |e2e/__tests__/resolveNodeModule.test.ts|1✔|||943ms|
|e2e/__tests__/resolveNoFileExtensions.test.ts|2✔|||1.263s| |e2e/__tests__/resolveNoFileExtensions.test.ts|2✔|||1s|
|e2e/__tests__/resolveWithPaths.test.ts|1✔|||1.170s| |e2e/__tests__/resolveWithPaths.test.ts|1✔|||1s|
|e2e/__tests__/runProgrammatically.test.ts|2✔|||575ms| |e2e/__tests__/runProgrammatically.test.ts|2✔|||575ms|
|e2e/__tests__/runTestsByPath.test.ts|1✔|||1.999s| |e2e/__tests__/runTestsByPath.test.ts|1✔|||2s|
|e2e/__tests__/runtimeInternalModuleRegistry.test.ts|1✔|||1.202s| |e2e/__tests__/runtimeInternalModuleRegistry.test.ts|1✔|||1s|
|e2e/__tests__/selectProjects.test.ts|18✔|||5.236s| |e2e/__tests__/selectProjects.test.ts|18✔|||5s|
|e2e/__tests__/setImmediate.test.ts|1✔|||904ms| |e2e/__tests__/setImmediate.test.ts|1✔|||904ms|
|e2e/__tests__/setupFilesAfterEnvConfig.test.ts|2✔|||1.967s| |e2e/__tests__/setupFilesAfterEnvConfig.test.ts|2✔|||2s|
|e2e/__tests__/showConfig.test.ts|1✔|||195ms| |e2e/__tests__/showConfig.test.ts|1✔|||195ms|
|e2e/__tests__/skipBeforeAfterAll.test.ts|1✔|||1.061s| |e2e/__tests__/skipBeforeAfterAll.test.ts|1✔|||1s|
|e2e/__tests__/snapshot-unknown.test.ts|1✔|||838ms| |e2e/__tests__/snapshot-unknown.test.ts|1✔|||838ms|
|e2e/__tests__/snapshot.test.ts|9✔|||13.899s| |e2e/__tests__/snapshot.test.ts|9✔|||14s|
|e2e/__tests__/snapshotMockFs.test.ts|1✔|||883ms| |e2e/__tests__/snapshotMockFs.test.ts|1✔|||883ms|
|e2e/__tests__/snapshotResolver.test.ts|1✔|||823ms| |e2e/__tests__/snapshotResolver.test.ts|1✔|||823ms|
|e2e/__tests__/snapshotSerializers.test.ts|2✔|||2.065s| |e2e/__tests__/snapshotSerializers.test.ts|2✔|||2s|
|e2e/__tests__/stackTrace.test.ts|7✔|||4.725s| |e2e/__tests__/stackTrace.test.ts|7✔|||5s|
|e2e/__tests__/stackTraceNoCaptureStackTrace.test.ts|1✔|||899ms| |e2e/__tests__/stackTraceNoCaptureStackTrace.test.ts|1✔|||899ms|
|e2e/__tests__/stackTraceSourceMaps.test.ts|1✔|||2.185s| |e2e/__tests__/stackTraceSourceMaps.test.ts|1✔|||2s|
|e2e/__tests__/stackTraceSourceMapsWithCoverage.test.ts|1✔|||2.444s| |e2e/__tests__/stackTraceSourceMapsWithCoverage.test.ts|1✔|||2s|
|e2e/__tests__/supportsDashedArgs.ts|2✔|||968ms| |e2e/__tests__/supportsDashedArgs.ts|2✔|||968ms|
|e2e/__tests__/symbol.test.ts|1✔|||49ms| |e2e/__tests__/symbol.test.ts|1✔|||49ms|
|e2e/__tests__/testEnvironment.test.ts|1✔|||1.628s| |e2e/__tests__/testEnvironment.test.ts|1✔|||2s|
|e2e/__tests__/testEnvironmentAsync.test.ts|1✔|||1.493s| |e2e/__tests__/testEnvironmentAsync.test.ts|1✔|||1s|
|e2e/__tests__/testEnvironmentCircus.test.ts|1✔|||1.501s| |e2e/__tests__/testEnvironmentCircus.test.ts|1✔|||2s|
|e2e/__tests__/testEnvironmentCircusAsync.test.ts|1✔|||1.507s| |e2e/__tests__/testEnvironmentCircusAsync.test.ts|1✔|||2s|
|e2e/__tests__/testFailureExitCode.test.ts|2✔|||4.476s| |e2e/__tests__/testFailureExitCode.test.ts|2✔|||4s|
|e2e/__tests__/testInRoot.test.ts|1✔|||1.009s| |e2e/__tests__/testInRoot.test.ts|1✔|||1s|
|e2e/__tests__/testNamePattern.test.ts|1✔|||859ms| |e2e/__tests__/testNamePattern.test.ts|1✔|||859ms|
|e2e/__tests__/testNamePatternSkipped.test.ts|1✔|||991ms| |e2e/__tests__/testNamePatternSkipped.test.ts|1✔|||991ms|
|e2e/__tests__/testPathPatternReporterMessage.test.ts|1✔|||3.076s| |e2e/__tests__/testPathPatternReporterMessage.test.ts|1✔|||3s|
|e2e/__tests__/testResultsProcessor.test.ts|1✔|||910ms| |e2e/__tests__/testResultsProcessor.test.ts|1✔|||910ms|
|e2e/__tests__/testRetries.test.ts|4✔|||3.277s| |e2e/__tests__/testRetries.test.ts|4✔|||3s|
|e2e/__tests__/testTodo.test.ts|5✔|||3.573s| |e2e/__tests__/testTodo.test.ts|5✔|||4s|
|e2e/__tests__/timeouts.test.ts|4✔|||4.029s| |e2e/__tests__/timeouts.test.ts|4✔|||4s|
|e2e/__tests__/timeoutsLegacy.test.ts|1✔||3✖|71ms| |e2e/__tests__/timeoutsLegacy.test.ts|1✔||3✖|71ms|
|e2e/__tests__/timerResetMocks.test.ts|2✔|||1.878s| |e2e/__tests__/timerResetMocks.test.ts|2✔|||2s|
|e2e/__tests__/timerUseRealTimers.test.ts|1✔|||1.018s| |e2e/__tests__/timerUseRealTimers.test.ts|1✔|||1s|
|e2e/__tests__/toMatchInlineSnapshot.test.ts|12✔|||23.917s| |e2e/__tests__/toMatchInlineSnapshot.test.ts|12✔|||24s|
|e2e/__tests__/toMatchInlineSnapshotWithRetries.test.ts|3✔|||4.670s| |e2e/__tests__/toMatchInlineSnapshotWithRetries.test.ts|3✔|||5s|
|e2e/__tests__/toMatchSnapshot.test.ts|9✔|||17.025s| |e2e/__tests__/toMatchSnapshot.test.ts|9✔|||17s|
|e2e/__tests__/toMatchSnapshotWithRetries.test.ts|2✔|||4.435s| |e2e/__tests__/toMatchSnapshotWithRetries.test.ts|2✔|||4s|
|e2e/__tests__/toMatchSnapshotWithStringSerializer.test.ts|3✔|||3.544s| |e2e/__tests__/toMatchSnapshotWithStringSerializer.test.ts|3✔|||4s|
|e2e/__tests__/toThrowErrorMatchingInlineSnapshot.test.ts|4✔|||3.562s| |e2e/__tests__/toThrowErrorMatchingInlineSnapshot.test.ts|4✔|||4s|
|e2e/__tests__/toThrowErrorMatchingSnapshot.test.ts|5✔|||3.524s| |e2e/__tests__/toThrowErrorMatchingSnapshot.test.ts|5✔|||4s|
|e2e/__tests__/transform.test.ts|16✔|||26.740s| |e2e/__tests__/transform.test.ts|16✔|||27s|
|e2e/__tests__/transformLinkedModules.test.ts|1✔|||783ms| |e2e/__tests__/transformLinkedModules.test.ts|1✔|||783ms|
|e2e/__tests__/typescriptCoverage.test.ts|1✔|||2.893s| |e2e/__tests__/typescriptCoverage.test.ts|1✔|||3s|
|e2e/__tests__/unexpectedToken.test.ts|3✔|||3.411s| |e2e/__tests__/unexpectedToken.test.ts|3✔|||3s|
|e2e/__tests__/useStderr.test.ts|1✔|||1.352s| |e2e/__tests__/useStderr.test.ts|1✔|||1s|
|e2e/__tests__/v8Coverage.test.ts|2✔|||2.412s| |e2e/__tests__/v8Coverage.test.ts|2✔|||2s|
|e2e/__tests__/verbose.test.ts|1✔|||683ms| |e2e/__tests__/verbose.test.ts|1✔|||683ms|
|e2e/__tests__/version.test.ts|1✔|||138ms| |e2e/__tests__/version.test.ts|1✔|||138ms|
|e2e/__tests__/watchModeNoAccess.test.ts|1✔|||4.370s| |e2e/__tests__/watchModeNoAccess.test.ts|1✔|||4s|
|e2e/__tests__/watchModeOnlyFailed.test.ts|1✔|||1.394s| |e2e/__tests__/watchModeOnlyFailed.test.ts|1✔|||1s|
|e2e/__tests__/watchModePatterns.test.ts|2✔|||3.503s| |e2e/__tests__/watchModePatterns.test.ts|2✔|||4s|
|e2e/__tests__/watchModeUpdateSnapshot.test.ts|1✔|||1.075s| |e2e/__tests__/watchModeUpdateSnapshot.test.ts|1✔|||1s|
|e2e/__tests__/workerForceExit.test.ts|2✔|||4.751s| |e2e/__tests__/workerForceExit.test.ts|2✔|||5s|
|e2e/__tests__/wrongEnv.test.ts|5✔|||3.877s| |e2e/__tests__/wrongEnv.test.ts|5✔|||4s|
|e2e/custom-test-sequencer/a.test.js|1✔|||29ms| |e2e/custom-test-sequencer/a.test.js|1✔|||29ms|
|e2e/custom-test-sequencer/b.test.js|1✔|||21ms| |e2e/custom-test-sequencer/b.test.js|1✔|||21ms|
|e2e/custom-test-sequencer/c.test.js|1✔|||42ms| |e2e/custom-test-sequencer/c.test.js|1✔|||42ms|
@ -206,7 +206,7 @@
|examples/module-mock/__tests__/mock_per_test.js|2✔|||116ms| |examples/module-mock/__tests__/mock_per_test.js|2✔|||116ms|
|examples/module-mock/__tests__/partial_mock.js|1✔|||215ms| |examples/module-mock/__tests__/partial_mock.js|1✔|||215ms|
|examples/mongodb/__test__/db.test.js|1✔|||236ms| |examples/mongodb/__test__/db.test.js|1✔|||236ms|
|examples/react-native/__tests__/intro.test.js|4✔|||8.559s| |examples/react-native/__tests__/intro.test.js|4✔|||9s|
|examples/react-testing-library/__tests__/CheckboxWithLabel-test.js|1✔|||469ms| |examples/react-testing-library/__tests__/CheckboxWithLabel-test.js|1✔|||469ms|
|examples/react/__tests__/CheckboxWithLabel-test.js|1✔|||256ms| |examples/react/__tests__/CheckboxWithLabel-test.js|1✔|||256ms|
|examples/snapshot/__tests__/clock.react.test.js|1✔|||62ms| |examples/snapshot/__tests__/clock.react.test.js|1✔|||62ms|
@ -228,7 +228,7 @@
|packages/expect/src/__tests__/isError.test.ts|4✔|||43ms| |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-toContain.property.test.ts|2✔|||236ms|
|packages/expect/src/__tests__/matchers-toContainEqual.property.test.ts|2✔|||287ms| |packages/expect/src/__tests__/matchers-toContainEqual.property.test.ts|2✔|||287ms|
|packages/expect/src/__tests__/matchers-toEqual.property.test.ts|2✔|||1.062s| |packages/expect/src/__tests__/matchers-toEqual.property.test.ts|2✔|||1s|
|packages/expect/src/__tests__/matchers-toStrictEqual.property.test.ts|3✔|||394ms| |packages/expect/src/__tests__/matchers-toStrictEqual.property.test.ts|3✔|||394ms|
|packages/expect/src/__tests__/matchers.test.js|592✔|||862ms| |packages/expect/src/__tests__/matchers.test.js|592✔|||862ms|
|packages/expect/src/__tests__/spyMatchers.test.ts|248✔|||395ms| |packages/expect/src/__tests__/spyMatchers.test.ts|248✔|||395ms|
@ -237,11 +237,11 @@
|packages/expect/src/__tests__/toEqual-dom.test.ts|12✔|||99ms| |packages/expect/src/__tests__/toEqual-dom.test.ts|12✔|||99ms|
|packages/expect/src/__tests__/toThrowMatchers.test.ts|98✔|||257ms| |packages/expect/src/__tests__/toThrowMatchers.test.ts|98✔|||257ms|
|packages/expect/src/__tests__/utils.test.ts|41✔|||147ms| |packages/expect/src/__tests__/utils.test.ts|41✔|||147ms|
|packages/jest-circus/src/__tests__/afterAll.test.ts|6✔|||5.755s| |packages/jest-circus/src/__tests__/afterAll.test.ts|6✔|||6s|
|packages/jest-circus/src/__tests__/baseTest.test.ts|2✔|||2.902s| |packages/jest-circus/src/__tests__/baseTest.test.ts|2✔|||3s|
|packages/jest-circus/src/__tests__/circusItTestError.test.ts|8✔|||300ms| |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__/circusItTodoTestError.test.ts|3✔|||81ms|
|packages/jest-circus/src/__tests__/hooks.test.ts|3✔|||3.762s| |packages/jest-circus/src/__tests__/hooks.test.ts|3✔|||4s|
|packages/jest-circus/src/__tests__/hooksError.test.ts|32✔|||127ms| |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/__tests__/cli/args.test.ts|17✔|||345ms|
|packages/jest-cli/src/init/__tests__/init.test.js|24✔|||119ms| |packages/jest-cli/src/init/__tests__/init.test.js|24✔|||119ms|
@ -261,12 +261,12 @@
|packages/jest-core/src/__tests__/getNoTestsFoundMessage.test.js|5✔|||61ms| |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__/globals.test.ts|1✔|||22ms|
|packages/jest-core/src/__tests__/runJest.test.js|2✔|||261ms| |packages/jest-core/src/__tests__/runJest.test.js|2✔|||261ms|
|packages/jest-core/src/__tests__/SearchSource.test.ts|27✔|||2.596s| |packages/jest-core/src/__tests__/SearchSource.test.ts|27✔|||3s|
|packages/jest-core/src/__tests__/SnapshotInteractiveMode.test.js|13✔|||89ms| |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__/TestScheduler.test.js|8✔|||520ms|
|packages/jest-core/src/__tests__/testSchedulerHelper.test.js|12✔|||48ms| |packages/jest-core/src/__tests__/testSchedulerHelper.test.js|12✔|||48ms|
|packages/jest-core/src/__tests__/watch.test.js|80✔|||6.755s| |packages/jest-core/src/__tests__/watch.test.js|80✔|||7s|
|packages/jest-core/src/__tests__/watchFileChanges.test.ts|1✔|||1.514s| |packages/jest-core/src/__tests__/watchFileChanges.test.ts|1✔|||2s|
|packages/jest-core/src/__tests__/watchFilenamePatternMode.test.js|2✔|||165ms| |packages/jest-core/src/__tests__/watchFilenamePatternMode.test.js|2✔|||165ms|
|packages/jest-core/src/__tests__/watchTestNamePatternMode.test.js|1✔|||246ms| |packages/jest-core/src/__tests__/watchTestNamePatternMode.test.js|1✔|||246ms|
|packages/jest-core/src/lib/__tests__/isValidPath.test.ts|3✔|||166ms| |packages/jest-core/src/lib/__tests__/isValidPath.test.ts|3✔|||166ms|
@ -289,7 +289,7 @@
|packages/jest-globals/src/__tests__/index.ts|1✔|||533ms| |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__/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__/includes_dotfiles.test.ts|1✔|||337ms|
|packages/jest-haste-map/src/__tests__/index.test.js|44✔|||1.145s| |packages/jest-haste-map/src/__tests__/index.test.js|44✔|||1s|
|packages/jest-haste-map/src/__tests__/worker.test.js|7✔|||100ms| |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__/node.test.js|10✔|||170ms|
|packages/jest-haste-map/src/crawlers/__tests__/watchman.test.js|8✔|||153ms| |packages/jest-haste-map/src/crawlers/__tests__/watchman.test.js|8✔|||153ms|
@ -318,12 +318,12 @@
|packages/jest-message-util/src/__tests__/messages.test.ts|11✔|||205ms| |packages/jest-message-util/src/__tests__/messages.test.ts|11✔|||205ms|
|packages/jest-mock/src/__tests__/index.test.ts|84✔|||509ms| |packages/jest-mock/src/__tests__/index.test.ts|84✔|||509ms|
|packages/jest-regex-util/src/__tests__/index.test.ts|8✔|||56ms| |packages/jest-regex-util/src/__tests__/index.test.ts|8✔|||56ms|
|packages/jest-repl/src/__tests__/jest_repl.test.js|1✔|||1.172s| |packages/jest-repl/src/__tests__/jest_repl.test.js|1✔|||1s|
|packages/jest-repl/src/__tests__/runtime_cli.test.js|4✔|||4.094s| |packages/jest-repl/src/__tests__/runtime_cli.test.js|4✔|||4s|
|packages/jest-reporters/src/__tests__/CoverageReporter.test.js|12✔|||397ms| |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__/CoverageWorker.test.js|2✔|||199ms|
|packages/jest-reporters/src/__tests__/DefaultReporter.test.js|2✔|||148ms| |packages/jest-reporters/src/__tests__/DefaultReporter.test.js|2✔|||148ms|
|packages/jest-reporters/src/__tests__/generateEmptyCoverage.test.js|3✔|||1.129s| |packages/jest-reporters/src/__tests__/generateEmptyCoverage.test.js|3✔|||1s|
|packages/jest-reporters/src/__tests__/getResultHeader.test.js|4✔|||30ms| |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__/getSnapshotStatus.test.js|3✔|||28ms|
|packages/jest-reporters/src/__tests__/getSnapshotSummary.test.js|4✔|||49ms| |packages/jest-reporters/src/__tests__/getSnapshotSummary.test.js|4✔|||49ms|
@ -334,7 +334,7 @@
|packages/jest-reporters/src/__tests__/VerboseReporter.test.js|11✔|||425ms| |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-dependencies/src/__tests__/dependency_resolver.test.ts|11✔|||666ms|
|packages/jest-resolve/src/__tests__/isBuiltinModule.test.ts|4✔|||36ms| |packages/jest-resolve/src/__tests__/isBuiltinModule.test.ts|4✔|||36ms|
|packages/jest-resolve/src/__tests__/resolve.test.ts|16✔|||1.308s| |packages/jest-resolve/src/__tests__/resolve.test.ts|16✔|||1s|
|packages/jest-runner/src/__tests__/testRunner.test.ts|2✔|||905ms| |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__/instrumentation.test.ts|1✔|||275ms|
|packages/jest-runtime/src/__tests__/runtime_create_mock_from_module.test.js|3✔|||606ms| |packages/jest-runtime/src/__tests__/runtime_create_mock_from_module.test.js|3✔|||606ms|
@ -344,31 +344,31 @@
|packages/jest-runtime/src/__tests__/runtime_jest_spy_on.test.js|2✔|||521ms| |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_mock.test.js|4✔|||743ms|
|packages/jest-runtime/src/__tests__/runtime_module_directories.test.js|4✔|||525ms| |packages/jest-runtime/src/__tests__/runtime_module_directories.test.js|4✔|||525ms|
|packages/jest-runtime/src/__tests__/runtime_node_path.test.js|4✔|||1.088s| |packages/jest-runtime/src/__tests__/runtime_node_path.test.js|4✔|||1s|
|packages/jest-runtime/src/__tests__/runtime_require_actual.test.js|2✔|||478ms| |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_cache.test.js|2✔|||454ms|
|packages/jest-runtime/src/__tests__/runtime_require_mock.test.js|13✔|||962ms| |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_no_ext.test.js|1✔|||261ms|
|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_transitive_deps.test.js|6✔|||2s|
|packages/jest-runtime/src/__tests__/runtime_require_module_or_mock.test.js|17✔|||1.223s| |packages/jest-runtime/src/__tests__/runtime_require_module_or_mock.test.js|17✔|||1s|
|packages/jest-runtime/src/__tests__/runtime_require_module.test.js|27✔|||2.439s| |packages/jest-runtime/src/__tests__/runtime_require_module.test.js|27✔|||2s|
|packages/jest-runtime/src/__tests__/runtime_require_resolve.test.ts|5✔|||707ms| |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_wrap.js|2✔|||263ms|
|packages/jest-runtime/src/__tests__/Runtime-sourceMaps.test.js|1✔|||584ms| |packages/jest-runtime/src/__tests__/Runtime-sourceMaps.test.js|1✔|||584ms|
|packages/jest-runtime/src/__tests__/Runtime-statics.test.js|2✔|||162ms| |packages/jest-runtime/src/__tests__/Runtime-statics.test.js|2✔|||162ms|
|packages/jest-serializer/src/__tests__/index.test.ts|17✔|||158ms| |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__/dedentLines.test.ts|17✔|||94ms|
|packages/jest-snapshot/src/__tests__/InlineSnapshots.test.ts|22✔|||1.149s| |packages/jest-snapshot/src/__tests__/InlineSnapshots.test.ts|22✔|||1s|
|packages/jest-snapshot/src/__tests__/matcher.test.ts|1✔|||131ms| |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__/mockSerializer.test.ts|10✔|||45ms|
|packages/jest-snapshot/src/__tests__/printSnapshot.test.ts|71✔|||1.188s| |packages/jest-snapshot/src/__tests__/printSnapshot.test.ts|71✔|||1s|
|packages/jest-snapshot/src/__tests__/SnapshotResolver.test.ts|10✔|||98ms| |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__/throwMatcher.test.ts|3✔|||481ms|
|packages/jest-snapshot/src/__tests__/utils.test.ts|26✔|||214ms| |packages/jest-snapshot/src/__tests__/utils.test.ts|26✔|||214ms|
|packages/jest-source-map/src/__tests__/getCallsite.test.ts|3✔|||86ms| |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-result/src/__tests__/formatTestResults.test.ts|1✔|||53ms|
|packages/jest-test-sequencer/src/__tests__/test_sequencer.test.js|8✔|||251ms| |packages/jest-test-sequencer/src/__tests__/test_sequencer.test.js|8✔|||251ms|
|packages/jest-transform/src/__tests__/ScriptTransformer.test.ts|22✔|||1.660s| |packages/jest-transform/src/__tests__/ScriptTransformer.test.ts|22✔|||2s|
|packages/jest-transform/src/__tests__/shouldInstrument.test.ts|25✔|||155ms| |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__/createProcessObject.test.ts|4✔|||81ms|
|packages/jest-util/src/__tests__/deepCyclicCopy.test.ts|12✔|||86ms| |packages/jest-util/src/__tests__/deepCyclicCopy.test.ts|12✔|||86ms|
@ -403,32 +403,30 @@
|packages/pretty-format/src/__tests__/prettyFormat.test.ts|86✔|||219ms| |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__/react.test.tsx|55✔|||325ms|
|packages/pretty-format/src/__tests__/ReactElement.test.ts|3✔|||64ms| |packages/pretty-format/src/__tests__/ReactElement.test.ts|3✔|||64ms|
### <a id="user-content-r0s75" href="#r0s75">e2e/__tests__/jestChangedFiles.test.ts</a> ### ❌ <a id="user-content-r0s75" href="#r0s75">e2e/__tests__/jestChangedFiles.test.ts</a>
**10** tests were completed in **9.045s** with **9** passed, **1** failed and **0** skipped. ```
✔️ gets hg SCM roots and dedupes them
|Result|Test|Time| ✔️ gets git SCM roots and dedupes them
|:---:|:---|---:| ✔️ gets mixed git and hg SCM roots and dedupes them
|✔️|gets hg SCM roots and dedupes them|559ms| ✔️ gets changed files for git
|✔️|gets git SCM roots and dedupes them|416ms| ✔️ monitors only root paths for git
|✔️|gets mixed git and hg SCM roots and dedupes them|467ms| ✔️ does not find changes in files with no diff, for git
|✔️|gets changed files for git|2.298s| ✔️ handles a bad revision for "changedSince", for git
|✔️|monitors only root paths for git|151ms| ❌ gets changed files for hg
|✔️|does not find changes in files with no diff, for git|628ms| Error: abort: empty revision range
|✔️|handles a bad revision for "changedSince", for git|878ms| ✔️ monitors only root paths for hg
|❌|gets changed files for hg|2.219s| ✔️ handles a bad revision for "changedSince", for hg
|✔️|monitors only root paths for hg|281ms| ```
|✔️|handles a bad revision for "changedSince", for hg|949ms| ### ❌ <a id="user-content-r0s98" href="#r0s98">e2e/__tests__/onlyChanged.test.ts</a>
### <a id="user-content-r0s98" href="#r0s98">e2e/__tests__/onlyChanged.test.ts</a> ```
**9** tests were completed in **22.281s** with **8** passed, **1** failed and **0** skipped. ✔️ run for "onlyChanged" and "changedSince"
✔️ run only changed files
|Result|Test|Time| ✔️ report test coverage for only changed files
|:---:|:---|---:| ✔️ report test coverage of source on test file change under only changed files
|✔️|run for "onlyChanged" and "changedSince"|1.464s| ✔️ do not pickup non-tested files when reporting coverage on only changed files
|✔️|run only changed files|5.196s| ✔️ collect test coverage when using onlyChanged
|✔️|report test coverage for only changed files|1.889s| ✔️ onlyChanged in config is overwritten by --all or testPathPattern
|✔️|report test coverage of source on test file change under only changed files|822ms| ❌ gets changed files for hg
|✔️|do not pickup non-tested files when reporting coverage on only changed files|861ms| Error: expect(received).toMatch(expected)
|✔️|collect test coverage when using onlyChanged|1.058s| ✔️ path on Windows is case-insensitive
|✔️|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|

View file

@ -1,32 +1,29 @@
![Tests failed](https://img.shields.io/badge/tests-1%20passed%2C%204%20failed%2C%201%20skipped-critical) ![Tests failed](https://img.shields.io/badge/tests-1%20passed%2C%204%20failed%2C%201%20skipped-critical)
## <a id="user-content-r0" href="#r0">fixtures/mocha-json.json</a> ## ❌ <a id="user-content-r0" href="#r0">fixtures/mocha-json.json</a>
**6** tests were completed in **12ms** with **1** passed, **4** failed and **1** skipped. **6** tests were completed in **12ms** with **1** passed, **4** failed and **1** skipped.
|Test suite|Passed|Failed|Skipped|Time| |Test suite|Passed|Failed|Skipped|Time|
|:---|---:|---:|---:|---:| |:---|---:|---:|---:|---:|
|[test/main.test.js](#r0s0)|1✔|3❌||1ms| |[test/main.test.js](#r0s0)|1✔|3❌||1ms|
|[test/second.test.js](#r0s1)||1❌|1✖|8ms| |[test/second.test.js](#r0s1)||1❌|1✖|8ms|
### <a id="user-content-r0s0" href="#r0s0">test/main.test.js</a> ### ❌ <a id="user-content-r0s0" href="#r0s0">test/main.test.js</a>
**4** tests were completed in **1ms** with **1** passed, **3** failed and **0** skipped. ```
Test 1
**Test 1** ✔️ Passing test
|Result|Test|Time| Test 1 Test 1.1
|:---:|:---|---:| ❌ Exception in target unit
|✔️|Passing test|0ms| Some error
❌ Failing test
**Test 1 Test 1.1** Expected values to be strictly equal:
|Result|Test|Time|
|:---:|:---|---:| false !== true
|❌|Exception in target unit|0ms|
|❌|Failing test|1ms| Test 2
❌ Exception in test
**Test 2** Some error
|Result|Test|Time| ```
|:---:|:---|---:| ### ❌ <a id="user-content-r0s1" href="#r0s1">test/second.test.js</a>
|❌|Exception in test|0ms| ```
### <a id="user-content-r0s1" href="#r0s1">test/second.test.js</a> ✖️ Skipped test
**2** tests were completed in **8ms** with **0** passed, **1** failed and **1** skipped. ❌ Timeout test
Timeout of 1ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves. (C:\Users\Michal\Workspace\dorny\test-reporter\reports\mocha\test\second.test.js)
|Result|Test|Time| ```
|:---:|:---|---:|
|✖️|Skipped test|0ms|
|❌|Timeout test|8ms|

View file

@ -1,5 +1,5 @@
![Tests failed](https://img.shields.io/badge/tests-268%20passed%2C%201%20failed-critical) ![Tests failed](https://img.shields.io/badge/tests-268%20passed%2C%201%20failed-critical)
## <a id="user-content-r0" href="#r0">fixtures/external/flutter/provider-test-results.json</a> ## ❌ <a id="user-content-r0" href="#r0">fixtures/external/flutter/provider-test-results.json</a>
**269** tests were completed in **0ms** with **268** passed, **1** failed and **0** skipped. **269** tests were completed in **0ms** with **268** passed, **1** failed and **0** skipped.
|Test suite|Passed|Failed|Skipped|Time| |Test suite|Passed|Failed|Skipped|Time|
|:---|---:|---:|---:|---:| |:---|---:|---:|---:|---:|
@ -8,7 +8,7 @@
|[test/consumer_test.dart](#r0s2)|18✔|||340ms| |[test/consumer_test.dart](#r0s2)|18✔|||340ms|
|[test/context_test.dart](#r0s3)|31✔|||698ms| |[test/context_test.dart](#r0s3)|31✔|||698ms|
|[test/future_provider_test.dart](#r0s4)|10✔|||305ms| |[test/future_provider_test.dart](#r0s4)|10✔|||305ms|
|[test/inherited_provider_test.dart](#r0s5)|81✔|||1.117s| |[test/inherited_provider_test.dart](#r0s5)|81✔|||1s|
|[test/listenable_provider_test.dart](#r0s6)|16✔|||353ms| |[test/listenable_provider_test.dart](#r0s6)|16✔|||353ms|
|[test/listenable_proxy_provider_test.dart](#r0s7)|12✔|||373ms| |[test/listenable_proxy_provider_test.dart](#r0s7)|12✔|||373ms|
|[test/multi_provider_test.dart](#r0s8)|3✔|||198ms| |[test/multi_provider_test.dart](#r0s8)|3✔|||198ms|
@ -19,455 +19,356 @@
|[test/stateful_provider_test.dart](#r0s13)|4✔|||254ms| |[test/stateful_provider_test.dart](#r0s13)|4✔|||254ms|
|[test/stream_provider_test.dart](#r0s14)|8✔|||282ms| |[test/stream_provider_test.dart](#r0s14)|8✔|||282ms|
|[test/value_listenable_provider_test.dart](#r0s15)|4✔|1❌||327ms| |[test/value_listenable_provider_test.dart](#r0s15)|4✔|1❌||327ms|
### <a id="user-content-r0s0" href="#r0s0">test/builder_test.dart</a> ✔️ ### ✔️ <a id="user-content-r0s0" href="#r0s0">test/builder_test.dart</a>
**24** tests were completed in **402ms** with **24** passed, **0** failed and **0** skipped. ```
ChangeNotifierProvider
**ChangeNotifierProvider** ✔️ default
|Result|Test|Time| ✔️ .value
|:---:|:---|---:| ListenableProvider
|✔️|ChangeNotifierProvider default|189ms| ✔️ default
|✔️|ChangeNotifierProvider .value|10ms| ✔️ .value
Provider
**ListenableProvider** ✔️ default
|Result|Test|Time| ✔️ .value
|:---:|:---|---:| ProxyProvider
|✔️|ListenableProvider default|9ms| ✔️ 0
|✔️|ListenableProvider .value|16ms| ✔️ 1
✔️ 2
**Provider** ✔️ 3
|Result|Test|Time| ✔️ 4
|:---:|:---|---:| ✔️ 5
|✔️|Provider default|11ms| ✔️ 6
|✔️|Provider .value|8ms| MultiProvider
✔️ with 1 ChangeNotifierProvider default
**ProxyProvider** ✔️ with 2 ChangeNotifierProvider default
|Result|Test|Time| ✔️ with ListenableProvider default
|:---:|:---|---:| ✔️ with Provider default
|✔️|ProxyProvider 0|11ms| ✔️ with ProxyProvider0
|✔️|ProxyProvider 1|10ms| ✔️ with ProxyProvider1
|✔️|ProxyProvider 2|8ms| ✔️ with ProxyProvider2
|✔️|ProxyProvider 3|10ms| ✔️ with ProxyProvider3
|✔️|ProxyProvider 4|9ms| ✔️ with ProxyProvider4
|✔️|ProxyProvider 5|9ms| ✔️ with ProxyProvider5
|✔️|ProxyProvider 6|9ms| ✔️ with ProxyProvider6
```
**MultiProvider** ### ✔️ <a id="user-content-r0s1" href="#r0s1">test/change_notifier_provider_test.dart</a>
|Result|Test|Time| ```
|:---:|:---|---:| ✔️ Use builder property, not child
|✔️|MultiProvider with 1 ChangeNotifierProvider default|9ms| ChangeNotifierProvider
|✔️|MultiProvider with 2 ChangeNotifierProvider default|9ms| ✔️ value
|✔️|MultiProvider with ListenableProvider default|12ms| ✔️ builder
|✔️|MultiProvider with Provider default|8ms| ✔️ builder1
|✔️|MultiProvider with ProxyProvider0|7ms| ✔️ builder2
|✔️|MultiProvider with ProxyProvider1|9ms| ✔️ builder3
|✔️|MultiProvider with ProxyProvider2|7ms| ✔️ builder4
|✔️|MultiProvider with ProxyProvider3|9ms| ✔️ builder5
|✔️|MultiProvider with ProxyProvider4|9ms| ✔️ builder6
|✔️|MultiProvider with ProxyProvider5|7ms| ✔️ builder0
|✔️|MultiProvider with ProxyProvider6|7ms| ```
### <a id="user-content-r0s1" href="#r0s1">test/change_notifier_provider_test.dart</a> ✔️ ### ✔️ <a id="user-content-r0s2" href="#r0s2">test/consumer_test.dart</a>
**10** tests were completed in **306ms** with **10** passed, **0** failed and **0** skipped. ```
consumer
|Result|Test|Time| ✔️ obtains value from Provider<T>
|:---:|:---|---:| ✔️ crashed with no builder
|✔️|Use builder property, not child|10ms| ✔️ can be used inside MultiProvider
consumer2
**ChangeNotifierProvider** ✔️ obtains value from Provider<T>
|Result|Test|Time| ✔️ crashed with no builder
|:---:|:---|---:| ✔️ can be used inside MultiProvider
|✔️|ChangeNotifierProvider value|185ms| consumer3
|✔️|ChangeNotifierProvider builder|18ms| ✔️ obtains value from Provider<T>
|✔️|ChangeNotifierProvider builder1|12ms| ✔️ crashed with no builder
|✔️|ChangeNotifierProvider builder2|12ms| ✔️ can be used inside MultiProvider
|✔️|ChangeNotifierProvider builder3|19ms| consumer4
|✔️|ChangeNotifierProvider builder4|14ms| ✔️ obtains value from Provider<T>
|✔️|ChangeNotifierProvider builder5|15ms| ✔️ crashed with no builder
|✔️|ChangeNotifierProvider builder6|11ms| ✔️ can be used inside MultiProvider
|✔️|ChangeNotifierProvider builder0|10ms| consumer5
### <a id="user-content-r0s2" href="#r0s2">test/consumer_test.dart</a> ✔️ ✔️ obtains value from Provider<T>
**18** tests were completed in **340ms** with **18** passed, **0** failed and **0** skipped. ✔️ crashed with no builder
✔️ can be used inside MultiProvider
**consumer** consumer6
|Result|Test|Time| ✔️ obtains value from Provider<T>
|:---:|:---|---:| ✔️ crashed with no builder
|✔️|consumer obtains value from Provider<T>|181ms| ✔️ can be used inside MultiProvider
|✔️|consumer crashed with no builder|11ms| ```
|✔️|consumer can be used inside MultiProvider|16ms| ### ✔️ <a id="user-content-r0s3" href="#r0s3">test/context_test.dart</a>
```
**consumer2** ✔️ watch in layoutbuilder
|Result|Test|Time| ✔️ select in layoutbuilder
|:---:|:---|---:| ✔️ cannot select in listView
|✔️|consumer2 obtains value from Provider<T>|22ms| ✔️ watch in listView
|✔️|consumer2 crashed with no builder|8ms| ✔️ watch in gridView
|✔️|consumer2 can be used inside MultiProvider|9ms| ✔️ clears select dependencies for all dependents
BuildContext
**consumer3** ✔️ internal selected value is updated
|Result|Test|Time| ✔️ create can use read without being lazy
|:---:|:---|---:| ✔️ watch can be used inside InheritedProvider.update
|✔️|consumer3 obtains value from Provider<T>|9ms| ✔️ select doesn't fail if it loads a provider that depends on other providers
|✔️|consumer3 crashed with no builder|7ms| ✔️ don't call old selectors if the child rebuilds individually
|✔️|consumer3 can be used inside MultiProvider|8ms| ✔️ selects throws inside click handlers
✔️ select throws if try to read dynamic
**consumer4** ✔️ select throws ProviderNotFoundException
|Result|Test|Time| ✔️ select throws if watch called inside the callback from build
|:---:|:---|---:| ✔️ select throws if read called inside the callback from build
|✔️|consumer4 obtains value from Provider<T>|8ms| ✔️ select throws if select called inside the callback from build
|✔️|consumer4 crashed with no builder|6ms| ✔️ select throws if read called inside the callback on dependency change
|✔️|consumer4 can be used inside MultiProvider|8ms| ✔️ select throws if watch called inside the callback on dependency change
✔️ select throws if select called inside the callback on dependency change
**consumer5** ✔️ can call read inside didChangeDependencies
|Result|Test|Time| ✔️ select cannot be called inside didChangeDependencies
|:---:|:---|---:| ✔️ select in initState throws
|✔️|consumer5 obtains value from Provider<T>|8ms| ✔️ watch in initState throws
|✔️|consumer5 crashed with no builder|6ms| ✔️ read in initState works
|✔️|consumer5 can be used inside MultiProvider|9ms| ✔️ consumer can be removed and selector stops to be called
✔️ context.select deeply compares maps
**consumer6** ✔️ context.select deeply compares lists
|Result|Test|Time| ✔️ context.select deeply compares iterables
|:---:|:---|---:| ✔️ context.select deeply compares sets
|✔️|consumer6 obtains value from Provider<T>|8ms| ✔️ context.watch listens to value changes
|✔️|consumer6 crashed with no builder|8ms| ```
|✔️|consumer6 can be used inside MultiProvider|8ms| ### ✔️ <a id="user-content-r0s4" href="#r0s4">test/future_provider_test.dart</a>
### <a id="user-content-r0s3" href="#r0s3">test/context_test.dart</a> ✔️ ```
**31** tests were completed in **698ms** with **31** passed, **0** failed and **0** skipped. ✔️ works with MultiProvider
✔️ (catchError) previous future completes after transition is no-op
|Result|Test|Time| ✔️ previous future completes after transition is no-op
|:---:|:---|---:| ✔️ transition from future to future preserve state
|✔️|watch in layoutbuilder|179ms| ✔️ throws if future has error and catchError is missing
|✔️|select in layoutbuilder|12ms| ✔️ calls catchError if present and future has error
|✔️|cannot select in listView|138ms| ✔️ works with null
|✔️|watch in listView|33ms| ✔️ create and dispose future with builder
|✔️|watch in gridView|21ms| ✔️ FutureProvider() crashes if builder is null
|✔️|clears select dependencies for all dependents|19ms| FutureProvider()
✔️ crashes if builder is null
**BuildContext** ```
|Result|Test|Time| ### ✔️ <a id="user-content-r0s5" href="#r0s5">test/inherited_provider_test.dart</a>
|:---:|:---|---:| ```
|✔️|BuildContext internal selected value is updated|32ms| ✔️ regression test #377
|✔️|BuildContext create can use read without being lazy|11ms| ✔️ rebuild on dependency flags update
|✔️|BuildContext watch can be used inside InheritedProvider.update|10ms| ✔️ properly update debug flags if a create triggers another deferred create
|✔️|BuildContext select doesn't fail if it loads a provider that depends on other providers|9ms| ✔️ properly update debug flags if a create triggers another deferred create
|✔️|BuildContext don't call old selectors if the child rebuilds individually|21ms| ✔️ properly update debug flags if an update triggers another create/update
|✔️|BuildContext selects throws inside click handlers|40ms| ✔️ properly update debug flags if a create triggers another create/update
|✔️|BuildContext select throws if try to read dynamic|9ms| ✔️ Provider.of(listen: false) outside of build works when it loads a provider
|✔️|BuildContext select throws ProviderNotFoundException|9ms| ✔️ new value is available in didChangeDependencies
|✔️|BuildContext select throws if watch called inside the callback from build|6ms| ✔️ builder receives the current value and updates independently from `update`
|✔️|BuildContext select throws if read called inside the callback from build|9ms| ✔️ builder can _not_ rebuild when provider updates
|✔️|BuildContext select throws if select called inside the callback from build|8ms| ✔️ builder rebuilds if provider is recreated
|✔️|BuildContext select throws if read called inside the callback on dependency change|10ms| ✔️ provider.of throws if listen:true outside of the widget tree
|✔️|BuildContext select throws if watch called inside the callback on dependency change|17ms| ✔️ InheritedProvider throws if no child is provided with default constructor
|✔️|BuildContext select throws if select called inside the callback on dependency change|9ms| ✔️ InheritedProvider throws if no child is provided with value constructor
|✔️|BuildContext can call read inside didChangeDependencies|9ms| ✔️ DeferredInheritedProvider throws if no child is provided with default constructor
|✔️|BuildContext select cannot be called inside didChangeDependencies|6ms| ✔️ DeferredInheritedProvider throws if no child is provided with value constructor
|✔️|BuildContext select in initState throws|6ms| ✔️ startListening markNeedsNotifyDependents
|✔️|BuildContext watch in initState throws|10ms| ✔️ InheritedProvider can be subclassed
|✔️|BuildContext read in initState works|6ms| ✔️ DeferredInheritedProvider can be subclassed
|✔️|BuildContext consumer can be removed and selector stops to be called|7ms| ✔️ can be used with MultiProvider
|✔️|BuildContext context.select deeply compares maps|15ms| ✔️ throw if the widget ctor changes
|✔️|BuildContext context.select deeply compares lists|8ms| ✔️ InheritedProvider lazy loading can be disabled
|✔️|BuildContext context.select deeply compares iterables|8ms| ✔️ InheritedProvider.value lazy loading can be disabled
|✔️|BuildContext context.select deeply compares sets|11ms| ✔️ InheritedProvider subclass don't have to specify default lazy value
|✔️|BuildContext context.watch listens to value changes|10ms| ✔️ DeferredInheritedProvider lazy loading can be disabled
### <a id="user-content-r0s4" href="#r0s4">test/future_provider_test.dart</a> ✔️ ✔️ DeferredInheritedProvider.value lazy loading can be disabled
**10** tests were completed in **305ms** with **10** passed, **0** failed and **0** skipped. ✔️ selector
✔️ can select multiple types from same provider
|Result|Test|Time| ✔️ can select same type on two different providers
|:---:|:---|---:| ✔️ can select same type twice on same provider
|✔️|works with MultiProvider|184ms| ✔️ Provider.of has a proper error message if context is null
|✔️|(catchError) previous future completes after transition is no-op|16ms| diagnostics
|✔️|previous future completes after transition is no-op|15ms| ✔️ InheritedProvider.value
|✔️|transition from future to future preserve state|12ms| ✔️ InheritedProvider doesn't break lazy loading
|✔️|throws if future has error and catchError is missing|24ms| ✔️ InheritedProvider show if listening
|✔️|calls catchError if present and future has error|21ms| ✔️ DeferredInheritedProvider.value
|✔️|works with null|14ms| ✔️ DeferredInheritedProvider
|✔️|create and dispose future with builder|12ms| InheritedProvider.value()
|✔️|FutureProvider() crashes if builder is null|4ms| ✔️ markNeedsNotifyDependents during startListening is noop
✔️ startListening called again when create returns new value
**FutureProvider()** ✔️ startListening
|Result|Test|Time| ✔️ stopListening not called twice if rebuild doesn't have listeners
|:---:|:---|---:| ✔️ removeListener cannot be null
|✔️|FutureProvider() crashes if builder is null|3ms| ✔️ pass down current value
### <a id="user-content-r0s5" href="#r0s5">test/inherited_provider_test.dart</a> ✔️ ✔️ default updateShouldNotify
**81** tests were completed in **1.117s** with **81** passed, **0** failed and **0** skipped. ✔️ custom updateShouldNotify
InheritedProvider()
|Result|Test|Time| ✔️ hasValue
|:---:|:---|---:| ✔️ provider calls update if rebuilding only due to didChangeDependencies
|✔️|regression test #377|167ms| ✔️ provider notifying dependents doesn't call update
|✔️|rebuild on dependency flags update|15ms| ✔️ update can call Provider.of with listen:true
|✔️|properly update debug flags if a create triggers another deferred create|9ms| ✔️ update lazy loaded can call Provider.of with listen:true
|✔️|properly update debug flags if a create triggers another deferred create|8ms| ✔️ markNeedsNotifyDependents during startListening is noop
|✔️|properly update debug flags if an update triggers another create/update|7ms| ✔️ update can obtain parent of the same type than self
|✔️|properly update debug flags if a create triggers another create/update|8ms| ✔️ _debugCheckInvalidValueType
|✔️|Provider.of(listen: false) outside of build works when it loads a provider|22ms| ✔️ startListening
|✔️|new value is available in didChangeDependencies|26ms| ✔️ startListening called again when create returns new value
|✔️|builder receives the current value and updates independently from `update`|16ms| ✔️ stopListening not called twice if rebuild doesn't have listeners
|✔️|builder can _not_ rebuild when provider updates|8ms| ✔️ removeListener cannot be null
|✔️|builder rebuilds if provider is recreated|9ms| ✔️ fails if initialValueBuilder calls inheritFromElement/inheritFromWiggetOfExactType
|✔️|provider.of throws if listen:true outside of the widget tree|23ms| ✔️ builder is called on every rebuild and after a dependency change
|✔️|InheritedProvider throws if no child is provided with default constructor|14ms| ✔️ builder with no updateShouldNotify use ==
|✔️|InheritedProvider throws if no child is provided with value constructor|8ms| ✔️ builder calls updateShouldNotify callback
|✔️|DeferredInheritedProvider throws if no child is provided with default constructor|15ms| ✔️ initialValue is transmitted to valueBuilder
|✔️|DeferredInheritedProvider throws if no child is provided with value constructor|7ms| ✔️ calls builder again if dependencies change
|✔️|startListening markNeedsNotifyDependents|7ms| ✔️ exposes initialValue if valueBuilder is null
|✔️|InheritedProvider can be subclassed|8ms| ✔️ call dispose on unmount
|✔️|DeferredInheritedProvider can be subclassed|7ms| ✔️ builder unmount, dispose not called if value never read
|✔️|can be used with MultiProvider|8ms| ✔️ call dispose after new value
|✔️|throw if the widget ctor changes|8ms| ✔️ valueBuilder works without initialBuilder
|✔️|InheritedProvider lazy loading can be disabled|6ms| ✔️ calls initialValueBuilder lazily once
|✔️|InheritedProvider.value lazy loading can be disabled|9ms| ✔️ throws if both builder and initialBuilder are missing
|✔️|InheritedProvider subclass don't have to specify default lazy value|7ms| DeferredInheritedProvider.value()
|✔️|DeferredInheritedProvider lazy loading can be disabled|7ms| ✔️ hasValue
|✔️|DeferredInheritedProvider.value lazy loading can be disabled|7ms| ✔️ startListening
|✔️|selector|14ms| ✔️ stopListening cannot be null
|✔️|can select multiple types from same provider|9ms| ✔️ startListening doesn't need setState if already initialized
|✔️|can select same type on two different providers|8ms| ✔️ setState without updateShouldNotify
|✔️|can select same type twice on same provider|10ms| ✔️ setState with updateShouldNotify
|✔️|Provider.of has a proper error message if context is null|6ms| ✔️ startListening never leave the widget uninitialized
✔️ startListening called again on controller change
**diagnostics** DeferredInheritedProvider()
|Result|Test|Time| ✔️ create can't call inherited widgets
|:---:|:---|---:| ✔️ creates the value lazily
|✔️|diagnostics InheritedProvider.value|11ms| ✔️ dispose
|✔️|diagnostics InheritedProvider doesn't break lazy loading|7ms| ✔️ dispose no-op if never built
|✔️|diagnostics InheritedProvider show if listening|7ms| ```
|✔️|diagnostics DeferredInheritedProvider.value|6ms| ### ✔️ <a id="user-content-r0s6" href="#r0s6">test/listenable_provider_test.dart</a>
|✔️|diagnostics DeferredInheritedProvider|16ms| ```
ListenableProvider
**InheritedProvider.value()** ✔️ works with MultiProvider
|Result|Test|Time| ✔️ asserts that the created notifier can have listeners
|:---:|:---|---:| ✔️ don't listen again if listenable instance doesn't change
|✔️|InheritedProvider.value() markNeedsNotifyDependents during startListening is noop|8ms| ✔️ works with null (default)
|✔️|InheritedProvider.value() startListening called again when create returns new value|27ms| ✔️ works with null (create)
|✔️|InheritedProvider.value() startListening|19ms| ✔️ stateful create called once
|✔️|InheritedProvider.value() stopListening not called twice if rebuild doesn't have listeners|16ms| ✔️ dispose called on unmount
|✔️|InheritedProvider.value() removeListener cannot be null|22ms| ✔️ dispose can be null
|✔️|InheritedProvider.value() pass down current value|17ms| ✔️ changing listenable rebuilds descendants
|✔️|InheritedProvider.value() default updateShouldNotify|8ms| ✔️ rebuilding with the same provider don't rebuilds descendants
|✔️|InheritedProvider.value() custom updateShouldNotify|32ms| ✔️ notifylistener rebuilds descendants
ListenableProvider value constructor
**InheritedProvider()** ✔️ pass down key
|Result|Test|Time| ✔️ changing the Listenable instance rebuilds dependents
|:---:|:---|---:| ListenableProvider stateful constructor
|✔️|InheritedProvider() hasValue|16ms| ✔️ called with context
|✔️|InheritedProvider() provider calls update if rebuilding only due to didChangeDependencies|9ms| ✔️ pass down key
|✔️|InheritedProvider() provider notifying dependents doesn't call update|11ms| ✔️ throws if create is null
|✔️|InheritedProvider() update can call Provider.of with listen:true|7ms| ```
|✔️|InheritedProvider() update lazy loaded can call Provider.of with listen:true|10ms| ### ✔️ <a id="user-content-r0s7" href="#r0s7">test/listenable_proxy_provider_test.dart</a>
|✔️|InheritedProvider() markNeedsNotifyDependents during startListening is noop|22ms| ```
|✔️|InheritedProvider() update can obtain parent of the same type than self|15ms| ListenableProxyProvider
|✔️|InheritedProvider() _debugCheckInvalidValueType|22ms| ✔️ throws if update is missing
|✔️|InheritedProvider() startListening|18ms| ✔️ asserts that the created notifier has no listener
|✔️|InheritedProvider() startListening called again when create returns new value|20ms| ✔️ asserts that the created notifier has no listener after rebuild
|✔️|InheritedProvider() stopListening not called twice if rebuild doesn't have listeners|18ms| ✔️ rebuilds dependendents when listeners are called
|✔️|InheritedProvider() removeListener cannot be null|16ms| ✔️ update returning a new Listenable disposes the previously created value and update dependents
|✔️|InheritedProvider() fails if initialValueBuilder calls inheritFromElement/inheritFromWiggetOfExactType|17ms| ✔️ disposes of created value
|✔️|InheritedProvider() builder is called on every rebuild and after a dependency change|11ms| ListenableProxyProvider variants
|✔️|InheritedProvider() builder with no updateShouldNotify use ==|8ms| ✔️ ListenableProxyProvider
|✔️|InheritedProvider() builder calls updateShouldNotify callback|8ms| ✔️ ListenableProxyProvider2
|✔️|InheritedProvider() initialValue is transmitted to valueBuilder|8ms| ✔️ ListenableProxyProvider3
|✔️|InheritedProvider() calls builder again if dependencies change|22ms| ✔️ ListenableProxyProvider4
|✔️|InheritedProvider() exposes initialValue if valueBuilder is null|20ms| ✔️ ListenableProxyProvider5
|✔️|InheritedProvider() call dispose on unmount|22ms| ✔️ ListenableProxyProvider6
|✔️|InheritedProvider() builder unmount, dispose not called if value never read|11ms| ```
|✔️|InheritedProvider() call dispose after new value|9ms| ### ✔️ <a id="user-content-r0s8" href="#r0s8">test/multi_provider_test.dart</a>
|✔️|InheritedProvider() valueBuilder works without initialBuilder|11ms| ```
|✔️|InheritedProvider() calls initialValueBuilder lazily once|7ms| MultiProvider
|✔️|InheritedProvider() throws if both builder and initialBuilder are missing|5ms| ✔️ throw if providers is null
✔️ MultiProvider children can only access parent providers
**DeferredInheritedProvider.value()** ✔️ MultiProvider.providers with ignored child
|Result|Test|Time| ```
|:---:|:---|---:| ### ✔️ <a id="user-content-r0s9" href="#r0s9">test/provider_test.dart</a>
|✔️|DeferredInheritedProvider.value() hasValue|6ms| ```
|✔️|DeferredInheritedProvider.value() startListening|9ms| ✔️ works with MultiProvider
|✔️|DeferredInheritedProvider.value() stopListening cannot be null|9ms| Provider.of
|✔️|DeferredInheritedProvider.value() startListening doesn't need setState if already initialized|8ms| ✔️ throws if T is dynamic
|✔️|DeferredInheritedProvider.value() setState without updateShouldNotify|8ms| ✔️ listen defaults to true when building widgets
|✔️|DeferredInheritedProvider.value() setState with updateShouldNotify|9ms| ✔️ listen defaults to false outside of the widget tree
|✔️|DeferredInheritedProvider.value() startListening never leave the widget uninitialized|8ms| ✔️ listen:false doesn't trigger rebuild
|✔️|DeferredInheritedProvider.value() startListening called again on controller change|10ms| ✔️ listen:true outside of the widget tree throws
Provider
**DeferredInheritedProvider()** ✔️ throws if the provided value is a Listenable/Stream
|Result|Test|Time| ✔️ debugCheckInvalidValueType can be disabled
|:---:|:---|---:| ✔️ simple usage
|✔️|DeferredInheritedProvider() create can't call inherited widgets|7ms| ✔️ throws an error if no provider found
|✔️|DeferredInheritedProvider() creates the value lazily|7ms| ✔️ update should notify
|✔️|DeferredInheritedProvider() dispose|7ms| ```
|✔️|DeferredInheritedProvider() dispose no-op if never built|7ms| ### ✔️ <a id="user-content-r0s10" href="#r0s10">test/proxy_provider_test.dart</a>
### <a id="user-content-r0s6" href="#r0s6">test/listenable_provider_test.dart</a> ✔️ ```
**16** tests were completed in **353ms** with **16** passed, **0** failed and **0** skipped. ProxyProvider
✔️ throws if the provided value is a Listenable/Stream
**ListenableProvider** ✔️ debugCheckInvalidValueType can be disabled
|Result|Test|Time| ✔️ create creates initial value
|:---:|:---|---:| ✔️ consume another providers
|✔️|ListenableProvider works with MultiProvider|173ms| ✔️ rebuild descendants if value change
|✔️|ListenableProvider asserts that the created notifier can have listeners|12ms| ✔️ call dispose when unmounted with the latest result
|✔️|ListenableProvider don't listen again if listenable instance doesn't change|12ms| ✔️ don't rebuild descendants if value doesn't change
|✔️|ListenableProvider works with null (default)|7ms| ✔️ pass down updateShouldNotify
|✔️|ListenableProvider works with null (create)|7ms| ✔️ works with MultiProvider
|✔️|ListenableProvider stateful create called once|11ms| ✔️ update callback can trigger descendants setState synchronously
|✔️|ListenableProvider dispose called on unmount|13ms| ✔️ throws if update is null
|✔️|ListenableProvider dispose can be null|8ms| ProxyProvider variants
|✔️|ListenableProvider changing listenable rebuilds descendants|12ms| ✔️ ProxyProvider2
|✔️|ListenableProvider rebuilding with the same provider don't rebuilds descendants|11ms| ✔️ ProxyProvider3
|✔️|ListenableProvider notifylistener rebuilds descendants|9ms| ✔️ ProxyProvider4
✔️ ProxyProvider5
**ListenableProvider value constructor** ✔️ ProxyProvider6
|Result|Test|Time| ```
|:---:|:---|---:| ### ✔️ <a id="user-content-r0s11" href="#r0s11">test/reassemble_test.dart</a>
|✔️|ListenableProvider value constructor pass down key|17ms| ```
|✔️|ListenableProvider value constructor changing the Listenable instance rebuilds dependents|29ms| ✔️ ReassembleHandler
✔️ unevaluated create
**ListenableProvider stateful constructor** ✔️ unevaluated create
|Result|Test|Time| ```
|:---:|:---|---:| ### ✔️ <a id="user-content-r0s12" href="#r0s12">test/selector_test.dart</a>
|✔️|ListenableProvider stateful constructor called with context|8ms| ```
|✔️|ListenableProvider stateful constructor pass down key|20ms| ✔️ asserts that builder/selector are not null
|✔️|ListenableProvider stateful constructor throws if create is null|4ms| ✔️ Deep compare maps by default
### <a id="user-content-r0s7" href="#r0s7">test/listenable_proxy_provider_test.dart</a> ✔️ ✔️ Deep compare iterables by default
**12** tests were completed in **373ms** with **12** passed, **0** failed and **0** skipped. ✔️ Deep compare sets by default
✔️ Deep compare lists by default
**ListenableProxyProvider** ✔️ custom shouldRebuid
|Result|Test|Time| ✔️ passes `child` and `key`
|:---:|:---|---:| ✔️ calls builder if the callback changes
|✔️|ListenableProxyProvider throws if update is missing|43ms| ✔️ works with MultiProvider
|✔️|ListenableProxyProvider asserts that the created notifier has no listener|177ms| ✔️ don't call builder again if it rebuilds but selector returns the same thing
|✔️|ListenableProxyProvider asserts that the created notifier has no listener after rebuild|18ms| ✔️ call builder again if it rebuilds abd selector returns the a different variable
|✔️|ListenableProxyProvider rebuilds dependendents when listeners are called|20ms| ✔️ Selector
|✔️|ListenableProxyProvider update returning a new Listenable disposes the previously created value and update dependents|25ms| ✔️ Selector2
|✔️|ListenableProxyProvider disposes of created value|13ms| ✔️ Selector3
✔️ Selector4
**ListenableProxyProvider variants** ✔️ Selector5
|Result|Test|Time| ✔️ Selector6
|:---:|:---|---:| ```
|✔️|ListenableProxyProvider variants ListenableProxyProvider|13ms| ### ✔️ <a id="user-content-r0s13" href="#r0s13">test/stateful_provider_test.dart</a>
|✔️|ListenableProxyProvider variants ListenableProxyProvider2|9ms| ```
|✔️|ListenableProxyProvider variants ListenableProxyProvider3|9ms| ✔️ asserts
|✔️|ListenableProxyProvider variants ListenableProxyProvider4|17ms| ✔️ works with MultiProvider
|✔️|ListenableProxyProvider variants ListenableProxyProvider5|12ms| ✔️ calls create only once
|✔️|ListenableProxyProvider variants ListenableProxyProvider6|17ms| ✔️ dispose
### <a id="user-content-r0s8" href="#r0s8">test/multi_provider_test.dart</a> ✔️ ```
**3** tests were completed in **198ms** with **3** passed, **0** failed and **0** skipped. ### ✔️ <a id="user-content-r0s14" href="#r0s14">test/stream_provider_test.dart</a>
```
**MultiProvider** ✔️ works with MultiProvider
|Result|Test|Time| ✔️ transition from stream to stream preserve state
|:---:|:---|---:| ✔️ throws if stream has error and catchError is missing
|✔️|MultiProvider throw if providers is null|30ms| ✔️ calls catchError if present and stream has error
|✔️|MultiProvider MultiProvider children can only access parent providers|160ms| ✔️ works with null
|✔️|MultiProvider MultiProvider.providers with ignored child|8ms| ✔️ StreamProvider() crashes if builder is null
### <a id="user-content-r0s9" href="#r0s9">test/provider_test.dart</a> ✔️ StreamProvider()
**11** tests were completed in **306ms** with **11** passed, **0** failed and **0** skipped. ✔️ create and dispose stream with builder
✔️ crashes if builder is null
|Result|Test|Time| ```
|:---:|:---|---:| ### ❌ <a id="user-content-r0s15" href="#r0s15">test/value_listenable_provider_test.dart</a>
|✔️|works with MultiProvider|172ms| ```
valueListenableProvider
**Provider.of** ✔️ rebuilds when value change
|Result|Test|Time| ✔️ don't rebuild dependents by default
|:---:|:---|---:| ✔️ pass keys
|✔️|Provider.of throws if T is dynamic|26ms| ✔️ don't listen again if stream instance doesn't change
|✔️|Provider.of listen defaults to true when building widgets|13ms| ❌ pass updateShouldNotify
|✔️|Provider.of listen defaults to false outside of the widget tree|9ms| The following TestFailure object was thrown running a test:
|✔️|Provider.of listen:false doesn't trigger rebuild|10ms| Expected: <2>
|✔️|Provider.of listen:true outside of the widget tree throws|11ms| Actual: <1>
Unexpected number of calls
**Provider**
|Result|Test|Time| ```
|:---:|:---|---:|
|✔️|Provider throws if the provided value is a Listenable/Stream|28ms|
|✔️|Provider debugCheckInvalidValueType can be disabled|9ms|
|✔️|Provider simple usage|9ms|
|✔️|Provider throws an error if no provider found|11ms|
|✔️|Provider update should notify|8ms|
### <a id="user-content-r0s10" href="#r0s10">test/proxy_provider_test.dart</a> ✔️
**16** tests were completed in **438ms** with **16** passed, **0** failed and **0** skipped.
**ProxyProvider**
|Result|Test|Time|
|:---:|:---|---:|
|✔️|ProxyProvider throws if the provided value is a Listenable/Stream|209ms|
|✔️|ProxyProvider debugCheckInvalidValueType can be disabled|13ms|
|✔️|ProxyProvider create creates initial value|23ms|
|✔️|ProxyProvider consume another providers|18ms|
|✔️|ProxyProvider rebuild descendants if value change|13ms|
|✔️|ProxyProvider call dispose when unmounted with the latest result|11ms|
|✔️|ProxyProvider don't rebuild descendants if value doesn't change|12ms|
|✔️|ProxyProvider pass down updateShouldNotify|19ms|
|✔️|ProxyProvider works with MultiProvider|16ms|
|✔️|ProxyProvider update callback can trigger descendants setState synchronously|24ms|
|✔️|ProxyProvider throws if update is null|7ms|
**ProxyProvider variants**
|Result|Test|Time|
|:---:|:---|---:|
|✔️|ProxyProvider variants ProxyProvider2|18ms|
|✔️|ProxyProvider variants ProxyProvider3|16ms|
|✔️|ProxyProvider variants ProxyProvider4|9ms|
|✔️|ProxyProvider variants ProxyProvider5|20ms|
|✔️|ProxyProvider variants ProxyProvider6|10ms|
### <a id="user-content-r0s11" href="#r0s11">test/reassemble_test.dart</a> ✔️
**3** tests were completed in **221ms** with **3** passed, **0** failed and **0** skipped.
|Result|Test|Time|
|:---:|:---|---:|
|✔️|ReassembleHandler|194ms|
|✔️|unevaluated create|11ms|
|✔️|unevaluated create|16ms|
### <a id="user-content-r0s12" href="#r0s12">test/selector_test.dart</a> ✔️
**17** tests were completed in **364ms** with **17** passed, **0** failed and **0** skipped.
|Result|Test|Time|
|:---:|:---|---:|
|✔️|asserts that builder/selector are not null|32ms|
|✔️|Deep compare maps by default|158ms|
|✔️|Deep compare iterables by default|9ms|
|✔️|Deep compare sets by default|12ms|
|✔️|Deep compare lists by default|14ms|
|✔️|custom shouldRebuid|11ms|
|✔️|passes `child` and `key`|13ms|
|✔️|calls builder if the callback changes|14ms|
|✔️|works with MultiProvider|12ms|
|✔️|don't call builder again if it rebuilds but selector returns the same thing|9ms|
|✔️|call builder again if it rebuilds abd selector returns the a different variable|9ms|
|✔️|Selector|15ms|
|✔️|Selector2|9ms|
|✔️|Selector3|8ms|
|✔️|Selector4|9ms|
|✔️|Selector5|19ms|
|✔️|Selector6|11ms|
### <a id="user-content-r0s13" href="#r0s13">test/stateful_provider_test.dart</a> ✔️
**4** tests were completed in **254ms** with **4** passed, **0** failed and **0** skipped.
|Result|Test|Time|
|:---:|:---|---:|
|✔️|asserts|6ms|
|✔️|works with MultiProvider|203ms|
|✔️|calls create only once|27ms|
|✔️|dispose|18ms|
### <a id="user-content-r0s14" href="#r0s14">test/stream_provider_test.dart</a> ✔️
**8** tests were completed in **282ms** with **8** passed, **0** failed and **0** skipped.
|Result|Test|Time|
|:---:|:---|---:|
|✔️|works with MultiProvider|191ms|
|✔️|transition from stream to stream preserve state|16ms|
|✔️|throws if stream has error and catchError is missing|22ms|
|✔️|calls catchError if present and stream has error|20ms|
|✔️|works with null|13ms|
|✔️|StreamProvider() crashes if builder is null|5ms|
**StreamProvider()**
|Result|Test|Time|
|:---:|:---|---:|
|✔️|StreamProvider() create and dispose stream with builder|11ms|
|✔️|StreamProvider() crashes if builder is null|4ms|
### <a id="user-content-r0s15" href="#r0s15">test/value_listenable_provider_test.dart</a>
**5** tests were completed in **327ms** with **4** passed, **1** failed and **0** skipped.
**valueListenableProvider**
|Result|Test|Time|
|:---:|:---|---:|
|✔️|valueListenableProvider rebuilds when value change|200ms|
|✔️|valueListenableProvider don't rebuild dependents by default|26ms|
|✔️|valueListenableProvider pass keys|10ms|
|✔️|valueListenableProvider don't listen again if stream instance doesn't change|22ms|
|❌|valueListenableProvider pass updateShouldNotify|69ms|

View file

@ -1,13 +1,12 @@
![Tests failed](https://img.shields.io/badge/tests-1%20failed%2C%201%20skipped-critical) ![Tests failed](https://img.shields.io/badge/tests-1%20failed%2C%201%20skipped-critical)
## <a id="user-content-r0" href="#r0">fixtures/external/java/TEST-org.apache.pulsar.AddMissingPatchVersionTest.xml</a> ## ❌ <a id="user-content-r0" href="#r0">fixtures/external/java/TEST-org.apache.pulsar.AddMissingPatchVersionTest.xml</a>
**2** tests were completed in **116ms** with **0** passed, **1** failed and **1** skipped. **2** tests were completed in **116ms** with **0** passed, **1** failed and **1** skipped.
|Test suite|Passed|Failed|Skipped|Time| |Test suite|Passed|Failed|Skipped|Time|
|:---|---:|---:|---:|---:| |:---|---:|---:|---:|---:|
|[org.apache.pulsar.AddMissingPatchVersionTest](#r0s0)||1❌|1✖|116ms| |[org.apache.pulsar.AddMissingPatchVersionTest](#r0s0)||1❌|1✖|116ms|
### <a id="user-content-r0s0" href="#r0s0">org.apache.pulsar.AddMissingPatchVersionTest</a> ### ❌ <a id="user-content-r0s0" href="#r0s0">org.apache.pulsar.AddMissingPatchVersionTest</a>
**2** tests were completed in **116ms** with **0** passed, **1** failed and **1** skipped. ```
✖️ testVersionStrings
|Result|Test|Time| ❌ testVersionStrings
|:---:|:---|---:| java.lang.AssertionError: expected [1.2.1] but found [1.2.0]
|✖️|testVersionStrings|99ms| ```
|❌|testVersionStrings|17ms|

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -7,7 +7,6 @@ import {getReport} from '../src/report/get-report'
import {normalizeFilePath} from '../src/utils/path-utils' import {normalizeFilePath} from '../src/utils/path-utils'
describe('mocha-json tests', () => { describe('mocha-json tests', () => {
it('produces empty test run result when there are no test cases', async () => { it('produces empty test run result when there are no test cases', async () => {
const fixturePath = path.join(__dirname, 'fixtures', 'empty', 'mocha-json.json') const fixturePath = path.join(__dirname, 'fixtures', 'empty', 'mocha-json.json')
const filePath = normalizeFilePath(path.relative(__dirname, fixturePath)) const filePath = normalizeFilePath(path.relative(__dirname, fixturePath))

View file

@ -0,0 +1,37 @@
import {parseNetDuration} from '../../src/utils/parse-utils'
describe('parseNetDuration', () => {
it('returns 0 for 00:00:00', () => {
const ms = parseNetDuration('00:00:00')
expect(ms).toBe(0)
})
it('returns 0 for 00:00:00.0000000', () => {
const ms = parseNetDuration('00:00:00.0000000')
expect(ms).toBe(0)
})
it('returns 123 for 00:00:00.123', () => {
const ms = parseNetDuration('00:00:00.123')
expect(ms).toBe(123)
})
it('returns 12 * 1000 for 00:00:12', () => {
const ms = parseNetDuration('00:00:12')
expect(ms).toBe(12 * 1000)
})
it('returns 12 * 60 * 1000 for 00:12:00', () => {
const ms = parseNetDuration('00:12:00')
expect(ms).toBe(12 * 60 * 1000)
})
it('returns 12 * 60 * 60 * 1000 for 12:00:00', () => {
const ms = parseNetDuration('12:00:00')
expect(ms).toBe(12 * 60 * 60 * 1000)
})
it('throws when string has invalid format', () => {
expect(() => parseNetDuration('12:34:56 not a duration')).toThrowError(/^Invalid format/)
})
})

176
dist/index.js generated vendored
View file

@ -325,18 +325,29 @@ class TestReporter {
const tr = await parser.parse(file, content); const tr = await parser.parse(file, content);
results.push(tr); results.push(tr);
} }
core.info(`Creating check run ${name}`);
const createResp = await this.octokit.checks.create({
head_sha: this.context.sha,
name,
status: 'in_progress',
output: {
title: name,
summary: ''
},
...github.context.repo
});
core.info('Creating report summary'); core.info('Creating report summary');
const { listSuites, listTests } = this; const { listSuites, listTests } = this;
const summary = get_report_1.getReport(results, { listSuites, listTests }); const baseUrl = createResp.data.html_url;
const summary = get_report_1.getReport(results, { listSuites, listTests, baseUrl });
core.info('Creating annotations'); core.info('Creating annotations');
const annotations = get_annotations_1.getAnnotations(results, this.maxAnnotations); const annotations = get_annotations_1.getAnnotations(results, this.maxAnnotations);
const isFailed = results.some(tr => tr.result === 'failed'); const isFailed = results.some(tr => tr.result === 'failed');
const conclusion = isFailed ? 'failure' : 'success'; const conclusion = isFailed ? 'failure' : 'success';
const icon = isFailed ? markdown_utils_1.Icon.fail : markdown_utils_1.Icon.success; const icon = isFailed ? markdown_utils_1.Icon.fail : markdown_utils_1.Icon.success;
core.info(`Creating check run with conclusion ${conclusion}`); core.info(`Updating check run conclusion (${conclusion}) and output`);
const resp = await this.octokit.checks.create({ const resp = await this.octokit.checks.update({
head_sha: this.context.sha, check_run_id: createResp.data.id,
name,
conclusion, conclusion,
status: 'completed', status: 'completed',
output: { output: {
@ -501,7 +512,10 @@ class DartJsonParser {
group.tests.sort((a, b) => { var _a, _b; return ((_a = a.testStart.test.line) !== null && _a !== void 0 ? _a : 0) - ((_b = b.testStart.test.line) !== null && _b !== void 0 ? _b : 0); }); group.tests.sort((a, b) => { var _a, _b; return ((_a = a.testStart.test.line) !== null && _a !== void 0 ? _a : 0) - ((_b = b.testStart.test.line) !== null && _b !== void 0 ? _b : 0); });
const tests = group.tests.map(tc => { const tests = group.tests.map(tc => {
const error = this.getError(suite, tc); const error = this.getError(suite, tc);
return new test_results_1.TestCaseResult(tc.testStart.test.name, tc.result, tc.time, error); const testName = group.group.name !== undefined && tc.testStart.test.name.startsWith(group.group.name)
? tc.testStart.test.name.slice(group.group.name.length).trim()
: tc.testStart.test.name.trim();
return new test_results_1.TestCaseResult(testName, tc.result, tc.time, error);
}); });
return new test_results_1.TestGroupResult(group.group.name, tests); return new test_results_1.TestGroupResult(group.group.name, tests);
}); });
@ -512,14 +526,14 @@ class DartJsonParser {
return undefined; return undefined;
} }
const { trackedFiles } = this.options; const { trackedFiles } = this.options;
const message = (_b = (_a = test.error) === null || _a === void 0 ? void 0 : _a.error) !== null && _b !== void 0 ? _b : ''; const stackTrace = (_b = (_a = test.error) === null || _a === void 0 ? void 0 : _a.stackTrace) !== null && _b !== void 0 ? _b : '';
const stackTrace = (_d = (_c = test.error) === null || _c === void 0 ? void 0 : _c.stackTrace) !== null && _d !== void 0 ? _d : '';
const print = test.print const print = test.print
.filter(p => p.messageType === 'print') .filter(p => p.messageType === 'print')
.map(p => p.message) .map(p => p.message)
.join('\n'); .join('\n');
const details = [print, stackTrace].filter(str => str !== '').join('\n'); const details = [print, stackTrace].filter(str => str !== '').join('\n');
const src = this.exceptionThrowSource(details, trackedFiles); const src = this.exceptionThrowSource(details, trackedFiles);
const message = this.getErrorMessage((_d = (_c = test.error) === null || _c === void 0 ? void 0 : _c.error) !== null && _d !== void 0 ? _d : '', print);
let path; let path;
let line; let line;
if (src !== undefined) { if (src !== undefined) {
@ -540,6 +554,19 @@ class DartJsonParser {
details details
}; };
} }
getErrorMessage(message, print) {
if (this.sdk === 'flutter') {
const uselessMessageRe = /^Test failed\. See exception logs above\.\nThe test description was:/m;
const flutterPrintRe = /^ EXCEPTION CAUGHT BY FLUTTER TEST FRAMEWORK +\s+(.*)\s+When the exception was thrown, this was the stack:/ms;
if (uselessMessageRe.test(message)) {
const match = print.match(flutterPrintRe);
if (match !== null) {
return match[1];
}
}
}
return message || print;
}
exceptionThrowSource(ex, trackedFiles) { exceptionThrowSource(ex, trackedFiles) {
const lines = ex.split(/\r?\n/g); const lines = ex.split(/\r?\n/g);
// regexp to extract file path and line number from stack trace // regexp to extract file path and line number from stack trace
@ -698,7 +725,8 @@ class DotnetTrxParser {
} }
const output = r.unitTestResult.Output; const output = r.unitTestResult.Output;
const error = (output === null || output === void 0 ? void 0 : output.length) > 0 && ((_a = output[0].ErrorInfo) === null || _a === void 0 ? void 0 : _a.length) > 0 ? output[0].ErrorInfo[0] : undefined; const error = (output === null || output === void 0 ? void 0 : output.length) > 0 && ((_a = output[0].ErrorInfo) === null || _a === void 0 ? void 0 : _a.length) > 0 ? output[0].ErrorInfo[0] : undefined;
const duration = parse_utils_1.parseNetDuration(r.unitTestResult.$.duration); const durationAttr = r.unitTestResult.$.duration;
const duration = durationAttr ? parse_utils_1.parseNetDuration(durationAttr) : 0;
const test = new Test(r.testMethod.$.name, r.unitTestResult.$.outcome, duration, error); const test = new Test(r.testMethod.$.name, r.unitTestResult.$.outcome, duration, error);
tc.tests.push(test); tc.tests.push(test);
} }
@ -1181,6 +1209,7 @@ exports.MochaJsonParser = MochaJsonParser;
Object.defineProperty(exports, "__esModule", ({ value: true })); Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.getAnnotations = void 0; exports.getAnnotations = void 0;
const markdown_utils_1 = __nccwpck_require__(6482); const markdown_utils_1 = __nccwpck_require__(6482);
const parse_utils_1 = __nccwpck_require__(7811);
function getAnnotations(results, maxCount) { function getAnnotations(results, maxCount) {
var _a, _b, _c, _d; var _a, _b, _c, _d;
if (maxCount === 0) { if (maxCount === 0) {
@ -1212,7 +1241,7 @@ function getAnnotations(results, maxCount) {
suiteName: ts.name, suiteName: ts.name,
testName: tg.name ? `${tg.name}${tc.name}` : tc.name, testName: tg.name ? `${tg.name}${tc.name}` : tc.name,
details: err.details, details: err.details,
message: (_d = (_c = err.message) !== null && _c !== void 0 ? _c : getFirstNonEmptyLine(err.details)) !== null && _d !== void 0 ? _d : 'Test failed', message: (_d = (_c = err.message) !== null && _c !== void 0 ? _c : parse_utils_1.getFirstNonEmptyLine(err.details)) !== null && _d !== void 0 ? _d : 'Test failed',
path, path,
line line
}); });
@ -1250,10 +1279,6 @@ function enforceCheckRunLimits(err) {
} }
return err; return err;
} }
function getFirstNonEmptyLine(stackTrace) {
const lines = stackTrace.split(/\r?\n/g);
return lines.find(str => !/^\s*$/.test(str));
}
function ident(text, prefix) { function ident(text, prefix) {
return text return text
.split(/\n/g) .split(/\n/g)
@ -1292,50 +1317,62 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.getReport = void 0; exports.getReport = void 0;
const core = __importStar(__nccwpck_require__(2186)); const core = __importStar(__nccwpck_require__(2186));
const markdown_utils_1 = __nccwpck_require__(6482); const markdown_utils_1 = __nccwpck_require__(6482);
const parse_utils_1 = __nccwpck_require__(7811);
const slugger_1 = __nccwpck_require__(3328); const slugger_1 = __nccwpck_require__(3328);
const MAX_REPORT_LENGTH = 65535;
const defaultOptions = { const defaultOptions = {
listSuites: 'all', listSuites: 'all',
listTests: 'all' listTests: 'all',
baseUrl: ''
}; };
function getReport(results, options = defaultOptions) { function getReport(results, options = defaultOptions) {
core.info('Generating check run summary'); core.info('Generating check run summary');
const maxReportLength = 65535;
applySort(results); applySort(results);
const opts = { ...options }; const opts = { ...options };
let report = renderReport(results, opts); let lines = renderReport(results, opts);
if (getByteLength(report) <= maxReportLength) { let report = lines.join('\n');
if (getByteLength(report) <= MAX_REPORT_LENGTH) {
return report; return report;
} }
if (opts.listTests === 'all') { if (opts.listTests === 'all') {
core.info("Test report summary is too big - setting 'listTests' to 'failed'"); core.info("Test report summary is too big - setting 'listTests' to 'failed'");
opts.listTests = 'failed'; opts.listTests = 'failed';
report = renderReport(results, opts); lines = renderReport(results, opts);
if (getByteLength(report) <= maxReportLength) { report = lines.join('\n');
if (getByteLength(report) <= MAX_REPORT_LENGTH) {
return report; return report;
} }
} }
if (opts.listSuites === 'all') { core.warning(`Test report summary exceeded limit of ${MAX_REPORT_LENGTH} bytes and will be trimmed`);
core.info("Test report summary is too big - setting 'listSuites' to 'failed'"); return trimReport(lines);
opts.listSuites = 'failed';
report = renderReport(results, opts);
if (getByteLength(report) <= maxReportLength) {
return report;
}
}
if (opts.listTests !== 'none') {
core.info("Test report summary is too big - setting 'listTests' to 'none'");
opts.listTests = 'none';
report = renderReport(results, opts);
if (getByteLength(report) <= maxReportLength) {
return report;
}
}
core.warning(`Test report summary exceeded limit of ${maxReportLength} bytes`);
const badge = getReportBadge(results);
const msg = `**Test report summary exceeded limit of ${maxReportLength} bytes and was removed**`;
return `${badge}\n${msg}`;
} }
exports.getReport = getReport; exports.getReport = getReport;
function trimReport(lines) {
const closingBlock = '```';
const errorMsg = `**Report exceeded GitHub limit of ${MAX_REPORT_LENGTH} bytes and has been trimmed**`;
const maxErrorMsgLength = closingBlock.length + errorMsg.length + 2;
const maxReportLength = MAX_REPORT_LENGTH - maxErrorMsgLength;
let reportLength = 0;
let codeBlock = false;
let endLineIndex = 0;
for (endLineIndex = 0; endLineIndex < lines.length; endLineIndex++) {
const line = lines[endLineIndex];
const lineLength = getByteLength(line);
reportLength += lineLength + 1;
if (reportLength > maxReportLength) {
break;
}
if (line === '```') {
codeBlock = !codeBlock;
}
}
const reportLines = lines.slice(0, endLineIndex);
if (codeBlock) {
reportLines.push('```');
}
reportLines.push(errorMsg);
return reportLines.join('\n');
}
function applySort(results) { function applySort(results) {
results.sort((a, b) => a.path.localeCompare(b.path)); results.sort((a, b) => a.path.localeCompare(b.path));
for (const res of results) { for (const res of results) {
@ -1351,7 +1388,7 @@ function renderReport(results, options) {
sections.push(badge); sections.push(badge);
const runs = getTestRunsReport(results, options); const runs = getTestRunsReport(results, options);
sections.push(...runs); sections.push(...runs);
return sections.join('\n'); return sections;
} }
function getReportBadge(results) { function getReportBadge(results) {
const passed = results.reduce((sum, tr) => sum + tr.passed, 0); const passed = results.reduce((sum, tr) => sum + tr.passed, 0);
@ -1388,7 +1425,7 @@ function getTestRunsReport(testRuns, options) {
const tableData = testRuns.map((tr, runIndex) => { const tableData = testRuns.map((tr, runIndex) => {
const time = markdown_utils_1.formatTime(tr.time); const time = markdown_utils_1.formatTime(tr.time);
const name = tr.path; const name = tr.path;
const addr = makeRunSlug(runIndex).link; const addr = options.baseUrl + makeRunSlug(runIndex).link;
const nameLink = markdown_utils_1.link(name, addr); const nameLink = markdown_utils_1.link(name, addr);
const passed = tr.passed > 0 ? `${tr.passed}${markdown_utils_1.Icon.success}` : ''; const passed = tr.passed > 0 ? `${tr.passed}${markdown_utils_1.Icon.success}` : '';
const failed = tr.failed > 0 ? `${tr.failed}${markdown_utils_1.Icon.fail}` : ''; const failed = tr.failed > 0 ? `${tr.failed}${markdown_utils_1.Icon.fail}` : '';
@ -1405,9 +1442,9 @@ function getTestRunsReport(testRuns, options) {
function getSuitesReport(tr, runIndex, options) { function getSuitesReport(tr, runIndex, options) {
const sections = []; const sections = [];
const trSlug = makeRunSlug(runIndex); const trSlug = makeRunSlug(runIndex);
const nameLink = `<a id="${trSlug.id}" href="${trSlug.link}">${tr.path}</a>`; const nameLink = `<a id="${trSlug.id}" href="${options.baseUrl + trSlug.link}">${tr.path}</a>`;
const icon = getResultIcon(tr.result); const icon = getResultIcon(tr.result);
sections.push(`## ${nameLink} ${icon}`); sections.push(`## ${icon}\xa0${nameLink}`);
const time = markdown_utils_1.formatTime(tr.time); const time = markdown_utils_1.formatTime(tr.time);
const headingLine2 = tr.tests > 0 const headingLine2 = tr.tests > 0
? `**${tr.tests}** tests were completed in **${time}** with **${tr.passed}** passed, **${tr.failed}** failed and **${tr.skipped}** skipped.` ? `**${tr.tests}** tests were completed in **${time}** with **${tr.passed}** passed, **${tr.failed}** failed and **${tr.skipped}** skipped.`
@ -1419,7 +1456,7 @@ function getSuitesReport(tr, runIndex, options) {
const tsTime = markdown_utils_1.formatTime(s.time); const tsTime = markdown_utils_1.formatTime(s.time);
const tsName = s.name; const tsName = s.name;
const skipLink = options.listTests === 'none' || (options.listTests === 'failed' && s.result !== 'failed'); const skipLink = options.listTests === 'none' || (options.listTests === 'failed' && s.result !== 'failed');
const tsAddr = makeSuiteSlug(runIndex, suiteIndex).link; const tsAddr = options.baseUrl + makeSuiteSlug(runIndex, suiteIndex).link;
const tsNameLink = skipLink ? tsName : markdown_utils_1.link(tsName, tsAddr); const tsNameLink = skipLink ? tsName : markdown_utils_1.link(tsName, tsAddr);
const passed = s.passed > 0 ? `${s.passed}${markdown_utils_1.Icon.success}` : ''; const passed = s.passed > 0 ? `${s.passed}${markdown_utils_1.Icon.success}` : '';
const failed = s.failed > 0 ? `${s.failed}${markdown_utils_1.Icon.fail}` : ''; const failed = s.failed > 0 ? `${s.failed}${markdown_utils_1.Icon.fail}` : '';
@ -1437,33 +1474,38 @@ function getSuitesReport(tr, runIndex, options) {
return sections; return sections;
} }
function getTestsReport(ts, runIndex, suiteIndex, options) { function getTestsReport(ts, runIndex, suiteIndex, options) {
const groups = options.listTests === 'failed' ? ts.failedGroups : ts.groups; var _a, _b, _c;
if (options.listTests === 'failed' && ts.result !== 'failed') {
return [];
}
const groups = ts.groups;
if (groups.length === 0) { if (groups.length === 0) {
return []; return [];
} }
const sections = []; const sections = [];
const tsName = ts.name; const tsName = ts.name;
const tsSlug = makeSuiteSlug(runIndex, suiteIndex); const tsSlug = makeSuiteSlug(runIndex, suiteIndex);
const tsNameLink = `<a id="${tsSlug.id}" href="${tsSlug.link}">${tsName}</a>`; const tsNameLink = `<a id="${tsSlug.id}" href="${options.baseUrl + tsSlug.link}">${tsName}</a>`;
const icon = getResultIcon(ts.result); const icon = getResultIcon(ts.result);
sections.push(`### ${tsNameLink} ${icon}`); sections.push(`### ${icon}\xa0${tsNameLink}`);
const tsTime = markdown_utils_1.formatTime(ts.time); sections.push('```');
const headingLine2 = `**${ts.tests}** tests were completed in **${tsTime}** with **${ts.passed}** passed, **${ts.failed}** failed and **${ts.skipped}** skipped.`;
sections.push(headingLine2);
for (const grp of groups) { for (const grp of groups) {
const tests = options.listTests === 'failed' ? grp.failedTests : grp.tests; if (grp.name) {
if (tests.length === 0) { sections.push(grp.name);
continue;
} }
const grpHeader = grp.name ? `\n**${grp.name}**` : ''; const space = grp.name ? ' ' : '';
const testsTable = markdown_utils_1.table(['Result', 'Test', 'Time'], [markdown_utils_1.Align.Center, markdown_utils_1.Align.Left, markdown_utils_1.Align.Right], ...grp.tests.map(tc => { for (const tc of grp.tests) {
const name = tc.name;
const time = markdown_utils_1.formatTime(tc.time);
const result = getResultIcon(tc.result); const result = getResultIcon(tc.result);
return [result, name, time]; sections.push(`${space}${result} ${tc.name}`);
})); if (tc.error) {
sections.push(grpHeader, testsTable); const lines = (_c = ((_a = tc.error.message) !== null && _a !== void 0 ? _a : (_b = parse_utils_1.getFirstNonEmptyLine(tc.error.details)) === null || _b === void 0 ? void 0 : _b.trim())) === null || _c === void 0 ? void 0 : _c.split(/\r?\n/g).map(l => '\t' + l);
if (lines) {
sections.push(...lines);
}
}
}
} }
sections.push('```');
return sections; return sections;
} }
function makeRunSlug(runIndex) { function makeRunSlug(runIndex) {
@ -1888,7 +1930,7 @@ function ellipsis(text, maxLength) {
exports.ellipsis = ellipsis; exports.ellipsis = ellipsis;
function formatTime(ms) { function formatTime(ms) {
if (ms > 1000) { if (ms > 1000) {
return `${(ms / 1000).toFixed(3)}s`; return `${Math.round(ms / 1000)}s`;
} }
return `${Math.round(ms)}ms`; return `${Math.round(ms)}ms`;
} }
@ -1938,10 +1980,9 @@ exports.getExceptionSource = getExceptionSource;
"use strict"; "use strict";
Object.defineProperty(exports, "__esModule", ({ value: true })); Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.parseIsoDate = exports.parseNetDuration = void 0; exports.getFirstNonEmptyLine = exports.parseIsoDate = exports.parseNetDuration = void 0;
function parseNetDuration(str) { function parseNetDuration(str) {
// matches dotnet duration: 00:00:00.0010000 const durationRe = /^(\d\d):(\d\d):(\d\d(?:\.\d+)?)$/;
const durationRe = /^(\d\d):(\d\d):(\d\d\.\d+)$/;
const durationMatch = str.match(durationRe); const durationMatch = str.match(durationRe);
if (durationMatch === null) { if (durationMatch === null) {
throw new Error(`Invalid format: "${str}" is not NET duration`); throw new Error(`Invalid format: "${str}" is not NET duration`);
@ -1958,6 +1999,11 @@ function parseIsoDate(str) {
return new Date(str); return new Date(str);
} }
exports.parseIsoDate = parseIsoDate; exports.parseIsoDate = parseIsoDate;
function getFirstNonEmptyLine(stackTrace) {
const lines = stackTrace.split(/\r?\n/g);
return lines.find(str => !/^\s*$/.test(str));
}
exports.getFirstNonEmptyLine = getFirstNonEmptyLine;
/***/ }), /***/ }),

2
dist/index.js.map generated vendored

File diff suppressed because one or more lines are too long

View file

@ -147,9 +147,22 @@ class TestReporter {
results.push(tr) results.push(tr)
} }
core.info(`Creating check run ${name}`)
const createResp = await this.octokit.checks.create({
head_sha: this.context.sha,
name,
status: 'in_progress',
output: {
title: name,
summary: ''
},
...github.context.repo
})
core.info('Creating report summary') core.info('Creating report summary')
const {listSuites, listTests} = this const {listSuites, listTests} = this
const summary = getReport(results, {listSuites, listTests}) const baseUrl = createResp.data.html_url
const summary = getReport(results, {listSuites, listTests, baseUrl})
core.info('Creating annotations') core.info('Creating annotations')
const annotations = getAnnotations(results, this.maxAnnotations) const annotations = getAnnotations(results, this.maxAnnotations)
@ -158,10 +171,9 @@ class TestReporter {
const conclusion = isFailed ? 'failure' : 'success' const conclusion = isFailed ? 'failure' : 'success'
const icon = isFailed ? Icon.fail : Icon.success const icon = isFailed ? Icon.fail : Icon.success
core.info(`Creating check run with conclusion ${conclusion}`) core.info(`Updating check run conclusion (${conclusion}) and output`)
const resp = await this.octokit.checks.create({ const resp = await this.octokit.checks.update({
head_sha: this.context.sha, check_run_id: createResp.data.id,
name,
conclusion, conclusion,
status: 'completed', status: 'completed',
output: { output: {

View file

@ -145,7 +145,11 @@ export class DartJsonParser implements TestParser {
group.tests.sort((a, b) => (a.testStart.test.line ?? 0) - (b.testStart.test.line ?? 0)) group.tests.sort((a, b) => (a.testStart.test.line ?? 0) - (b.testStart.test.line ?? 0))
const tests = group.tests.map(tc => { const tests = group.tests.map(tc => {
const error = this.getError(suite, tc) const error = this.getError(suite, tc)
return new TestCaseResult(tc.testStart.test.name, tc.result, tc.time, error) const testName =
group.group.name !== undefined && tc.testStart.test.name.startsWith(group.group.name)
? tc.testStart.test.name.slice(group.group.name.length).trim()
: tc.testStart.test.name.trim()
return new TestCaseResult(testName, tc.result, tc.time, error)
}) })
return new TestGroupResult(group.group.name, tests) return new TestGroupResult(group.group.name, tests)
}) })
@ -157,7 +161,6 @@ export class DartJsonParser implements TestParser {
} }
const {trackedFiles} = this.options const {trackedFiles} = this.options
const message = test.error?.error ?? ''
const stackTrace = test.error?.stackTrace ?? '' const stackTrace = test.error?.stackTrace ?? ''
const print = test.print const print = test.print
.filter(p => p.messageType === 'print') .filter(p => p.messageType === 'print')
@ -165,6 +168,7 @@ export class DartJsonParser implements TestParser {
.join('\n') .join('\n')
const details = [print, stackTrace].filter(str => str !== '').join('\n') const details = [print, stackTrace].filter(str => str !== '').join('\n')
const src = this.exceptionThrowSource(details, trackedFiles) const src = this.exceptionThrowSource(details, trackedFiles)
const message = this.getErrorMessage(test.error?.error ?? '', print)
let path let path
let line let line
@ -187,6 +191,21 @@ export class DartJsonParser implements TestParser {
} }
} }
private getErrorMessage(message: string, print: string): string {
if (this.sdk === 'flutter') {
const uselessMessageRe = /^Test failed\. See exception logs above\.\nThe test description was:/m
const flutterPrintRe = /^ EXCEPTION CAUGHT BY FLUTTER TEST FRAMEWORK +\s+(.*)\s+When the exception was thrown, this was the stack:/ms
if (uselessMessageRe.test(message)) {
const match = print.match(flutterPrintRe)
if (match !== null) {
return match[1]
}
}
}
return message || print
}
private exceptionThrowSource(ex: string, trackedFiles: string[]): {path: string; line: number} | undefined { private exceptionThrowSource(ex: string, trackedFiles: string[]): {path: string; line: number} | undefined {
const lines = ex.split(/\r?\n/g) const lines = ex.split(/\r?\n/g)

View file

@ -87,7 +87,9 @@ export class DotnetTrxParser implements TestParser {
} }
const output = r.unitTestResult.Output const output = r.unitTestResult.Output
const error = output?.length > 0 && output[0].ErrorInfo?.length > 0 ? output[0].ErrorInfo[0] : undefined const error = output?.length > 0 && output[0].ErrorInfo?.length > 0 ? output[0].ErrorInfo[0] : undefined
const duration = parseNetDuration(r.unitTestResult.$.duration) const durationAttr = r.unitTestResult.$.duration
const duration = durationAttr ? parseNetDuration(durationAttr) : 0
const test = new Test(r.testMethod.$.name, r.unitTestResult.$.outcome, duration, error) const test = new Test(r.testMethod.$.name, r.unitTestResult.$.outcome, duration, error)
tc.tests.push(test) tc.tests.push(test)
} }

View file

@ -43,7 +43,7 @@ export interface UnitTestResult {
$: { $: {
testId: string testId: string
testName: string testName: string
duration: string duration?: string
outcome: Outcome outcome: Outcome
} }
Output: Output[] Output: Output[]

View file

@ -1,5 +1,6 @@
import {ellipsis, fixEol} from '../utils/markdown-utils' import {ellipsis, fixEol} from '../utils/markdown-utils'
import {TestRunResult} from '../test-results' import {TestRunResult} from '../test-results'
import {getFirstNonEmptyLine} from '../utils/parse-utils'
type Annotation = { type Annotation = {
path: string path: string
@ -98,11 +99,6 @@ function enforceCheckRunLimits(err: Annotation): Annotation {
return err return err
} }
function getFirstNonEmptyLine(stackTrace: string): string | undefined {
const lines = stackTrace.split(/\r?\n/g)
return lines.find(str => !/^\s*$/.test(str))
}
function ident(text: string, prefix: string): string { function ident(text: string, prefix: string): string {
return text return text
.split(/\n/g) .split(/\n/g)

View file

@ -1,61 +1,79 @@
import * as core from '@actions/core' import * as core from '@actions/core'
import {TestExecutionResult, TestRunResult, TestSuiteResult} from '../test-results' import {TestExecutionResult, TestRunResult, TestSuiteResult} from '../test-results'
import {Align, formatTime, Icon, link, table} from '../utils/markdown-utils' import {Align, formatTime, Icon, link, table} from '../utils/markdown-utils'
import {getFirstNonEmptyLine} from '../utils/parse-utils'
import {slug} from '../utils/slugger' import {slug} from '../utils/slugger'
const MAX_REPORT_LENGTH = 65535
export interface ReportOptions { export interface ReportOptions {
listSuites: 'all' | 'failed' listSuites: 'all' | 'failed'
listTests: 'all' | 'failed' | 'none' listTests: 'all' | 'failed' | 'none'
baseUrl: string
} }
const defaultOptions: ReportOptions = { const defaultOptions: ReportOptions = {
listSuites: 'all', listSuites: 'all',
listTests: 'all' listTests: 'all',
baseUrl: ''
} }
export function getReport(results: TestRunResult[], options: ReportOptions = defaultOptions): string { export function getReport(results: TestRunResult[], options: ReportOptions = defaultOptions): string {
core.info('Generating check run summary') core.info('Generating check run summary')
const maxReportLength = 65535
applySort(results) applySort(results)
const opts = {...options} const opts = {...options}
let report = renderReport(results, opts) let lines = renderReport(results, opts)
if (getByteLength(report) <= maxReportLength) { let report = lines.join('\n')
if (getByteLength(report) <= MAX_REPORT_LENGTH) {
return report return report
} }
if (opts.listTests === 'all') { if (opts.listTests === 'all') {
core.info("Test report summary is too big - setting 'listTests' to 'failed'") core.info("Test report summary is too big - setting 'listTests' to 'failed'")
opts.listTests = 'failed' opts.listTests = 'failed'
report = renderReport(results, opts) lines = renderReport(results, opts)
if (getByteLength(report) <= maxReportLength) { report = lines.join('\n')
if (getByteLength(report) <= MAX_REPORT_LENGTH) {
return report return report
} }
} }
if (opts.listSuites === 'all') { core.warning(`Test report summary exceeded limit of ${MAX_REPORT_LENGTH} bytes and will be trimmed`)
core.info("Test report summary is too big - setting 'listSuites' to 'failed'") return trimReport(lines)
opts.listSuites = 'failed' }
report = renderReport(results, opts)
if (getByteLength(report) <= maxReportLength) { function trimReport(lines: string[]): string {
return report const closingBlock = '```'
const errorMsg = `**Report exceeded GitHub limit of ${MAX_REPORT_LENGTH} bytes and has been trimmed**`
const maxErrorMsgLength = closingBlock.length + errorMsg.length + 2
const maxReportLength = MAX_REPORT_LENGTH - maxErrorMsgLength
let reportLength = 0
let codeBlock = false
let endLineIndex = 0
for (endLineIndex = 0; endLineIndex < lines.length; endLineIndex++) {
const line = lines[endLineIndex]
const lineLength = getByteLength(line)
reportLength += lineLength + 1
if (reportLength > maxReportLength) {
break
}
if (line === '```') {
codeBlock = !codeBlock
} }
} }
if (opts.listTests !== 'none') { const reportLines = lines.slice(0, endLineIndex)
core.info("Test report summary is too big - setting 'listTests' to 'none'") if (codeBlock) {
opts.listTests = 'none' reportLines.push('```')
report = renderReport(results, opts)
if (getByteLength(report) <= maxReportLength) {
return report
}
} }
reportLines.push(errorMsg)
core.warning(`Test report summary exceeded limit of ${maxReportLength} bytes`) return reportLines.join('\n')
const badge = getReportBadge(results)
const msg = `**Test report summary exceeded limit of ${maxReportLength} bytes and was removed**`
return `${badge}\n${msg}`
} }
function applySort(results: TestRunResult[]): void { function applySort(results: TestRunResult[]): void {
@ -69,7 +87,7 @@ function getByteLength(text: string): number {
return Buffer.byteLength(text, 'utf8') return Buffer.byteLength(text, 'utf8')
} }
function renderReport(results: TestRunResult[], options: ReportOptions): string { function renderReport(results: TestRunResult[], options: ReportOptions): string[] {
const sections: string[] = [] const sections: string[] = []
const badge = getReportBadge(results) const badge = getReportBadge(results)
sections.push(badge) sections.push(badge)
@ -77,7 +95,7 @@ function renderReport(results: TestRunResult[], options: ReportOptions): string
const runs = getTestRunsReport(results, options) const runs = getTestRunsReport(results, options)
sections.push(...runs) sections.push(...runs)
return sections.join('\n') return sections
} }
function getReportBadge(results: TestRunResult[]): string { function getReportBadge(results: TestRunResult[]): string {
@ -118,7 +136,7 @@ function getTestRunsReport(testRuns: TestRunResult[], options: ReportOptions): s
const tableData = testRuns.map((tr, runIndex) => { const tableData = testRuns.map((tr, runIndex) => {
const time = formatTime(tr.time) const time = formatTime(tr.time)
const name = tr.path const name = tr.path
const addr = makeRunSlug(runIndex).link const addr = options.baseUrl + makeRunSlug(runIndex).link
const nameLink = link(name, addr) const nameLink = link(name, addr)
const passed = tr.passed > 0 ? `${tr.passed}${Icon.success}` : '' const passed = tr.passed > 0 ? `${tr.passed}${Icon.success}` : ''
const failed = tr.failed > 0 ? `${tr.failed}${Icon.fail}` : '' const failed = tr.failed > 0 ? `${tr.failed}${Icon.fail}` : ''
@ -143,9 +161,9 @@ function getSuitesReport(tr: TestRunResult, runIndex: number, options: ReportOpt
const sections: string[] = [] const sections: string[] = []
const trSlug = makeRunSlug(runIndex) const trSlug = makeRunSlug(runIndex)
const nameLink = `<a id="${trSlug.id}" href="${trSlug.link}">${tr.path}</a>` const nameLink = `<a id="${trSlug.id}" href="${options.baseUrl + trSlug.link}">${tr.path}</a>`
const icon = getResultIcon(tr.result) const icon = getResultIcon(tr.result)
sections.push(`## ${nameLink} ${icon}`) sections.push(`## ${icon}\xa0${nameLink}`)
const time = formatTime(tr.time) const time = formatTime(tr.time)
const headingLine2 = const headingLine2 =
@ -163,7 +181,7 @@ function getSuitesReport(tr: TestRunResult, runIndex: number, options: ReportOpt
const tsTime = formatTime(s.time) const tsTime = formatTime(s.time)
const tsName = s.name const tsName = s.name
const skipLink = options.listTests === 'none' || (options.listTests === 'failed' && s.result !== 'failed') const skipLink = options.listTests === 'none' || (options.listTests === 'failed' && s.result !== 'failed')
const tsAddr = makeSuiteSlug(runIndex, suiteIndex).link const tsAddr = options.baseUrl + makeSuiteSlug(runIndex, suiteIndex).link
const tsNameLink = skipLink ? tsName : link(tsName, tsAddr) const tsNameLink = skipLink ? tsName : link(tsName, tsAddr)
const passed = s.passed > 0 ? `${s.passed}${Icon.success}` : '' const passed = s.passed > 0 ? `${s.passed}${Icon.success}` : ''
const failed = s.failed > 0 ? `${s.failed}${Icon.fail}` : '' const failed = s.failed > 0 ? `${s.failed}${Icon.fail}` : ''
@ -186,7 +204,10 @@ function getSuitesReport(tr: TestRunResult, runIndex: number, options: ReportOpt
} }
function getTestsReport(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 (options.listTests === 'failed' && ts.result !== 'failed') {
return []
}
const groups = ts.groups
if (groups.length === 0) { if (groups.length === 0) {
return [] return []
} }
@ -195,33 +216,30 @@ function getTestsReport(ts: TestSuiteResult, runIndex: number, suiteIndex: numbe
const tsName = ts.name const tsName = ts.name
const tsSlug = makeSuiteSlug(runIndex, suiteIndex) const tsSlug = makeSuiteSlug(runIndex, suiteIndex)
const tsNameLink = `<a id="${tsSlug.id}" href="${tsSlug.link}">${tsName}</a>` const tsNameLink = `<a id="${tsSlug.id}" href="${options.baseUrl + tsSlug.link}">${tsName}</a>`
const icon = getResultIcon(ts.result) const icon = getResultIcon(ts.result)
sections.push(`### ${tsNameLink} ${icon}`) sections.push(`### ${icon}\xa0${tsNameLink}`)
const tsTime = formatTime(ts.time)
const headingLine2 = `**${ts.tests}** tests were completed in **${tsTime}** with **${ts.passed}** passed, **${ts.failed}** failed and **${ts.skipped}** skipped.`
sections.push(headingLine2)
sections.push('```')
for (const grp of groups) { for (const grp of groups) {
const tests = options.listTests === 'failed' ? grp.failedTests : grp.tests if (grp.name) {
if (tests.length === 0) { sections.push(grp.name)
continue }
const space = grp.name ? ' ' : ''
for (const tc of grp.tests) {
const result = getResultIcon(tc.result)
sections.push(`${space}${result} ${tc.name}`)
if (tc.error) {
const lines = (tc.error.message ?? getFirstNonEmptyLine(tc.error.details)?.trim())
?.split(/\r?\n/g)
.map(l => '\t' + l)
if (lines) {
sections.push(...lines)
}
}
} }
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)
} }
sections.push('```')
return sections return sections
} }

View file

@ -41,7 +41,7 @@ export function ellipsis(text: string, maxLength: number): string {
export function formatTime(ms: number): string { export function formatTime(ms: number): string {
if (ms > 1000) { if (ms > 1000) {
return `${(ms / 1000).toFixed(3)}s` return `${Math.round(ms / 1000)}s`
} }
return `${Math.round(ms)}ms` return `${Math.round(ms)}ms`

View file

@ -1,6 +1,5 @@
export function parseNetDuration(str: string): number { export function parseNetDuration(str: string): number {
// matches dotnet duration: 00:00:00.0010000 const durationRe = /^(\d\d):(\d\d):(\d\d(?:\.\d+)?)$/
const durationRe = /^(\d\d):(\d\d):(\d\d\.\d+)$/
const durationMatch = str.match(durationRe) const durationMatch = str.match(durationRe)
if (durationMatch === null) { if (durationMatch === null) {
throw new Error(`Invalid format: "${str}" is not NET duration`) throw new Error(`Invalid format: "${str}" is not NET duration`)
@ -18,3 +17,8 @@ export function parseIsoDate(str: string): Date {
return new Date(str) return new Date(str)
} }
export function getFirstNonEmptyLine(stackTrace: string): string | undefined {
const lines = stackTrace.split(/\r?\n/g)
return lines.find(str => !/^\s*$/.test(str))
}