New report rendering with code blocks instead of tables

Previously we listed tests using markdown tables. Each test group had it's own table and textual preface saying how many tests were executed in what time.
This was completely reworked - now tests are listed inside code block. Grouping is achieved using simple indentation. Duration of individual tests is no longer shown - it produced too much "noise" in the report. Pass/Fail check-mark was also moved before name of test suite.
Behavior of "listTests" option was also changed - now if set to failed, it will list all tests, but only if suite is failed. Otherwise test listing is completely omitted.
Last change affects report trimming - if report is still too big after "listTests" is set to "failed" - it will trim report to fit max size and add informational message at the end.
This commit is contained in:
Michal Dorner 2021-03-31 21:49:53 +02:00
parent 96df6db61e
commit 690ec77880
No known key found for this signature in database
GPG key ID: 9EEE04B48DA36786
13 changed files with 3292 additions and 1046 deletions

View file

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

View file

@ -1,18 +1,21 @@
![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>
**7** tests were completed in **1.061s** with **3** passed, **3** failed and **1** skipped.
## <a id="user-content-r0" href="#r0">fixtures/dotnet-trx.trx</a>
**7** tests were completed in **1s** with **3** passed, **3** failed and **1** skipped.
|Test suite|Passed|Failed|Skipped|Time|
|:---|---:|---:|---:|---:|
|[DotnetTests.XUnitTests.CalculatorTests](#r0s0)|3✔|3❌|1✖|110ms|
### <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.
|Result|Test|Time|
|:---:|:---|---:|
|❌|Exception_In_TargetTest|0ms|
|❌|Exception_In_Test|2ms|
|❌|Failing_Test|3ms|
|✔️|Passing_Test|0ms|
|✔️|Passing_Test_With_Name|0ms|
|✖️|Skipped_Test|1ms|
|✔️|Timeout_Test|102ms|
### ❌ <a id="user-content-r0s0" href="#r0s0">DotnetTests.XUnitTests.CalculatorTests</a>
```
❌ Exception_In_TargetTest
System.DivideByZeroException : Attempted to divide by zero.
❌ Exception_In_Test
System.Exception : Test
❌ Failing_Test
Assert.Equal() Failure
Expected: 3
Actual: 2
✔️ Passing_Test
✔️ 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)
## <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.
## <a id="user-content-r0" href="#r0">fixtures/jest-junit.xml</a>
**6** tests were completed in **1s** with **1** passed, **4** failed and **1** skipped.
|Test suite|Passed|Failed|Skipped|Time|
|:---|---:|---:|---:|---:|
|[__tests__\main.test.js](#r0s0)|1✔|3❌||486ms|
|[__tests__\second.test.js](#r0s1)||1❌|1✖|82ms|
### <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**
|Result|Test|Time|
|:---:|:---|---:|
|✔️|Passing test|1ms|
**Test 1 Test 1.1**
|Result|Test|Time|
|:---:|:---|---:|
|❌|Failing test|2ms|
|❌|Exception in target unit|0ms|
**Test 2**
|Result|Test|Time|
|:---:|:---|---:|
|❌|Exception in test|0ms|
### <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|
### ❌ <a id="user-content-r0s0" href="#r0s0">__tests__\main.test.js</a>
```
Test 1
✔️ Passing test
Test 1 Test 1.1
❌ Failing test
Error: expect(received).toBeTruthy()
❌ Exception in target unit
Error: Some error
Test 2
❌ Exception in test
Error: Some error
```
### ❌ <a id="user-content-r0s1" href="#r0s1">__tests__\second.test.js</a>
```
❌ 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:
✖️ Skipped test
```

View file

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

View file

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

View file

@ -1,13 +1,12 @@
![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.
|Test suite|Passed|Failed|Skipped|Time|
|:---|---:|---:|---:|---:|
|[org.apache.pulsar.AddMissingPatchVersionTest](#r0s0)||1❌|1✖|116ms|
### <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.
|Result|Test|Time|
|:---:|:---|---:|
|✖️|testVersionStrings|99ms|
|❌|testVersionStrings|17ms|
### ❌ <a id="user-content-r0s0" href="#r0s0">org.apache.pulsar.AddMissingPatchVersionTest</a>
```
✖️ testVersionStrings
❌ testVersionStrings
java.lang.AssertionError: expected [1.2.1] but found [1.2.0]
```

File diff suppressed because it is too large Load diff

116
dist/index.js generated vendored
View file

@ -1111,6 +1111,7 @@ exports.JestJunitParser = JestJunitParser;
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.getAnnotations = void 0;
const markdown_utils_1 = __nccwpck_require__(6482);
const parse_utils_1 = __nccwpck_require__(7811);
function getAnnotations(results, maxCount) {
var _a, _b, _c, _d;
if (maxCount === 0) {
@ -1142,7 +1143,7 @@ function getAnnotations(results, maxCount) {
suiteName: ts.name,
testName: tc.name,
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,
line
});
@ -1180,10 +1181,6 @@ function enforceCheckRunLimits(err) {
}
return err;
}
function getFirstNonEmptyLine(stackTrace) {
const lines = stackTrace.split(/\r?\n/g);
return lines.find(str => !/^\s*$/.test(str));
}
function ident(text, prefix) {
return text
.split(/\n/g)
@ -1222,50 +1219,61 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.getReport = void 0;
const core = __importStar(__nccwpck_require__(2186));
const markdown_utils_1 = __nccwpck_require__(6482);
const parse_utils_1 = __nccwpck_require__(7811);
const slugger_1 = __nccwpck_require__(3328);
const MAX_REPORT_LENGTH = 65535;
const defaultOptions = {
listSuites: 'all',
listTests: 'all'
};
function getReport(results, options = defaultOptions) {
core.info('Generating check run summary');
const maxReportLength = 65535;
applySort(results);
const opts = { ...options };
let report = renderReport(results, opts);
if (getByteLength(report) <= maxReportLength) {
let lines = renderReport(results, opts);
let report = lines.join('\n');
if (getByteLength(report) <= MAX_REPORT_LENGTH) {
return report;
}
if (opts.listTests === 'all') {
core.info("Test report summary is too big - setting 'listTests' to 'failed'");
opts.listTests = 'failed';
report = renderReport(results, opts);
if (getByteLength(report) <= maxReportLength) {
lines = renderReport(results, opts);
report = lines.join('\n');
if (getByteLength(report) <= MAX_REPORT_LENGTH) {
return report;
}
}
if (opts.listSuites === 'all') {
core.info("Test report summary is too big - setting 'listSuites' to 'failed'");
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}`;
core.warning(`Test report summary exceeded limit of ${MAX_REPORT_LENGTH} bytes and will be trimmed`);
return trimReport(lines);
}
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) {
results.sort((a, b) => a.path.localeCompare(b.path));
for (const res of results) {
@ -1281,7 +1289,7 @@ function renderReport(results, options) {
sections.push(badge);
const runs = getTestRunsReport(results, options);
sections.push(...runs);
return sections.join('\n');
return sections;
}
function getReportBadge(results) {
const passed = results.reduce((sum, tr) => sum + tr.passed, 0);
@ -1337,7 +1345,7 @@ function getSuitesReport(tr, runIndex, options) {
const trSlug = makeRunSlug(runIndex);
const nameLink = `<a id="${trSlug.id}" href="${trSlug.link}">${tr.path}</a>`;
const icon = getResultIcon(tr.result);
sections.push(`## ${nameLink} ${icon}`);
sections.push(`## ${icon} ${nameLink}`);
const time = markdown_utils_1.formatTime(tr.time);
const headingLine2 = tr.tests > 0
? `**${tr.tests}** tests were completed in **${time}** with **${tr.passed}** passed, **${tr.failed}** failed and **${tr.skipped}** skipped.`
@ -1367,7 +1375,11 @@ function getSuitesReport(tr, runIndex, options) {
return sections;
}
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) {
return [];
}
@ -1376,24 +1388,25 @@ function getTestsReport(ts, runIndex, suiteIndex, options) {
const tsSlug = makeSuiteSlug(runIndex, suiteIndex);
const tsNameLink = `<a id="${tsSlug.id}" href="${tsSlug.link}">${tsName}</a>`;
const icon = getResultIcon(ts.result);
sections.push(`### ${tsNameLink} ${icon}`);
const tsTime = markdown_utils_1.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(`### ${icon} ${tsNameLink}`);
sections.push('```');
for (const grp of groups) {
const tests = options.listTests === 'failed' ? grp.failedTests : grp.tests;
if (tests.length === 0) {
continue;
if (grp.name) {
sections.push(grp.name);
}
const grpHeader = grp.name ? `\n**${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 => {
const name = tc.name;
const time = markdown_utils_1.formatTime(tc.time);
const space = grp.name ? ' ' : '';
for (const tc of grp.tests) {
const result = getResultIcon(tc.result);
return [result, name, time];
}));
sections.push(grpHeader, testsTable);
sections.push(`${space}${result} ${tc.name}`);
if (tc.error) {
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;
}
function makeRunSlug(runIndex) {
@ -1799,7 +1812,7 @@ function ellipsis(text, maxLength) {
exports.ellipsis = ellipsis;
function formatTime(ms) {
if (ms > 1000) {
return `${(ms / 1000).toFixed(3)}s`;
return `${Math.round(ms / 1000)}s`;
}
return `${Math.round(ms)}ms`;
}
@ -1814,7 +1827,7 @@ exports.formatTime = formatTime;
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.parseIsoDate = exports.parseNetDuration = void 0;
exports.getFirstNonEmptyLine = exports.parseIsoDate = exports.parseNetDuration = void 0;
function parseNetDuration(str) {
const durationRe = /^(\d\d):(\d\d):(\d\d(?:\.\d+)?)$/;
const durationMatch = str.match(durationRe);
@ -1833,6 +1846,11 @@ function parseIsoDate(str) {
return new Date(str);
}
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

@ -1,5 +1,6 @@
import {ellipsis, fixEol} from '../utils/markdown-utils'
import {TestRunResult} from '../test-results'
import {getFirstNonEmptyLine} from '../utils/parse-utils'
type Annotation = {
path: string
@ -98,11 +99,6 @@ function enforceCheckRunLimits(err: Annotation): Annotation {
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 {
return text
.split(/\n/g)

View file

@ -1,8 +1,11 @@
import * as core from '@actions/core'
import {TestExecutionResult, TestRunResult, TestSuiteResult} from '../test-results'
import {Align, formatTime, Icon, link, table} from '../utils/markdown-utils'
import {getFirstNonEmptyLine} from '../utils/parse-utils'
import {slug} from '../utils/slugger'
const MAX_REPORT_LENGTH = 65535
export interface ReportOptions {
listSuites: 'all' | 'failed'
listTests: 'all' | 'failed' | 'none'
@ -16,46 +19,59 @@ const defaultOptions: ReportOptions = {
export function getReport(results: TestRunResult[], options: ReportOptions = defaultOptions): string {
core.info('Generating check run summary')
const maxReportLength = 65535
applySort(results)
const opts = {...options}
let report = renderReport(results, opts)
if (getByteLength(report) <= maxReportLength) {
let lines = renderReport(results, opts)
let report = lines.join('\n')
if (getByteLength(report) <= MAX_REPORT_LENGTH) {
return report
}
if (opts.listTests === 'all') {
core.info("Test report summary is too big - setting 'listTests' to 'failed'")
opts.listTests = 'failed'
report = renderReport(results, opts)
if (getByteLength(report) <= maxReportLength) {
lines = renderReport(results, opts)
report = lines.join('\n')
if (getByteLength(report) <= MAX_REPORT_LENGTH) {
return report
}
}
if (opts.listSuites === 'all') {
core.info("Test report summary is too big - setting 'listSuites' to 'failed'")
opts.listSuites = 'failed'
report = renderReport(results, opts)
if (getByteLength(report) <= maxReportLength) {
return report
core.warning(`Test report summary exceeded limit of ${MAX_REPORT_LENGTH} bytes and will be trimmed`)
return trimReport(lines)
}
function trimReport(lines: string[]): string {
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') {
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
}
const reportLines = lines.slice(0, endLineIndex)
if (codeBlock) {
reportLines.push('```')
}
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}`
reportLines.push(errorMsg)
return reportLines.join('\n')
}
function applySort(results: TestRunResult[]): void {
@ -69,7 +85,7 @@ function getByteLength(text: string): number {
return Buffer.byteLength(text, 'utf8')
}
function renderReport(results: TestRunResult[], options: ReportOptions): string {
function renderReport(results: TestRunResult[], options: ReportOptions): string[] {
const sections: string[] = []
const badge = getReportBadge(results)
sections.push(badge)
@ -77,7 +93,7 @@ function renderReport(results: TestRunResult[], options: ReportOptions): string
const runs = getTestRunsReport(results, options)
sections.push(...runs)
return sections.join('\n')
return sections
}
function getReportBadge(results: TestRunResult[]): string {
@ -145,7 +161,7 @@ function getSuitesReport(tr: TestRunResult, runIndex: number, options: ReportOpt
const trSlug = makeRunSlug(runIndex)
const nameLink = `<a id="${trSlug.id}" href="${trSlug.link}">${tr.path}</a>`
const icon = getResultIcon(tr.result)
sections.push(`## ${nameLink} ${icon}`)
sections.push(`## ${icon} ${nameLink}`)
const time = formatTime(tr.time)
const headingLine2 =
@ -186,7 +202,10 @@ function getSuitesReport(tr: TestRunResult, runIndex: number, options: ReportOpt
}
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) {
return []
}
@ -197,31 +216,28 @@ function getTestsReport(ts: TestSuiteResult, runIndex: number, suiteIndex: numbe
const tsSlug = makeSuiteSlug(runIndex, suiteIndex)
const tsNameLink = `<a id="${tsSlug.id}" href="${tsSlug.link}">${tsName}</a>`
const icon = getResultIcon(ts.result)
sections.push(`### ${tsNameLink} ${icon}`)
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(`### ${icon} ${tsNameLink}`)
sections.push('```')
for (const grp of groups) {
const tests = options.listTests === 'failed' ? grp.failedTests : grp.tests
if (tests.length === 0) {
continue
if (grp.name) {
sections.push(grp.name)
}
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
}

View file

@ -17,3 +17,8 @@ export function parseIsoDate(str: string): Date {
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))
}