diff --git a/.github/workflows/check-dist.yml b/.github/workflows/check-dist.yml index e571511..c994dfa 100644 --- a/.github/workflows/check-dist.yml +++ b/.github/workflows/check-dist.yml @@ -21,10 +21,10 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Set Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version-file: '.nvmrc' @@ -46,7 +46,7 @@ jobs: id: diff # If index.js was different than expected, upload the expected version as an artifact - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v5 if: ${{ failure() && steps.diff.conclusion == 'failure' }} with: name: dist diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a8a86e4..aeec96d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,8 +13,8 @@ jobs: name: Build & Test runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 + - uses: actions/checkout@v6 + - uses: actions/setup-node@v6 with: node-version-file: '.nvmrc' - run: npm ci @@ -24,8 +24,8 @@ jobs: - run: npm test - name: Upload test results - if: success() || failure() - uses: actions/upload-artifact@v4 + if: ${{ !cancelled() }} + uses: actions/upload-artifact@v5 with: name: test-results path: __tests__/__results__/*.xml diff --git a/.github/workflows/manual-run.yml b/.github/workflows/manual-run.yml index f8b1ee0..c1875a9 100644 --- a/.github/workflows/manual-run.yml +++ b/.github/workflows/manual-run.yml @@ -8,14 +8,14 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - run: npm ci - run: npm run build - run: npm test - name: Create test report uses: ./ - if: success() || failure() + if: ${{ !cancelled() }} with: name: JEST Tests path: __tests__/__results__/*.xml diff --git a/.github/workflows/test-report.yml b/.github/workflows/test-report.yml index e3f9555..11b266a 100644 --- a/.github/workflows/test-report.yml +++ b/.github/workflows/test-report.yml @@ -11,7 +11,7 @@ jobs: name: Workflow test runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - uses: ./ with: artifact: test-results diff --git a/.markdownlint.json b/.markdownlint.json new file mode 100644 index 0000000..3f71d87 --- /dev/null +++ b/.markdownlint.json @@ -0,0 +1,13 @@ +{ + "blanks-around-headings": false, + "blanks-around-lists": false, + "blanks-around-tables": false, + "blanks-around-fences": false, + "no-bare-urls": false, + "line-length": false, + "ul-style": false, + "no-inline-html": false, + "no-multiple-blanks": { + "maximum": 3 + } +} diff --git a/CHANGELOG.md b/CHANGELOG.md index 69c93a4..b0badd5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,38 @@ # Changelog +## 2.3.0 +* Feature: Add Python support with `python-xunit` reporter (pytest) https://github.com/dorny/test-reporter/pull/643 +* Feature: Add pytest traceback parsing and `directory-mapping` option https://github.com/dorny/test-reporter/pull/238 +* Performance: Update sax.js to fix large XML file parsing https://github.com/dorny/test-reporter/pull/681 +* Documentation: Complete documentation for all supported reporters https://github.com/dorny/test-reporter/pull/691 +* Security: Bump js-yaml and mocha in /reports/mocha (fixes prototype pollution) https://github.com/dorny/test-reporter/pull/682 + +## 2.2.0 +* Feature: Add collapsed option to control report summary visibility https://github.com/dorny/test-reporter/pull/664 +* Fix badge encoding for values including underscore and hyphens https://github.com/dorny/test-reporter/pull/672 +* Fix missing `report-title` attribute in action definition https://github.com/dorny/test-reporter/pull/637 +* Refactor variable names to fix shadowing issues https://github.com/dorny/test-reporter/pull/630 + +## 2.1.1 +* Fix error when a TestMethod element does not have a className attribute in a trx file https://github.com/dorny/test-reporter/pull/623 +* Add stack trace from trx to summary https://github.com/dorny/test-reporter/pull/615 +* List only failed tests https://github.com/dorny/test-reporter/pull/606 +* Add type definitions to `github-utils.ts` https://github.com/dorny/test-reporter/pull/604 +* Avoid split on undefined https://github.com/dorny/test-reporter/pull/258 +* Return links to summary report https://github.com/dorny/test-reporter/pull/588 +* Add step summary short summary https://github.com/dorny/test-reporter/pull/589 +* Fix for empty TRX TestDefinitions https://github.com/dorny/test-reporter/pull/582 +* Increase step summary limit to 1MiB https://github.com/dorny/test-reporter/pull/581 +* Fix input description for list options https://github.com/dorny/test-reporter/pull/572 + +## 2.1.0 +* Feature: Add summary title https://github.com/dorny/test-reporter/pull/568 +* Feature: Add Golang test parser https://github.com/dorny/test-reporter/pull/571 +* Increase step summary limit to 1MiB https://github.com/dorny/test-reporter/pull/581 +* Fix for empty TRX TestDefinitions https://github.com/dorny/test-reporter/pull/582 +* Fix input description for list options https://github.com/dorny/test-reporter/pull/572 +* Update npm packages https://github.com/dorny/test-reporter/pull/583 + ## 2.0.0 * Parse JUnit report with detailed message in failure https://github.com/dorny/test-reporter/pull/559 * Support displaying test results in markdown using GitHub Actions Job Summaries https://github.com/dorny/test-reporter/pull/383 diff --git a/README.md b/README.md index 3f8afbe..d900926 100644 --- a/README.md +++ b/README.md @@ -9,15 +9,18 @@ This [Github Action](https://github.com/features/actions) displays test results ✔️ Provides final `conclusion` and counts of `passed`, `failed` and `skipped` tests as output parameters **How it looks:** -|![](assets/fluent-validation-report.png)|![](assets/provider-error-summary.png)|![](assets/provider-error-details.png)|![](assets/mocha-groups.png)| +|![Summary showing test run with all tests passed, including details such as test file names, number of passed, failed, and skipped tests, and execution times. The interface is dark-themed and displays a green badge indicating 3527 passed and 4 skipped tests.](assets/fluent-validation-report.png)|![Summary showing test run with a failed unit test. The summary uses a dark background and highlights errors in red for quick identification.](assets/provider-error-summary.png)|![GitHub Actions annotation showing details of a failed unit test with a detailed error message, stack trace, and code annotation.](assets/provider-error-details.png)|![Test cases written in Mocha framework with a list of expectations for each test case. The table format and color-coded badges help users quickly assess test suite health.](assets/mocha-groups.png)| |:--:|:--:|:--:|:--:| **Supported languages / frameworks:** - .NET / [dotnet test](https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-test#examples) ( [xUnit](https://xunit.net/) / [NUnit](https://nunit.org/) / [MSTest](https://github.com/Microsoft/testfx-docs) ) - Dart / [test](https://pub.dev/packages/test) - Flutter / [test](https://pub.dev/packages/test) +- Go / [go test](https://pkg.go.dev/testing) - Java / [JUnit](https://junit.org/) - JavaScript / [JEST](https://jestjs.io/) / [Mocha](https://mochajs.org/) +- Python / [pytest](https://docs.pytest.org/en/stable/) / [unittest](https://docs.python.org/3/library/unittest.html) +- Ruby / [RSpec](https://rspec.info/) - Swift / xUnit For more information see [Supported formats](#supported-formats) section. @@ -49,7 +52,7 @@ jobs: - name: Test Report uses: dorny/test-reporter@v2 - if: success() || failure() # run this step even if previous step failed + if: ${{ !cancelled() }} # run this step even if previous step failed with: name: JEST Tests # Name of the check run which will be created path: reports/jest-*.xml # Path to test results @@ -78,7 +81,7 @@ jobs: - run: npm ci # install packages - run: npm test # run tests (configured to use jest-junit reporter) - uses: actions/upload-artifact@v4 # upload test results - if: success() || failure() # run this step even if previous step failed + if: ${{ !cancelled() }} # run this step even if previous step failed with: name: test-results path: jest-junit.xml @@ -140,10 +143,13 @@ jobs: # dotnet-nunit # dotnet-trx # flutter-json + # golang-json # java-junit # jest-junit # mocha-json + # python-xunit # rspec-json + # swift-xunit reporter: '' # Allows you to generate only the summary. @@ -154,6 +160,11 @@ jobs: # Allows you to generate reports for Actions Summary # https://github.blog/2022-05-09-supercharging-github-actions-with-job-summaries/ use-actions-summary: 'true' + + # Optionally specify a title (Heading level 1) for the report. Leading and trailing whitespace are ignored. + # This is useful for separating your test report from other sections in the build summary. + # If omitted or set to whitespace/empty, no title will be printed. + report-title: '' # Customize the title of badges shown for each Actions Summary. # Useful when distinguish summaries for tests ran in multiple Actions steps. @@ -246,6 +257,20 @@ Supported testing frameworks: For more information see [dotnet test](https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-test#examples) +
+ dotnet-nunit + +Test execution must be configured to generate [NUnit3](https://docs.nunit.org/articles/nunit/technical-notes/usage/Test-Result-XML-Format.html) XML test results. +Install the [NUnit3TestAdapter](https://www.nuget.org/packages/NUnit3TestAdapter) package (required; it registers the `nunit` logger for `dotnet test`), then run tests with: + +`dotnet test --logger "nunit;LogFileName=test-results.xml"` + +Supported testing frameworks: +- [NUnit](https://nunit.org/) + +For more information see [dotnet test](https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-test#examples) +
+
flutter-json @@ -273,6 +298,13 @@ For more information see:
+
+ golang-json + +You must use the `-json` flag and output the results to a file (ex: `go test -json > testresults.json`) + +
+
java-junit (Experimental) @@ -335,6 +367,41 @@ Before version [v9.1.0](https://github.com/mochajs/mocha/releases/tag/v9.1.0), M Please update Mocha to version [v9.1.0](https://github.com/mochajs/mocha/releases/tag/v9.1.0) or above if you encounter this issue.
+
+ python-xunit (Experimental) + +Support for Python test results in xUnit format is experimental - should work but it was not extensively tested. + +For **pytest** support, configure [JUnit XML output](https://docs.pytest.org/en/stable/how-to/output.html#creating-junitxml-format-files) and run with the `--junit-xml` option, which also lets you specify the output path for test results. + +```shell +pytest --junit-xml=test-report.xml +``` + +For **unittest** support, use a test runner that outputs the JUnit report format, such as [unittest-xml-reporting](https://pypi.org/project/unittest-xml-reporting/). +
+ +
+ rspec-json + +[RSpec](https://rspec.info/) testing framework support requires the usage of JSON formatter. +You can configure RSpec to output JSON format by using the `--format json` option and redirecting to a file: + +```shell +rspec --format json --out rspec-results.json +``` + +Or configure it in `.rspec` file: +``` +--format json +--out rspec-results.json +``` + +For more information see: +- [RSpec documentation](https://rspec.info/) +- [RSpec Formatters](https://relishapp.com/rspec/rspec-core/docs/formatters) +
+
swift-xunit (Experimental) @@ -345,7 +412,7 @@ Support for Swift test results in xUnit format is experimental - should work but Unfortunately, there are some known issues and limitations caused by GitHub API: -- Test report (i.e. Check Run summary) is markdown text. No custom styling or HTML is possible. +- Test report (i.e. build summary) is Markdown text. No custom styling or HTML is possible. - Maximum report size is 65535 bytes. Input parameters `list-suites` and `list-tests` will be automatically adjusted if max size is exceeded. - Test report can't reference any additional files (e.g. screenshots). You can use `actions/upload-artifact@v4` to upload them and inspect them manually. - Check Runs are created for specific commit SHA. It's not possible to specify under which workflow test report should belong if more diff --git a/__tests__/__outputs__/dart-json.md b/__tests__/__outputs__/dart-json.md index dfe8e05..2b7ec09 100644 --- a/__tests__/__outputs__/dart-json.md +++ b/__tests__/__outputs__/dart-json.md @@ -1,14 +1,14 @@ ![Tests failed](https://img.shields.io/badge/tests-1%20passed%2C%204%20failed%2C%201%20skipped-critical) |Report|Passed|Failed|Skipped|Time| |:---|---:|---:|---:|---:| -|fixtures/dart-json.json|1 ✅|4 ❌|1 ⚪|4s| -## ❌ fixtures/dart-json.json +|[fixtures/dart-json.json](#user-content-r0)|1 ✅|4 ❌|1 ⚪|4s| +## ❌ fixtures/dart-json.json **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| -### ❌ test/main_test.dart +|[test/main_test.dart](#user-content-r0s0)|1 ✅|3 ❌||74ms| +|[test/second_test.dart](#user-content-r0s1)||1 ❌|1 ⚪|51ms| +### ❌ test/main_test.dart ``` Test 1 ✅ Passing test @@ -23,7 +23,7 @@ Test 2 ❌ Exception in test Exception: Some error ``` -### ❌ test/second_test.dart +### ❌ test/second_test.dart ``` ❌ Timeout test TimeoutException after 0:00:00.000001: Test timed out after 0 seconds. diff --git a/__tests__/__outputs__/dotnet-nunit.md b/__tests__/__outputs__/dotnet-nunit.md index c7f2d52..a0985f5 100644 --- a/__tests__/__outputs__/dotnet-nunit.md +++ b/__tests__/__outputs__/dotnet-nunit.md @@ -1,13 +1,13 @@ ![Tests failed](https://img.shields.io/badge/tests-3%20passed%2C%205%20failed%2C%201%20skipped-critical) |Report|Passed|Failed|Skipped|Time| |:---|---:|---:|---:|---:| -|fixtures/dotnet-nunit.xml|3 ✅|5 ❌|1 ⚪|230ms| -## ❌ fixtures/dotnet-nunit.xml +|[fixtures/dotnet-nunit.xml](#user-content-r0)|3 ✅|5 ❌|1 ⚪|230ms| +## ❌ fixtures/dotnet-nunit.xml **9** tests were completed in **230ms** with **3** passed, **5** failed and **1** skipped. |Test suite|Passed|Failed|Skipped|Time| |:---|---:|---:|---:|---:| -|[DotnetTests.NUnitV3Tests.dll.DotnetTests.XUnitTests](#r0s0)|3 ✅|5 ❌|1 ⚪|69ms| -### ❌ DotnetTests.NUnitV3Tests.dll.DotnetTests.XUnitTests +|[DotnetTests.NUnitV3Tests.dll.DotnetTests.XUnitTests](#user-content-r0s0)|3 ✅|5 ❌|1 ⚪|69ms| +### ❌ DotnetTests.NUnitV3Tests.dll.DotnetTests.XUnitTests ``` CalculatorTests ✅ Is_Even_Number(2) diff --git a/__tests__/__outputs__/dotnet-trx-only-failed.md b/__tests__/__outputs__/dotnet-trx-only-failed.md new file mode 100644 index 0000000..5eeaec5 --- /dev/null +++ b/__tests__/__outputs__/dotnet-trx-only-failed.md @@ -0,0 +1,34 @@ +![Tests failed](https://img.shields.io/badge/tests-5%20passed%2C%205%20failed%2C%201%20skipped-critical) +|Report|Passed|Failed|Skipped|Time| +|:---|---:|---:|---:|---:| +|[fixtures/dotnet-trx.trx](#user-content-r0)|5 ✅|5 ❌|1 ⚪|1s| +## ❌ fixtures/dotnet-trx.trx +**11** tests were completed in **1s** with **5** passed, **5** failed and **1** skipped. +|Test suite|Passed|Failed|Skipped|Time| +|:---|---:|---:|---:|---:| +|[DotnetTests.XUnitTests.CalculatorTests](#user-content-r0s0)|5 ✅|5 ❌|1 ⚪|118ms| +### ❌ DotnetTests.XUnitTests.CalculatorTests +``` +❌ Exception_In_TargetTest + System.DivideByZeroException : Attempted to divide by zero. + at DotnetTests.Unit.Calculator.Div(Int32 a, Int32 b) in C:\Users\Michal\Workspace\dorny\test-reporter\reports\dotnet\DotnetTests.Unit\Calculator.cs:line 9 + at DotnetTests.XUnitTests.CalculatorTests.Exception_In_TargetTest() in C:\Users\Michal\Workspace\dorny\test-reporter\reports\dotnet\DotnetTests.XUnitTests\CalculatorTests.cs:line 33 +❌ Exception_In_Test + System.Exception : Test + at DotnetTests.XUnitTests.CalculatorTests.Exception_In_Test() in C:\Users\Michal\Workspace\dorny\test-reporter\reports\dotnet\DotnetTests.XUnitTests\CalculatorTests.cs:line 39 +❌ Failing_Test + Assert.Equal() Failure + Expected: 3 + Actual: 2 + at DotnetTests.XUnitTests.CalculatorTests.Failing_Test() in C:\Users\Michal\Workspace\dorny\test-reporter\reports\dotnet\DotnetTests.XUnitTests\CalculatorTests.cs:line 27 +❌ Is_Even_Number(i: 3) + Assert.True() Failure + Expected: True + Actual: False + at DotnetTests.XUnitTests.CalculatorTests.Is_Even_Number(Int32 i) in C:\Users\Michal\Workspace\dorny\test-reporter\reports\dotnet\DotnetTests.XUnitTests\CalculatorTests.cs:line 59 +❌ Should be even number(i: 3) + Assert.True() Failure + Expected: True + Actual: False + at DotnetTests.XUnitTests.CalculatorTests.Theory_With_Custom_Name(Int32 i) in C:\Users\Michal\Workspace\dorny\test-reporter\reports\dotnet\DotnetTests.XUnitTests\CalculatorTests.cs:line 67 +``` \ No newline at end of file diff --git a/__tests__/__outputs__/dotnet-trx.md b/__tests__/__outputs__/dotnet-trx.md index 7a38b19..40bcaf2 100644 --- a/__tests__/__outputs__/dotnet-trx.md +++ b/__tests__/__outputs__/dotnet-trx.md @@ -1,34 +1,40 @@ ![Tests failed](https://img.shields.io/badge/tests-5%20passed%2C%205%20failed%2C%201%20skipped-critical) |Report|Passed|Failed|Skipped|Time| |:---|---:|---:|---:|---:| -|fixtures/dotnet-trx.trx|5 ✅|5 ❌|1 ⚪|1s| -## ❌ fixtures/dotnet-trx.trx +|[fixtures/dotnet-trx.trx](#user-content-r0)|5 ✅|5 ❌|1 ⚪|1s| +## ❌ fixtures/dotnet-trx.trx **11** tests were completed in **1s** with **5** passed, **5** failed and **1** skipped. |Test suite|Passed|Failed|Skipped|Time| |:---|---:|---:|---:|---:| -|[DotnetTests.XUnitTests.CalculatorTests](#r0s0)|5 ✅|5 ❌|1 ⚪|118ms| -### ❌ DotnetTests.XUnitTests.CalculatorTests +|[DotnetTests.XUnitTests.CalculatorTests](#user-content-r0s0)|5 ✅|5 ❌|1 ⚪|118ms| +### ❌ DotnetTests.XUnitTests.CalculatorTests ``` ✅ Custom Name ❌ Exception_In_TargetTest System.DivideByZeroException : Attempted to divide by zero. + at DotnetTests.Unit.Calculator.Div(Int32 a, Int32 b) in C:\Users\Michal\Workspace\dorny\test-reporter\reports\dotnet\DotnetTests.Unit\Calculator.cs:line 9 + at DotnetTests.XUnitTests.CalculatorTests.Exception_In_TargetTest() in C:\Users\Michal\Workspace\dorny\test-reporter\reports\dotnet\DotnetTests.XUnitTests\CalculatorTests.cs:line 33 ❌ Exception_In_Test System.Exception : Test + at DotnetTests.XUnitTests.CalculatorTests.Exception_In_Test() in C:\Users\Michal\Workspace\dorny\test-reporter\reports\dotnet\DotnetTests.XUnitTests\CalculatorTests.cs:line 39 ❌ Failing_Test Assert.Equal() Failure Expected: 3 Actual: 2 + at DotnetTests.XUnitTests.CalculatorTests.Failing_Test() in C:\Users\Michal\Workspace\dorny\test-reporter\reports\dotnet\DotnetTests.XUnitTests\CalculatorTests.cs:line 27 ✅ Is_Even_Number(i: 2) ❌ Is_Even_Number(i: 3) Assert.True() Failure Expected: True Actual: False + at DotnetTests.XUnitTests.CalculatorTests.Is_Even_Number(Int32 i) in C:\Users\Michal\Workspace\dorny\test-reporter\reports\dotnet\DotnetTests.XUnitTests\CalculatorTests.cs:line 59 ✅ Passing_Test ✅ Should be even number(i: 2) ❌ Should be even number(i: 3) Assert.True() Failure Expected: True Actual: False + at DotnetTests.XUnitTests.CalculatorTests.Theory_With_Custom_Name(Int32 i) in C:\Users\Michal\Workspace\dorny\test-reporter\reports\dotnet\DotnetTests.XUnitTests\CalculatorTests.cs:line 67 ⚪ Skipped_Test ✅ Timeout_Test ``` \ No newline at end of file diff --git a/__tests__/__outputs__/dotnet-xunitv3.md b/__tests__/__outputs__/dotnet-xunitv3.md new file mode 100644 index 0000000..f27f9e2 --- /dev/null +++ b/__tests__/__outputs__/dotnet-xunitv3.md @@ -0,0 +1,26 @@ +![Tests failed](https://img.shields.io/badge/tests-1%20passed%2C%203%20failed-critical) +|Report|Passed|Failed|Skipped|Time| +|:---|---:|---:|---:|---:| +|[fixtures/dotnet-xunitv3.trx](#user-content-r0)|1 ✅|3 ❌||267ms| +## ❌ fixtures/dotnet-xunitv3.trx +**4** tests were completed in **267ms** with **1** passed, **3** failed and **0** skipped. +|Test suite|Passed|Failed|Skipped|Time| +|:---|---:|---:|---:|---:| +|[DotnetTests.XUnitV3Tests.FixtureTests](#user-content-r0s0)|1 ✅|1 ❌||18ms| +|[Unclassified](#user-content-r0s1)||2 ❌||0ms| +### ❌ DotnetTests.XUnitV3Tests.FixtureTests +``` +❌ Failing_Test + Assert.Null() Failure: Value is not null + Expected: null + Actual: Fixture { } + at DotnetTests.XUnitV3Tests.FixtureTests.Failing_Test() in /_/reports/dotnet/DotnetTests.XUnitV3Tests/FixtureTests.cs:line 25 + at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) + at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +✅ Passing_Test +``` +### ❌ Unclassified +``` +❌ [Test Class Cleanup Failure (DotnetTests.XUnitV3Tests.FixtureTests.Failing_Test)] +❌ [Test Class Cleanup Failure (DotnetTests.XUnitV3Tests.FixtureTests.Passing_Test)] +``` \ No newline at end of file diff --git a/__tests__/__outputs__/fluent-validation-test-results.md b/__tests__/__outputs__/fluent-validation-test-results.md index fe13390..83d0503 100644 --- a/__tests__/__outputs__/fluent-validation-test-results.md +++ b/__tests__/__outputs__/fluent-validation-test-results.md @@ -3,74 +3,74 @@ |Report|Passed|Failed|Skipped|Time| |:---|---:|---:|---:|---:| -|fixtures/external/FluentValidation.Tests.trx|803 ✅||1 ⚪|4s| -## ✅ fixtures/external/FluentValidation.Tests.trx +|[fixtures/external/FluentValidation.Tests.trx](#user-content-r0)|803 ✅||1 ⚪|4s| +## ✅ fixtures/external/FluentValidation.Tests.trx **804** tests were completed in **4s** with **803** passed, **0** failed and **1** skipped. |Test suite|Passed|Failed|Skipped|Time| |:---|---:|---:|---:|---:| -|[FluentValidation.Tests.AbstractValidatorTester](#r0s0)|35 ✅|||12ms| -|[FluentValidation.Tests.AccessorCacheTests](#r0s1)|4 ✅||1 ⚪|4ms| -|[FluentValidation.Tests.AssemblyScannerTester](#r0s2)|2 ✅|||2ms| -|[FluentValidation.Tests.CascadingFailuresTester](#r0s3)|38 ✅|||23ms| -|[FluentValidation.Tests.ChainedValidationTester](#r0s4)|13 ✅|||6ms| -|[FluentValidation.Tests.ChainingValidatorsTester](#r0s5)|3 ✅|||1ms| -|[FluentValidation.Tests.ChildRulesTests](#r0s6)|2 ✅|||7ms| -|[FluentValidation.Tests.CollectionValidatorWithParentTests](#r0s7)|16 ✅|||13ms| -|[FluentValidation.Tests.ComplexValidationTester](#r0s8)|17 ✅|||26ms| -|[FluentValidation.Tests.ConditionTests](#r0s9)|18 ✅|||9ms| -|[FluentValidation.Tests.CreditCardValidatorTests](#r0s10)|2 ✅|||2ms| -|[FluentValidation.Tests.CustomFailureActionTester](#r0s11)|3 ✅|||1ms| -|[FluentValidation.Tests.CustomMessageFormatTester](#r0s12)|6 ✅|||3ms| -|[FluentValidation.Tests.CustomValidatorTester](#r0s13)|10 ✅|||6ms| -|[FluentValidation.Tests.DefaultValidatorExtensionTester](#r0s14)|30 ✅|||38ms| -|[FluentValidation.Tests.EmailValidatorTests](#r0s15)|36 ✅|||18ms| -|[FluentValidation.Tests.EmptyTester](#r0s16)|9 ✅|||5ms| -|[FluentValidation.Tests.EnumValidatorTests](#r0s17)|12 ✅|||24ms| -|[FluentValidation.Tests.EqualValidatorTests](#r0s18)|10 ✅|||3ms| -|[FluentValidation.Tests.ExactLengthValidatorTester](#r0s19)|6 ✅|||2ms| -|[FluentValidation.Tests.ExclusiveBetweenValidatorTests](#r0s20)|19 ✅|||6ms| -|[FluentValidation.Tests.ExtensionTester](#r0s21)|4 ✅|||1ms| -|[FluentValidation.Tests.ForEachRuleTests](#r0s22)|34 ✅|||47ms| -|[FluentValidation.Tests.GreaterThanOrEqualToValidatorTester](#r0s23)|14 ✅|||5ms| -|[FluentValidation.Tests.GreaterThanValidatorTester](#r0s24)|13 ✅|||4ms| -|[FluentValidation.Tests.InclusiveBetweenValidatorTests](#r0s25)|18 ✅|||4ms| -|[FluentValidation.Tests.InheritanceValidatorTest](#r0s26)|11 ✅|||18ms| -|[FluentValidation.Tests.InlineValidatorTester](#r0s27)|1 ✅|||2ms| -|[FluentValidation.Tests.LanguageManagerTests](#r0s28)|21 ✅|||28ms| -|[FluentValidation.Tests.LengthValidatorTests](#r0s29)|16 ✅|||17ms| -|[FluentValidation.Tests.LessThanOrEqualToValidatorTester](#r0s30)|13 ✅|||4ms| -|[FluentValidation.Tests.LessThanValidatorTester](#r0s31)|16 ✅|||6ms| -|[FluentValidation.Tests.LocalisedMessagesTester](#r0s32)|6 ✅|||3ms| -|[FluentValidation.Tests.LocalisedNameTester](#r0s33)|2 ✅|||1ms| -|[FluentValidation.Tests.MemberAccessorTests](#r0s34)|9 ✅|||5ms| -|[FluentValidation.Tests.MessageFormatterTests](#r0s35)|10 ✅|||2ms| -|[FluentValidation.Tests.ModelLevelValidatorTests](#r0s36)|2 ✅|||1ms| -|[FluentValidation.Tests.NameResolutionPluggabilityTester](#r0s37)|3 ✅|||2ms| -|[FluentValidation.Tests.NotEmptyTester](#r0s38)|10 ✅|||7ms| -|[FluentValidation.Tests.NotEqualValidatorTests](#r0s39)|11 ✅|||7ms| -|[FluentValidation.Tests.NotNullTester](#r0s40)|5 ✅|||1ms| -|[FluentValidation.Tests.NullTester](#r0s41)|5 ✅|||2ms| -|[FluentValidation.Tests.OnFailureTests](#r0s42)|10 ✅|||8ms| -|[FluentValidation.Tests.PredicateValidatorTester](#r0s43)|5 ✅|||2ms| -|[FluentValidation.Tests.PropertyChainTests](#r0s44)|7 ✅|||1ms| -|[FluentValidation.Tests.RegularExpressionValidatorTests](#r0s45)|15 ✅|||6ms| -|[FluentValidation.Tests.RuleBuilderTests](#r0s46)|29 ✅|||96ms| -|[FluentValidation.Tests.RuleDependencyTests](#r0s47)|14 ✅|||3s| -|[FluentValidation.Tests.RulesetTests](#r0s48)|21 ✅|||14ms| -|[FluentValidation.Tests.ScalePrecisionValidatorTests](#r0s49)|6 ✅|||4ms| -|[FluentValidation.Tests.SharedConditionTests](#r0s50)|42 ✅|||42ms| -|[FluentValidation.Tests.StandalonePropertyValidationTester](#r0s51)|1 ✅|||0ms| -|[FluentValidation.Tests.StringEnumValidatorTests](#r0s52)|10 ✅|||5ms| -|[FluentValidation.Tests.TrackingCollectionTests](#r0s53)|3 ✅|||2ms| -|[FluentValidation.Tests.TransformTests](#r0s54)|4 ✅|||3ms| -|[FluentValidation.Tests.UserSeverityTester](#r0s55)|7 ✅|||3ms| -|[FluentValidation.Tests.UserStateTester](#r0s56)|4 ✅|||3ms| -|[FluentValidation.Tests.ValidateAndThrowTester](#r0s57)|14 ✅|||25ms| -|[FluentValidation.Tests.ValidationResultTests](#r0s58)|8 ✅|||8ms| -|[FluentValidation.Tests.ValidatorDescriptorTester](#r0s59)|5 ✅|||1ms| -|[FluentValidation.Tests.ValidatorSelectorTests](#r0s60)|10 ✅|||9ms| -|[FluentValidation.Tests.ValidatorTesterTester](#r0s61)|73 ✅|||74ms| -### ✅ FluentValidation.Tests.AbstractValidatorTester +|[FluentValidation.Tests.AbstractValidatorTester](#user-content-r0s0)|35 ✅|||12ms| +|[FluentValidation.Tests.AccessorCacheTests](#user-content-r0s1)|4 ✅||1 ⚪|4ms| +|[FluentValidation.Tests.AssemblyScannerTester](#user-content-r0s2)|2 ✅|||2ms| +|[FluentValidation.Tests.CascadingFailuresTester](#user-content-r0s3)|38 ✅|||23ms| +|[FluentValidation.Tests.ChainedValidationTester](#user-content-r0s4)|13 ✅|||6ms| +|[FluentValidation.Tests.ChainingValidatorsTester](#user-content-r0s5)|3 ✅|||1ms| +|[FluentValidation.Tests.ChildRulesTests](#user-content-r0s6)|2 ✅|||7ms| +|[FluentValidation.Tests.CollectionValidatorWithParentTests](#user-content-r0s7)|16 ✅|||13ms| +|[FluentValidation.Tests.ComplexValidationTester](#user-content-r0s8)|17 ✅|||26ms| +|[FluentValidation.Tests.ConditionTests](#user-content-r0s9)|18 ✅|||9ms| +|[FluentValidation.Tests.CreditCardValidatorTests](#user-content-r0s10)|2 ✅|||2ms| +|[FluentValidation.Tests.CustomFailureActionTester](#user-content-r0s11)|3 ✅|||1ms| +|[FluentValidation.Tests.CustomMessageFormatTester](#user-content-r0s12)|6 ✅|||3ms| +|[FluentValidation.Tests.CustomValidatorTester](#user-content-r0s13)|10 ✅|||6ms| +|[FluentValidation.Tests.DefaultValidatorExtensionTester](#user-content-r0s14)|30 ✅|||38ms| +|[FluentValidation.Tests.EmailValidatorTests](#user-content-r0s15)|36 ✅|||18ms| +|[FluentValidation.Tests.EmptyTester](#user-content-r0s16)|9 ✅|||5ms| +|[FluentValidation.Tests.EnumValidatorTests](#user-content-r0s17)|12 ✅|||24ms| +|[FluentValidation.Tests.EqualValidatorTests](#user-content-r0s18)|10 ✅|||3ms| +|[FluentValidation.Tests.ExactLengthValidatorTester](#user-content-r0s19)|6 ✅|||2ms| +|[FluentValidation.Tests.ExclusiveBetweenValidatorTests](#user-content-r0s20)|19 ✅|||6ms| +|[FluentValidation.Tests.ExtensionTester](#user-content-r0s21)|4 ✅|||1ms| +|[FluentValidation.Tests.ForEachRuleTests](#user-content-r0s22)|34 ✅|||47ms| +|[FluentValidation.Tests.GreaterThanOrEqualToValidatorTester](#user-content-r0s23)|14 ✅|||5ms| +|[FluentValidation.Tests.GreaterThanValidatorTester](#user-content-r0s24)|13 ✅|||4ms| +|[FluentValidation.Tests.InclusiveBetweenValidatorTests](#user-content-r0s25)|18 ✅|||4ms| +|[FluentValidation.Tests.InheritanceValidatorTest](#user-content-r0s26)|11 ✅|||18ms| +|[FluentValidation.Tests.InlineValidatorTester](#user-content-r0s27)|1 ✅|||2ms| +|[FluentValidation.Tests.LanguageManagerTests](#user-content-r0s28)|21 ✅|||28ms| +|[FluentValidation.Tests.LengthValidatorTests](#user-content-r0s29)|16 ✅|||17ms| +|[FluentValidation.Tests.LessThanOrEqualToValidatorTester](#user-content-r0s30)|13 ✅|||4ms| +|[FluentValidation.Tests.LessThanValidatorTester](#user-content-r0s31)|16 ✅|||6ms| +|[FluentValidation.Tests.LocalisedMessagesTester](#user-content-r0s32)|6 ✅|||3ms| +|[FluentValidation.Tests.LocalisedNameTester](#user-content-r0s33)|2 ✅|||1ms| +|[FluentValidation.Tests.MemberAccessorTests](#user-content-r0s34)|9 ✅|||5ms| +|[FluentValidation.Tests.MessageFormatterTests](#user-content-r0s35)|10 ✅|||2ms| +|[FluentValidation.Tests.ModelLevelValidatorTests](#user-content-r0s36)|2 ✅|||1ms| +|[FluentValidation.Tests.NameResolutionPluggabilityTester](#user-content-r0s37)|3 ✅|||2ms| +|[FluentValidation.Tests.NotEmptyTester](#user-content-r0s38)|10 ✅|||7ms| +|[FluentValidation.Tests.NotEqualValidatorTests](#user-content-r0s39)|11 ✅|||7ms| +|[FluentValidation.Tests.NotNullTester](#user-content-r0s40)|5 ✅|||1ms| +|[FluentValidation.Tests.NullTester](#user-content-r0s41)|5 ✅|||2ms| +|[FluentValidation.Tests.OnFailureTests](#user-content-r0s42)|10 ✅|||8ms| +|[FluentValidation.Tests.PredicateValidatorTester](#user-content-r0s43)|5 ✅|||2ms| +|[FluentValidation.Tests.PropertyChainTests](#user-content-r0s44)|7 ✅|||1ms| +|[FluentValidation.Tests.RegularExpressionValidatorTests](#user-content-r0s45)|15 ✅|||6ms| +|[FluentValidation.Tests.RuleBuilderTests](#user-content-r0s46)|29 ✅|||96ms| +|[FluentValidation.Tests.RuleDependencyTests](#user-content-r0s47)|14 ✅|||3s| +|[FluentValidation.Tests.RulesetTests](#user-content-r0s48)|21 ✅|||14ms| +|[FluentValidation.Tests.ScalePrecisionValidatorTests](#user-content-r0s49)|6 ✅|||4ms| +|[FluentValidation.Tests.SharedConditionTests](#user-content-r0s50)|42 ✅|||42ms| +|[FluentValidation.Tests.StandalonePropertyValidationTester](#user-content-r0s51)|1 ✅|||0ms| +|[FluentValidation.Tests.StringEnumValidatorTests](#user-content-r0s52)|10 ✅|||5ms| +|[FluentValidation.Tests.TrackingCollectionTests](#user-content-r0s53)|3 ✅|||2ms| +|[FluentValidation.Tests.TransformTests](#user-content-r0s54)|4 ✅|||3ms| +|[FluentValidation.Tests.UserSeverityTester](#user-content-r0s55)|7 ✅|||3ms| +|[FluentValidation.Tests.UserStateTester](#user-content-r0s56)|4 ✅|||3ms| +|[FluentValidation.Tests.ValidateAndThrowTester](#user-content-r0s57)|14 ✅|||25ms| +|[FluentValidation.Tests.ValidationResultTests](#user-content-r0s58)|8 ✅|||8ms| +|[FluentValidation.Tests.ValidatorDescriptorTester](#user-content-r0s59)|5 ✅|||1ms| +|[FluentValidation.Tests.ValidatorSelectorTests](#user-content-r0s60)|10 ✅|||9ms| +|[FluentValidation.Tests.ValidatorTesterTester](#user-content-r0s61)|73 ✅|||74ms| +### ✅ FluentValidation.Tests.AbstractValidatorTester ``` ✅ Can_replace_default_errorcode_resolver ✅ CanValidateInstancesOfType_returns_false_when_comparing_against_some_other_type @@ -108,7 +108,7 @@ ✅ WithName_should_override_field_name ✅ WithName_should_override_field_name_with_value_from_other_property ``` -### ✅ FluentValidation.Tests.AccessorCacheTests +### ✅ FluentValidation.Tests.AccessorCacheTests ``` ⚪ Benchmark ✅ Equality_comparison_check @@ -116,12 +116,12 @@ ✅ Gets_member_for_nested_property ✅ Identifies_if_memberexp_acts_on_model_instance ``` -### ✅ FluentValidation.Tests.AssemblyScannerTester +### ✅ FluentValidation.Tests.AssemblyScannerTester ``` ✅ Finds_validators_for_types ✅ ForEach_iterates_over_types ``` -### ✅ FluentValidation.Tests.CascadingFailuresTester +### ✅ FluentValidation.Tests.CascadingFailuresTester ``` ✅ Cascade_mode_can_be_set_after_validator_instantiated ✅ Cascade_mode_can_be_set_after_validator_instantiated_async @@ -162,7 +162,7 @@ ✅ Validation_stops_on_first_failure_when_set_to_StopOnFirstFailure_at_validator_level_async_legacy ✅ Validation_stops_on_first_failure_when_set_to_StopOnFirstFailure_at_validator_level_legacy ``` -### ✅ FluentValidation.Tests.ChainedValidationTester +### ✅ FluentValidation.Tests.ChainedValidationTester ``` ✅ Can_validate_using_validator_for_base_type ✅ Chained_property_should_be_excluded @@ -178,18 +178,18 @@ ✅ Uses_explicit_ruleset ✅ Validates_chained_property ``` -### ✅ FluentValidation.Tests.ChainingValidatorsTester +### ✅ FluentValidation.Tests.ChainingValidatorsTester ``` ✅ Options_should_only_apply_to_current_validator ✅ Should_create_multiple_validators ✅ Should_execute_multiple_validators ``` -### ✅ FluentValidation.Tests.ChildRulesTests +### ✅ FluentValidation.Tests.ChildRulesTests ``` ✅ Can_define_nested_rules_for_collection ✅ ChildRules_works_with_RuleSet ``` -### ✅ FluentValidation.Tests.CollectionValidatorWithParentTests +### ✅ FluentValidation.Tests.CollectionValidatorWithParentTests ``` ✅ Async_condition_should_work_with_child_collection ✅ Can_specify_condition_for_individual_collection_elements @@ -208,7 +208,7 @@ ✅ Validates_collection_several_levels_deep ✅ Validates_collection_several_levels_deep_async ``` -### ✅ FluentValidation.Tests.ComplexValidationTester +### ✅ FluentValidation.Tests.ComplexValidationTester ``` ✅ Async_condition_should_work_with_complex_property ✅ Async_condition_should_work_with_complex_property_when_validator_invoked_synchronously @@ -228,7 +228,7 @@ ✅ Validates_child_validator_synchronously ✅ Validates_complex_property ``` -### ✅ FluentValidation.Tests.ConditionTests +### ✅ FluentValidation.Tests.ConditionTests ``` ✅ Async_condition_executed_synchronosuly_with_asynchronous_collection_rule ✅ Async_condition_executed_synchronosuly_with_asynchronous_rule @@ -249,18 +249,18 @@ ✅ Validation_should_succeed_when_condition_does_not_match ✅ Validation_should_succeed_when_condition_matches ``` -### ✅ FluentValidation.Tests.CreditCardValidatorTests +### ✅ FluentValidation.Tests.CreditCardValidatorTests ``` ✅ IsValidTests ✅ When_validation_fails_the_default_error_should_be_set ``` -### ✅ FluentValidation.Tests.CustomFailureActionTester +### ✅ FluentValidation.Tests.CustomFailureActionTester ``` ✅ Does_not_invoke_action_if_validation_success ✅ Invokes_custom_action_on_failure ✅ Passes_object_being_validated_to_action ``` -### ✅ FluentValidation.Tests.CustomMessageFormatTester +### ✅ FluentValidation.Tests.CustomMessageFormatTester ``` ✅ Replaces_propertyvalue_placeholder ✅ Replaces_propertyvalue_with_empty_string_when_null @@ -269,7 +269,7 @@ ✅ Uses_custom_delegate_for_building_message_only_for_specific_validator ✅ Uses_property_value_in_message ``` -### ✅ FluentValidation.Tests.CustomValidatorTester +### ✅ FluentValidation.Tests.CustomValidatorTester ``` ✅ New_Custom_Returns_single_failure ✅ New_Custom_Returns_single_failure_async @@ -282,7 +282,7 @@ ✅ Runs_async_rule_synchronously_when_validator_invoked_synchronously ✅ Runs_sync_rule_asynchronously_when_validator_invoked_asynchronously ``` -### ✅ FluentValidation.Tests.DefaultValidatorExtensionTester +### ✅ FluentValidation.Tests.DefaultValidatorExtensionTester ``` ✅ Empty_should_create_EmptyValidator ✅ Equal_should_create_EqualValidator_with_explicit_value @@ -315,7 +315,7 @@ ✅ ScalePrecision_should_create_ScalePrecisionValidator ✅ ScalePrecision_should_create_ScalePrecisionValidator_with_ignore_trailing_zeros ``` -### ✅ FluentValidation.Tests.EmailValidatorTests +### ✅ FluentValidation.Tests.EmailValidatorTests ``` ✅ Fails_email_validation_aspnetcore_compatible(email: " \r \t \n") ✅ Fails_email_validation_aspnetcore_compatible(email: "") @@ -354,7 +354,7 @@ ✅ Valid_email_addresses_regex(email: "testperson+label@gmail.com") ✅ Valid_email_addresses_regex(email: null) ``` -### ✅ FluentValidation.Tests.EmptyTester +### ✅ FluentValidation.Tests.EmptyTester ``` ✅ Passes_for_ienumerable_that_doesnt_implement_ICollection ✅ Passes_when_collection_empty @@ -366,7 +366,7 @@ ✅ When_value_is_null_validator_should_pass ✅ When_value_is_whitespace_validation_should_pass ``` -### ✅ FluentValidation.Tests.EnumValidatorTests +### ✅ FluentValidation.Tests.EnumValidatorTests ``` ✅ Flags_enum_invalid_when_using_outofrange_negative_value ✅ Flags_enum_invalid_when_using_outofrange_positive_value @@ -381,7 +381,7 @@ ✅ When_the_enum_is_not_initialized_with_valid_value_then_the_validator_should_fail ✅ When_validation_fails_the_default_error_should_be_set ``` -### ✅ FluentValidation.Tests.EqualValidatorTests +### ✅ FluentValidation.Tests.EqualValidatorTests ``` ✅ Comparison_property_uses_custom_resolver ✅ Should_store_comparison_type @@ -394,7 +394,7 @@ ✅ When_the_objects_are_not_equal_validation_should_fail ✅ When_validation_fails_the_error_should_be_set ``` -### ✅ FluentValidation.Tests.ExactLengthValidatorTester +### ✅ FluentValidation.Tests.ExactLengthValidatorTester ``` ✅ Min_and_max_properties_should_be_set ✅ When_exact_length_rule_failes_error_should_have_exact_length_error_errorcode @@ -403,7 +403,7 @@ ✅ When_the_text_length_is_smaller_the_validator_should_fail ✅ When_the_validator_fails_the_error_message_should_be_set ``` -### ✅ FluentValidation.Tests.ExclusiveBetweenValidatorTests +### ✅ FluentValidation.Tests.ExclusiveBetweenValidatorTests ``` ✅ To_and_from_properties_should_be_set ✅ To_and_from_properties_should_be_set_for_dates @@ -425,14 +425,14 @@ ✅ When_the_value_is_smaller_than_the_range_then_the_validator_should_fail ✅ When_the_value_is_smaller_than_the_range_then_the_validator_should_fail_for_strings ``` -### ✅ FluentValidation.Tests.ExtensionTester +### ✅ FluentValidation.Tests.ExtensionTester ``` ✅ Should_extract_member_from_member_expression ✅ Should_return_null_for_non_member_expressions ✅ Should_split_pascal_cased_member_name ✅ SplitPascalCase_should_return_null_when_input_is_null ``` -### ✅ FluentValidation.Tests.ForEachRuleTests +### ✅ FluentValidation.Tests.ForEachRuleTests ``` ✅ Async_condition_should_work_with_child_collection ✅ Can_access_colletion_index @@ -469,7 +469,7 @@ ✅ When_runs_outside_RuleForEach_loop ✅ When_runs_outside_RuleForEach_loop_async ``` -### ✅ FluentValidation.Tests.GreaterThanOrEqualToValidatorTester +### ✅ FluentValidation.Tests.GreaterThanOrEqualToValidatorTester ``` ✅ Comparison_property_uses_custom_resolver ✅ Comparison_type @@ -486,7 +486,7 @@ ✅ Validates_with_nullable_when_property_not_null_cross_property ✅ Validates_with_property ``` -### ✅ FluentValidation.Tests.GreaterThanValidatorTester +### ✅ FluentValidation.Tests.GreaterThanValidatorTester ``` ✅ Comparison_property_uses_custom_resolver ✅ Comparison_Type @@ -502,7 +502,7 @@ ✅ Validates_with_nullable_when_property_not_null_cross_property ✅ Validates_with_property ``` -### ✅ FluentValidation.Tests.InclusiveBetweenValidatorTests +### ✅ FluentValidation.Tests.InclusiveBetweenValidatorTests ``` ✅ To_and_from_properties_should_be_set ✅ To_and_from_properties_should_be_set_for_strings @@ -523,7 +523,7 @@ ✅ When_the_value_is_smaller_than_the_range_then_the_validator_should_fail ✅ When_the_value_is_smaller_than_the_range_then_the_validator_should_fail_for_strings ``` -### ✅ FluentValidation.Tests.InheritanceValidatorTest +### ✅ FluentValidation.Tests.InheritanceValidatorTest ``` ✅ Can_use_custom_subclass_with_nongeneric_overload ✅ Validates_collection @@ -537,11 +537,11 @@ ✅ Validates_with_callback_accepting_derived_async ✅ Validates_with_callback_async ``` -### ✅ FluentValidation.Tests.InlineValidatorTester +### ✅ FluentValidation.Tests.InlineValidatorTester ``` ✅ Uses_inline_validator_to_build_rules ``` -### ✅ FluentValidation.Tests.LanguageManagerTests +### ✅ FluentValidation.Tests.LanguageManagerTests ``` ✅ All_languages_should_be_loaded ✅ All_localizations_have_same_parameters_as_English @@ -565,7 +565,7 @@ ✅ Gets_translation_for_specific_culture ✅ Uses_error_code_as_localization_key ``` -### ✅ FluentValidation.Tests.LengthValidatorTests +### ✅ FluentValidation.Tests.LengthValidatorTests ``` ✅ Min_and_max_properties_should_be_set ✅ When_input_is_null_then_the_validator_should_pass @@ -584,7 +584,7 @@ ✅ When_the_text_is_smaller_than_the_range_then_the_validator_should_fail ✅ When_the_validator_fails_the_error_message_should_be_set ``` -### ✅ FluentValidation.Tests.LessThanOrEqualToValidatorTester +### ✅ FluentValidation.Tests.LessThanOrEqualToValidatorTester ``` ✅ Comparison_property_uses_custom_resolver ✅ Comparison_type @@ -600,7 +600,7 @@ ✅ Validates_with_nullable_when_property_not_null_cross_property ✅ Validates_with_property ``` -### ✅ FluentValidation.Tests.LessThanValidatorTester +### ✅ FluentValidation.Tests.LessThanValidatorTester ``` ✅ Comparison_property_uses_custom_resolver ✅ Comparison_type @@ -619,7 +619,7 @@ ✅ Validates_with_nullable_when_property_not_null_cross_property ✅ Validates_with_nullable_when_property_null_cross_property ``` -### ✅ FluentValidation.Tests.LocalisedMessagesTester +### ✅ FluentValidation.Tests.LocalisedMessagesTester ``` ✅ Correctly_assigns_default_localized_error_message ✅ Does_not_throw_InvalidCastException_when_using_RuleForEach @@ -628,12 +628,12 @@ ✅ Uses_func_to_get_message ✅ Uses_string_format_with_property_value ``` -### ✅ FluentValidation.Tests.LocalisedNameTester +### ✅ FluentValidation.Tests.LocalisedNameTester ``` ✅ Uses_localized_name ✅ Uses_localized_name_expression ``` -### ✅ FluentValidation.Tests.MemberAccessorTests +### ✅ FluentValidation.Tests.MemberAccessorTests ``` ✅ ComplexPropertyGet ✅ ComplexPropertySet @@ -645,7 +645,7 @@ ✅ SimplePropertyGet ✅ SimplePropertySet ``` -### ✅ FluentValidation.Tests.MessageFormatterTests +### ✅ FluentValidation.Tests.MessageFormatterTests ``` ✅ Adds_argument_and_custom_arguments ✅ Adds_formatted_argument_and_custom_arguments @@ -658,18 +658,18 @@ ✅ Understands_date_formats ✅ Understands_numeric_formats ``` -### ✅ FluentValidation.Tests.ModelLevelValidatorTests +### ✅ FluentValidation.Tests.ModelLevelValidatorTests ``` ✅ Can_use_child_validator_at_model_level ✅ Validates_at_model_level ``` -### ✅ FluentValidation.Tests.NameResolutionPluggabilityTester +### ✅ FluentValidation.Tests.NameResolutionPluggabilityTester ``` ✅ Resolves_nested_properties ✅ ShouldHaveValidationError_Should_support_custom_propertynameresolver ✅ Uses_custom_property_name ``` -### ✅ FluentValidation.Tests.NotEmptyTester +### ✅ FluentValidation.Tests.NotEmptyTester ``` ✅ Fails_for_array ✅ Fails_for_ienumerable_that_doesnt_implement_ICollection @@ -682,7 +682,7 @@ ✅ When_value_is_null_validator_should_fail ✅ When_value_is_whitespace_validation_should_fail ``` -### ✅ FluentValidation.Tests.NotEqualValidatorTests +### ✅ FluentValidation.Tests.NotEqualValidatorTests ``` ✅ Comparison_property_uses_custom_resolver ✅ Should_handle_custom_value_types_correctly @@ -696,7 +696,7 @@ ✅ When_the_objects_are_not_equal_then_the_validator_should_pass ✅ When_the_validator_fails_the_error_message_should_be_set ``` -### ✅ FluentValidation.Tests.NotNullTester +### ✅ FluentValidation.Tests.NotNullTester ``` ✅ Fails_when_nullable_value_type_is_null ✅ Not_null_validator_should_not_crash_with_non_nullable_value_type @@ -704,7 +704,7 @@ ✅ NotNullValidator_should_pass_if_value_has_value ✅ When_the_validator_fails_the_error_message_should_be_set ``` -### ✅ FluentValidation.Tests.NullTester +### ✅ FluentValidation.Tests.NullTester ``` ✅ Not_null_validator_should_not_crash_with_non_nullable_value_type ✅ NullValidator_should_fail_if_value_has_value @@ -712,7 +712,7 @@ ✅ Passes_when_nullable_value_type_is_null ✅ When_the_validator_passes_the_error_message_should_be_set ``` -### ✅ FluentValidation.Tests.OnFailureTests +### ✅ FluentValidation.Tests.OnFailureTests ``` ✅ OnFailure_called_for_each_failed_rule ✅ OnFailure_called_for_each_failed_rule_asyncAsync @@ -725,7 +725,7 @@ ✅ WhenWithOnFailure_should_invoke_condition_on_async_inner_validator ✅ WhenWithOnFailure_should_invoke_condition_on_inner_validator ``` -### ✅ FluentValidation.Tests.PredicateValidatorTester +### ✅ FluentValidation.Tests.PredicateValidatorTester ``` ✅ Should_fail_when_predicate_returns_false ✅ Should_succeed_when_predicate_returns_true @@ -733,7 +733,7 @@ ✅ When_validation_fails_metadata_should_be_set_on_failure ✅ When_validation_fails_the_default_error_should_be_set ``` -### ✅ FluentValidation.Tests.PropertyChainTests +### ✅ FluentValidation.Tests.PropertyChainTests ``` ✅ AddIndexer_throws_when_nothing_added ✅ Calling_ToString_should_construct_string_representation_of_chain @@ -743,7 +743,7 @@ ✅ Should_ignore_blanks ✅ Should_not_be_subchain ``` -### ✅ FluentValidation.Tests.RegularExpressionValidatorTests +### ✅ FluentValidation.Tests.RegularExpressionValidatorTests ``` ✅ Can_access_expression_in_message ✅ Can_access_expression_in_message_lambda @@ -761,7 +761,7 @@ ✅ When_the_text_matches_the_regular_expression_then_the_validator_should_pass ✅ When_validation_fails_the_default_error_should_be_set ``` -### ✅ FluentValidation.Tests.RuleBuilderTests +### ✅ FluentValidation.Tests.RuleBuilderTests ``` ✅ Adding_a_validator_should_return_builder ✅ Adding_a_validator_should_store_validator @@ -793,7 +793,7 @@ ✅ Should_throw_when_inverse_predicate_is_null ✅ Should_throw_when_predicate_is_null ``` -### ✅ FluentValidation.Tests.RuleDependencyTests +### ✅ FluentValidation.Tests.RuleDependencyTests ``` ✅ Async_inside_dependent_rules ✅ Async_inside_dependent_rules_when_parent_rule_not_async @@ -810,7 +810,7 @@ ✅ TestAsyncWithDependentRules_SyncEntry ✅ Treats_root_level_RuleFor_call_as_dependent_rule_if_user_forgets_to_use_DependentRulesBuilder ``` -### ✅ FluentValidation.Tests.RulesetTests +### ✅ FluentValidation.Tests.RulesetTests ``` ✅ Applies_multiple_rulesets_to_rule ✅ Combines_rulesets_and_explicit_properties @@ -834,7 +834,7 @@ ✅ Trims_spaces ✅ WithMessage_works_inside_rulesets ``` -### ✅ FluentValidation.Tests.ScalePrecisionValidatorTests +### ✅ FluentValidation.Tests.ScalePrecisionValidatorTests ``` ✅ Scale_precision_should_be_valid ✅ Scale_precision_should_be_valid_when_ignoring_trailing_zeroes @@ -843,7 +843,7 @@ ✅ Scale_precision_should_not_be_valid_when_ignoring_trailing_zeroes ✅ Scale_precision_should_not_be_valid_when_they_are_equal ``` -### ✅ FluentValidation.Tests.SharedConditionTests +### ✅ FluentValidation.Tests.SharedConditionTests ``` ✅ Async_condition_can_be_used_inside_ruleset ✅ Condition_can_be_used_inside_ruleset @@ -888,11 +888,11 @@ ✅ When_condition_only_executed_once ✅ WhenAsync_condition_only_executed_once ``` -### ✅ FluentValidation.Tests.StandalonePropertyValidationTester +### ✅ FluentValidation.Tests.StandalonePropertyValidationTester ``` ✅ Should_validate_property_value_without_instance ``` -### ✅ FluentValidation.Tests.StringEnumValidatorTests +### ✅ FluentValidation.Tests.StringEnumValidatorTests ``` ✅ IsValidTests_CaseInsensitive_CaseCorrect ✅ IsValidTests_CaseInsensitive_CaseIncorrect @@ -905,20 +905,20 @@ ✅ When_the_property_is_initialized_with_null_then_the_validator_should_be_valid ✅ When_validation_fails_the_default_error_should_be_set ``` -### ✅ FluentValidation.Tests.TrackingCollectionTests +### ✅ FluentValidation.Tests.TrackingCollectionTests ``` ✅ Add_AddsItem ✅ Should_not_raise_event_once_handler_detached ✅ When_Item_Added_Raises_ItemAdded ``` -### ✅ FluentValidation.Tests.TransformTests +### ✅ FluentValidation.Tests.TransformTests ``` ✅ Transforms_collection_element ✅ Transforms_collection_element_async ✅ Transforms_property_value ✅ Transforms_property_value_to_another_type ``` -### ✅ FluentValidation.Tests.UserSeverityTester +### ✅ FluentValidation.Tests.UserSeverityTester ``` ✅ Can_Provide_conditional_severity ✅ Can_Provide_severity_for_item_in_collection @@ -928,14 +928,14 @@ ✅ Stores_user_severity_against_validation_failure ✅ Throws_when_provider_is_null ``` -### ✅ FluentValidation.Tests.UserStateTester +### ✅ FluentValidation.Tests.UserStateTester ``` ✅ Can_Provide_state_for_item_in_collection ✅ Correctly_provides_object_being_validated ✅ Stores_user_state_against_validation_failure ✅ Throws_when_provider_is_null ``` -### ✅ FluentValidation.Tests.ValidateAndThrowTester +### ✅ FluentValidation.Tests.ValidateAndThrowTester ``` ✅ Does_not_throw_when_valid ✅ Does_not_throw_when_valid_and_a_ruleset @@ -952,7 +952,7 @@ ✅ ValidationException_provides_correct_message_when_appendDefaultMessage_false ✅ ValidationException_provides_correct_message_when_appendDefaultMessage_true ``` -### ✅ FluentValidation.Tests.ValidationResultTests +### ✅ FluentValidation.Tests.ValidationResultTests ``` ✅ Can_serialize_failure ✅ Can_serialize_result @@ -963,7 +963,7 @@ ✅ ToString_return_error_messages_with_given_separator ✅ ToString_return_error_messages_with_newline_as_separator ``` -### ✅ FluentValidation.Tests.ValidatorDescriptorTester +### ✅ FluentValidation.Tests.ValidatorDescriptorTester ``` ✅ Does_not_throw_when_rule_declared_without_property ✅ Gets_validators_for_property @@ -971,7 +971,7 @@ ✅ Returns_empty_collection_for_property_with_no_validators ✅ Should_retrieve_name_given_to_it_pass_property_as_string ``` -### ✅ FluentValidation.Tests.ValidatorSelectorTests +### ✅ FluentValidation.Tests.ValidatorSelectorTests ``` ✅ Can_use_property_with_include ✅ Does_not_validate_other_property @@ -984,7 +984,7 @@ ✅ Validates_nullable_property_with_overriden_name_when_selected ✅ Validates_property_using_expression ``` -### ✅ FluentValidation.Tests.ValidatorTesterTester +### ✅ FluentValidation.Tests.ValidatorTesterTester ``` ✅ Allows_only_one_failure_to_match ✅ Can_use_indexer_in_string_message diff --git a/__tests__/__outputs__/golang-json.md b/__tests__/__outputs__/golang-json.md new file mode 100644 index 0000000..8b63704 --- /dev/null +++ b/__tests__/__outputs__/golang-json.md @@ -0,0 +1,38 @@ +![Tests failed](https://img.shields.io/badge/tests-5%20passed%2C%206%20failed%2C%201%20skipped-critical) +|Report|Passed|Failed|Skipped|Time| +|:---|---:|---:|---:|---:| +|[fixtures/golang-json.json](#user-content-r0)|5 ✅|6 ❌|1 ⚪|6s| +## ❌ fixtures/golang-json.json +**12** tests were completed in **6s** with **5** passed, **6** failed and **1** skipped. +|Test suite|Passed|Failed|Skipped|Time| +|:---|---:|---:|---:|---:| +|[_/home/james_t/git/test-reporter/reports/go](#user-content-r0s0)|5 ✅|6 ❌|1 ⚪|6s| +### ❌ _/home/james_t/git/test-reporter/reports/go +``` +✅ TestPassing +❌ TestFailing + calculator_test.go:19: expected 1+1 = 3, got 2 + +❌ TestPanicInsideFunction + calculator_test.go:76: caught panic: runtime error: integer divide by zero + +❌ TestPanicInsideTest + calculator_test.go:76: caught panic: bad stuff + +⚪ TestSkipped + calculator_test.go:45: skipping test + +❌ TestCases + +TestCases + ✅ 1_+_2_=_3 + ✅ 4_+_7_=_11 + ❌ 2_+_3_=_4 + calculator_test.go:67: expected 2 + 3 = 4, got 5 + + ❌ 1_/_2_=_1 + calculator_test.go:67: expected 1 / 2 = 1, got 0 + + ✅ 9_/_3_=_3 + ✅ 14_/_7_=_2 +``` \ No newline at end of file diff --git a/__tests__/__outputs__/jest-junit-eslint.md b/__tests__/__outputs__/jest-junit-eslint.md index 32608c3..5ebb57e 100644 --- a/__tests__/__outputs__/jest-junit-eslint.md +++ b/__tests__/__outputs__/jest-junit-eslint.md @@ -3,13 +3,13 @@ |Report|Passed|Failed|Skipped|Time| |:---|---:|---:|---:|---:| -|fixtures/jest-junit-eslint.xml|1 ✅|||0ms| -## ✅ fixtures/jest-junit-eslint.xml +|[fixtures/jest-junit-eslint.xml](#user-content-r0)|1 ✅|||0ms| +## ✅ fixtures/jest-junit-eslint.xml **1** tests were completed in **0ms** with **1** passed, **0** failed and **0** skipped. |Test suite|Passed|Failed|Skipped|Time| |:---|---:|---:|---:|---:| -|[test.jsx](#r0s0)|1 ✅|||0ms| -### ✅ test.jsx +|[test.jsx](#user-content-r0s0)|1 ✅|||0ms| +### ✅ test.jsx ``` test ✅ test.jsx diff --git a/__tests__/__outputs__/jest-junit.md b/__tests__/__outputs__/jest-junit.md index 7c577d3..951256f 100644 --- a/__tests__/__outputs__/jest-junit.md +++ b/__tests__/__outputs__/jest-junit.md @@ -1,14 +1,14 @@ ![Tests failed](https://img.shields.io/badge/tests-1%20passed%2C%204%20failed%2C%201%20skipped-critical) |Report|Passed|Failed|Skipped|Time| |:---|---:|---:|---:|---:| -|fixtures/jest-junit.xml|1 ✅|4 ❌|1 ⚪|1s| -## ❌ fixtures/jest-junit.xml +|[fixtures/jest-junit.xml](#user-content-r0)|1 ✅|4 ❌|1 ⚪|1s| +## ❌ fixtures/jest-junit.xml **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| -### ❌ __tests__\main.test.js +|[__tests__\main.test.js](#user-content-r0s0)|1 ✅|3 ❌||486ms| +|[__tests__\second.test.js](#user-content-r0s1)||1 ❌|1 ⚪|82ms| +### ❌ __tests__\main.test.js ``` Test 1 ✅ Passing test @@ -21,7 +21,7 @@ Test 2 ❌ Exception in test Error: Some error ``` -### ❌ __tests__\second.test.js +### ❌ __tests__\second.test.js ``` ❌ 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: diff --git a/__tests__/__outputs__/jest-react-component-test-results.md b/__tests__/__outputs__/jest-react-component-test-results.md index e9dda68..1365818 100644 --- a/__tests__/__outputs__/jest-react-component-test-results.md +++ b/__tests__/__outputs__/jest-react-component-test-results.md @@ -3,13 +3,13 @@ |Report|Passed|Failed|Skipped|Time| |:---|---:|---:|---:|---:| -|fixtures/external/jest/jest-react-component-test-results.xml|1 ✅|||1000ms| -## ✅ fixtures/external/jest/jest-react-component-test-results.xml +|[fixtures/external/jest/jest-react-component-test-results.xml](#user-content-r0)|1 ✅|||1000ms| +## ✅ fixtures/external/jest/jest-react-component-test-results.xml **1** tests were completed in **1000ms** with **1** passed, **0** failed and **0** skipped. |Test suite|Passed|Failed|Skipped|Time| |:---|---:|---:|---:|---:| -|[\](#r0s0)|1 ✅|||798ms| -### ✅ \ +|[\](#user-content-r0s0)|1 ✅|||798ms| +### ✅ \ ``` ✅ should render properly ``` diff --git a/__tests__/__outputs__/jest-test-results.md b/__tests__/__outputs__/jest-test-results.md index 24b5309..cfbc169 100644 --- a/__tests__/__outputs__/jest-test-results.md +++ b/__tests__/__outputs__/jest-test-results.md @@ -1,412 +1,890 @@ ![Tests failed](https://img.shields.io/badge/tests-4207%20passed%2C%202%20failed%2C%2030%20skipped-critical) |Report|Passed|Failed|Skipped|Time| |:---|---:|---:|---:|---:| -|fixtures/external/jest/jest-test-results.xml|4207 ✅|2 ❌|30 ⚪|166s| -## ❌ fixtures/external/jest/jest-test-results.xml +|[fixtures/external/jest/jest-test-results.xml](#user-content-r0)|4207 ✅|2 ❌|30 ⚪|166s| +## ❌ fixtures/external/jest/jest-test-results.xml **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 ✅|||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 ✅|||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 ✅|||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 ✅|||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 ✅|||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 ✅|||3s| -|e2e/__tests__/debug.test.ts|1 ✅|||899ms| -|e2e/__tests__/declarationErrors.test.ts|3 ✅|||2s| -|e2e/__tests__/dependencyClash.test.ts|1 ✅|||833ms| -|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 ✅|||5s| -|e2e/__tests__/emptyDescribeWithHooks.test.ts|4 ✅|||3s| -|e2e/__tests__/emptySuiteError.test.ts|1 ✅|||885ms| -|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 ✅|||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 ✅|||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 ✅|||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 ✅|||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 ✅|||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 ✅|||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 ✅|||2s| -|e2e/__tests__/lifecycles.ts|1 ✅|||861ms| -|e2e/__tests__/listTests.test.ts|2 ✅|||945ms| -|e2e/__tests__/locationInResults.test.ts|2 ✅|||2s| -|e2e/__tests__/logHeapUsage.test.ts|1 ✅|||884ms| -|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 ✅|||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 ✅|||1s| -|e2e/__tests__/nestedTestDefinitions.test.ts|4 ✅|||5s| -|e2e/__tests__/nodePath.test.ts|1 ✅|||866ms| -|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 ✅|||1s| -|e2e/__tests__/requireMainAfterCreateRequire.test.ts|1 ✅|||966ms| -|e2e/__tests__/requireMainIsolateModules.test.ts|1 ✅|||976ms| -|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 ✅|||2s| -|e2e/__tests__/resolveGetPaths.test.ts|1 ✅|||1s| -|e2e/__tests__/resolveNodeModule.test.ts|1 ✅|||943ms| -|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 ✅|||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 ✅|||2s| -|e2e/__tests__/showConfig.test.ts|1 ✅|||195ms| -|e2e/__tests__/skipBeforeAfterAll.test.ts|1 ✅|||1s| -|e2e/__tests__/snapshot-unknown.test.ts|1 ✅|||838ms| -|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 ✅|||2s| -|e2e/__tests__/stackTrace.test.ts|7 ✅|||5s| -|e2e/__tests__/stackTraceNoCaptureStackTrace.test.ts|1 ✅|||899ms| -|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 ✅|||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 ✅|||3s| -|e2e/__tests__/testResultsProcessor.test.ts|1 ✅|||910ms| -|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 ✅|||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 ✅|||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 ✅|||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| -|e2e/custom-test-sequencer/d.test.js|1 ✅|||21ms| -|e2e/custom-test-sequencer/e.test.js|1 ✅|||27ms| -|e2e/test-in-root/spec.js|1 ✅|||19ms| -|e2e/test-in-root/test.js|1 ✅|||37ms| -|e2e/timer-reset-mocks/after-reset-all-mocks/timerAndMock.test.js|2 ✅|||30ms| -|e2e/timer-reset-mocks/with-reset-mocks/timerWithMock.test.js|1 ✅|||34ms| -|e2e/v8-coverage/empty-sourcemap/test.ts|1 ✅|||31ms| -|examples/angular/app.component.spec.ts|3 ✅|||654ms| -|examples/angular/shared/data.service.spec.ts|2 ✅|||431ms| -|examples/angular/shared/sub.service.spec.ts|1 ✅|||109ms| -|examples/async/__tests__/user.test.js|8 ✅|||96ms| -|examples/automatic-mocks/__tests__/automock.test.js|2 ✅|||74ms| -|examples/automatic-mocks/__tests__/createMockFromModule.test.js|2 ✅|||115ms| -|examples/automatic-mocks/__tests__/disableAutomocking.test.js|1 ✅|||24ms| -|examples/enzyme/__tests__/CheckboxWithLabel-test.js|1 ✅|||434ms| -|examples/getting-started/sum.test.js|1 ✅|||78ms| -|examples/jquery/__tests__/display_user.test.js|1 ✅|||196ms| -|examples/jquery/__tests__/fetch_current_user.test.js|2 ✅|||196ms| -|examples/manual-mocks/__tests__/file_summarizer.test.js|1 ✅|||87ms| -|examples/manual-mocks/__tests__/lodashMocking.test.js|1 ✅|||109ms| -|examples/manual-mocks/__tests__/user.test.js|1 ✅|||41ms| -|examples/manual-mocks/__tests__/userMocked.test.js|1 ✅|||105ms| -|examples/module-mock/__tests__/full_mock.js|1 ✅|||60ms| -|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 ✅|||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| -|examples/snapshot/__tests__/link.react.test.js|4 ✅|||181ms| -|examples/timer/__tests__/infinite_timer_game.test.js|1 ✅|||94ms| -|examples/timer/__tests__/timer_game.test.js|3 ✅|||74ms| -|examples/typescript/__tests__/calc.test.ts|6 ✅|||276ms| -|examples/typescript/__tests__/CheckboxWithLabel-test.tsx|1 ✅|||227ms| -|examples/typescript/__tests__/sub-test.ts|1 ✅|||43ms| -|examples/typescript/__tests__/sum-test.ts|2 ✅|||69ms| -|examples/typescript/__tests__/sum.test.js|2 ✅|||100ms| -|packages/babel-jest/src/__tests__/index.ts|6 ✅|||371ms| -|packages/babel-plugin-jest-hoist/src/__tests__/hoistPlugin.test.ts|4 ✅|||347ms| -|packages/diff-sequences/src/__tests__/index.property.test.ts|7 ✅|||357ms| -|packages/diff-sequences/src/__tests__/index.test.ts|48 ✅|||195ms| -|packages/expect/src/__tests__/assertionCounts.test.ts|6 ✅|||60ms| -|packages/expect/src/__tests__/asymmetricMatchers.test.ts|38 ✅|||207ms| -|packages/expect/src/__tests__/extend.test.ts|10 ✅|||99ms| -|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 ✅|||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| -|packages/expect/src/__tests__/stacktrace.test.ts|3 ✅|||69ms| -|packages/expect/src/__tests__/symbolInObjects.test.ts|3 ✅|||33ms| -|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 ✅|||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 ✅|||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| -|packages/jest-cli/src/init/__tests__/modifyPackageJson.test.ts|4 ✅|||30ms| -|packages/jest-config/src/__tests__/Defaults.test.ts|1 ✅|||672ms| -|packages/jest-config/src/__tests__/getMaxWorkers.test.ts|7 ✅|||67ms| -|packages/jest-config/src/__tests__/normalize.test.js|118 ✅|||798ms| -|packages/jest-config/src/__tests__/readConfig.test.ts|1 ✅|||76ms| -|packages/jest-config/src/__tests__/readConfigs.test.ts|3 ✅|||135ms| -|packages/jest-config/src/__tests__/resolveConfigPath.test.ts|10 ✅|||183ms| -|packages/jest-config/src/__tests__/setFromArgv.test.ts|4 ✅|||53ms| -|packages/jest-config/src/__tests__/validatePattern.test.ts|4 ✅|||52ms| -|packages/jest-console/src/__tests__/bufferedConsole.test.ts|20 ✅|||171ms| -|packages/jest-console/src/__tests__/CustomConsole.test.ts|23 ✅|||115ms| -|packages/jest-console/src/__tests__/getConsoleOutput.test.ts|12 ✅|||56ms| -|packages/jest-core/src/__tests__/FailedTestsCache.test.js|1 ✅|||25ms| -|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 ✅|||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 ✅|||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| -|packages/jest-core/src/lib/__tests__/logDebugMessages.test.ts|3 ✅|||48ms| -|packages/jest-create-cache-key-function/src/__tests__/index.test.ts|1 ✅|||75ms| -|packages/jest-diff/src/__tests__/diff.test.ts|107 ✅|||625ms| -|packages/jest-diff/src/__tests__/diffStringsRaw.test.ts|2 ✅|||55ms| -|packages/jest-diff/src/__tests__/getAlignedDiffs.test.ts|24 ✅|||72ms| -|packages/jest-diff/src/__tests__/joinAlignedDiffs.test.ts|6 ✅|||44ms| -|packages/jest-docblock/src/__tests__/index.test.ts|36 ✅|||177ms| -|packages/jest-each/src/__tests__/array.test.ts|159 ✅|||192ms| -|packages/jest-each/src/__tests__/index.test.ts|10 ✅|||44ms| -|packages/jest-each/src/__tests__/template.test.ts|242 ✅|||483ms| -|packages/jest-environment-jsdom/src/__tests__/jsdom_environment.test.ts|2 ✅|||783ms| -|packages/jest-environment-node/src/__tests__/node_environment.test.ts|6 ✅|||184ms| -|packages/jest-fake-timers/src/__tests__/legacyFakeTimers.test.ts|50 ✅|||302ms| -|packages/jest-fake-timers/src/__tests__/modernFakeTimers.test.ts|40 ✅|||317ms| -|packages/jest-get-type/src/__tests__/getType.test.ts|14 ✅|||45ms| -|packages/jest-get-type/src/__tests__/isPrimitive.test.ts|18 ✅|||36ms| -|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 ✅|||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| -|packages/jest-haste-map/src/lib/__tests__/dependencyExtractor.test.js|15 ✅|||56ms| -|packages/jest-haste-map/src/lib/__tests__/fast_path.test.js|5 ✅|||29ms| -|packages/jest-haste-map/src/lib/__tests__/getPlatformExtension.test.js|1 ✅|||35ms| -|packages/jest-haste-map/src/lib/__tests__/isRegExpSupported.test.js|2 ✅|||31ms| -|packages/jest-haste-map/src/lib/__tests__/normalizePathSep.test.js|2 ✅|||35ms| -|packages/jest-jasmine2/src/__tests__/concurrent.test.ts|3 ✅|||24ms| -|packages/jest-jasmine2/src/__tests__/expectationResultFactory.test.ts|7 ✅|||70ms| -|packages/jest-jasmine2/src/__tests__/hooksError.test.ts|32 ✅|||51ms| -|packages/jest-jasmine2/src/__tests__/iterators.test.ts|4 ✅|||43ms| -|packages/jest-jasmine2/src/__tests__/itTestError.test.ts|6 ✅|||32ms| -|packages/jest-jasmine2/src/__tests__/itToTestAlias.test.ts|1 ✅|||23ms| -|packages/jest-jasmine2/src/__tests__/pTimeout.test.ts|3 ✅|||44ms| -|packages/jest-jasmine2/src/__tests__/queueRunner.test.ts|6 ✅|||93ms| -|packages/jest-jasmine2/src/__tests__/reporter.test.ts|1 ✅|||107ms| -|packages/jest-jasmine2/src/__tests__/Suite.test.ts|1 ✅|||84ms| -|packages/jest-jasmine2/src/__tests__/todoError.test.ts|3 ✅|||27ms| -|packages/jest-leak-detector/src/__tests__/index.test.ts|6 ✅|||986ms| -|packages/jest-matcher-utils/src/__tests__/deepCyclicCopyReplaceable.test.ts|11 ✅|||49ms| -|packages/jest-matcher-utils/src/__tests__/deepCyclicCopyReplaceableDom.test.ts|2 ✅|||48ms| -|packages/jest-matcher-utils/src/__tests__/index.test.ts|48 ✅|||391ms| -|packages/jest-matcher-utils/src/__tests__/printDiffOrStringify.test.ts|21 ✅|||114ms| -|packages/jest-matcher-utils/src/__tests__/Replaceable.test.ts|17 ✅|||111ms| -|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 ✅|||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 ✅|||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| -|packages/jest-reporters/src/__tests__/getWatermarks.test.ts|2 ✅|||37ms| -|packages/jest-reporters/src/__tests__/NotifyReporter.test.ts|18 ✅|||166ms| -|packages/jest-reporters/src/__tests__/SummaryReporter.test.js|4 ✅|||366ms| -|packages/jest-reporters/src/__tests__/utils.test.ts|10 ✅|||85ms| -|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 ✅|||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| -|packages/jest-runtime/src/__tests__/runtime_environment.test.js|2 ✅|||497ms| -|packages/jest-runtime/src/__tests__/runtime_internal_module.test.js|4 ✅|||727ms| -|packages/jest-runtime/src/__tests__/runtime_jest_fn.js|4 ✅|||479ms| -|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 ✅|||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 ✅|||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 ✅|||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 ✅|||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 ✅|||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| -|packages/jest-util/src/__tests__/errorWithStack.test.ts|1 ✅|||41ms| -|packages/jest-util/src/__tests__/formatTime.test.ts|11 ✅|||82ms| -|packages/jest-util/src/__tests__/globsToMatcher.test.ts|4 ✅|||56ms| -|packages/jest-util/src/__tests__/installCommonGlobals.test.ts|2 ✅|||68ms| -|packages/jest-util/src/__tests__/isInteractive.test.ts|2 ✅|||35ms| -|packages/jest-util/src/__tests__/isPromise.test.ts|10 ✅|||30ms| -|packages/jest-validate/src/__tests__/validate.test.ts|23 ✅|||283ms| -|packages/jest-validate/src/__tests__/validateCLIOptions.test.js|6 ✅|||83ms| -|packages/jest-watcher/src/lib/__tests__/formatTestNameByPattern.test.ts|11 ✅|||129ms| -|packages/jest-watcher/src/lib/__tests__/prompt.test.ts|3 ✅|||91ms| -|packages/jest-watcher/src/lib/__tests__/scroll.test.ts|5 ✅|||57ms| -|packages/jest-worker/src/__tests__/Farm.test.js|10 ✅|||158ms| -|packages/jest-worker/src/__tests__/FifoQueue.test.js|3 ✅|||48ms| -|packages/jest-worker/src/__tests__/index.test.js|8 ✅|||230ms| -|packages/jest-worker/src/__tests__/PriorityQueue.test.js|5 ✅|||63ms| -|packages/jest-worker/src/__tests__/process-integration.test.js|5 ✅|||62ms| -|packages/jest-worker/src/__tests__/thread-integration.test.js|6 ✅|||114ms| -|packages/jest-worker/src/__tests__/WorkerPool.test.js|3 ✅|||51ms| -|packages/jest-worker/src/base/__tests__/BaseWorkerPool.test.js|11 ✅|||653ms| -|packages/jest-worker/src/workers/__tests__/ChildProcessWorker.test.js|17 ✅|||184ms| -|packages/jest-worker/src/workers/__tests__/NodeThreadsWorker.test.js|15 ✅|||258ms| -|packages/jest-worker/src/workers/__tests__/processChild.test.js|10 ✅|||135ms| -|packages/jest-worker/src/workers/__tests__/threadChild.test.js|10 ✅|||120ms| -|packages/pretty-format/src/__tests__/AsymmetricMatcher.test.ts|38 ✅|||137ms| -|packages/pretty-format/src/__tests__/ConvertAnsi.test.ts|6 ✅|||43ms| -|packages/pretty-format/src/__tests__/DOMCollection.test.ts|10 ✅|||64ms| -|packages/pretty-format/src/__tests__/DOMElement.test.ts|28 ✅|||148ms| -|packages/pretty-format/src/__tests__/Immutable.test.ts|111 ✅|||443ms| -|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| -### ❌ e2e/__tests__/jestChangedFiles.test.ts +|[e2e/__tests__/asyncAndCallback.test.ts](#user-content-r0s0)|1 ✅|||746ms| +|[e2e/__tests__/asyncRegenerator.test.ts](#user-content-r0s1)|1 ✅|||4s| +|[e2e/__tests__/autoClearMocks.test.ts](#user-content-r0s2)|2 ✅|||2s| +|[e2e/__tests__/autoResetMocks.test.ts](#user-content-r0s3)|2 ✅|||2s| +|[e2e/__tests__/autoRestoreMocks.test.ts](#user-content-r0s4)|2 ✅|||2s| +|[e2e/__tests__/babelPluginJestHoist.test.ts](#user-content-r0s5)|1 ✅|||6s| +|[e2e/__tests__/badSourceMap.test.ts](#user-content-r0s6)|1 ✅|||858ms| +|[e2e/__tests__/beforeAllFiltered.ts](#user-content-r0s7)|1 ✅|||958ms| +|[e2e/__tests__/beforeEachQueue.ts](#user-content-r0s8)|1 ✅||1 ⚪|55ms| +|[e2e/__tests__/callDoneTwice.test.ts](#user-content-r0s9)|1 ✅|||882ms| +|[e2e/__tests__/chaiAssertionLibrary.ts](#user-content-r0s10)|1 ✅|||2s| +|[e2e/__tests__/circularInequality.test.ts](#user-content-r0s11)|1 ✅|||1s| +|[e2e/__tests__/circusConcurrentEach.test.ts](#user-content-r0s12)|2 ✅|||2s| +|[e2e/__tests__/circusDeclarationErrors.test.ts](#user-content-r0s13)|1 ✅|||869ms| +|[e2e/__tests__/clearCache.test.ts](#user-content-r0s14)|2 ✅|||1s| +|[e2e/__tests__/cliHandlesExactFilenames.test.ts](#user-content-r0s15)|2 ✅|||1s| +|[e2e/__tests__/compareDomNodes.test.ts](#user-content-r0s16)|1 ✅|||1s| +|[e2e/__tests__/config.test.ts](#user-content-r0s17)|6 ✅|||4s| +|[e2e/__tests__/console.test.ts](#user-content-r0s18)|7 ✅|||8s| +|[e2e/__tests__/consoleAfterTeardown.test.ts](#user-content-r0s19)|1 ✅|||1s| +|[e2e/__tests__/consoleLogOutputWhenRunInBand.test.ts](#user-content-r0s20)|1 ✅|||793ms| +|[e2e/__tests__/coverageHandlebars.test.ts](#user-content-r0s21)|1 ✅|||2s| +|[e2e/__tests__/coverageRemapping.test.ts](#user-content-r0s22)|1 ✅|||13s| +|[e2e/__tests__/coverageReport.test.ts](#user-content-r0s23)|12 ✅|||22s| +|[e2e/__tests__/coverageThreshold.test.ts](#user-content-r0s24)|5 ✅|||5s| +|[e2e/__tests__/coverageTransformInstrumented.test.ts](#user-content-r0s25)|1 ✅|||5s| +|[e2e/__tests__/coverageWithoutTransform.test.ts](#user-content-r0s26)|1 ✅|||1s| +|[e2e/__tests__/createProcessObject.test.ts](#user-content-r0s27)|1 ✅|||908ms| +|[e2e/__tests__/customInlineSnapshotMatchers.test.ts](#user-content-r0s28)|1 ✅|||2s| +|[e2e/__tests__/customMatcherStackTrace.test.ts](#user-content-r0s29)|2 ✅|||2s| +|[e2e/__tests__/customReporters.test.ts](#user-content-r0s30)|9 ✅|||7s| +|[e2e/__tests__/customResolver.test.ts](#user-content-r0s31)|1 ✅|||826ms| +|[e2e/__tests__/customTestSequencers.test.ts](#user-content-r0s32)|3 ✅|||3s| +|[e2e/__tests__/debug.test.ts](#user-content-r0s33)|1 ✅|||899ms| +|[e2e/__tests__/declarationErrors.test.ts](#user-content-r0s34)|3 ✅|||2s| +|[e2e/__tests__/dependencyClash.test.ts](#user-content-r0s35)|1 ✅|||833ms| +|[e2e/__tests__/detectOpenHandles.ts](#user-content-r0s36)|8 ✅|||8s| +|[e2e/__tests__/domDiffing.test.ts](#user-content-r0s37)|1 ✅|||1s| +|[e2e/__tests__/doneInHooks.test.ts](#user-content-r0s38)|1 ✅|||855ms| +|[e2e/__tests__/dynamicRequireDependencies.ts](#user-content-r0s39)|1 ✅|||847ms| +|[e2e/__tests__/each.test.ts](#user-content-r0s40)|7 ✅|||5s| +|[e2e/__tests__/emptyDescribeWithHooks.test.ts](#user-content-r0s41)|4 ✅|||3s| +|[e2e/__tests__/emptySuiteError.test.ts](#user-content-r0s42)|1 ✅|||885ms| +|[e2e/__tests__/env.test.ts](#user-content-r0s43)|6 ✅|||5s| +|[e2e/__tests__/environmentAfterTeardown.test.ts](#user-content-r0s44)|1 ✅|||892ms| +|[e2e/__tests__/errorOnDeprecated.test.ts](#user-content-r0s45)|1 ✅||24 ⚪|56ms| +|[e2e/__tests__/esmConfigFile.test.ts](#user-content-r0s46)|3 ✅|||526ms| +|[e2e/__tests__/executeTestsOnceInMpr.ts](#user-content-r0s47)|1 ✅|||976ms| +|[e2e/__tests__/existentRoots.test.ts](#user-content-r0s48)|4 ✅|||627ms| +|[e2e/__tests__/expectAsyncMatcher.test.ts](#user-content-r0s49)|2 ✅|||3s| +|[e2e/__tests__/expectInVm.test.ts](#user-content-r0s50)|1 ✅|||2s| +|[e2e/__tests__/extraGlobals.test.ts](#user-content-r0s51)|1 ✅|||1s| +|[e2e/__tests__/failureDetailsProperty.test.ts](#user-content-r0s52)|1 ✅|||907ms| +|[e2e/__tests__/failures.test.ts](#user-content-r0s53)|7 ✅|||10s| +|[e2e/__tests__/fakePromises.test.ts](#user-content-r0s54)|2 ✅|||2s| +|[e2e/__tests__/fatalWorkerError.test.ts](#user-content-r0s55)|1 ✅|||3s| +|[e2e/__tests__/filter.test.ts](#user-content-r0s56)|7 ✅|||5s| +|[e2e/__tests__/findRelatedFiles.test.ts](#user-content-r0s57)|5 ✅|||6s| +|[e2e/__tests__/focusedTests.test.ts](#user-content-r0s58)|1 ✅|||888ms| +|[e2e/__tests__/forceExit.test.ts](#user-content-r0s59)|1 ✅|||2s| +|[e2e/__tests__/generatorMock.test.ts](#user-content-r0s60)|1 ✅|||1s| +|[e2e/__tests__/global-mutation.test.ts](#user-content-r0s61)|1 ✅|||40ms| +|[e2e/__tests__/global.test.ts](#user-content-r0s62)|1 ✅|||31ms| +|[e2e/__tests__/globals.test.ts](#user-content-r0s63)|10 ✅|||8s| +|[e2e/__tests__/globalSetup.test.ts](#user-content-r0s64)|10 ✅|||14s| +|[e2e/__tests__/globalTeardown.test.ts](#user-content-r0s65)|7 ✅|||12s| +|[e2e/__tests__/hasteMapMockChanged.test.ts](#user-content-r0s66)|1 ✅|||379ms| +|[e2e/__tests__/hasteMapSha1.test.ts](#user-content-r0s67)|1 ✅|||298ms| +|[e2e/__tests__/hasteMapSize.test.ts](#user-content-r0s68)|2 ✅|||397ms| +|[e2e/__tests__/importedGlobals.test.ts](#user-content-r0s69)|1 ✅|||1s| +|[e2e/__tests__/injectGlobals.test.ts](#user-content-r0s70)|2 ✅|||2s| +|[e2e/__tests__/jasmineAsync.test.ts](#user-content-r0s71)|15 ✅|||28s| +|[e2e/__tests__/jasmineAsyncWithPendingDuringTest.ts](#user-content-r0s72)|1 ✅||1 ⚪|72ms| +|[e2e/__tests__/jest.config.js.test.ts](#user-content-r0s73)|3 ✅|||2s| +|[e2e/__tests__/jest.config.ts.test.ts](#user-content-r0s74)|5 ✅|||14s| +|[e2e/__tests__/jestChangedFiles.test.ts](#user-content-r0s75)|9 ✅|1 ❌||9s| +|[e2e/__tests__/jestEnvironmentJsdom.test.ts](#user-content-r0s76)|1 ✅|||2s| +|[e2e/__tests__/jestRequireActual.test.ts](#user-content-r0s77)|1 ✅|||2s| +|[e2e/__tests__/jestRequireMock.test.ts](#user-content-r0s78)|1 ✅|||2s| +|[e2e/__tests__/json.test.ts](#user-content-r0s79)|2 ✅|||29ms| +|[e2e/__tests__/jsonReporter.test.ts](#user-content-r0s80)|2 ✅|||2s| +|[e2e/__tests__/lifecycles.ts](#user-content-r0s81)|1 ✅|||861ms| +|[e2e/__tests__/listTests.test.ts](#user-content-r0s82)|2 ✅|||945ms| +|[e2e/__tests__/locationInResults.test.ts](#user-content-r0s83)|2 ✅|||2s| +|[e2e/__tests__/logHeapUsage.test.ts](#user-content-r0s84)|1 ✅|||884ms| +|[e2e/__tests__/mockNames.test.ts](#user-content-r0s85)|8 ✅|||7s| +|[e2e/__tests__/modernFakeTimers.test.ts](#user-content-r0s86)|2 ✅|||2s| +|[e2e/__tests__/moduleNameMapper.test.ts](#user-content-r0s87)|5 ✅|||5s| +|[e2e/__tests__/moduleParentNullInTest.ts](#user-content-r0s88)|1 ✅|||886ms| +|[e2e/__tests__/multiProjectRunner.test.ts](#user-content-r0s89)|14 ✅|||16s| +|[e2e/__tests__/nativeAsyncMock.test.ts](#user-content-r0s90)|1 ✅|||55ms| +|[e2e/__tests__/nativeEsm.test.ts](#user-content-r0s91)|2 ✅||1 ⚪|905ms| +|[e2e/__tests__/nativeEsmTypescript.test.ts](#user-content-r0s92)|1 ✅|||956ms| +|[e2e/__tests__/nestedEventLoop.test.ts](#user-content-r0s93)|1 ✅|||1s| +|[e2e/__tests__/nestedTestDefinitions.test.ts](#user-content-r0s94)|4 ✅|||5s| +|[e2e/__tests__/nodePath.test.ts](#user-content-r0s95)|1 ✅|||866ms| +|[e2e/__tests__/noTestFound.test.ts](#user-content-r0s96)|2 ✅|||1s| +|[e2e/__tests__/noTestsFound.test.ts](#user-content-r0s97)|5 ✅|||3s| +|[e2e/__tests__/onlyChanged.test.ts](#user-content-r0s98)|8 ✅|1 ❌||22s| +|[e2e/__tests__/onlyFailuresNonWatch.test.ts](#user-content-r0s99)|1 ✅|||3s| +|[e2e/__tests__/overrideGlobals.test.ts](#user-content-r0s100)|2 ✅|||2s| +|[e2e/__tests__/pnp.test.ts](#user-content-r0s101)|1 ✅|||3s| +|[e2e/__tests__/presets.test.ts](#user-content-r0s102)|2 ✅|||2s| +|[e2e/__tests__/processExit.test.ts](#user-content-r0s103)|1 ✅|||1s| +|[e2e/__tests__/promiseReject.test.ts](#user-content-r0s104)|1 ✅|||967ms| +|[e2e/__tests__/regexCharInPath.test.ts](#user-content-r0s105)|1 ✅|||962ms| +|[e2e/__tests__/requireAfterTeardown.test.ts](#user-content-r0s106)|1 ✅|||921ms| +|[e2e/__tests__/requireMain.test.ts](#user-content-r0s107)|1 ✅|||1s| +|[e2e/__tests__/requireMainAfterCreateRequire.test.ts](#user-content-r0s108)|1 ✅|||966ms| +|[e2e/__tests__/requireMainIsolateModules.test.ts](#user-content-r0s109)|1 ✅|||976ms| +|[e2e/__tests__/requireMainResetModules.test.ts](#user-content-r0s110)|2 ✅|||2s| +|[e2e/__tests__/requireV8Module.test.ts](#user-content-r0s111)|1 ✅|||30ms| +|[e2e/__tests__/resetModules.test.ts](#user-content-r0s112)|1 ✅|||926ms| +|[e2e/__tests__/resolve.test.ts](#user-content-r0s113)|1 ✅|||2s| +|[e2e/__tests__/resolveGetPaths.test.ts](#user-content-r0s114)|1 ✅|||1s| +|[e2e/__tests__/resolveNodeModule.test.ts](#user-content-r0s115)|1 ✅|||943ms| +|[e2e/__tests__/resolveNoFileExtensions.test.ts](#user-content-r0s116)|2 ✅|||1s| +|[e2e/__tests__/resolveWithPaths.test.ts](#user-content-r0s117)|1 ✅|||1s| +|[e2e/__tests__/runProgrammatically.test.ts](#user-content-r0s118)|2 ✅|||575ms| +|[e2e/__tests__/runTestsByPath.test.ts](#user-content-r0s119)|1 ✅|||2s| +|[e2e/__tests__/runtimeInternalModuleRegistry.test.ts](#user-content-r0s120)|1 ✅|||1s| +|[e2e/__tests__/selectProjects.test.ts](#user-content-r0s121)|18 ✅|||5s| +|[e2e/__tests__/setImmediate.test.ts](#user-content-r0s122)|1 ✅|||904ms| +|[e2e/__tests__/setupFilesAfterEnvConfig.test.ts](#user-content-r0s123)|2 ✅|||2s| +|[e2e/__tests__/showConfig.test.ts](#user-content-r0s124)|1 ✅|||195ms| +|[e2e/__tests__/skipBeforeAfterAll.test.ts](#user-content-r0s125)|1 ✅|||1s| +|[e2e/__tests__/snapshot-unknown.test.ts](#user-content-r0s126)|1 ✅|||838ms| +|[e2e/__tests__/snapshot.test.ts](#user-content-r0s127)|9 ✅|||14s| +|[e2e/__tests__/snapshotMockFs.test.ts](#user-content-r0s128)|1 ✅|||883ms| +|[e2e/__tests__/snapshotResolver.test.ts](#user-content-r0s129)|1 ✅|||823ms| +|[e2e/__tests__/snapshotSerializers.test.ts](#user-content-r0s130)|2 ✅|||2s| +|[e2e/__tests__/stackTrace.test.ts](#user-content-r0s131)|7 ✅|||5s| +|[e2e/__tests__/stackTraceNoCaptureStackTrace.test.ts](#user-content-r0s132)|1 ✅|||899ms| +|[e2e/__tests__/stackTraceSourceMaps.test.ts](#user-content-r0s133)|1 ✅|||2s| +|[e2e/__tests__/stackTraceSourceMapsWithCoverage.test.ts](#user-content-r0s134)|1 ✅|||2s| +|[e2e/__tests__/supportsDashedArgs.ts](#user-content-r0s135)|2 ✅|||968ms| +|[e2e/__tests__/symbol.test.ts](#user-content-r0s136)|1 ✅|||49ms| +|[e2e/__tests__/testEnvironment.test.ts](#user-content-r0s137)|1 ✅|||2s| +|[e2e/__tests__/testEnvironmentAsync.test.ts](#user-content-r0s138)|1 ✅|||1s| +|[e2e/__tests__/testEnvironmentCircus.test.ts](#user-content-r0s139)|1 ✅|||2s| +|[e2e/__tests__/testEnvironmentCircusAsync.test.ts](#user-content-r0s140)|1 ✅|||2s| +|[e2e/__tests__/testFailureExitCode.test.ts](#user-content-r0s141)|2 ✅|||4s| +|[e2e/__tests__/testInRoot.test.ts](#user-content-r0s142)|1 ✅|||1s| +|[e2e/__tests__/testNamePattern.test.ts](#user-content-r0s143)|1 ✅|||859ms| +|[e2e/__tests__/testNamePatternSkipped.test.ts](#user-content-r0s144)|1 ✅|||991ms| +|[e2e/__tests__/testPathPatternReporterMessage.test.ts](#user-content-r0s145)|1 ✅|||3s| +|[e2e/__tests__/testResultsProcessor.test.ts](#user-content-r0s146)|1 ✅|||910ms| +|[e2e/__tests__/testRetries.test.ts](#user-content-r0s147)|4 ✅|||3s| +|[e2e/__tests__/testTodo.test.ts](#user-content-r0s148)|5 ✅|||4s| +|[e2e/__tests__/timeouts.test.ts](#user-content-r0s149)|4 ✅|||4s| +|[e2e/__tests__/timeoutsLegacy.test.ts](#user-content-r0s150)|1 ✅||3 ⚪|71ms| +|[e2e/__tests__/timerResetMocks.test.ts](#user-content-r0s151)|2 ✅|||2s| +|[e2e/__tests__/timerUseRealTimers.test.ts](#user-content-r0s152)|1 ✅|||1s| +|[e2e/__tests__/toMatchInlineSnapshot.test.ts](#user-content-r0s153)|12 ✅|||24s| +|[e2e/__tests__/toMatchInlineSnapshotWithRetries.test.ts](#user-content-r0s154)|3 ✅|||5s| +|[e2e/__tests__/toMatchSnapshot.test.ts](#user-content-r0s155)|9 ✅|||17s| +|[e2e/__tests__/toMatchSnapshotWithRetries.test.ts](#user-content-r0s156)|2 ✅|||4s| +|[e2e/__tests__/toMatchSnapshotWithStringSerializer.test.ts](#user-content-r0s157)|3 ✅|||4s| +|[e2e/__tests__/toThrowErrorMatchingInlineSnapshot.test.ts](#user-content-r0s158)|4 ✅|||4s| +|[e2e/__tests__/toThrowErrorMatchingSnapshot.test.ts](#user-content-r0s159)|5 ✅|||4s| +|[e2e/__tests__/transform.test.ts](#user-content-r0s160)|16 ✅|||27s| +|[e2e/__tests__/transformLinkedModules.test.ts](#user-content-r0s161)|1 ✅|||783ms| +|[e2e/__tests__/typescriptCoverage.test.ts](#user-content-r0s162)|1 ✅|||3s| +|[e2e/__tests__/unexpectedToken.test.ts](#user-content-r0s163)|3 ✅|||3s| +|[e2e/__tests__/useStderr.test.ts](#user-content-r0s164)|1 ✅|||1s| +|[e2e/__tests__/v8Coverage.test.ts](#user-content-r0s165)|2 ✅|||2s| +|[e2e/__tests__/verbose.test.ts](#user-content-r0s166)|1 ✅|||683ms| +|[e2e/__tests__/version.test.ts](#user-content-r0s167)|1 ✅|||138ms| +|[e2e/__tests__/watchModeNoAccess.test.ts](#user-content-r0s168)|1 ✅|||4s| +|[e2e/__tests__/watchModeOnlyFailed.test.ts](#user-content-r0s169)|1 ✅|||1s| +|[e2e/__tests__/watchModePatterns.test.ts](#user-content-r0s170)|2 ✅|||4s| +|[e2e/__tests__/watchModeUpdateSnapshot.test.ts](#user-content-r0s171)|1 ✅|||1s| +|[e2e/__tests__/workerForceExit.test.ts](#user-content-r0s172)|2 ✅|||5s| +|[e2e/__tests__/wrongEnv.test.ts](#user-content-r0s173)|5 ✅|||4s| +|[e2e/custom-test-sequencer/a.test.js](#user-content-r0s174)|1 ✅|||29ms| +|[e2e/custom-test-sequencer/b.test.js](#user-content-r0s175)|1 ✅|||21ms| +|[e2e/custom-test-sequencer/c.test.js](#user-content-r0s176)|1 ✅|||42ms| +|[e2e/custom-test-sequencer/d.test.js](#user-content-r0s177)|1 ✅|||21ms| +|[e2e/custom-test-sequencer/e.test.js](#user-content-r0s178)|1 ✅|||27ms| +|[e2e/test-in-root/spec.js](#user-content-r0s179)|1 ✅|||19ms| +|[e2e/test-in-root/test.js](#user-content-r0s180)|1 ✅|||37ms| +|[e2e/timer-reset-mocks/after-reset-all-mocks/timerAndMock.test.js](#user-content-r0s181)|2 ✅|||30ms| +|[e2e/timer-reset-mocks/with-reset-mocks/timerWithMock.test.js](#user-content-r0s182)|1 ✅|||34ms| +|[e2e/v8-coverage/empty-sourcemap/test.ts](#user-content-r0s183)|1 ✅|||31ms| +|[examples/angular/app.component.spec.ts](#user-content-r0s184)|3 ✅|||654ms| +|[examples/angular/shared/data.service.spec.ts](#user-content-r0s185)|2 ✅|||431ms| +|[examples/angular/shared/sub.service.spec.ts](#user-content-r0s186)|1 ✅|||109ms| +|[examples/async/__tests__/user.test.js](#user-content-r0s187)|8 ✅|||96ms| +|[examples/automatic-mocks/__tests__/automock.test.js](#user-content-r0s188)|2 ✅|||74ms| +|[examples/automatic-mocks/__tests__/createMockFromModule.test.js](#user-content-r0s189)|2 ✅|||115ms| +|[examples/automatic-mocks/__tests__/disableAutomocking.test.js](#user-content-r0s190)|1 ✅|||24ms| +|[examples/enzyme/__tests__/CheckboxWithLabel-test.js](#user-content-r0s191)|1 ✅|||434ms| +|[examples/getting-started/sum.test.js](#user-content-r0s192)|1 ✅|||78ms| +|[examples/jquery/__tests__/display_user.test.js](#user-content-r0s193)|1 ✅|||196ms| +|[examples/jquery/__tests__/fetch_current_user.test.js](#user-content-r0s194)|2 ✅|||196ms| +|[examples/manual-mocks/__tests__/file_summarizer.test.js](#user-content-r0s195)|1 ✅|||87ms| +|[examples/manual-mocks/__tests__/lodashMocking.test.js](#user-content-r0s196)|1 ✅|||109ms| +|[examples/manual-mocks/__tests__/user.test.js](#user-content-r0s197)|1 ✅|||41ms| +|[examples/manual-mocks/__tests__/userMocked.test.js](#user-content-r0s198)|1 ✅|||105ms| +|[examples/module-mock/__tests__/full_mock.js](#user-content-r0s199)|1 ✅|||60ms| +|[examples/module-mock/__tests__/mock_per_test.js](#user-content-r0s200)|2 ✅|||116ms| +|[examples/module-mock/__tests__/partial_mock.js](#user-content-r0s201)|1 ✅|||215ms| +|[examples/mongodb/__test__/db.test.js](#user-content-r0s202)|1 ✅|||236ms| +|[examples/react-native/__tests__/intro.test.js](#user-content-r0s203)|4 ✅|||9s| +|[examples/react-testing-library/__tests__/CheckboxWithLabel-test.js](#user-content-r0s204)|1 ✅|||469ms| +|[examples/react/__tests__/CheckboxWithLabel-test.js](#user-content-r0s205)|1 ✅|||256ms| +|[examples/snapshot/__tests__/clock.react.test.js](#user-content-r0s206)|1 ✅|||62ms| +|[examples/snapshot/__tests__/link.react.test.js](#user-content-r0s207)|4 ✅|||181ms| +|[examples/timer/__tests__/infinite_timer_game.test.js](#user-content-r0s208)|1 ✅|||94ms| +|[examples/timer/__tests__/timer_game.test.js](#user-content-r0s209)|3 ✅|||74ms| +|[examples/typescript/__tests__/calc.test.ts](#user-content-r0s210)|6 ✅|||276ms| +|[examples/typescript/__tests__/CheckboxWithLabel-test.tsx](#user-content-r0s211)|1 ✅|||227ms| +|[examples/typescript/__tests__/sub-test.ts](#user-content-r0s212)|1 ✅|||43ms| +|[examples/typescript/__tests__/sum-test.ts](#user-content-r0s213)|2 ✅|||69ms| +|[examples/typescript/__tests__/sum.test.js](#user-content-r0s214)|2 ✅|||100ms| +|[packages/babel-jest/src/__tests__/index.ts](#user-content-r0s215)|6 ✅|||371ms| +|[packages/babel-plugin-jest-hoist/src/__tests__/hoistPlugin.test.ts](#user-content-r0s216)|4 ✅|||347ms| +|[packages/diff-sequences/src/__tests__/index.property.test.ts](#user-content-r0s217)|7 ✅|||357ms| +|[packages/diff-sequences/src/__tests__/index.test.ts](#user-content-r0s218)|48 ✅|||195ms| +|[packages/expect/src/__tests__/assertionCounts.test.ts](#user-content-r0s219)|6 ✅|||60ms| +|[packages/expect/src/__tests__/asymmetricMatchers.test.ts](#user-content-r0s220)|38 ✅|||207ms| +|[packages/expect/src/__tests__/extend.test.ts](#user-content-r0s221)|10 ✅|||99ms| +|[packages/expect/src/__tests__/isError.test.ts](#user-content-r0s222)|4 ✅|||43ms| +|[packages/expect/src/__tests__/matchers-toContain.property.test.ts](#user-content-r0s223)|2 ✅|||236ms| +|[packages/expect/src/__tests__/matchers-toContainEqual.property.test.ts](#user-content-r0s224)|2 ✅|||287ms| +|[packages/expect/src/__tests__/matchers-toEqual.property.test.ts](#user-content-r0s225)|2 ✅|||1s| +|[packages/expect/src/__tests__/matchers-toStrictEqual.property.test.ts](#user-content-r0s226)|3 ✅|||394ms| +|[packages/expect/src/__tests__/matchers.test.js](#user-content-r0s227)|592 ✅|||862ms| +|[packages/expect/src/__tests__/spyMatchers.test.ts](#user-content-r0s228)|248 ✅|||395ms| +|[packages/expect/src/__tests__/stacktrace.test.ts](#user-content-r0s229)|3 ✅|||69ms| +|[packages/expect/src/__tests__/symbolInObjects.test.ts](#user-content-r0s230)|3 ✅|||33ms| +|[packages/expect/src/__tests__/toEqual-dom.test.ts](#user-content-r0s231)|12 ✅|||99ms| +|[packages/expect/src/__tests__/toThrowMatchers.test.ts](#user-content-r0s232)|98 ✅|||257ms| +|[packages/expect/src/__tests__/utils.test.ts](#user-content-r0s233)|41 ✅|||147ms| +|[packages/jest-circus/src/__tests__/afterAll.test.ts](#user-content-r0s234)|6 ✅|||6s| +|[packages/jest-circus/src/__tests__/baseTest.test.ts](#user-content-r0s235)|2 ✅|||3s| +|[packages/jest-circus/src/__tests__/circusItTestError.test.ts](#user-content-r0s236)|8 ✅|||300ms| +|[packages/jest-circus/src/__tests__/circusItTodoTestError.test.ts](#user-content-r0s237)|3 ✅|||81ms| +|[packages/jest-circus/src/__tests__/hooks.test.ts](#user-content-r0s238)|3 ✅|||4s| +|[packages/jest-circus/src/__tests__/hooksError.test.ts](#user-content-r0s239)|32 ✅|||127ms| +|[packages/jest-cli/src/__tests__/cli/args.test.ts](#user-content-r0s240)|17 ✅|||345ms| +|[packages/jest-cli/src/init/__tests__/init.test.js](#user-content-r0s241)|24 ✅|||119ms| +|[packages/jest-cli/src/init/__tests__/modifyPackageJson.test.ts](#user-content-r0s242)|4 ✅|||30ms| +|[packages/jest-config/src/__tests__/Defaults.test.ts](#user-content-r0s243)|1 ✅|||672ms| +|[packages/jest-config/src/__tests__/getMaxWorkers.test.ts](#user-content-r0s244)|7 ✅|||67ms| +|[packages/jest-config/src/__tests__/normalize.test.js](#user-content-r0s245)|118 ✅|||798ms| +|[packages/jest-config/src/__tests__/readConfig.test.ts](#user-content-r0s246)|1 ✅|||76ms| +|[packages/jest-config/src/__tests__/readConfigs.test.ts](#user-content-r0s247)|3 ✅|||135ms| +|[packages/jest-config/src/__tests__/resolveConfigPath.test.ts](#user-content-r0s248)|10 ✅|||183ms| +|[packages/jest-config/src/__tests__/setFromArgv.test.ts](#user-content-r0s249)|4 ✅|||53ms| +|[packages/jest-config/src/__tests__/validatePattern.test.ts](#user-content-r0s250)|4 ✅|||52ms| +|[packages/jest-console/src/__tests__/bufferedConsole.test.ts](#user-content-r0s251)|20 ✅|||171ms| +|[packages/jest-console/src/__tests__/CustomConsole.test.ts](#user-content-r0s252)|23 ✅|||115ms| +|[packages/jest-console/src/__tests__/getConsoleOutput.test.ts](#user-content-r0s253)|12 ✅|||56ms| +|[packages/jest-core/src/__tests__/FailedTestsCache.test.js](#user-content-r0s254)|1 ✅|||25ms| +|[packages/jest-core/src/__tests__/getNoTestsFoundMessage.test.js](#user-content-r0s255)|5 ✅|||61ms| +|[packages/jest-core/src/__tests__/globals.test.ts](#user-content-r0s256)|1 ✅|||22ms| +|[packages/jest-core/src/__tests__/runJest.test.js](#user-content-r0s257)|2 ✅|||261ms| +|[packages/jest-core/src/__tests__/SearchSource.test.ts](#user-content-r0s258)|27 ✅|||3s| +|[packages/jest-core/src/__tests__/SnapshotInteractiveMode.test.js](#user-content-r0s259)|13 ✅|||89ms| +|[packages/jest-core/src/__tests__/TestScheduler.test.js](#user-content-r0s260)|8 ✅|||520ms| +|[packages/jest-core/src/__tests__/testSchedulerHelper.test.js](#user-content-r0s261)|12 ✅|||48ms| +|[packages/jest-core/src/__tests__/watch.test.js](#user-content-r0s262)|80 ✅|||7s| +|[packages/jest-core/src/__tests__/watchFileChanges.test.ts](#user-content-r0s263)|1 ✅|||2s| +|[packages/jest-core/src/__tests__/watchFilenamePatternMode.test.js](#user-content-r0s264)|2 ✅|||165ms| +|[packages/jest-core/src/__tests__/watchTestNamePatternMode.test.js](#user-content-r0s265)|1 ✅|||246ms| +|[packages/jest-core/src/lib/__tests__/isValidPath.test.ts](#user-content-r0s266)|3 ✅|||166ms| +|[packages/jest-core/src/lib/__tests__/logDebugMessages.test.ts](#user-content-r0s267)|3 ✅|||48ms| +|[packages/jest-create-cache-key-function/src/__tests__/index.test.ts](#user-content-r0s268)|1 ✅|||75ms| +|[packages/jest-diff/src/__tests__/diff.test.ts](#user-content-r0s269)|107 ✅|||625ms| +|[packages/jest-diff/src/__tests__/diffStringsRaw.test.ts](#user-content-r0s270)|2 ✅|||55ms| +|[packages/jest-diff/src/__tests__/getAlignedDiffs.test.ts](#user-content-r0s271)|24 ✅|||72ms| +|[packages/jest-diff/src/__tests__/joinAlignedDiffs.test.ts](#user-content-r0s272)|6 ✅|||44ms| +|[packages/jest-docblock/src/__tests__/index.test.ts](#user-content-r0s273)|36 ✅|||177ms| +|[packages/jest-each/src/__tests__/array.test.ts](#user-content-r0s274)|159 ✅|||192ms| +|[packages/jest-each/src/__tests__/index.test.ts](#user-content-r0s275)|10 ✅|||44ms| +|[packages/jest-each/src/__tests__/template.test.ts](#user-content-r0s276)|242 ✅|||483ms| +|[packages/jest-environment-jsdom/src/__tests__/jsdom_environment.test.ts](#user-content-r0s277)|2 ✅|||783ms| +|[packages/jest-environment-node/src/__tests__/node_environment.test.ts](#user-content-r0s278)|6 ✅|||184ms| +|[packages/jest-fake-timers/src/__tests__/legacyFakeTimers.test.ts](#user-content-r0s279)|50 ✅|||302ms| +|[packages/jest-fake-timers/src/__tests__/modernFakeTimers.test.ts](#user-content-r0s280)|40 ✅|||317ms| +|[packages/jest-get-type/src/__tests__/getType.test.ts](#user-content-r0s281)|14 ✅|||45ms| +|[packages/jest-get-type/src/__tests__/isPrimitive.test.ts](#user-content-r0s282)|18 ✅|||36ms| +|[packages/jest-globals/src/__tests__/index.ts](#user-content-r0s283)|1 ✅|||533ms| +|[packages/jest-haste-map/src/__tests__/get_mock_name.test.js](#user-content-r0s284)|1 ✅|||22ms| +|[packages/jest-haste-map/src/__tests__/includes_dotfiles.test.ts](#user-content-r0s285)|1 ✅|||337ms| +|[packages/jest-haste-map/src/__tests__/index.test.js](#user-content-r0s286)|44 ✅|||1s| +|[packages/jest-haste-map/src/__tests__/worker.test.js](#user-content-r0s287)|7 ✅|||100ms| +|[packages/jest-haste-map/src/crawlers/__tests__/node.test.js](#user-content-r0s288)|10 ✅|||170ms| +|[packages/jest-haste-map/src/crawlers/__tests__/watchman.test.js](#user-content-r0s289)|8 ✅|||153ms| +|[packages/jest-haste-map/src/lib/__tests__/dependencyExtractor.test.js](#user-content-r0s290)|15 ✅|||56ms| +|[packages/jest-haste-map/src/lib/__tests__/fast_path.test.js](#user-content-r0s291)|5 ✅|||29ms| +|[packages/jest-haste-map/src/lib/__tests__/getPlatformExtension.test.js](#user-content-r0s292)|1 ✅|||35ms| +|[packages/jest-haste-map/src/lib/__tests__/isRegExpSupported.test.js](#user-content-r0s293)|2 ✅|||31ms| +|[packages/jest-haste-map/src/lib/__tests__/normalizePathSep.test.js](#user-content-r0s294)|2 ✅|||35ms| +|[packages/jest-jasmine2/src/__tests__/concurrent.test.ts](#user-content-r0s295)|3 ✅|||24ms| +|[packages/jest-jasmine2/src/__tests__/expectationResultFactory.test.ts](#user-content-r0s296)|7 ✅|||70ms| +|[packages/jest-jasmine2/src/__tests__/hooksError.test.ts](#user-content-r0s297)|32 ✅|||51ms| +|[packages/jest-jasmine2/src/__tests__/iterators.test.ts](#user-content-r0s298)|4 ✅|||43ms| +|[packages/jest-jasmine2/src/__tests__/itTestError.test.ts](#user-content-r0s299)|6 ✅|||32ms| +|[packages/jest-jasmine2/src/__tests__/itToTestAlias.test.ts](#user-content-r0s300)|1 ✅|||23ms| +|[packages/jest-jasmine2/src/__tests__/pTimeout.test.ts](#user-content-r0s301)|3 ✅|||44ms| +|[packages/jest-jasmine2/src/__tests__/queueRunner.test.ts](#user-content-r0s302)|6 ✅|||93ms| +|[packages/jest-jasmine2/src/__tests__/reporter.test.ts](#user-content-r0s303)|1 ✅|||107ms| +|[packages/jest-jasmine2/src/__tests__/Suite.test.ts](#user-content-r0s304)|1 ✅|||84ms| +|[packages/jest-jasmine2/src/__tests__/todoError.test.ts](#user-content-r0s305)|3 ✅|||27ms| +|[packages/jest-leak-detector/src/__tests__/index.test.ts](#user-content-r0s306)|6 ✅|||986ms| +|[packages/jest-matcher-utils/src/__tests__/deepCyclicCopyReplaceable.test.ts](#user-content-r0s307)|11 ✅|||49ms| +|[packages/jest-matcher-utils/src/__tests__/deepCyclicCopyReplaceableDom.test.ts](#user-content-r0s308)|2 ✅|||48ms| +|[packages/jest-matcher-utils/src/__tests__/index.test.ts](#user-content-r0s309)|48 ✅|||391ms| +|[packages/jest-matcher-utils/src/__tests__/printDiffOrStringify.test.ts](#user-content-r0s310)|21 ✅|||114ms| +|[packages/jest-matcher-utils/src/__tests__/Replaceable.test.ts](#user-content-r0s311)|17 ✅|||111ms| +|[packages/jest-message-util/src/__tests__/messages.test.ts](#user-content-r0s312)|11 ✅|||205ms| +|[packages/jest-mock/src/__tests__/index.test.ts](#user-content-r0s313)|84 ✅|||509ms| +|[packages/jest-regex-util/src/__tests__/index.test.ts](#user-content-r0s314)|8 ✅|||56ms| +|[packages/jest-repl/src/__tests__/jest_repl.test.js](#user-content-r0s315)|1 ✅|||1s| +|[packages/jest-repl/src/__tests__/runtime_cli.test.js](#user-content-r0s316)|4 ✅|||4s| +|[packages/jest-reporters/src/__tests__/CoverageReporter.test.js](#user-content-r0s317)|12 ✅|||397ms| +|[packages/jest-reporters/src/__tests__/CoverageWorker.test.js](#user-content-r0s318)|2 ✅|||199ms| +|[packages/jest-reporters/src/__tests__/DefaultReporter.test.js](#user-content-r0s319)|2 ✅|||148ms| +|[packages/jest-reporters/src/__tests__/generateEmptyCoverage.test.js](#user-content-r0s320)|3 ✅|||1s| +|[packages/jest-reporters/src/__tests__/getResultHeader.test.js](#user-content-r0s321)|4 ✅|||30ms| +|[packages/jest-reporters/src/__tests__/getSnapshotStatus.test.js](#user-content-r0s322)|3 ✅|||28ms| +|[packages/jest-reporters/src/__tests__/getSnapshotSummary.test.js](#user-content-r0s323)|4 ✅|||49ms| +|[packages/jest-reporters/src/__tests__/getWatermarks.test.ts](#user-content-r0s324)|2 ✅|||37ms| +|[packages/jest-reporters/src/__tests__/NotifyReporter.test.ts](#user-content-r0s325)|18 ✅|||166ms| +|[packages/jest-reporters/src/__tests__/SummaryReporter.test.js](#user-content-r0s326)|4 ✅|||366ms| +|[packages/jest-reporters/src/__tests__/utils.test.ts](#user-content-r0s327)|10 ✅|||85ms| +|[packages/jest-reporters/src/__tests__/VerboseReporter.test.js](#user-content-r0s328)|11 ✅|||425ms| +|[packages/jest-resolve-dependencies/src/__tests__/dependency_resolver.test.ts](#user-content-r0s329)|11 ✅|||666ms| +|[packages/jest-resolve/src/__tests__/isBuiltinModule.test.ts](#user-content-r0s330)|4 ✅|||36ms| +|[packages/jest-resolve/src/__tests__/resolve.test.ts](#user-content-r0s331)|16 ✅|||1s| +|[packages/jest-runner/src/__tests__/testRunner.test.ts](#user-content-r0s332)|2 ✅|||905ms| +|[packages/jest-runtime/src/__tests__/instrumentation.test.ts](#user-content-r0s333)|1 ✅|||275ms| +|[packages/jest-runtime/src/__tests__/runtime_create_mock_from_module.test.js](#user-content-r0s334)|3 ✅|||606ms| +|[packages/jest-runtime/src/__tests__/runtime_environment.test.js](#user-content-r0s335)|2 ✅|||497ms| +|[packages/jest-runtime/src/__tests__/runtime_internal_module.test.js](#user-content-r0s336)|4 ✅|||727ms| +|[packages/jest-runtime/src/__tests__/runtime_jest_fn.js](#user-content-r0s337)|4 ✅|||479ms| +|[packages/jest-runtime/src/__tests__/runtime_jest_spy_on.test.js](#user-content-r0s338)|2 ✅|||521ms| +|[packages/jest-runtime/src/__tests__/runtime_mock.test.js](#user-content-r0s339)|4 ✅|||743ms| +|[packages/jest-runtime/src/__tests__/runtime_module_directories.test.js](#user-content-r0s340)|4 ✅|||525ms| +|[packages/jest-runtime/src/__tests__/runtime_node_path.test.js](#user-content-r0s341)|4 ✅|||1s| +|[packages/jest-runtime/src/__tests__/runtime_require_actual.test.js](#user-content-r0s342)|2 ✅|||478ms| +|[packages/jest-runtime/src/__tests__/runtime_require_cache.test.js](#user-content-r0s343)|2 ✅|||454ms| +|[packages/jest-runtime/src/__tests__/runtime_require_mock.test.js](#user-content-r0s344)|13 ✅|||962ms| +|[packages/jest-runtime/src/__tests__/runtime_require_module_no_ext.test.js](#user-content-r0s345)|1 ✅|||261ms| +|[packages/jest-runtime/src/__tests__/runtime_require_module_or_mock_transitive_deps.test.js](#user-content-r0s346)|6 ✅|||2s| +|[packages/jest-runtime/src/__tests__/runtime_require_module_or_mock.test.js](#user-content-r0s347)|17 ✅|||1s| +|[packages/jest-runtime/src/__tests__/runtime_require_module.test.js](#user-content-r0s348)|27 ✅|||2s| +|[packages/jest-runtime/src/__tests__/runtime_require_resolve.test.ts](#user-content-r0s349)|5 ✅|||707ms| +|[packages/jest-runtime/src/__tests__/runtime_wrap.js](#user-content-r0s350)|2 ✅|||263ms| +|[packages/jest-runtime/src/__tests__/Runtime-sourceMaps.test.js](#user-content-r0s351)|1 ✅|||584ms| +|[packages/jest-runtime/src/__tests__/Runtime-statics.test.js](#user-content-r0s352)|2 ✅|||162ms| +|[packages/jest-serializer/src/__tests__/index.test.ts](#user-content-r0s353)|17 ✅|||158ms| +|[packages/jest-snapshot/src/__tests__/dedentLines.test.ts](#user-content-r0s354)|17 ✅|||94ms| +|[packages/jest-snapshot/src/__tests__/InlineSnapshots.test.ts](#user-content-r0s355)|22 ✅|||1s| +|[packages/jest-snapshot/src/__tests__/matcher.test.ts](#user-content-r0s356)|1 ✅|||131ms| +|[packages/jest-snapshot/src/__tests__/mockSerializer.test.ts](#user-content-r0s357)|10 ✅|||45ms| +|[packages/jest-snapshot/src/__tests__/printSnapshot.test.ts](#user-content-r0s358)|71 ✅|||1s| +|[packages/jest-snapshot/src/__tests__/SnapshotResolver.test.ts](#user-content-r0s359)|10 ✅|||98ms| +|[packages/jest-snapshot/src/__tests__/throwMatcher.test.ts](#user-content-r0s360)|3 ✅|||481ms| +|[packages/jest-snapshot/src/__tests__/utils.test.ts](#user-content-r0s361)|26 ✅|||214ms| +|[packages/jest-source-map/src/__tests__/getCallsite.test.ts](#user-content-r0s362)|3 ✅|||86ms| +|[packages/jest-test-result/src/__tests__/formatTestResults.test.ts](#user-content-r0s363)|1 ✅|||53ms| +|[packages/jest-test-sequencer/src/__tests__/test_sequencer.test.js](#user-content-r0s364)|8 ✅|||251ms| +|[packages/jest-transform/src/__tests__/ScriptTransformer.test.ts](#user-content-r0s365)|22 ✅|||2s| +|[packages/jest-transform/src/__tests__/shouldInstrument.test.ts](#user-content-r0s366)|25 ✅|||155ms| +|[packages/jest-util/src/__tests__/createProcessObject.test.ts](#user-content-r0s367)|4 ✅|||81ms| +|[packages/jest-util/src/__tests__/deepCyclicCopy.test.ts](#user-content-r0s368)|12 ✅|||86ms| +|[packages/jest-util/src/__tests__/errorWithStack.test.ts](#user-content-r0s369)|1 ✅|||41ms| +|[packages/jest-util/src/__tests__/formatTime.test.ts](#user-content-r0s370)|11 ✅|||82ms| +|[packages/jest-util/src/__tests__/globsToMatcher.test.ts](#user-content-r0s371)|4 ✅|||56ms| +|[packages/jest-util/src/__tests__/installCommonGlobals.test.ts](#user-content-r0s372)|2 ✅|||68ms| +|[packages/jest-util/src/__tests__/isInteractive.test.ts](#user-content-r0s373)|2 ✅|||35ms| +|[packages/jest-util/src/__tests__/isPromise.test.ts](#user-content-r0s374)|10 ✅|||30ms| +|[packages/jest-validate/src/__tests__/validate.test.ts](#user-content-r0s375)|23 ✅|||283ms| +|[packages/jest-validate/src/__tests__/validateCLIOptions.test.js](#user-content-r0s376)|6 ✅|||83ms| +|[packages/jest-watcher/src/lib/__tests__/formatTestNameByPattern.test.ts](#user-content-r0s377)|11 ✅|||129ms| +|[packages/jest-watcher/src/lib/__tests__/prompt.test.ts](#user-content-r0s378)|3 ✅|||91ms| +|[packages/jest-watcher/src/lib/__tests__/scroll.test.ts](#user-content-r0s379)|5 ✅|||57ms| +|[packages/jest-worker/src/__tests__/Farm.test.js](#user-content-r0s380)|10 ✅|||158ms| +|[packages/jest-worker/src/__tests__/FifoQueue.test.js](#user-content-r0s381)|3 ✅|||48ms| +|[packages/jest-worker/src/__tests__/index.test.js](#user-content-r0s382)|8 ✅|||230ms| +|[packages/jest-worker/src/__tests__/PriorityQueue.test.js](#user-content-r0s383)|5 ✅|||63ms| +|[packages/jest-worker/src/__tests__/process-integration.test.js](#user-content-r0s384)|5 ✅|||62ms| +|[packages/jest-worker/src/__tests__/thread-integration.test.js](#user-content-r0s385)|6 ✅|||114ms| +|[packages/jest-worker/src/__tests__/WorkerPool.test.js](#user-content-r0s386)|3 ✅|||51ms| +|[packages/jest-worker/src/base/__tests__/BaseWorkerPool.test.js](#user-content-r0s387)|11 ✅|||653ms| +|[packages/jest-worker/src/workers/__tests__/ChildProcessWorker.test.js](#user-content-r0s388)|17 ✅|||184ms| +|[packages/jest-worker/src/workers/__tests__/NodeThreadsWorker.test.js](#user-content-r0s389)|15 ✅|||258ms| +|[packages/jest-worker/src/workers/__tests__/processChild.test.js](#user-content-r0s390)|10 ✅|||135ms| +|[packages/jest-worker/src/workers/__tests__/threadChild.test.js](#user-content-r0s391)|10 ✅|||120ms| +|[packages/pretty-format/src/__tests__/AsymmetricMatcher.test.ts](#user-content-r0s392)|38 ✅|||137ms| +|[packages/pretty-format/src/__tests__/ConvertAnsi.test.ts](#user-content-r0s393)|6 ✅|||43ms| +|[packages/pretty-format/src/__tests__/DOMCollection.test.ts](#user-content-r0s394)|10 ✅|||64ms| +|[packages/pretty-format/src/__tests__/DOMElement.test.ts](#user-content-r0s395)|28 ✅|||148ms| +|[packages/pretty-format/src/__tests__/Immutable.test.ts](#user-content-r0s396)|111 ✅|||443ms| +|[packages/pretty-format/src/__tests__/prettyFormat.test.ts](#user-content-r0s397)|86 ✅|||219ms| +|[packages/pretty-format/src/__tests__/react.test.tsx](#user-content-r0s398)|55 ✅|||325ms| +|[packages/pretty-format/src/__tests__/ReactElement.test.ts](#user-content-r0s399)|3 ✅|||64ms| +### ✅ e2e/__tests__/asyncAndCallback.test.ts +``` +✅ errors when a test both returns a promise and takes a callback +``` +### ✅ e2e/__tests__/asyncRegenerator.test.ts +``` +✅ successfully transpiles async +``` +### ✅ e2e/__tests__/autoClearMocks.test.ts +``` +✅ suite with auto-clear +✅ suite without auto-clear +``` +### ✅ e2e/__tests__/autoResetMocks.test.ts +``` +✅ suite with auto-reset +✅ suite without auto-reset +``` +### ✅ e2e/__tests__/autoRestoreMocks.test.ts +``` +✅ suite with auto-restore +✅ suite without auto-restore +``` +### ✅ e2e/__tests__/babelPluginJestHoist.test.ts +``` +✅ successfully runs the tests inside `babel-plugin-jest-hoist/` +``` +### ✅ e2e/__tests__/badSourceMap.test.ts +``` +✅ suite with test cases that contain malformed sourcemaps +``` +### ✅ e2e/__tests__/beforeAllFiltered.ts +``` +Correct BeforeAll run + ✅ ensures the BeforeAll of ignored suite is not run +``` +### ✅ e2e/__tests__/beforeEachQueue.ts +``` +✅ does not work on jest-circus +Correct beforeEach order + ⚪ ensures the correct order for beforeEach +``` +### ✅ e2e/__tests__/callDoneTwice.test.ts +``` +✅ `done()` should not be called more than once +``` +### ✅ e2e/__tests__/chaiAssertionLibrary.ts +``` +✅ chai assertion errors should display properly +``` +### ✅ e2e/__tests__/circularInequality.test.ts +``` +✅ handles circular inequality properly +``` +### ✅ e2e/__tests__/circusConcurrentEach.test.ts +``` +✅ works with concurrent.each +✅ works with concurrent.only.each +``` +### ✅ e2e/__tests__/circusDeclarationErrors.test.ts +``` +✅ defining tests and hooks asynchronously throws +``` +### ✅ e2e/__tests__/clearCache.test.ts +``` +jest --clearCache + ✅ normal run results in cache directory being written + ✅ clearCache results in deleted directory and exitCode 0 +``` +### ✅ e2e/__tests__/cliHandlesExactFilenames.test.ts +``` +✅ CLI accepts exact file names if matchers matched +✅ CLI skips exact file names if no matchers matched +``` +### ✅ e2e/__tests__/compareDomNodes.test.ts +``` +✅ does not crash when expect involving a DOM node fails +``` +### ✅ e2e/__tests__/config.test.ts +``` +✅ config as JSON +✅ works with sane config JSON +✅ watchman config option is respected over default argv +✅ config from argv is respected with sane config JSON +✅ works with jsdom testEnvironmentOptions config JSON +✅ negated flags override previous flags +``` +### ✅ e2e/__tests__/console.test.ts +``` +✅ console printing +✅ console printing with --verbose +✅ does not print to console with --silent +✅ respects --noStackTrace +✅ respects noStackTrace in config +✅ the jsdom console is the same as the test console +✅ does not error out when using winston +``` +### ✅ e2e/__tests__/consoleAfterTeardown.test.ts +``` +✅ console printing +``` +### ✅ e2e/__tests__/consoleLogOutputWhenRunInBand.test.ts +``` +✅ prints console.logs when run with forceExit +``` +### ✅ e2e/__tests__/coverageHandlebars.test.ts +``` +✅ code coverage for Handlebars +``` +### ✅ e2e/__tests__/coverageRemapping.test.ts +``` +✅ maps code coverage against original source +``` +### ✅ e2e/__tests__/coverageReport.test.ts +``` +✅ outputs coverage report +✅ collects coverage only from specified file +✅ collects coverage only from multiple specified files +✅ collects coverage only from specified files avoiding dependencies +✅ json reporter printing with --coverage +✅ outputs coverage report as json +✅ outputs coverage report when text is requested +✅ outputs coverage report when text-summary is requested +✅ outputs coverage report when text and text-summary is requested +✅ does not output coverage report when html is requested +✅ collects coverage from duplicate files avoiding shared cache +✅ generates coverage when using the testRegex config param +``` +### ✅ e2e/__tests__/coverageThreshold.test.ts +``` +✅ exits with 1 if coverage threshold is not met +✅ exits with 1 if path threshold group is not found in coverage data +✅ exits with 0 if global threshold group is not found in coverage data +✅ excludes tests matched by path threshold groups from global group +✅ file is matched by all path and glob threshold groups +``` +### ✅ e2e/__tests__/coverageTransformInstrumented.test.ts +``` +✅ code coverage for transform instrumented code +``` +### ✅ e2e/__tests__/coverageWithoutTransform.test.ts +``` +✅ produces code coverage for uncovered files without transformer +``` +### ✅ e2e/__tests__/createProcessObject.test.ts +``` +✅ allows retrieving the current domain +``` +### ✅ e2e/__tests__/customInlineSnapshotMatchers.test.ts +``` +✅ works with custom inline snapshot matchers +``` +### ✅ e2e/__tests__/customMatcherStackTrace.test.ts +``` +✅ works with custom matchers +✅ custom async matchers +``` +### ✅ e2e/__tests__/customReporters.test.ts +``` +Custom Reporters Integration + ✅ valid string format for adding reporters + ✅ valid array format for adding reporters + ✅ invalid format for adding reporters + ✅ default reporters enabled + ✅ TestReporter with all tests passing + ✅ TestReporter with all tests failing + ✅ IncompleteReporter for flexibility + ✅ reporters can be default exports + ✅ prints reporter errors +``` +### ✅ e2e/__tests__/customResolver.test.ts +``` +✅ use the custom resolver +``` +### ✅ e2e/__tests__/customTestSequencers.test.ts +``` +✅ run prioritySequence first sync +✅ run prioritySequence first async +✅ run failed tests async +``` +### ✅ e2e/__tests__/debug.test.ts +``` +jest --debug + ✅ outputs debugging info before running the test +``` +### ✅ e2e/__tests__/declarationErrors.test.ts +``` +✅ errors if describe returns a Promise +✅ errors if describe returns something +✅ errors if describe throws +``` +### ✅ e2e/__tests__/dependencyClash.test.ts +``` +✅ does not require project modules from inside node_modules +``` +### ✅ e2e/__tests__/detectOpenHandles.ts +``` +✅ prints message about flag on slow tests +✅ prints message about flag on forceExit +✅ prints out info about open handlers +✅ does not report promises +✅ prints out info about open handlers from inside tests +on node >=11.10.0 + ✅ does not report ELD histograms +notify + ✅ does not report --notify flag +on node >=11 + ✅ does not report timeouts using unref +``` +### ✅ e2e/__tests__/domDiffing.test.ts +``` +✅ should work without error +``` +### ✅ e2e/__tests__/doneInHooks.test.ts +``` +✅ `done()` works properly in hooks +``` +### ✅ e2e/__tests__/dynamicRequireDependencies.ts +``` +✅ successfully runs tests with dynamic dependencies +``` +### ✅ e2e/__tests__/each.test.ts +``` +✅ works with passing tests +✅ shows error message when not enough arguments are supplied to tests +✅ shows the correct errors in stderr when failing tests +✅ shows only the tests with .only as being ran +✅ shows only the tests without .skip as being ran +✅ runs only the describe.only.each tests +✅ formats args with pretty format when given %p +``` +### ✅ e2e/__tests__/emptyDescribeWithHooks.test.ts +``` +✅ hook in empty describe +✅ hook in describe with skipped test +✅ hook in empty nested describe +✅ multiple hooks in empty describe +``` +### ✅ e2e/__tests__/emptySuiteError.test.ts +``` +JSON Reporter + ✅ fails the test suite if it contains no tests +``` +### ✅ e2e/__tests__/env.test.ts +``` +Environment override + ✅ uses jsdom when specified + ✅ uses node as default from package.json + ✅ uses node when specified + ✅ fails when the env is not available +Environment equivalent + ✅ uses jsdom + ✅ uses node +``` +### ✅ e2e/__tests__/environmentAfterTeardown.test.ts +``` +✅ prints useful error for environment methods after test is done +``` +### ✅ e2e/__tests__/errorOnDeprecated.test.ts +``` +✅ does not work on jest-circus +⚪ fail.test.js errors in errorOnDeprecated mode +⚪ jasmine.addMatchers.test.js errors in errorOnDeprecated mode +⚪ jasmine.any.test.js errors in errorOnDeprecated mode +⚪ jasmine.anything.test.js errors in errorOnDeprecated mode +⚪ jasmine.arrayContaining.test.js errors in errorOnDeprecated mode +⚪ jasmine.createSpy.test.js errors in errorOnDeprecated mode +⚪ jasmine.objectContaining.test.js errors in errorOnDeprecated mode +⚪ jasmine.stringMatching.test.js errors in errorOnDeprecated mode +⚪ pending.test.js errors in errorOnDeprecated mode +⚪ spyOn.test.js errors in errorOnDeprecated mode +⚪ spyOnProperty.test.js errors in errorOnDeprecated mode +⚪ defaultTimeoutInterval.test.js errors in errorOnDeprecated mode +⚪ fail.test.js errors when not in errorOnDeprecated mode +⚪ jasmine.addMatchers.test.js passes when not in errorOnDeprecated mode +⚪ jasmine.any.test.js passes when not in errorOnDeprecated mode +⚪ jasmine.anything.test.js passes when not in errorOnDeprecated mode +⚪ jasmine.arrayContaining.test.js passes when not in errorOnDeprecated mode +⚪ jasmine.createSpy.test.js passes when not in errorOnDeprecated mode +⚪ jasmine.objectContaining.test.js passes when not in errorOnDeprecated mode +⚪ jasmine.stringMatching.test.js passes when not in errorOnDeprecated mode +⚪ pending.test.js passes when not in errorOnDeprecated mode +⚪ spyOn.test.js passes when not in errorOnDeprecated mode +⚪ spyOnProperty.test.js errors when not in errorOnDeprecated mode +⚪ defaultTimeoutInterval.test.js passes when not in errorOnDeprecated mode +``` +### ✅ e2e/__tests__/esmConfigFile.test.ts +``` +✅ reads config from cjs file +on node ^12.17.0 || >=13.2.0 + ✅ reads config from mjs file + ✅ reads config from js file when package.json#type=module +``` +### ✅ e2e/__tests__/executeTestsOnceInMpr.ts +``` +✅ Tests are executed only once even in an MPR +``` +### ✅ e2e/__tests__/existentRoots.test.ts +``` +✅ error when rootDir does not exist +✅ error when rootDir is a file +✅ error when roots directory does not exist +✅ error when roots is a file +``` +### ✅ e2e/__tests__/expectAsyncMatcher.test.ts +``` +✅ works with passing tests +✅ shows the correct errors in stderr when failing tests +``` +### ✅ e2e/__tests__/expectInVm.test.ts +``` +✅ expect works correctly with RegExps created inside a VM +``` +### ✅ e2e/__tests__/extraGlobals.test.ts +``` +✅ works with injected globals +``` +### ✅ e2e/__tests__/failureDetailsProperty.test.ts +``` +✅ that the failureDetails property is set +``` +### ✅ e2e/__tests__/failures.test.ts +``` +✅ not throwing Error objects +✅ works with node assert +✅ works with assertions in separate files +✅ works with async failures +✅ works with snapshot failures +✅ works with snapshot failures with hint +✅ errors after test has completed +``` +### ✅ e2e/__tests__/fakePromises.test.ts +``` +Fake promises + ✅ should be possible to resolve with fake timers using immediates + ✅ should be possible to resolve with fake timers using asap +``` +### ✅ e2e/__tests__/fatalWorkerError.test.ts +``` +✅ fails a test that terminates the worker with a fatal error +``` +### ✅ e2e/__tests__/filter.test.ts +``` +Dynamic test filtering + ✅ uses the default JSON option + ✅ uses the CLI option + ✅ ignores the filter if requested to do so + ✅ throws when you return clowny stuff + ✅ will call setup on filter before filtering + ✅ will print error when filter throws + ✅ will return no results when setup hook throws +``` +### ✅ e2e/__tests__/findRelatedFiles.test.ts +``` +--findRelatedTests flag + ✅ runs tests related to filename + ✅ runs tests related to uppercased filename on case-insensitive os + ✅ runs tests related to filename with a custom dependency extractor + ✅ generates coverage report for filename + ✅ coverage configuration is applied correctly +``` +### ✅ e2e/__tests__/focusedTests.test.ts +``` +✅ runs only "it.only" tests +``` +### ✅ e2e/__tests__/forceExit.test.ts +``` +✅ exits the process after test are done but before timers complete +``` +### ✅ e2e/__tests__/generatorMock.test.ts +``` +✅ mock works with generator +``` +### ✅ e2e/__tests__/global-mutation.test.ts +``` +✅ can redefine global +``` +### ✅ e2e/__tests__/global.test.ts +``` +✅ globals are properly defined +``` +### ✅ e2e/__tests__/globals.test.ts +``` +✅ basic test constructs +✅ interleaved describe and test children order +✅ skips +✅ only +✅ cannot have describe with no implementation +✅ cannot test with no implementation +✅ skips with expand arg +✅ only with expand arg +✅ cannot test with no implementation with expand arg +✅ function as descriptor +``` +### ✅ e2e/__tests__/globalSetup.test.ts +``` +✅ globalSetup is triggered once before all test suites +✅ jest throws an error when globalSetup does not export a function +✅ globalSetup function gets jest config object as a parameter +✅ should call globalSetup function of multiple projects +✅ should not call a globalSetup of a project if there are no tests to run from this project +✅ should not call any globalSetup if there are no tests to run +✅ globalSetup works with default export +✅ globalSetup throws with named export +✅ should not transpile the transformer +✅ should transform node_modules if configured by transformIgnorePatterns +``` +### ✅ e2e/__tests__/globalTeardown.test.ts +``` +✅ globalTeardown is triggered once after all test suites +✅ jest throws an error when globalTeardown does not export a function +✅ globalTeardown function gets jest config object as a parameter +✅ should call globalTeardown function of multiple projects +✅ should not call a globalTeardown of a project if there are no tests to run from this project +✅ globalTeardown works with default export +✅ globalTeardown throws with named export +``` +### ✅ e2e/__tests__/hasteMapMockChanged.test.ts +``` +✅ should not warn when a mock file changes +``` +### ✅ e2e/__tests__/hasteMapSha1.test.ts +``` +✅ exits the process after test are done but before timers complete +``` +### ✅ e2e/__tests__/hasteMapSize.test.ts +``` +✅ reports the correct file size +✅ updates the file size when a file changes +``` +### ✅ e2e/__tests__/importedGlobals.test.ts +``` +✅ imported globals +``` +### ✅ e2e/__tests__/injectGlobals.test.ts +``` +✅ globals are undefined if passed `false` from CLI +✅ globals are undefined if passed `false` from config +``` +### ✅ e2e/__tests__/jasmineAsync.test.ts +``` +async jasmine + ✅ works with beforeAll + ✅ works with beforeEach + ✅ works with afterAll + ✅ works with afterEach + ✅ works with fit + ✅ works with xit + ✅ throws when not a promise is returned + ✅ tests async promise code + ✅ works with concurrent + ✅ works with concurrent within a describe block when invoked with testNamePattern + ✅ works with concurrent.each + ✅ works with concurrent.only.each + ✅ doesn't execute more than 5 tests simultaneously + ✅ async test fails + ✅ generator test +``` +### ✅ e2e/__tests__/jasmineAsyncWithPendingDuringTest.ts +``` +async jasmine with pending during test + ✅ does not work on jest-circus + ⚪ should be reported as a pending test +``` +### ✅ e2e/__tests__/jest.config.js.test.ts +``` +✅ works with jest.config.js +✅ traverses directory tree up until it finds jest.config +✅ invalid JS in jest.config.js +``` +### ✅ e2e/__tests__/jest.config.ts.test.ts +``` +✅ works with jest.config.ts +✅ works with tsconfig.json +✅ traverses directory tree up until it finds jest.config +✅ it does type check the config +✅ invalid JS in jest.config.ts +``` +### ❌ e2e/__tests__/jestChangedFiles.test.ts ``` ✅ gets hg SCM roots and dedupes them ✅ gets git SCM roots and dedupes them @@ -420,7 +898,144 @@ ✅ monitors only root paths for hg ✅ handles a bad revision for "changedSince", for hg ``` -### ❌ e2e/__tests__/onlyChanged.test.ts +### ✅ e2e/__tests__/jestEnvironmentJsdom.test.ts +``` +✅ check is not leaking memory +``` +### ✅ e2e/__tests__/jestRequireActual.test.ts +``` +✅ understands dependencies using jest.requireActual +``` +### ✅ e2e/__tests__/jestRequireMock.test.ts +``` +✅ understands dependencies using jest.requireMock +``` +### ✅ e2e/__tests__/json.test.ts +``` +✅ JSON is available in the global scope +✅ JSON.parse creates objects from within this context +``` +### ✅ e2e/__tests__/jsonReporter.test.ts +``` +JSON Reporter + ✅ writes test result to sum.result.json + ✅ outputs coverage report +``` +### ✅ e2e/__tests__/lifecycles.ts +``` +✅ suite with invalid assertions in afterAll +``` +### ✅ e2e/__tests__/listTests.test.ts +``` +--listTests flag + ✅ causes tests to be printed in different lines + ✅ causes tests to be printed out as JSON when using the --json flag +``` +### ✅ e2e/__tests__/locationInResults.test.ts +``` +✅ defaults to null for location +✅ adds correct location info when provided with flag +``` +### ✅ e2e/__tests__/logHeapUsage.test.ts +``` +✅ logs memory usage +``` +### ✅ e2e/__tests__/mockNames.test.ts +``` +✅ suite without mock name, mock called +✅ suite without mock name, mock not called +✅ suite with mock name, expect mock not called +✅ suite with mock name, mock called, expect fail +✅ suite with mock name, mock called 5 times +✅ suite with mock name, mock not called 5 times, expect fail +✅ suite with mock name, mock called +✅ suite with mock name, mock not called +``` +### ✅ e2e/__tests__/modernFakeTimers.test.ts +``` +modern implementation of fake timers + ✅ should be possible to use modern implementation from config + ✅ should be possible to use modern implementation from jest-object +``` +### ✅ e2e/__tests__/moduleNameMapper.test.ts +``` +✅ moduleNameMapper wrong configuration +✅ moduleNameMapper wrong array configuration +✅ moduleNameMapper correct configuration +✅ moduleNameMapper correct configuration mocking module of absolute path +✅ moduleNameMapper with mocking +``` +### ✅ e2e/__tests__/moduleParentNullInTest.ts +``` +✅ module.parent should be null in test files +``` +### ✅ e2e/__tests__/multiProjectRunner.test.ts +``` +✅ --listTests doesn't duplicate the test files +✅ can pass projects or global config +✅ "No tests found" message for projects +✅ allows a single non-root project +✅ allows a single non-root project +✅ correctly runs a single non-root project +✅ correctly runs a single non-root project +✅ projects can be workspaces with non-JS/JSON files +✅ objects in project configuration +✅ allows a single project +✅ resolves projects and their properly +✅ Does transform files with the corresponding project transformer +doesn't bleed module file extensions resolution with multiple workers + ✅ external config files + ✅ inline config files +``` +### ✅ e2e/__tests__/nativeAsyncMock.test.ts +``` +✅ mocks async functions +``` +### ✅ e2e/__tests__/nativeEsm.test.ts +``` +✅ test config is without transform +on node ^12.16.0 || >=13.7.0 + ✅ runs test with native ESM +on node >=14.3.0 + ⚪ supports top-level await +``` +### ✅ e2e/__tests__/nativeEsmTypescript.test.ts +``` +on node ^12.16.0 || >=13.7.0 + ✅ runs TS test with native ESM +``` +### ✅ e2e/__tests__/nestedEventLoop.test.ts +``` +✅ works with nested event loops +``` +### ✅ e2e/__tests__/nestedTestDefinitions.test.ts +``` +✅ print correct error message with nested test definitions outside describe +✅ print correct error message with nested test definitions inside describe +✅ print correct message when nesting describe inside it +✅ print correct message when nesting a hook inside it +``` +### ✅ e2e/__tests__/nodePath.test.ts +``` +✅ supports NODE_PATH +``` +### ✅ e2e/__tests__/noTestFound.test.ts +``` +Coverage Report + ✅ outputs coverage report +File path not found in mulit-project scenario + ✅ outputs coverage report +``` +### ✅ e2e/__tests__/noTestsFound.test.ts +``` +No tests are found + ✅ fails the test suite in standard situation + ✅ doesn't fail the test suite if --passWithNoTests passed + ✅ doesn't fail the test suite if using --lastCommit + ✅ doesn't fail the test suite if using --onlyChanged + ✅ doesn't fail the test suite if using --findRelatedTests +``` +### ❌ e2e/__tests__/onlyChanged.test.ts ``` ✅ run for "onlyChanged" and "changedSince" ✅ run only changed files @@ -432,4 +1047,5416 @@ ❌ gets changed files for hg Error: expect(received).toMatch(expected) ✅ path on Windows is case-insensitive +``` +### ✅ e2e/__tests__/onlyFailuresNonWatch.test.ts +``` +✅ onlyFailures flag works in non-watch mode +``` +### ✅ e2e/__tests__/overrideGlobals.test.ts +``` +✅ overriding native promise does not freeze Jest +✅ has a duration even if time is faked +``` +### ✅ e2e/__tests__/pnp.test.ts +``` +✅ successfully runs the tests inside `pnp/` +``` +### ✅ e2e/__tests__/presets.test.ts +``` +✅ supports json preset +✅ supports js preset +``` +### ✅ e2e/__tests__/processExit.test.ts +``` +✅ prints stack trace pointing to process.exit call +``` +### ✅ e2e/__tests__/promiseReject.test.ts +``` +✅ +``` +### ✅ e2e/__tests__/regexCharInPath.test.ts +``` +Regex Char In Path + ✅ parses paths containing regex chars correctly +``` +### ✅ e2e/__tests__/requireAfterTeardown.test.ts +``` +✅ prints useful error for requires after test is done +``` +### ✅ e2e/__tests__/requireMain.test.ts +``` +✅ provides `require.main` set to test suite module +``` +### ✅ e2e/__tests__/requireMainAfterCreateRequire.test.ts +``` +on node >=12.2.0 + ✅ `require.main` not undefined after createRequire +``` +### ✅ e2e/__tests__/requireMainIsolateModules.test.ts +``` +✅ `require.main` on using `jest.isolateModules` should not be undefined +``` +### ✅ e2e/__tests__/requireMainResetModules.test.ts +``` +✅ `require.main` on using `--resetModules='true'` should not be undefined +✅ `require.main` on using `jest.resetModules()` should not be undefined +``` +### ✅ e2e/__tests__/requireV8Module.test.ts +``` +✅ v8 module +``` +### ✅ e2e/__tests__/resetModules.test.ts +``` +✅ jest.resetModules should not error when _isMockFunction is defined but not boolean +``` +### ✅ e2e/__tests__/resolve.test.ts +``` +✅ resolve platform modules +``` +### ✅ e2e/__tests__/resolveGetPaths.test.ts +``` +✅ require.resolve.paths +``` +### ✅ e2e/__tests__/resolveNodeModule.test.ts +``` +✅ resolve node module +``` +### ✅ e2e/__tests__/resolveNoFileExtensions.test.ts +``` +✅ show error message with matching files +✅ show error message when no js moduleFileExtensions +``` +### ✅ e2e/__tests__/resolveWithPaths.test.ts +``` +✅ require.resolve with paths +``` +### ✅ e2e/__tests__/runProgrammatically.test.ts +``` +✅ run Jest programmatically cjs +✅ run Jest programmatically esm +``` +### ✅ e2e/__tests__/runTestsByPath.test.ts +``` +✅ runs tests by exact path +``` +### ✅ e2e/__tests__/runtimeInternalModuleRegistry.test.ts +``` +Runtime Internal Module Registry + ✅ correctly makes use of internal module registry when requiring modules +``` +### ✅ e2e/__tests__/selectProjects.test.ts +``` +Given a config with two named projects, first-project and second-project when Jest is started with `--selectProjects first-project` + ✅ runs the tests in the first project only + ✅ prints that only first-project will run +Given a config with two named projects, first-project and second-project when Jest is started with `--selectProjects second-project` + ✅ runs the tests in the second project only + ✅ prints that only second-project will run +Given a config with two named projects, first-project and second-project when Jest is started with `--selectProjects first-project second-project` + ✅ runs the tests in the first and second projects + ✅ prints that both first-project and second-project will run +Given a config with two named projects, first-project and second-project when Jest is started without providing `--selectProjects` + ✅ runs the tests in the first and second projects + ✅ does not print which projects are run +Given a config with two named projects, first-project and second-project when Jest is started with `--selectProjects third-project` + ✅ fails + ✅ prints that no project was found +Given a config with two projects, first-project and an unnamed project when Jest is started with `--selectProjects first-project` + ✅ runs the tests in the first project only + ✅ prints that a project does not have a name + ✅ prints that only first-project will run +Given a config with two projects, first-project and an unnamed project when Jest is started without providing `--selectProjects` + ✅ runs the tests in the first and second projects + ✅ does not print that a project has no name +Given a config with two projects, first-project and an unnamed project when Jest is started with `--selectProjects third-project` + ✅ fails + ✅ prints that a project does not have a name + ✅ prints that no project was found +``` +### ✅ e2e/__tests__/setImmediate.test.ts +``` +✅ setImmediate +``` +### ✅ e2e/__tests__/setupFilesAfterEnvConfig.test.ts +``` +setupFilesAfterEnv + ✅ requires multiple setup files before each file in the suite + ✅ requires setup files *after* the test runners are required +``` +### ✅ e2e/__tests__/showConfig.test.ts +``` +✅ --showConfig outputs config info and exits +``` +### ✅ e2e/__tests__/skipBeforeAfterAll.test.ts +``` +✅ correctly skip `beforeAll`s in skipped tests +``` +### ✅ e2e/__tests__/snapshot-unknown.test.ts +``` +Snapshot serializers + ✅ renders snapshot +``` +### ✅ e2e/__tests__/snapshot.test.ts +``` +Snapshot + ✅ stores new snapshots on the first run + ✅ works with escaped characters + ✅ works with escaped regex + ✅ works with template literal substitutions +Snapshot Validation + ✅ does not save snapshots in CI mode by default + ✅ works on subsequent runs without `-u` + ✅ deletes the snapshot if the test suite has been removed + ✅ deletes a snapshot when a test does removes all the snapshots + ✅ updates the snapshot when a test removes some snapshots +``` +### ✅ e2e/__tests__/snapshotMockFs.test.ts +``` +✅ store snapshot even if fs is mocked +``` +### ✅ e2e/__tests__/snapshotResolver.test.ts +``` +Custom snapshot resolver + ✅ Resolves snapshot files using custom resolver +``` +### ✅ e2e/__tests__/snapshotSerializers.test.ts +``` +Snapshot serializers + ✅ renders snapshot + ✅ compares snapshots correctly +``` +### ✅ e2e/__tests__/stackTrace.test.ts +``` +Stack Trace + ✅ prints a stack trace for runtime errors + ✅ does not print a stack trace for runtime errors when --noStackTrace is given + ✅ prints a stack trace for matching errors + ✅ does not print a stack trace for matching errors when --noStackTrace is given + ✅ prints a stack trace for errors + ✅ prints a stack trace for errors without message in stack trace + ✅ does not print a stack trace for errors when --noStackTrace is given +``` +### ✅ e2e/__tests__/stackTraceNoCaptureStackTrace.test.ts +``` +✅ prints a usable stack trace even if no Error.captureStackTrace +``` +### ✅ e2e/__tests__/stackTraceSourceMaps.test.ts +``` +✅ processes stack traces and code frames with source maps +``` +### ✅ e2e/__tests__/stackTraceSourceMapsWithCoverage.test.ts +``` +✅ processes stack traces and code frames with source maps with coverage +``` +### ✅ e2e/__tests__/supportsDashedArgs.ts +``` +✅ works with passing tests +✅ throws error for unknown dashed & camelcase args +``` +### ✅ e2e/__tests__/symbol.test.ts +``` +✅ Symbol deletion +``` +### ✅ e2e/__tests__/testEnvironment.test.ts +``` +✅ respects testEnvironment docblock +``` +### ✅ e2e/__tests__/testEnvironmentAsync.test.ts +``` +✅ triggers setup/teardown hooks +``` +### ✅ e2e/__tests__/testEnvironmentCircus.test.ts +``` +✅ calls testEnvironment handleTestEvent +``` +### ✅ e2e/__tests__/testEnvironmentCircusAsync.test.ts +``` +✅ calls asynchronous handleTestEvent in testEnvironment +``` +### ✅ e2e/__tests__/testFailureExitCode.test.ts +``` +✅ exits with a specified code when test fail +✅ exits with a specified code when bailing from a failed test +``` +### ✅ e2e/__tests__/testInRoot.test.ts +``` +✅ runs tests in only test.js and spec.js +``` +### ✅ e2e/__tests__/testNamePattern.test.ts +``` +✅ testNamePattern +``` +### ✅ e2e/__tests__/testNamePatternSkipped.test.ts +``` +✅ testNamePattern skipped +``` +### ✅ e2e/__tests__/testPathPatternReporterMessage.test.ts +``` +✅ prints a message with path pattern at the end +``` +### ✅ e2e/__tests__/testResultsProcessor.test.ts +``` +✅ testNamePattern +``` +### ✅ e2e/__tests__/testRetries.test.ts +``` +Test Retries + ✅ retries failed tests + ✅ reporter shows more than 1 invocation if test is retried + ✅ reporter shows 1 invocation if tests are not retried + ✅ tests are not retried if beforeAll hook failure occurs +``` +### ✅ e2e/__tests__/testTodo.test.ts +``` +✅ works with all statuses +✅ shows error messages when called with no arguments +✅ shows error messages when called with multiple arguments +✅ shows error messages when called with invalid argument +✅ shows todo messages when in verbose mode +``` +### ✅ e2e/__tests__/timeouts.test.ts +``` +✅ exceeds the timeout +✅ does not exceed the timeout +✅ exceeds the command line testTimeout +✅ does not exceed the command line testTimeout +``` +### ✅ e2e/__tests__/timeoutsLegacy.test.ts +``` +✅ does not work on jest-circus +⚪ exceeds the timeout set using jasmine.DEFAULT_TIMEOUT_INTERVAL +⚪ does not exceed the timeout using jasmine.DEFAULT_TIMEOUT_INTERVAL +⚪ can read and write jasmine.DEFAULT_TIMEOUT_INTERVAL +``` +### ✅ e2e/__tests__/timerResetMocks.test.ts +``` +✅ run timers after resetAllMocks test +✅ run timers with resetMocks in config test +``` +### ✅ e2e/__tests__/timerUseRealTimers.test.ts +``` +✅ useRealTimers cancels "timers": "fake" for whole test file +``` +### ✅ e2e/__tests__/toMatchInlineSnapshot.test.ts +``` +✅ basic support +✅ do not indent empty lines +✅ handles property matchers +✅ removes obsolete external snapshots +✅ supports async matchers +✅ supports async tests +✅ writes snapshots with non-literals in expect(...) +✅ handles mocking native modules prettier relies on +✅ supports custom matchers +✅ supports custom matchers with property matcher +✅ multiple custom matchers and native matchers +✅ indentation is correct in the presences of existing snapshots +``` +### ✅ e2e/__tests__/toMatchInlineSnapshotWithRetries.test.ts +``` +✅ works with a single snapshot +✅ works when a different assertion is failing +✅ works when multiple tests have snapshots but only one of them failed multiple times +``` +### ✅ e2e/__tests__/toMatchSnapshot.test.ts +``` +✅ basic support +✅ error thrown before snapshot +✅ first snapshot fails, second passes +✅ does not mark snapshots as obsolete in skipped tests +✅ accepts custom snapshot name +✅ handles property matchers +✅ handles invalid property matchers +✅ handles property matchers with hint +✅ handles property matchers with deep properties +``` +### ✅ e2e/__tests__/toMatchSnapshotWithRetries.test.ts +``` +✅ works with a single snapshot +✅ works when multiple tests have snapshots but only one of them failed multiple times +``` +### ✅ e2e/__tests__/toMatchSnapshotWithStringSerializer.test.ts +``` +✅ empty external +✅ empty internal ci false +✅ undefined internal ci true +``` +### ✅ e2e/__tests__/toThrowErrorMatchingInlineSnapshot.test.ts +``` +✅ works fine when function throws error +✅ updates existing snapshot +✅ cannot be used with .not +✅ should support rejecting promises +``` +### ✅ e2e/__tests__/toThrowErrorMatchingSnapshot.test.ts +``` +✅ works fine when function throws error +✅ throws the error if tested function didn't throw error +✅ accepts custom snapshot name +✅ cannot be used with .not +✅ should support rejecting promises +``` +### ✅ e2e/__tests__/transform.test.ts +``` +babel-jest + ✅ runs transpiled code + ✅ instruments only specific files and collects coverage +babel-jest ignored + ✅ tells user to match ignored files +babel-jest with manual transformer + ✅ runs transpiled code +no babel-jest + ✅ fails with syntax error on flow types + ✅ instrumentation with no babel-jest +custom transformer + ✅ proprocesses files + ✅ instruments files +multiple-transformers + ✅ transforms dependencies using specific transformers +ecmascript-modules-support + ✅ runs transpiled code +transformer-config + ✅ runs transpiled code + ✅ instruments only specific files and collects coverage +transformer caching + ✅ does not rerun transform within worker +transform-environment + ✅ should transform the environment +transform-runner + ✅ should transform runner +transform-testrunner + ✅ should transform testRunner +``` +### ✅ e2e/__tests__/transformLinkedModules.test.ts +``` +✅ should transform linked modules +``` +### ✅ e2e/__tests__/typescriptCoverage.test.ts +``` +✅ instruments and collects coverage for typescript files +``` +### ✅ e2e/__tests__/unexpectedToken.test.ts +``` +✅ triggers unexpected token error message for non-JS assets +✅ triggers unexpected token error message for untranspiled node_modules +✅ does not trigger unexpected token error message for regular syntax errors +``` +### ✅ e2e/__tests__/useStderr.test.ts +``` +✅ no tests found message is redirected to stderr +``` +### ✅ e2e/__tests__/v8Coverage.test.ts +``` +✅ prints coverage with missing sourcemaps +✅ prints coverage with empty sourcemaps +``` +### ✅ e2e/__tests__/verbose.test.ts +``` +✅ Verbose Reporter +``` +### ✅ e2e/__tests__/version.test.ts +``` +✅ works with jest.config.js +``` +### ✅ e2e/__tests__/watchModeNoAccess.test.ts +``` +✅ does not re-run tests when only access time is modified +``` +### ✅ e2e/__tests__/watchModeOnlyFailed.test.ts +``` +✅ can press "f" to run only failed tests +``` +### ✅ e2e/__tests__/watchModePatterns.test.ts +``` +✅ can press "p" to filter by file name +✅ can press "t" to filter by test name +``` +### ✅ e2e/__tests__/watchModeUpdateSnapshot.test.ts +``` +✅ can press "u" to update snapshots +``` +### ✅ e2e/__tests__/workerForceExit.test.ts +``` +✅ prints a warning if a worker is force exited +✅ force exits a worker that fails to exit gracefully +``` +### ✅ e2e/__tests__/wrongEnv.test.ts +``` +Wrong globals for environment + ✅ print useful error for window + ✅ print useful error for document + ✅ print useful error for navigator + ✅ print useful error for unref + ✅ print useful error when it explodes during evaluation +``` +### ✅ e2e/custom-test-sequencer/a.test.js +``` +✅ a +``` +### ✅ e2e/custom-test-sequencer/b.test.js +``` +✅ b +``` +### ✅ e2e/custom-test-sequencer/c.test.js +``` +✅ c +``` +### ✅ e2e/custom-test-sequencer/d.test.js +``` +✅ d +``` +### ✅ e2e/custom-test-sequencer/e.test.js +``` +✅ e +``` +### ✅ e2e/test-in-root/spec.js +``` +✅ stub +``` +### ✅ e2e/test-in-root/test.js +``` +✅ stub +``` +### ✅ e2e/timer-reset-mocks/after-reset-all-mocks/timerAndMock.test.js +``` +timers + ✅ should work before calling resetAllMocks + ✅ should not break after calling resetAllMocks +``` +### ✅ e2e/timer-reset-mocks/with-reset-mocks/timerWithMock.test.js +``` +timers + ✅ should work before calling resetAllMocks +``` +### ✅ e2e/v8-coverage/empty-sourcemap/test.ts +``` +✅ dummy-test +``` +### ✅ examples/angular/app.component.spec.ts +``` +AppComponent + ✅ should create the app + ✅ should have as title 'angular' + ✅ should render title in a h1 tag +``` +### ✅ examples/angular/shared/data.service.spec.ts +``` +Service: DataService + ✅ should create service + ✅ should return the right title +``` +### ✅ examples/angular/shared/sub.service.spec.ts +``` +Service: SubService + ✅ should create service +``` +### ✅ examples/async/__tests__/user.test.js +``` +✅ works with resolves +✅ works with promises +✅ works with async/await +✅ works with async/await and resolves +✅ tests error with rejects +✅ tests error with promises +✅ tests error with async/await +✅ tests error with async/await and rejects +``` +### ✅ examples/automatic-mocks/__tests__/automock.test.js +``` +✅ if utils are mocked +✅ mocked implementation +``` +### ✅ examples/automatic-mocks/__tests__/createMockFromModule.test.js +``` +✅ implementation created by automock +✅ implementation created by jest.createMockFromModule +``` +### ✅ examples/automatic-mocks/__tests__/disableAutomocking.test.js +``` +✅ original implementation +``` +### ✅ examples/enzyme/__tests__/CheckboxWithLabel-test.js +``` +✅ CheckboxWithLabel changes the text after click +``` +### ✅ examples/getting-started/sum.test.js +``` +✅ adds 1 + 2 to equal 3 +``` +### ✅ examples/jquery/__tests__/display_user.test.js +``` +✅ displays a user after a click +``` +### ✅ examples/jquery/__tests__/fetch_current_user.test.js +``` +✅ calls into $.ajax with the correct params +✅ calls the callback when $.ajax requests are finished +``` +### ✅ examples/manual-mocks/__tests__/file_summarizer.test.js +``` +listFilesInDirectorySync + ✅ includes all files in the directory in the summary +``` +### ✅ examples/manual-mocks/__tests__/lodashMocking.test.js +``` +✅ if lodash head is mocked +``` +### ✅ examples/manual-mocks/__tests__/user.test.js +``` +✅ if orginal user model +``` +### ✅ examples/manual-mocks/__tests__/userMocked.test.js +``` +✅ if user model is mocked +``` +### ✅ examples/module-mock/__tests__/full_mock.js +``` +✅ does a full mock +``` +### ✅ examples/module-mock/__tests__/mock_per_test.js +``` +define mock per test + ✅ uses mocked module + ✅ uses actual module +``` +### ✅ examples/module-mock/__tests__/partial_mock.js +``` +✅ does a partial mock +``` +### ✅ examples/mongodb/__test__/db.test.js +``` +✅ should aggregate docs from collection +``` +### ✅ examples/react-native/__tests__/intro.test.js +``` +✅ renders correctly +✅ renders the ActivityIndicator component +✅ renders the TextInput component +✅ renders the FlatList component +``` +### ✅ examples/react-testing-library/__tests__/CheckboxWithLabel-test.js +``` +✅ CheckboxWithLabel changes the text after click +``` +### ✅ examples/react/__tests__/CheckboxWithLabel-test.js +``` +✅ CheckboxWithLabel changes the text after click +``` +### ✅ examples/snapshot/__tests__/clock.react.test.js +``` +✅ renders correctly +``` +### ✅ examples/snapshot/__tests__/link.react.test.js +``` +✅ renders correctly +✅ renders as an anchor when no page is set +✅ properly escapes quotes +✅ changes the class when hovered +``` +### ✅ examples/timer/__tests__/infinite_timer_game.test.js +``` +✅ schedules a 10-second timer after 1 second +``` +### ✅ examples/timer/__tests__/timer_game.test.js +``` +timerGame + ✅ waits 1 second before ending the game + ✅ calls the callback after 1 second via runAllTimers + ✅ calls the callback after 1 second via advanceTimersByTime +``` +### ✅ examples/typescript/__tests__/calc.test.ts +``` +calc - mocks + ✅ returns result from subtract + ✅ returns result from sum + ✅ adds last result to memory + ✅ subtracts last result to memory + ✅ clears the memory + ✅ throws an error when invalid Op is passed +``` +### ✅ examples/typescript/__tests__/CheckboxWithLabel-test.tsx +``` +✅ CheckboxWithLabel changes the text after click +``` +### ✅ examples/typescript/__tests__/sub-test.ts +``` +✅ subtracts 5 - 1 to equal 4 in TypeScript +``` +### ✅ examples/typescript/__tests__/sum-test.ts +``` +✅ adds 1 + 2 to equal 3 in TScript +✅ adds 1 + 2 to equal 3 in JavaScript +``` +### ✅ examples/typescript/__tests__/sum.test.js +``` +✅ adds 1 + 2 to equal 3 in Typescript +✅ adds 1 + 2 to equal 3 in JavaScript +``` +### ✅ packages/babel-jest/src/__tests__/index.ts +``` +✅ Returns source string with inline maps when no transformOptions is passed +✅ can pass null to createTransformer +caller option correctly merges from defaults and options + ✅ {"supportsDynamicImport":true,"supportsStaticESM":true} -> {"supportsDynamicImport":true,"supportsStaticESM":true} + ✅ {"supportsDynamicImport":false,"supportsStaticESM":false} -> {"supportsDynamicImport":false,"supportsStaticESM":false} + ✅ {"supportsStaticESM":false} -> {"supportsDynamicImport":false,"supportsStaticESM":false} + ✅ {"supportsDynamicImport":true} -> {"supportsDynamicImport":true,"supportsStaticESM":false} +``` +### ✅ packages/babel-plugin-jest-hoist/src/__tests__/hoistPlugin.test.ts +``` +babel-plugin-jest-hoist + ✅ automatic react runtime + ✅ top level mocking + ✅ within a block + ✅ within a block with no siblings +``` +### ✅ packages/diff-sequences/src/__tests__/index.property.test.ts +``` +✅ should be reflexive +✅ should find the same number of common items when switching the inputs +✅ should have at most the length of its inputs +✅ should have at most the same number of each character as its inputs +✅ should be a subsequence of its inputs +✅ should be no-op when passing common items +✅ should find the exact common items when one array is subarray of the other +``` +### ✅ packages/diff-sequences/src/__tests__/index.test.ts +``` +invalid arg length + ✅ is not a number + ✅ Infinity is not a safe integer + ✅ Not a Number is not a safe integer + ✅ MAX_SAFE_INTEGER + 1 is not a safe integer + ✅ MIN_SAFE_INTEGER - 1 is not a safe integer + ✅ is a negative integer +invalid arg callback + ✅ null is not a function + ✅ undefined is not a function +input callback encapsulates comparison zero and negative zero + ✅ are not common according to Object.is method + ✅ are common according to === operator +input callback encapsulates comparison Not a Number + ✅ is common according to Object.is method + ✅ is not common according to === operator +input callback encapsulates sequences + ✅ arrays of strings + ✅ string and array of strings + ✅ strings +no common items negative zero is equivalent to zero for length + ✅ of a + ✅ of b + ✅ of a and b +no common items + ✅ a empty and b empty + ✅ a empty and b non-empty + ✅ a non-empty and b empty +no common items a non-empty and b non-empty + ✅ baDeltaLength 0 even + ✅ baDeltaLength 1 odd + ✅ baDeltaLength 2 even + ✅ baDeltaLength 7 odd +only common items + ✅ length 1 + ✅ length 2 +all common items outside + ✅ preceding changes + ✅ following change + ✅ preceding and following changes in one sequence +some common items inside and outside + ✅ preceding changes adjacent to common in both sequences + ✅ following changes adjacent to common in both sequences +all common items inside non-recursive + ✅ move from start to end relative to change + ✅ move from start to end relative to common + ✅ move from start to end relative to change and common + ✅ reverse relative to change + ✅ preceding middle + ✅ following middle +all common items inside recursive + ✅ prev reverse at depth 1 and preceding at depth 2 + ✅ last forward at depth 1 and following at depth 2 + ✅ preceding at depth 2 and both at depth 3 of following + ✅ interleaved single change + ✅ interleaved double changes + ✅ optimization decreases iMaxF + ✅ optimization decreases iMaxR +common substrings + ✅ progress + ✅ regression + ✅ wrapping +``` +### ✅ packages/expect/src/__tests__/assertionCounts.test.ts +``` +.assertions() + ✅ does not throw + ✅ redeclares different assertion count + ✅ expects no assertions +.hasAssertions() + ✅ does not throw if there is an assertion + ✅ throws if expected is not undefined + ✅ hasAssertions not leaking to global state +``` +### ✅ packages/expect/src/__tests__/asymmetricMatchers.test.ts +``` +✅ Any.asymmetricMatch() +✅ Any.toAsymmetricMatcher() +✅ Any.toAsymmetricMatcher() with function name +✅ Any throws when called with empty constructor +✅ Anything matches any type +✅ Anything does not match null and undefined +✅ Anything.toAsymmetricMatcher() +✅ ArrayContaining matches +✅ ArrayContaining does not match +✅ ArrayContaining throws for non-arrays +✅ ArrayNotContaining matches +✅ ArrayNotContaining does not match +✅ ArrayNotContaining throws for non-arrays +✅ ObjectContaining matches +✅ ObjectContaining does not match +✅ ObjectContaining matches defined properties +✅ ObjectContaining matches prototype properties +✅ ObjectContaining throws for non-objects +✅ ObjectContaining does not mutate the sample +✅ ObjectNotContaining matches +✅ ObjectNotContaining does not match +✅ ObjectNotContaining inverts ObjectContaining +✅ ObjectNotContaining throws for non-objects +✅ StringContaining matches string against string +✅ StringContaining throws if expected value is not string +✅ StringContaining returns false if received value is not string +✅ StringNotContaining matches string against string +✅ StringNotContaining throws if expected value is not string +✅ StringNotContaining returns true if received value is not string +✅ StringMatching matches string against regexp +✅ StringMatching matches string against string +✅ StringMatching throws if expected value is neither string nor regexp +✅ StringMatching returns false if received value is not string +✅ StringMatching returns false even if coerced non-string received value matches pattern +✅ StringNotMatching matches string against regexp +✅ StringNotMatching matches string against string +✅ StringNotMatching throws if expected value is neither string nor regexp +✅ StringNotMatching returns true if received value is not string +``` +### ✅ packages/expect/src/__tests__/extend.test.ts +``` +✅ is available globally when matcher is unary +✅ is available globally when matcher is variadic +✅ exposes matcherUtils in context +✅ is ok if there is no message specified +✅ exposes an equality function to custom matchers +✅ defines asymmetric unary matchers +✅ defines asymmetric unary matchers that can be prefixed by not +✅ defines asymmetric variadic matchers +✅ defines asymmetric variadic matchers that can be prefixed by not +✅ prints the Symbol into the error message +``` +### ✅ packages/expect/src/__tests__/isError.test.ts +``` +isError + ✅ should not assume objects are errors + ✅ should detect simple error instances + ✅ should detect errors from another context + ✅ should detect DOMException errors from another context +``` +### ✅ packages/expect/src/__tests__/matchers-toContain.property.test.ts +``` +toContain + ✅ should always find the value when inside the array + ✅ should not find the value if it has been cloned into the array +``` +### ✅ packages/expect/src/__tests__/matchers-toContainEqual.property.test.ts +``` +toContainEqual + ✅ should always find the value when inside the array + ✅ should always find the value when cloned inside the array +``` +### ✅ packages/expect/src/__tests__/matchers-toEqual.property.test.ts +``` +toEqual + ✅ should be reflexive + ✅ should be symmetric +``` +### ✅ packages/expect/src/__tests__/matchers-toStrictEqual.property.test.ts +``` +toStrictEqual + ✅ should be reflexive + ✅ should be symmetric +toStrictEqual on node >=9 + ✅ should be equivalent to Node deepStrictEqual +``` +### ✅ packages/expect/src/__tests__/matchers.test.js +``` +✅ should throw if passed two arguments +.rejects + ✅ should reject + ✅ should reject with toThrow + ✅ should reject async function to toThrow + ✅ fails non-promise value "a" synchronously + ✅ fails non-promise value "a" + ✅ fails non-promise value [1] synchronously + ✅ fails non-promise value [1] + ✅ fails non-promise value [Function anonymous] synchronously + ✅ fails non-promise value [Function anonymous] + ✅ fails non-promise value {"a": 1} synchronously + ✅ fails non-promise value {"a": 1} + ✅ fails non-promise value 4 synchronously + ✅ fails non-promise value 4 + ✅ fails non-promise value null synchronously + ✅ fails non-promise value null + ✅ fails non-promise value true synchronously + ✅ fails non-promise value true + ✅ fails non-promise value undefined synchronously + ✅ fails non-promise value undefined + ✅ fails for promise that resolves +.resolves + ✅ should resolve + ✅ fails non-promise value "a" synchronously + ✅ fails non-promise value "a" + ✅ fails non-promise value [1] synchronously + ✅ fails non-promise value [1] + ✅ fails non-promise value [Function anonymous] synchronously + ✅ fails non-promise value [Function anonymous] + ✅ fails non-promise value {"a": 1} synchronously + ✅ fails non-promise value {"a": 1} + ✅ fails non-promise value 4 synchronously + ✅ fails non-promise value 4 + ✅ fails non-promise value null synchronously + ✅ fails non-promise value null + ✅ fails non-promise value true synchronously + ✅ fails non-promise value true + ✅ fails non-promise value undefined synchronously + ✅ fails non-promise value undefined + ✅ fails for promise that rejects +.toBe() + ✅ does not throw + ✅ fails for: 1 and 2 + ✅ fails for: true and false + ✅ fails for: [Function anonymous] and [Function anonymous] + ✅ fails for: {} and {} + ✅ fails for: {"a": 1} and {"a": 1} + ✅ fails for: {"a": 1} and {"a": 5} + ✅ fails for: {"a": [Function a], "b": 2} and {"a": Any, "b": 2} + ✅ fails for: {"a": undefined, "b": 2} and {"b": 2} + ✅ fails for: 2020-02-20T00:00:00.000Z and 2020-02-20T00:00:00.000Z + ✅ fails for: 2020-02-21T00:00:00.000Z and 2020-02-20T00:00:00.000Z + ✅ fails for: /received/ and /expected/ + ✅ fails for: Symbol(received) and Symbol(expected) + ✅ fails for: [Error: received] and [Error: expected] + ✅ fails for: "abc" and "cde" + ✅ fails for: "painless JavaScript testing" and "delightful JavaScript testing" + ✅ fails for: "" and "compare one-line string to empty string" + ✅ fails for: "with +trailing space" and "without trailing space" + ✅ fails for: "four +4 +line +string" and "3 +line +string" + ✅ fails for: [] and [] + ✅ fails for: null and undefined + ✅ fails for: -0 and 0 + ✅ fails for: 1n and 2n + ✅ fails for: {"a": 1n} and {"a": 1n} + ✅ fails for 'false' with '.not' + ✅ fails for '1' with '.not' + ✅ fails for '"a"' with '.not' + ✅ fails for 'undefined' with '.not' + ✅ fails for 'null' with '.not' + ✅ fails for '{}' with '.not' + ✅ fails for '[]' with '.not' + ✅ fails for '1n' with '.not' + ✅ fails for '1n' with '.not' + ✅ does not crash on circular references + ✅ assertion error matcherResult property contains matcher name, expected and actual values +.toStrictEqual() + ✅ does not ignore keys with undefined values + ✅ does not ignore keys with undefined values inside an array + ✅ does not ignore keys with undefined values deep inside an object + ✅ passes when comparing same type + ✅ matches the expected snapshot when it fails + ✅ displays substring diff + ✅ displays substring diff for multiple lines + ✅ does not pass for different types + ✅ does not simply compare constructor names + ✅ passes for matching sparse arrays + ✅ does not pass when sparseness of arrays do not match + ✅ does not pass when equally sparse arrays have different values +.toEqual() + ✅ {pass: false} expect(true).toEqual(false) + ✅ {pass: false} expect(1).toEqual(2) + ✅ {pass: false} expect(0).toEqual(-0) + ✅ {pass: false} expect(0).toEqual(5e-324) + ✅ {pass: false} expect(5e-324).toEqual(0) + ✅ {pass: false} expect(0).toEqual({}) + ✅ {pass: false} expect({}).toEqual(0) + ✅ {pass: false} expect({}).toEqual({}) + ✅ {pass: false} expect("abc").toEqual({"0": "a", "1": "b", "2": "c"}) + ✅ {pass: false} expect({"0": "a", "1": "b", "2": "c"}).toEqual("abc") + ✅ {pass: false} expect(/abc/gsy).toEqual(/abc/g) + ✅ {pass: false} expect({"a": 1}).toEqual({"a": 2}) + ✅ {pass: false} expect({"a": 5}).toEqual({"b": 6}) + ✅ {pass: false} expect({"foo": {"bar": 1}}).toEqual({"foo": {}}) + ✅ {pass: false} expect({"getterAndSetter": {}}).toEqual({"getterAndSetter": {"foo": "bar"}}) + ✅ {pass: false} expect({"frozenGetterAndSetter": {}}).toEqual({"frozenGetterAndSetter": {"foo": "bar"}}) + ✅ {pass: false} expect({"getter": {}}).toEqual({"getter": {"foo": "bar"}}) + ✅ {pass: false} expect({"frozenGetter": {}}).toEqual({"frozenGetter": {"foo": "bar"}}) + ✅ {pass: false} expect({"setter": undefined}).toEqual({"setter": {"foo": "bar"}}) + ✅ {pass: false} expect({"frozenSetter": undefined}).toEqual({"frozenSetter": {"foo": "bar"}}) + ✅ {pass: false} expect("banana").toEqual("apple") + ✅ {pass: false} expect("1 234,57 $").toEqual("1 234,57 $") + ✅ {pass: false} expect("type TypeName = T extends Function ? \"function\" : \"object\";").toEqual("type TypeName = T extends Function +? \"function\" +: \"object\";") + ✅ {pass: false} expect(null).toEqual(undefined) + ✅ {pass: false} expect([1]).toEqual([2]) + ✅ {pass: false} expect([1, 2]).toEqual([2, 1]) + ✅ {pass: false} expect(Immutable.List [1]).toEqual(Immutable.List [2]) + ✅ {pass: false} expect(Immutable.List [1, 2]).toEqual(Immutable.List [2, 1]) + ✅ {pass: false} expect(Map {}).toEqual(Set {}) + ✅ {pass: false} expect(Set {1, 2}).toEqual(Set {}) + ✅ {pass: false} expect(Set {1, 2}).toEqual(Set {1, 2, 3}) + ✅ {pass: false} expect(Set {[1], [2]}).toEqual(Set {[1], [2], [3]}) + ✅ {pass: false} expect(Set {[1], [2]}).toEqual(Set {[1], [2], [2]}) + ✅ {pass: false} expect(Set {Set {1}, Set {2}}).toEqual(Set {Set {1}, Set {3}}) + ✅ {pass: false} expect(Immutable.Set [1, 2]).toEqual(Immutable.Set []) + ✅ {pass: false} expect(Immutable.Set [1, 2]).toEqual(Immutable.Set [1, 2, 3]) + ✅ {pass: false} expect(Immutable.OrderedSet [1, 2]).toEqual(Immutable.OrderedSet [2, 1]) + ✅ {pass: false} expect(Map {1 => "one", 2 => "two"}).toEqual(Map {1 => "one"}) + ✅ {pass: false} expect(Map {"a" => 0}).toEqual(Map {"b" => 0}) + ✅ {pass: false} expect(Map {"v" => 1}).toEqual(Map {"v" => 2}) + ✅ {pass: false} expect(Map {["v"] => 1}).toEqual(Map {["v"] => 2}) + ✅ {pass: false} expect(Map {[1] => Map {[1] => "one"}}).toEqual(Map {[1] => Map {[1] => "two"}}) + ✅ {pass: false} expect(Immutable.Map {"a": 0}).toEqual(Immutable.Map {"b": 0}) + ✅ {pass: false} expect(Immutable.Map {"v": 1}).toEqual(Immutable.Map {"v": 2}) + ✅ {pass: false} expect(Immutable.OrderedMap {1: "one", 2: "two"}).toEqual(Immutable.OrderedMap {2: "two", 1: "one"}) + ✅ {pass: false} expect(Immutable.Map {"1": Immutable.Map {"2": {"a": 99}}}).toEqual(Immutable.Map {"1": Immutable.Map {"2": {"a": 11}}}) + ✅ {pass: false} expect([97, 98, 99]).toEqual([97, 98, 100]) + ✅ {pass: false} expect({"a": 1, "b": 2}).toEqual(ObjectContaining {"a": 2}) + ✅ {pass: false} expect(false).toEqual(ObjectContaining {"a": 2}) + ✅ {pass: false} expect([1, 3]).toEqual(ArrayContaining [1, 2]) + ✅ {pass: false} expect(1).toEqual(ArrayContaining [1, 2]) + ✅ {pass: false} expect("abd").toEqual(StringContaining "bc") + ✅ {pass: false} expect("abd").toEqual(StringMatching /bc/i) + ✅ {pass: false} expect(undefined).toEqual(Anything) + ✅ {pass: false} expect(undefined).toEqual(Any) + ✅ {pass: false} expect("Eve").toEqual({"asymmetricMatch": [Function asymmetricMatch]}) + ✅ {pass: false} expect({"target": {"nodeType": 1, "value": "a"}}).toEqual({"target": {"nodeType": 1, "value": "b"}}) + ✅ {pass: false} expect({"nodeName": "div", "nodeType": 1}).toEqual({"nodeName": "p", "nodeType": 1}) + ✅ {pass: false} expect({Symbol(foo): 1, Symbol(bar): 2}).toEqual({Symbol(foo): Any, Symbol(bar): 1}) + ✅ {pass: false} expect(1n).toEqual(2n) + ✅ {pass: false} expect(1n).toEqual(1) + ✅ {pass: true} expect(true).not.toEqual(true) + ✅ {pass: true} expect(1).not.toEqual(1) + ✅ {pass: true} expect(NaN).not.toEqual(NaN) + ✅ {pass: true} expect(0).not.toEqual(0) + ✅ {pass: true} expect(0).not.toEqual(0) + ✅ {pass: true} expect({}).not.toEqual({}) + ✅ {pass: true} expect("abc").not.toEqual("abc") + ✅ {pass: true} expect("abc").not.toEqual("abc") + ✅ {pass: true} expect("abc").not.toEqual("abc") + ✅ {pass: true} expect([1]).not.toEqual([1]) + ✅ {pass: true} expect([1, 2]).not.toEqual([1, 2]) + ✅ {pass: true} expect(Immutable.List [1]).not.toEqual(Immutable.List [1]) + ✅ {pass: true} expect(Immutable.List [1, 2]).not.toEqual(Immutable.List [1, 2]) + ✅ {pass: true} expect({}).not.toEqual({}) + ✅ {pass: true} expect({"a": 99}).not.toEqual({"a": 99}) + ✅ {pass: true} expect(Set {}).not.toEqual(Set {}) + ✅ {pass: true} expect(Set {1, 2}).not.toEqual(Set {1, 2}) + ✅ {pass: true} expect(Set {1, 2}).not.toEqual(Set {2, 1}) + ✅ {pass: true} expect(Set {[1], [2]}).not.toEqual(Set {[2], [1]}) + ✅ {pass: true} expect(Set {Set {[1]}, Set {[2]}}).not.toEqual(Set {Set {[2]}, Set {[1]}}) + ✅ {pass: true} expect(Set {[1], [2], [3], [3]}).not.toEqual(Set {[3], [3], [2], [1]}) + ✅ {pass: true} expect(Set {{"a": 1}, {"b": 2}}).not.toEqual(Set {{"b": 2}, {"a": 1}}) + ✅ {pass: true} expect(Immutable.Set []).not.toEqual(Immutable.Set []) + ✅ {pass: true} expect(Immutable.Set [1, 2]).not.toEqual(Immutable.Set [1, 2]) + ✅ {pass: true} expect(Immutable.Set [1, 2]).not.toEqual(Immutable.Set [2, 1]) + ✅ {pass: true} expect(Immutable.OrderedSet []).not.toEqual(Immutable.OrderedSet []) + ✅ {pass: true} expect(Immutable.OrderedSet [1, 2]).not.toEqual(Immutable.OrderedSet [1, 2]) + ✅ {pass: true} expect(Map {}).not.toEqual(Map {}) + ✅ {pass: true} expect(Map {1 => "one", 2 => "two"}).not.toEqual(Map {1 => "one", 2 => "two"}) + ✅ {pass: true} expect(Map {1 => "one", 2 => "two"}).not.toEqual(Map {2 => "two", 1 => "one"}) + ✅ {pass: true} expect(Map {[1] => "one", [2] => "two", [3] => "three", [3] => "four"}).not.toEqual(Map {[3] => "three", [3] => "four", [2] => "two", [1] => "one"}) + ✅ {pass: true} expect(Map {[1] => Map {[1] => "one"}, [2] => Map {[2] => "two"}}).not.toEqual(Map {[2] => Map {[2] => "two"}, [1] => Map {[1] => "one"}}) + ✅ {pass: true} expect(Map {[1] => "one", [2] => "two"}).not.toEqual(Map {[2] => "two", [1] => "one"}) + ✅ {pass: true} expect(Map {{"a": 1} => "one", {"b": 2} => "two"}).not.toEqual(Map {{"b": 2} => "two", {"a": 1} => "one"}) + ✅ {pass: true} expect(Map {1 => ["one"], 2 => ["two"]}).not.toEqual(Map {2 => ["two"], 1 => ["one"]}) + ✅ {pass: true} expect(Immutable.Map {}).not.toEqual(Immutable.Map {}) + ✅ {pass: true} expect(Immutable.Map {1: "one", 2: "two"}).not.toEqual(Immutable.Map {1: "one", 2: "two"}) + ✅ {pass: true} expect(Immutable.Map {1: "one", 2: "two"}).not.toEqual(Immutable.Map {2: "two", 1: "one"}) + ✅ {pass: true} expect(Immutable.OrderedMap {1: "one", 2: "two"}).not.toEqual(Immutable.OrderedMap {1: "one", 2: "two"}) + ✅ {pass: true} expect(Immutable.Map {"1": Immutable.Map {"2": {"a": 99}}}).not.toEqual(Immutable.Map {"1": Immutable.Map {"2": {"a": 99}}}) + ✅ {pass: true} expect([97, 98, 99]).not.toEqual([97, 98, 99]) + ✅ {pass: true} expect({"a": 1, "b": 2}).not.toEqual(ObjectContaining {"a": 1}) + ✅ {pass: true} expect([1, 2, 3]).not.toEqual(ArrayContaining [2, 3]) + ✅ {pass: true} expect("abcd").not.toEqual(StringContaining "bc") + ✅ {pass: true} expect("abcd").not.toEqual(StringMatching /bc/) + ✅ {pass: true} expect(true).not.toEqual(Anything) + ✅ {pass: true} expect([Function anonymous]).not.toEqual(Any) + ✅ {pass: true} expect({"a": 1, "b": [Function b], "c": true}).not.toEqual({"a": 1, "b": Any, "c": Anything}) + ✅ {pass: true} expect("Alice").not.toEqual({"asymmetricMatch": [Function asymmetricMatch]}) + ✅ {pass: true} expect({"nodeName": "div", "nodeType": 1}).not.toEqual({"nodeName": "div", "nodeType": 1}) + ✅ {pass: true} expect({Symbol(foo): 1, Symbol(bar): 2}).not.toEqual({Symbol(foo): Any, Symbol(bar): 2}) + ✅ {pass: true} expect(1n).not.toEqual(1n) + ✅ {pass: true} expect(0n).not.toEqual(0n) + ✅ {pass: true} expect([1n]).not.toEqual([1n]) + ✅ {pass: true} expect([1n, 2]).not.toEqual([1n, 2]) + ✅ {pass: true} expect(Immutable.List [1n]).not.toEqual(Immutable.List [1n]) + ✅ {pass: true} expect({"a": 99n}).not.toEqual({"a": 99n}) + ✅ {pass: true} expect(Set {1n, 2n}).not.toEqual(Set {1n, 2n}) + ✅ assertion error matcherResult property contains matcher name, expected and actual values + ✅ symbol based keys in arrays are processed correctly + ✅ non-enumerable members should be skipped during equal + ✅ non-enumerable symbolic members should be skipped during equal +.toEqual() cyclic object equality + ✅ properties with the same circularity are equal + ✅ properties with different circularity are not equal + ✅ are not equal if circularity is not on the same property +.toBeInstanceOf() + ✅ passing Map {} and [Function Map] + ✅ passing [] and [Function Array] + ✅ passing {} and [Function A] + ✅ passing {} and [Function B] + ✅ passing {} and [Function B] + ✅ passing {} and [Function anonymous] + ✅ passing {} and [Function B] + ✅ passing {} and [Function name() {}] + ✅ failing "a" and [Function String] + ✅ failing 1 and [Function Number] + ✅ failing true and [Function Boolean] + ✅ failing {} and [Function B] + ✅ failing {} and [Function A] + ✅ failing undefined and [Function String] + ✅ failing null and [Function String] + ✅ failing /\w+/ and [Function anonymous] + ✅ failing {} and [Function RegExp] + ✅ throws if constructor is not a function +.toBeTruthy(), .toBeFalsy() + ✅ does not accept arguments + ✅ '{}' is truthy + ✅ '[]' is truthy + ✅ 'true' is truthy + ✅ '1' is truthy + ✅ '"a"' is truthy + ✅ '0.5' is truthy + ✅ 'Map {}' is truthy + ✅ '[Function anonymous]' is truthy + ✅ 'Infinity' is truthy + ✅ '1n' is truthy + ✅ 'false' is falsy + ✅ 'null' is falsy + ✅ 'NaN' is falsy + ✅ '0' is falsy + ✅ '""' is falsy + ✅ 'undefined' is falsy + ✅ '0n' is falsy +.toBeNaN() + ✅ {pass: true} expect(NaN).toBeNaN() + ✅ throws +.toBeNull() + ✅ fails for '{}' + ✅ fails for '[]' + ✅ fails for 'true' + ✅ fails for '1' + ✅ fails for '"a"' + ✅ fails for '0.5' + ✅ fails for 'Map {}' + ✅ fails for '[Function anonymous]' + ✅ fails for 'Infinity' + ✅ fails for null with .not + ✅ pass for null +.toBeDefined(), .toBeUndefined() + ✅ '{}' is defined + ✅ '[]' is defined + ✅ 'true' is defined + ✅ '1' is defined + ✅ '"a"' is defined + ✅ '0.5' is defined + ✅ 'Map {}' is defined + ✅ '[Function anonymous]' is defined + ✅ 'Infinity' is defined + ✅ '1n' is defined + ✅ undefined is undefined +.toBeGreaterThan(), .toBeLessThan(), .toBeGreaterThanOrEqual(), .toBeLessThanOrEqual() + ✅ {pass: true} expect(1).toBeLessThan(2) + ✅ {pass: false} expect(2).toBeLessThan(1) + ✅ {pass: true} expect(2).toBeGreaterThan(1) + ✅ {pass: false} expect(1).toBeGreaterThan(2) + ✅ {pass: true} expect(1).toBeLessThanOrEqual(2) + ✅ {pass: false} expect(2).toBeLessThanOrEqual(1) + ✅ {pass: true} expect(2).toBeGreaterThanOrEqual(1) + ✅ {pass: false} expect(1).toBeGreaterThanOrEqual(2) + ✅ throws: [1, 2] + ✅ {pass: true} expect(-Infinity).toBeLessThan(Infinity) + ✅ {pass: false} expect(Infinity).toBeLessThan(-Infinity) + ✅ {pass: true} expect(Infinity).toBeGreaterThan(-Infinity) + ✅ {pass: false} expect(-Infinity).toBeGreaterThan(Infinity) + ✅ {pass: true} expect(-Infinity).toBeLessThanOrEqual(Infinity) + ✅ {pass: false} expect(Infinity).toBeLessThanOrEqual(-Infinity) + ✅ {pass: true} expect(Infinity).toBeGreaterThanOrEqual(-Infinity) + ✅ {pass: false} expect(-Infinity).toBeGreaterThanOrEqual(Infinity) + ✅ throws: [-Infinity, Infinity] + ✅ {pass: true} expect(5e-324).toBeLessThan(1.7976931348623157e+308) + ✅ {pass: false} expect(1.7976931348623157e+308).toBeLessThan(5e-324) + ✅ {pass: true} expect(1.7976931348623157e+308).toBeGreaterThan(5e-324) + ✅ {pass: false} expect(5e-324).toBeGreaterThan(1.7976931348623157e+308) + ✅ {pass: true} expect(5e-324).toBeLessThanOrEqual(1.7976931348623157e+308) + ✅ {pass: false} expect(1.7976931348623157e+308).toBeLessThanOrEqual(5e-324) + ✅ {pass: true} expect(1.7976931348623157e+308).toBeGreaterThanOrEqual(5e-324) + ✅ {pass: false} expect(5e-324).toBeGreaterThanOrEqual(1.7976931348623157e+308) + ✅ throws: [5e-324, 1.7976931348623157e+308] + ✅ {pass: true} expect(17).toBeLessThan(34) + ✅ {pass: false} expect(34).toBeLessThan(17) + ✅ {pass: true} expect(34).toBeGreaterThan(17) + ✅ {pass: false} expect(17).toBeGreaterThan(34) + ✅ {pass: true} expect(17).toBeLessThanOrEqual(34) + ✅ {pass: false} expect(34).toBeLessThanOrEqual(17) + ✅ {pass: true} expect(34).toBeGreaterThanOrEqual(17) + ✅ {pass: false} expect(17).toBeGreaterThanOrEqual(34) + ✅ throws: [17, 34] + ✅ {pass: true} expect(3).toBeLessThan(7) + ✅ {pass: false} expect(7).toBeLessThan(3) + ✅ {pass: true} expect(7).toBeGreaterThan(3) + ✅ {pass: false} expect(3).toBeGreaterThan(7) + ✅ {pass: true} expect(3).toBeLessThanOrEqual(7) + ✅ {pass: false} expect(7).toBeLessThanOrEqual(3) + ✅ {pass: true} expect(7).toBeGreaterThanOrEqual(3) + ✅ {pass: false} expect(3).toBeGreaterThanOrEqual(7) + ✅ throws: [3, 7] + ✅ {pass: true} expect(9).toBeLessThan(18) + ✅ {pass: false} expect(18).toBeLessThan(9) + ✅ {pass: true} expect(18).toBeGreaterThan(9) + ✅ {pass: false} expect(9).toBeGreaterThan(18) + ✅ {pass: true} expect(9).toBeLessThanOrEqual(18) + ✅ {pass: false} expect(18).toBeLessThanOrEqual(9) + ✅ {pass: true} expect(18).toBeGreaterThanOrEqual(9) + ✅ {pass: false} expect(9).toBeGreaterThanOrEqual(18) + ✅ throws: [9, 18] + ✅ {pass: true} expect(0.1).toBeLessThan(0.2) + ✅ {pass: false} expect(0.2).toBeLessThan(0.1) + ✅ {pass: true} expect(0.2).toBeGreaterThan(0.1) + ✅ {pass: false} expect(0.1).toBeGreaterThan(0.2) + ✅ {pass: true} expect(0.1).toBeLessThanOrEqual(0.2) + ✅ {pass: false} expect(0.2).toBeLessThanOrEqual(0.1) + ✅ {pass: true} expect(0.2).toBeGreaterThanOrEqual(0.1) + ✅ {pass: false} expect(0.1).toBeGreaterThanOrEqual(0.2) + ✅ throws: [0.1, 0.2] + ✅ can compare BigInt to Numbers + ✅ {pass: true} expect(1n).toBeLessThan(2n) + ✅ {pass: false} expect(2n).toBeLessThan(1n) + ✅ {pass: true} expect(2n).toBeGreaterThan(1n) + ✅ {pass: false} expect(1n).toBeGreaterThan(2n) + ✅ {pass: true} expect(1n).toBeLessThanOrEqual(2n) + ✅ {pass: false} expect(2n).toBeLessThanOrEqual(1n) + ✅ {pass: true} expect(2n).toBeGreaterThanOrEqual(1n) + ✅ {pass: false} expect(1n).toBeGreaterThanOrEqual(2n) + ✅ throws: [1n, 2n] + ✅ {pass: true} expect(17n).toBeLessThan(34n) + ✅ {pass: false} expect(34n).toBeLessThan(17n) + ✅ {pass: true} expect(34n).toBeGreaterThan(17n) + ✅ {pass: false} expect(17n).toBeGreaterThan(34n) + ✅ {pass: true} expect(17n).toBeLessThanOrEqual(34n) + ✅ {pass: false} expect(34n).toBeLessThanOrEqual(17n) + ✅ {pass: true} expect(34n).toBeGreaterThanOrEqual(17n) + ✅ {pass: false} expect(17n).toBeGreaterThanOrEqual(34n) + ✅ throws: [17n, 34n] + ✅ {pass: true} expect(-1).toBeLessThan(2n) + ✅ {pass: false} expect(2n).toBeLessThan(-1) + ✅ {pass: true} expect(2n).toBeGreaterThan(-1) + ✅ {pass: false} expect(-1).toBeGreaterThan(2n) + ✅ {pass: true} expect(-1).toBeLessThanOrEqual(2n) + ✅ {pass: false} expect(2n).toBeLessThanOrEqual(-1) + ✅ {pass: true} expect(2n).toBeGreaterThanOrEqual(-1) + ✅ {pass: false} expect(-1).toBeGreaterThanOrEqual(2n) + ✅ throws: [-1, 2n] + ✅ equal numbers: [1, 1] + ✅ equal numbers: [5e-324, 5e-324] + ✅ equal numbers: [1.7976931348623157e+308, 1.7976931348623157e+308] + ✅ equal numbers: [Infinity, Infinity] + ✅ equal numbers: [-Infinity, -Infinity] + ✅ equal numbers: [1, 1] + ✅ equal numbers: [9007199254740991, 9007199254740991] +.toContain(), .toContainEqual() + ✅ iterable + ✅ '[1, 2, 3, 4]' contains '1' + ✅ '["a", "b", "c", "d"]' contains '"a"' + ✅ '[undefined, null]' contains 'null' + ✅ '[undefined, null]' contains 'undefined' + ✅ '[Symbol(a)]' contains 'Symbol(a)' + ✅ '"abcdef"' contains '"abc"' + ✅ '"11112111"' contains '"2"' + ✅ 'Set {"abc", "def"}' contains '"abc"' + ✅ '[0, 1]' contains '1' + ✅ '[1n, 2n, 3n, 4n]' contains '1n' + ✅ '[1, 2, 3, 3n, 4]' contains '3n' + ✅ '[1, 2, 3]' does not contain '4' + ✅ '[null, undefined]' does not contain '1' + ✅ '[{}, []]' does not contain '[]' + ✅ '[{}, []]' does not contain '{}' + ✅ '[1n, 2n, 3n]' does not contain '3' + ✅ error cases + ✅ '[1, 2, 3, 4]' contains a value equal to '1' + ✅ '["a", "b", "c", "d"]' contains a value equal to '"a"' + ✅ '[undefined, null]' contains a value equal to 'null' + ✅ '[undefined, null]' contains a value equal to 'undefined' + ✅ '[Symbol(a)]' contains a value equal to 'Symbol(a)' + ✅ '[{"a": "b"}, {"a": "c"}]' contains a value equal to '{"a": "b"}' + ✅ 'Set {1, 2, 3, 4}' contains a value equal to '1' + ✅ '[0, 1]' contains a value equal to '1' + ✅ '[{"a": "b"}, {"a": "c"}]' does not contain a value equal to'{"a": "d"}' + ✅ error cases for toContainEqual +.toBeCloseTo + ✅ {pass: true} expect(0).toBeCloseTo(0) + ✅ {pass: true} expect(0).toBeCloseTo(0.001) + ✅ {pass: true} expect(1.23).toBeCloseTo(1.229) + ✅ {pass: true} expect(1.23).toBeCloseTo(1.226) + ✅ {pass: true} expect(1.23).toBeCloseTo(1.225) + ✅ {pass: true} expect(1.23).toBeCloseTo(1.234) + ✅ {pass: true} expect(Infinity).toBeCloseTo(Infinity) + ✅ {pass: true} expect(-Infinity).toBeCloseTo(-Infinity) + ✅ {pass: false} expect(0).toBeCloseTo(0.01) + ✅ {pass: false} expect(1).toBeCloseTo(1.23) + ✅ {pass: false} expect(1.23).toBeCloseTo(1.2249999) + ✅ {pass: false} expect(Infinity).toBeCloseTo(-Infinity) + ✅ {pass: false} expect(Infinity).toBeCloseTo(1.23) + ✅ {pass: false} expect(-Infinity).toBeCloseTo(-1.23) + ✅ {pass: false} expect(3.141592e-7).toBeCloseTo(3e-7, 8) + ✅ {pass: false} expect(56789).toBeCloseTo(51234, -4) + ✅ {pass: true} expect(0).toBeCloseTo(0.1, 0) + ✅ {pass: true} expect(0).toBeCloseTo(0.0001, 3) + ✅ {pass: true} expect(0).toBeCloseTo(0.000004, 5) + ✅ {pass: true} expect(2.0000002).toBeCloseTo(2, 5) +.toBeCloseTo throws: Matcher error + ✅ promise empty isNot false received + ✅ promise empty isNot true expected + ✅ promise rejects isNot false expected + ✅ promise rejects isNot true received + ✅ promise resolves isNot false received + ✅ promise resolves isNot true expected +.toMatch() + ✅ {pass: true} expect(foo).toMatch(foo) + ✅ {pass: true} expect(Foo bar).toMatch(/^foo/i) + ✅ throws: [bar, foo] + ✅ throws: [bar, /foo/] + ✅ throws if non String actual value passed: [1, "foo"] + ✅ throws if non String actual value passed: [{}, "foo"] + ✅ throws if non String actual value passed: [[], "foo"] + ✅ throws if non String actual value passed: [true, "foo"] + ✅ throws if non String actual value passed: [/foo/i, "foo"] + ✅ throws if non String actual value passed: [[Function anonymous], "foo"] + ✅ throws if non String actual value passed: [undefined, "foo"] + ✅ throws if non String/RegExp expected value passed: ["foo", 1] + ✅ throws if non String/RegExp expected value passed: ["foo", {}] + ✅ throws if non String/RegExp expected value passed: ["foo", []] + ✅ throws if non String/RegExp expected value passed: ["foo", true] + ✅ throws if non String/RegExp expected value passed: ["foo", [Function anonymous]] + ✅ throws if non String/RegExp expected value passed: ["foo", undefined] + ✅ escapes strings properly + ✅ does not maintain RegExp state between calls +.toHaveLength + ✅ {pass: true} expect([1, 2]).toHaveLength(2) + ✅ {pass: true} expect([]).toHaveLength(0) + ✅ {pass: true} expect(["a", "b"]).toHaveLength(2) + ✅ {pass: true} expect("abc").toHaveLength(3) + ✅ {pass: true} expect("").toHaveLength(0) + ✅ {pass: true} expect([Function anonymous]).toHaveLength(0) + ✅ {pass: false} expect([1, 2]).toHaveLength(3) + ✅ {pass: false} expect([]).toHaveLength(1) + ✅ {pass: false} expect(["a", "b"]).toHaveLength(99) + ✅ {pass: false} expect("abc").toHaveLength(66) + ✅ {pass: false} expect("").toHaveLength(1) + ✅ error cases +.toHaveLength matcher error expected length + ✅ not number + ✅ number Infinity + ✅ number NaN + ✅ number float + ✅ number negative integer +.toHaveProperty() + ✅ {pass: true} expect({"a": {"b": {"c": {"d": 1}}}}).toHaveProperty('a.b.c.d', 1) + ✅ {pass: true} expect({"a": {"b": {"c": {"d": 1}}}}).toHaveProperty('a,b,c,d', 1) + ✅ {pass: true} expect({"a.b.c.d": 1}).toHaveProperty('a.b.c.d', 1) + ✅ {pass: true} expect({"a": {"b": [1, 2, 3]}}).toHaveProperty('a,b,1', 2) + ✅ {pass: true} expect({"a": {"b": [1, 2, 3]}}).toHaveProperty('a,b,1', Any) + ✅ {pass: true} expect({"a": 0}).toHaveProperty('a', 0) + ✅ {pass: true} expect({"a": {"b": undefined}}).toHaveProperty('a.b', undefined) + ✅ {pass: true} expect({"a": {}}).toHaveProperty('a.b', undefined) + ✅ {pass: true} expect({"a": {"b": {"c": 5}}}).toHaveProperty('a.b', {"c": 5}) + ✅ {pass: true} expect({"property": 1}).toHaveProperty('property', 1) + ✅ {pass: true} expect({}).toHaveProperty('a', undefined) + ✅ {pass: true} expect({}).toHaveProperty('b', "b") + ✅ {pass: true} expect({}).toHaveProperty('setter', undefined) + ✅ {pass: true} expect({"val": true}).toHaveProperty('a', undefined) + ✅ {pass: true} expect({"val": true}).toHaveProperty('c', "c") + ✅ {pass: true} expect({"val": true}).toHaveProperty('val', true) + ✅ {pass: true} expect({"nodeName": "DIV"}).toHaveProperty('nodeType', 1) + ✅ {pass: true} expect("").toHaveProperty('length', 0) + ✅ {pass: true} expect([Function memoized]).toHaveProperty('memo', []) + ✅ {pass: false} expect({"a": {"b": {"c": {"d": 1}}}}).toHaveProperty('a.b.ttt.d', 1) + ✅ {pass: false} expect({"a": {"b": {"c": {"d": 1}}}}).toHaveProperty('a.b.c.d', 2) + ✅ {pass: false} expect({"a.b.c.d": 1}).toHaveProperty('a.b.c.d', 2) + ✅ {pass: false} expect({"a.b.c.d": 1}).toHaveProperty('a.b.c.d', 2) + ✅ {pass: false} expect({"children": ["\"That cartoon\""], "props": null, "type": "p"}).toHaveProperty('children,0', "\"That cat cartoon\"") + ✅ {pass: false} expect({"children": ["Roses are red. +Violets are blue. +Testing with Jest is good for you."], "props": null, "type": "pre"}).toHaveProperty('children,0', "Roses are red, violets are blue. +Testing with Jest +Is good for you.") + ✅ {pass: false} expect({"a": {"b": {"c": {"d": 1}}}}).toHaveProperty('a,b,c,d', 2) + ✅ {pass: false} expect({"a": {"b": {"c": {}}}}).toHaveProperty('a.b.c.d', 1) + ✅ {pass: false} expect({"a": 1}).toHaveProperty('a.b.c.d', 5) + ✅ {pass: false} expect({}).toHaveProperty('a', "test") + ✅ {pass: false} expect({"a": {"b": 3}}).toHaveProperty('a.b', undefined) + ✅ {pass: false} expect(1).toHaveProperty('a.b.c', "test") + ✅ {pass: false} expect("abc").toHaveProperty('a.b.c', {"a": 5}) + ✅ {pass: false} expect({"a": {"b": {"c": 5}}}).toHaveProperty('a.b', {"c": 4}) + ✅ {pass: false} expect({}).toHaveProperty('a', "a") + ✅ {pass: false} expect({}).toHaveProperty('b', undefined) + ✅ {pass: true} expect({"a": {"b": {"c": {"d": 1}}}}).toHaveProperty('a.b.c.d') + ✅ {pass: true} expect({"a": {"b": {"c": {"d": 1}}}}).toHaveProperty('a,b,c,d') + ✅ {pass: true} expect({"a.b.c.d": 1}).toHaveProperty('a.b.c.d') + ✅ {pass: true} expect({"a": {"b": [1, 2, 3]}}).toHaveProperty('a,b,1') + ✅ {pass: true} expect({"a": 0}).toHaveProperty('a') + ✅ {pass: true} expect({"a": {"b": undefined}}).toHaveProperty('a.b') + ✅ {pass: false} expect({"a": {"b": {"c": {}}}}).toHaveProperty('a.b.c.d') + ✅ {pass: false} expect({"a": 1}).toHaveProperty('a.b.c.d') + ✅ {pass: false} expect({}).toHaveProperty('a') + ✅ {pass: false} expect(1).toHaveProperty('a.b.c') + ✅ {pass: false} expect("abc").toHaveProperty('a.b.c') + ✅ {pass: false} expect(false).toHaveProperty('key') + ✅ {pass: false} expect(0).toHaveProperty('key') + ✅ {pass: false} expect("").toHaveProperty('key') + ✅ {pass: false} expect(Symbol()).toHaveProperty('key') + ✅ {pass: false} expect({"key": 1}).toHaveProperty('not') + ✅ {error} expect(null).toHaveProperty('a.b') + ✅ {error} expect(undefined).toHaveProperty('a') + ✅ {error} expect({"a": {"b": {}}}).toHaveProperty('undefined') + ✅ {error} expect({"a": {"b": {}}}).toHaveProperty('null') + ✅ {error} expect({"a": {"b": {}}}).toHaveProperty('1') + ✅ {error} expect({}).toHaveProperty('') +toMatchObject() circular references simple circular references + ✅ {pass: true} expect({"a": "hello", "ref": [Circular]}).toMatchObject({}) + ✅ {pass: true} expect({"a": "hello", "ref": [Circular]}).toMatchObject({"a": "hello", "ref": [Circular]}) + ✅ {pass: false} expect({}).toMatchObject({"a": "hello", "ref": [Circular]}) + ✅ {pass: false} expect({"a": "hello", "ref": [Circular]}).toMatchObject({"a": "world", "ref": [Circular]}) + ✅ {pass: false} expect({"ref": "not a ref"}).toMatchObject({"a": "hello", "ref": [Circular]}) +toMatchObject() circular references transitive circular references + ✅ {pass: true} expect({"a": "hello", "nestedObj": {"parentObj": [Circular]}}).toMatchObject({}) + ✅ {pass: true} expect({"a": "hello", "nestedObj": {"parentObj": [Circular]}}).toMatchObject({"a": "hello", "nestedObj": {"parentObj": [Circular]}}) + ✅ {pass: false} expect({}).toMatchObject({"a": "hello", "nestedObj": {"parentObj": [Circular]}}) + ✅ {pass: false} expect({"a": "world", "nestedObj": {"parentObj": [Circular]}}).toMatchObject({"a": "hello", "nestedObj": {"parentObj": [Circular]}}) + ✅ {pass: false} expect({"nestedObj": {"parentObj": "not the parent ref"}}).toMatchObject({"a": "hello", "nestedObj": {"parentObj": [Circular]}}) +toMatchObject() + ✅ {pass: true} expect({"a": "b", "c": "d"}).toMatchObject({"a": "b"}) + ✅ {pass: true} expect({"a": "b", "c": "d"}).toMatchObject({"a": "b", "c": "d"}) + ✅ {pass: true} expect({"a": "b", "t": {"x": {"r": "r"}, "z": "z"}}).toMatchObject({"a": "b", "t": {"z": "z"}}) + ✅ {pass: true} expect({"a": "b", "t": {"x": {"r": "r"}, "z": "z"}}).toMatchObject({"t": {"x": {"r": "r"}}}) + ✅ {pass: true} expect({"a": [3, 4, 5], "b": "b"}).toMatchObject({"a": [3, 4, 5]}) + ✅ {pass: true} expect({"a": [3, 4, 5, "v"], "b": "b"}).toMatchObject({"a": [3, 4, 5, "v"]}) + ✅ {pass: true} expect({"a": 1, "c": 2}).toMatchObject({"a": Any}) + ✅ {pass: true} expect({"a": {"x": "x", "y": "y"}}).toMatchObject({"a": {"x": Any}}) + ✅ {pass: true} expect(Set {1, 2}).toMatchObject(Set {1, 2}) + ✅ {pass: true} expect(Set {1, 2}).toMatchObject(Set {2, 1}) + ✅ {pass: true} expect(2015-11-30T00:00:00.000Z).toMatchObject(2015-11-30T00:00:00.000Z) + ✅ {pass: true} expect({"a": 2015-11-30T00:00:00.000Z, "b": "b"}).toMatchObject({"a": 2015-11-30T00:00:00.000Z}) + ✅ {pass: true} expect({"a": null, "b": "b"}).toMatchObject({"a": null}) + ✅ {pass: true} expect({"a": undefined, "b": "b"}).toMatchObject({"a": undefined}) + ✅ {pass: true} expect({"a": [{"a": "a", "b": "b"}]}).toMatchObject({"a": [{"a": "a"}]}) + ✅ {pass: true} expect([1, 2]).toMatchObject([1, 2]) + ✅ {pass: true} expect({"a": undefined}).toMatchObject({"a": undefined}) + ✅ {pass: true} expect([]).toMatchObject([]) + ✅ {pass: true} expect([Error: foo]).toMatchObject([Error: foo]) + ✅ {pass: true} expect([Error: bar]).toMatchObject({"message": "bar"}) + ✅ {pass: true} expect({}).toMatchObject({"a": undefined, "b": "b"}) + ✅ {pass: true} expect({"a": "b"}).toMatchObject({"a": "b"}) + ✅ {pass: true} expect({"a": "b", "c": "d", Symbol(jest): "jest"}).toMatchObject({"a": "b", Symbol(jest): "jest"}) + ✅ {pass: true} expect({"a": "b", "c": "d", Symbol(jest): "jest"}).toMatchObject({"a": "b", "c": "d", Symbol(jest): "jest"}) + ✅ {pass: true} expect({}).toMatchObject({"a": undefined, "b": "b", "c": "c"}) + ✅ {pass: true} expect({}).toMatchObject({"d": 4}) + ✅ {pass: true} expect({"a": "b", "toString": [Function toString]}).toMatchObject({"toString": Any}) + ✅ {pass: false} expect({"a": "b", "c": "d"}).toMatchObject({"e": "b"}) + ✅ {pass: false} expect({"a": "b", "c": "d"}).toMatchObject({"a": "b!", "c": "d"}) + ✅ {pass: false} expect({"a": "a", "c": "d"}).toMatchObject({"a": Any}) + ✅ {pass: false} expect({"a": "b", "t": {"x": {"r": "r"}, "z": "z"}}).toMatchObject({"a": "b", "t": {"z": [3]}}) + ✅ {pass: false} expect({"a": "b", "t": {"x": {"r": "r"}, "z": "z"}}).toMatchObject({"t": {"l": {"r": "r"}}}) + ✅ {pass: false} expect({"a": [3, 4, 5], "b": "b"}).toMatchObject({"a": [3, 4, 5, 6]}) + ✅ {pass: false} expect({"a": [3, 4, 5], "b": "b"}).toMatchObject({"a": [3, 4]}) + ✅ {pass: false} expect({"a": [3, 4, "v"], "b": "b"}).toMatchObject({"a": ["v"]}) + ✅ {pass: false} expect({"a": [3, 4, 5], "b": "b"}).toMatchObject({"a": {"b": 4}}) + ✅ {pass: false} expect({"a": [3, 4, 5], "b": "b"}).toMatchObject({"a": {"b": Any}}) + ✅ {pass: false} expect([1, 2]).toMatchObject([1, 3]) + ✅ {pass: false} expect([0]).toMatchObject([-0]) + ✅ {pass: false} expect(Set {1, 2}).toMatchObject(Set {2}) + ✅ {pass: false} expect(2015-11-30T00:00:00.000Z).toMatchObject(2015-10-10T00:00:00.000Z) + ✅ {pass: false} expect({"a": 2015-11-30T00:00:00.000Z, "b": "b"}).toMatchObject({"a": 2015-10-10T00:00:00.000Z}) + ✅ {pass: false} expect({"a": null, "b": "b"}).toMatchObject({"a": "4"}) + ✅ {pass: false} expect({"a": null, "b": "b"}).toMatchObject({"a": undefined}) + ✅ {pass: false} expect({"a": undefined}).toMatchObject({"a": null}) + ✅ {pass: false} expect({"a": [{"a": "a", "b": "b"}]}).toMatchObject({"a": [{"a": "c"}]}) + ✅ {pass: false} expect({"a": 1, "b": 1, "c": 1, "d": {"e": {"f": 555}}}).toMatchObject({"d": {"e": {"f": 222}}}) + ✅ {pass: false} expect({}).toMatchObject({"a": undefined}) + ✅ {pass: false} expect([1, 2, 3]).toMatchObject([2, 3, 1]) + ✅ {pass: false} expect([1, 2, 3]).toMatchObject([1, 2, 2]) + ✅ {pass: false} expect([Error: foo]).toMatchObject([Error: bar]) + ✅ {pass: false} expect({"a": "b"}).toMatchObject({"c": "d"}) + ✅ {pass: false} expect({"a": "b", "c": "d", Symbol(jest): "jest"}).toMatchObject({"a": "c", Symbol(jest): Any}) + ✅ {pass: false} expect({"a": "b"}).toMatchObject({"toString": Any}) + ✅ throws expect(null).toMatchObject({}) + ✅ throws expect(4).toMatchObject({}) + ✅ throws expect("44").toMatchObject({}) + ✅ throws expect(true).toMatchObject({}) + ✅ throws expect(undefined).toMatchObject({}) + ✅ throws expect({}).toMatchObject(null) + ✅ throws expect({}).toMatchObject(4) + ✅ throws expect({}).toMatchObject("some string") + ✅ throws expect({}).toMatchObject(true) + ✅ throws expect({}).toMatchObject(undefined) + ✅ does not match properties up in the prototype chain +``` +### ✅ packages/expect/src/__tests__/spyMatchers.test.ts +``` +toBeCalled + ✅ works only on spies or jest.fn + ✅ passes when called + ✅ .not passes when called + ✅ fails with any argument passed + ✅ .not fails with any argument passed + ✅ includes the custom mock name in the error message +toHaveBeenCalled + ✅ works only on spies or jest.fn + ✅ passes when called + ✅ .not passes when called + ✅ fails with any argument passed + ✅ .not fails with any argument passed + ✅ includes the custom mock name in the error message +toBeCalledTimes + ✅ .not works only on spies or jest.fn + ✅ only accepts a number argument + ✅ .not only accepts a number argument + ✅ passes if function called equal to expected times + ✅ .not passes if function called more than expected times + ✅ .not passes if function called less than expected times + ✅ includes the custom mock name in the error message +toHaveBeenCalledTimes + ✅ .not works only on spies or jest.fn + ✅ only accepts a number argument + ✅ .not only accepts a number argument + ✅ passes if function called equal to expected times + ✅ .not passes if function called more than expected times + ✅ .not passes if function called less than expected times + ✅ includes the custom mock name in the error message +lastCalledWith + ✅ works only on spies or jest.fn + ✅ works when not called + ✅ works with no arguments + ✅ works with arguments that don't match + ✅ works with arguments that match + ✅ works with trailing undefined arguments + ✅ works with Map + ✅ works with Set + ✅ works with Immutable.js objects + ✅ works with many arguments + ✅ works with many arguments that don't match + ✅ includes the custom mock name in the error message +toHaveBeenLastCalledWith + ✅ works only on spies or jest.fn + ✅ works when not called + ✅ works with no arguments + ✅ works with arguments that don't match + ✅ works with arguments that match + ✅ works with trailing undefined arguments + ✅ works with Map + ✅ works with Set + ✅ works with Immutable.js objects + ✅ works with many arguments + ✅ works with many arguments that don't match + ✅ includes the custom mock name in the error message +nthCalledWith + ✅ works only on spies or jest.fn + ✅ works when not called + ✅ works with no arguments + ✅ works with arguments that don't match + ✅ works with arguments that match + ✅ works with trailing undefined arguments + ✅ works with Map + ✅ works with Set + ✅ works with Immutable.js objects + ✅ works with three calls + ✅ positive throw matcher error for n that is not positive integer + ✅ positive throw matcher error for n that is not integer + ✅ negative throw matcher error for n that is not integer + ✅ includes the custom mock name in the error message +toHaveBeenNthCalledWith + ✅ works only on spies or jest.fn + ✅ works when not called + ✅ works with no arguments + ✅ works with arguments that don't match + ✅ works with arguments that match + ✅ works with trailing undefined arguments + ✅ works with Map + ✅ works with Set + ✅ works with Immutable.js objects + ✅ works with three calls + ✅ positive throw matcher error for n that is not positive integer + ✅ positive throw matcher error for n that is not integer + ✅ negative throw matcher error for n that is not integer + ✅ includes the custom mock name in the error message +toBeCalledWith + ✅ works only on spies or jest.fn + ✅ works when not called + ✅ works with no arguments + ✅ works with arguments that don't match + ✅ works with arguments that match + ✅ works with trailing undefined arguments + ✅ works with Map + ✅ works with Set + ✅ works with Immutable.js objects + ✅ works with many arguments + ✅ works with many arguments that don't match + ✅ includes the custom mock name in the error message +toHaveBeenCalledWith + ✅ works only on spies or jest.fn + ✅ works when not called + ✅ works with no arguments + ✅ works with arguments that don't match + ✅ works with arguments that match + ✅ works with trailing undefined arguments + ✅ works with Map + ✅ works with Set + ✅ works with Immutable.js objects + ✅ works with many arguments + ✅ works with many arguments that don't match + ✅ includes the custom mock name in the error message +toReturn + ✅ .not works only on jest.fn + ✅ throw matcher error if received is spy + ✅ passes when returned + ✅ passes when undefined is returned + ✅ passes when at least one call does not throw + ✅ .not passes when not returned + ✅ .not passes when all calls throw + ✅ .not passes when a call throws undefined + ✅ fails with any argument passed + ✅ .not fails with any argument passed + ✅ includes the custom mock name in the error message + ✅ incomplete recursive calls are handled properly +toHaveReturned + ✅ .not works only on jest.fn + ✅ throw matcher error if received is spy + ✅ passes when returned + ✅ passes when undefined is returned + ✅ passes when at least one call does not throw + ✅ .not passes when not returned + ✅ .not passes when all calls throw + ✅ .not passes when a call throws undefined + ✅ fails with any argument passed + ✅ .not fails with any argument passed + ✅ includes the custom mock name in the error message + ✅ incomplete recursive calls are handled properly +toReturnTimes + ✅ throw matcher error if received is spy + ✅ only accepts a number argument + ✅ .not only accepts a number argument + ✅ passes if function returned equal to expected times + ✅ calls that return undefined are counted as returns + ✅ .not passes if function returned more than expected times + ✅ .not passes if function called less than expected times + ✅ calls that throw are not counted + ✅ calls that throw undefined are not counted + ✅ includes the custom mock name in the error message + ✅ incomplete recursive calls are handled properly +toHaveReturnedTimes + ✅ throw matcher error if received is spy + ✅ only accepts a number argument + ✅ .not only accepts a number argument + ✅ passes if function returned equal to expected times + ✅ calls that return undefined are counted as returns + ✅ .not passes if function returned more than expected times + ✅ .not passes if function called less than expected times + ✅ calls that throw are not counted + ✅ calls that throw undefined are not counted + ✅ includes the custom mock name in the error message + ✅ incomplete recursive calls are handled properly +lastReturnedWith + ✅ works only on spies or jest.fn + ✅ works when not called + ✅ works with no arguments + ✅ works with argument that does not match + ✅ works with argument that does match + ✅ works with undefined + ✅ works with Map + ✅ works with Set + ✅ works with Immutable.js objects directly created + ✅ works with Immutable.js objects indirectly created + ✅ a call that throws is not considered to have returned + ✅ a call that throws undefined is not considered to have returned + ✅ includes the custom mock name in the error message +lastReturnedWith lastReturnedWith + ✅ works with three calls + ✅ incomplete recursive calls are handled properly +toHaveLastReturnedWith + ✅ works only on spies or jest.fn + ✅ works when not called + ✅ works with no arguments + ✅ works with argument that does not match + ✅ works with argument that does match + ✅ works with undefined + ✅ works with Map + ✅ works with Set + ✅ works with Immutable.js objects directly created + ✅ works with Immutable.js objects indirectly created + ✅ a call that throws is not considered to have returned + ✅ a call that throws undefined is not considered to have returned + ✅ includes the custom mock name in the error message +toHaveLastReturnedWith lastReturnedWith + ✅ works with three calls + ✅ incomplete recursive calls are handled properly +nthReturnedWith + ✅ works only on spies or jest.fn + ✅ works when not called + ✅ works with no arguments + ✅ works with argument that does not match + ✅ works with argument that does match + ✅ works with undefined + ✅ works with Map + ✅ works with Set + ✅ works with Immutable.js objects directly created + ✅ works with Immutable.js objects indirectly created + ✅ a call that throws is not considered to have returned + ✅ a call that throws undefined is not considered to have returned + ✅ includes the custom mock name in the error message +nthReturnedWith nthReturnedWith + ✅ works with three calls + ✅ should replace 1st, 2nd, 3rd with first, second, third + ✅ positive throw matcher error for n that is not positive integer + ✅ should reject nth value greater than number of calls + ✅ positive throw matcher error for n that is not integer + ✅ negative throw matcher error for n that is not number + ✅ incomplete recursive calls are handled properly +toHaveNthReturnedWith + ✅ works only on spies or jest.fn + ✅ works when not called + ✅ works with no arguments + ✅ works with argument that does not match + ✅ works with argument that does match + ✅ works with undefined + ✅ works with Map + ✅ works with Set + ✅ works with Immutable.js objects directly created + ✅ works with Immutable.js objects indirectly created + ✅ a call that throws is not considered to have returned + ✅ a call that throws undefined is not considered to have returned + ✅ includes the custom mock name in the error message +toHaveNthReturnedWith nthReturnedWith + ✅ works with three calls + ✅ should replace 1st, 2nd, 3rd with first, second, third + ✅ positive throw matcher error for n that is not positive integer + ✅ should reject nth value greater than number of calls + ✅ positive throw matcher error for n that is not integer + ✅ negative throw matcher error for n that is not number + ✅ incomplete recursive calls are handled properly +toReturnWith + ✅ works only on spies or jest.fn + ✅ works when not called + ✅ works with no arguments + ✅ works with argument that does not match + ✅ works with argument that does match + ✅ works with undefined + ✅ works with Map + ✅ works with Set + ✅ works with Immutable.js objects directly created + ✅ works with Immutable.js objects indirectly created + ✅ a call that throws is not considered to have returned + ✅ a call that throws undefined is not considered to have returned + ✅ includes the custom mock name in the error message +toReturnWith returnedWith + ✅ works with more calls than the limit + ✅ incomplete recursive calls are handled properly +toHaveReturnedWith + ✅ works only on spies or jest.fn + ✅ works when not called + ✅ works with no arguments + ✅ works with argument that does not match + ✅ works with argument that does match + ✅ works with undefined + ✅ works with Map + ✅ works with Set + ✅ works with Immutable.js objects directly created + ✅ works with Immutable.js objects indirectly created + ✅ a call that throws is not considered to have returned + ✅ a call that throws undefined is not considered to have returned + ✅ includes the custom mock name in the error message +toHaveReturnedWith returnedWith + ✅ works with more calls than the limit + ✅ incomplete recursive calls are handled properly +``` +### ✅ packages/expect/src/__tests__/stacktrace.test.ts +``` +✅ stack trace points to correct location when using matchers +✅ stack trace points to correct location when using nested matchers +✅ stack trace points to correct location when throwing from a custom matcher +``` +### ✅ packages/expect/src/__tests__/symbolInObjects.test.ts +``` +Symbol in objects + ✅ should compare objects with Symbol keys + ✅ should compare objects with mixed keys and Symbol + ✅ should compare objects with different Symbol keys +``` +### ✅ packages/expect/src/__tests__/toEqual-dom.test.ts +``` +toEqual duck type Text + ✅ isNot false + ✅ isNot true +toEqual duck type Element + ✅ isNot false + ✅ isNot true +toEqual duck type Fragment + ✅ isNot false + ✅ isNot true +toEqual document createTextNode + ✅ isNot false + ✅ isNot true +toEqual document createElement + ✅ isNot false + ✅ isNot true +toEqual document createDocumentFragment + ✅ isNot false + ✅ isNot true +``` +### ✅ packages/expect/src/__tests__/toThrowMatchers.test.ts +``` +toThrowError + ✅ to throw or not to throw + ✅ invalid arguments + ✅ invalid actual +toThrowError substring + ✅ passes + ✅ did not throw at all + ✅ threw, but message did not match (error) + ✅ threw, but message did not match (non-error falsey) + ✅ properly escapes strings when matching against errors + ✅ threw, but message should not match (error) + ✅ threw, but message should not match (non-error truthy) +toThrowError regexp + ✅ passes + ✅ did not throw at all + ✅ threw, but message did not match (error) + ✅ threw, but message did not match (non-error falsey) + ✅ threw, but message should not match (error) + ✅ threw, but message should not match (non-error truthy) +toThrowError error class + ✅ passes + ✅ did not throw at all + ✅ threw, but class did not match (error) + ✅ threw, but class did not match (non-error falsey) + ✅ threw, but class should not match (error) + ✅ threw, but class should not match (error subclass) + ✅ threw, but class should not match (error subsubclass) +toThrowError error-message pass + ✅ isNot false + ✅ isNot true +toThrowError error-message fail + ✅ isNot false + ✅ isNot true + ✅ multiline diff highlight incorrect expected space +toThrowError asymmetric any-Class pass + ✅ isNot false + ✅ isNot true +toThrowError asymmetric any-Class fail + ✅ isNot false + ✅ isNot true +toThrowError asymmetric anything pass + ✅ isNot false + ✅ isNot true +toThrowError asymmetric anything fail + ✅ isNot false + ✅ isNot true +toThrowError asymmetric no-symbol pass + ✅ isNot false + ✅ isNot true +toThrowError asymmetric no-symbol fail + ✅ isNot false + ✅ isNot true +toThrowError asymmetric objectContaining pass + ✅ isNot false + ✅ isNot true +toThrowError asymmetric objectContaining fail + ✅ isNot false + ✅ isNot true +toThrowError promise/async throws if Error-like object is returned + ✅ passes + ✅ did not throw at all + ✅ threw, but class did not match + ✅ threw, but should not have +toThrowError expected is undefined + ✅ threw, but should not have (non-error falsey) +toThrow + ✅ to throw or not to throw + ✅ invalid arguments + ✅ invalid actual +toThrow substring + ✅ passes + ✅ did not throw at all + ✅ threw, but message did not match (error) + ✅ threw, but message did not match (non-error falsey) + ✅ properly escapes strings when matching against errors + ✅ threw, but message should not match (error) + ✅ threw, but message should not match (non-error truthy) +toThrow regexp + ✅ passes + ✅ did not throw at all + ✅ threw, but message did not match (error) + ✅ threw, but message did not match (non-error falsey) + ✅ threw, but message should not match (error) + ✅ threw, but message should not match (non-error truthy) +toThrow error class + ✅ passes + ✅ did not throw at all + ✅ threw, but class did not match (error) + ✅ threw, but class did not match (non-error falsey) + ✅ threw, but class should not match (error) + ✅ threw, but class should not match (error subclass) + ✅ threw, but class should not match (error subsubclass) +toThrow error-message pass + ✅ isNot false + ✅ isNot true +toThrow error-message fail + ✅ isNot false + ✅ isNot true + ✅ multiline diff highlight incorrect expected space +toThrow asymmetric any-Class pass + ✅ isNot false + ✅ isNot true +toThrow asymmetric any-Class fail + ✅ isNot false + ✅ isNot true +toThrow asymmetric anything pass + ✅ isNot false + ✅ isNot true +toThrow asymmetric anything fail + ✅ isNot false + ✅ isNot true +toThrow asymmetric no-symbol pass + ✅ isNot false + ✅ isNot true +toThrow asymmetric no-symbol fail + ✅ isNot false + ✅ isNot true +toThrow asymmetric objectContaining pass + ✅ isNot false + ✅ isNot true +toThrow asymmetric objectContaining fail + ✅ isNot false + ✅ isNot true +toThrow promise/async throws if Error-like object is returned + ✅ passes + ✅ did not throw at all + ✅ threw, but class did not match + ✅ threw, but should not have +toThrow expected is undefined + ✅ threw, but should not have (non-error falsey) +``` +### ✅ packages/expect/src/__tests__/utils.test.ts +``` +getPath() + ✅ property exists + ✅ property doesnt exist + ✅ property exist but undefined + ✅ property is a getter on class instance + ✅ property is inherited + ✅ path breaks + ✅ empty object at the end +getObjectSubset + ✅ expect(getObjectSubset({"a": "b", "c": "d"}, {"a": "d"})).toEqual({"a": "b"}) + ✅ expect(getObjectSubset({"a": [1, 2], "b": "b"}, {"a": [3, 4]})).toEqual({"a": [1, 2]}) + ✅ expect(getObjectSubset([{"a": "b", "c": "d"}], [{"a": "z"}])).toEqual([{"a": "b"}]) + ✅ expect(getObjectSubset([1, 2], [1, 2, 3])).toEqual([1, 2]) + ✅ expect(getObjectSubset({"a": [1]}, {"a": [1, 2]})).toEqual({"a": [1]}) + ✅ expect(getObjectSubset(2015-11-30T00:00:00.000Z, 2016-12-30T00:00:00.000Z)).toEqual(2015-11-30T00:00:00.000Z) +getObjectSubset returns the object instance if the subset has no extra properties + ✅ Date +getObjectSubset returns the subset instance if its property values are equal + ✅ Object +getObjectSubset returns the subset instance if its property values are equal Uint8Array + ✅ expected + ✅ received +getObjectSubset calculating subsets of objects with circular references + ✅ simple circular references + ✅ transitive circular references +emptyObject() + ✅ matches an empty object + ✅ does not match an object with keys + ✅ does not match a non-object +subsetEquality() + ✅ matching object returns true + ✅ object without keys is undefined + ✅ objects to not match + ✅ null does not return errors + ✅ undefined does not return errors +subsetEquality() matching subsets with circular references + ✅ simple circular references + ✅ referenced object on same level should not regarded as circular reference + ✅ transitive circular references +iterableEquality + ✅ returns true when given circular iterators + ✅ returns true when given circular Set + ✅ returns true when given nested Sets + ✅ returns false when given inequal set within a set + ✅ returns false when given inequal map within a set + ✅ returns false when given inequal set within a map + ✅ returns true when given circular Set shape + ✅ returns true when given circular key in Map + ✅ returns true when given nested Maps + ✅ returns true when given circular key and value in Map + ✅ returns true when given circular value in Map +``` +### ✅ packages/jest-circus/src/__tests__/afterAll.test.ts +``` +✅ tests are not marked done until their parent afterAll runs +✅ describe block cannot have hooks and no tests +✅ describe block _can_ have hooks if a child describe block has tests +✅ describe block hooks must not run if describe block is skipped +✅ child tests marked with todo should not run if describe block is skipped +✅ child tests marked with only should not run if describe block is skipped +``` +### ✅ packages/jest-circus/src/__tests__/baseTest.test.ts +``` +✅ simple test +✅ failures +``` +### ✅ packages/jest-circus/src/__tests__/circusItTestError.test.ts +``` +test/it error throwing + ✅ it doesn't throw an error with valid arguments + ✅ it throws error with missing callback function + ✅ it throws an error when first argument isn't a string + ✅ it throws an error when callback function is not a function + ✅ test doesn't throw an error with valid arguments + ✅ test throws error with missing callback function + ✅ test throws an error when first argument isn't a string + ✅ test throws an error when callback function is not a function +``` +### ✅ packages/jest-circus/src/__tests__/circusItTodoTestError.test.ts +``` +test/it.todo error throwing + ✅ todo throws error when given no arguments + ✅ todo throws error when given more than one argument + ✅ todo throws error when given none string description +``` +### ✅ packages/jest-circus/src/__tests__/hooks.test.ts +``` +✅ beforeEach is executed before each test in current/child describe blocks +✅ multiple before each hooks in one describe are executed in the right order +✅ beforeAll is exectued correctly +``` +### ✅ packages/jest-circus/src/__tests__/hooksError.test.ts +``` +beforeEach hooks error throwing + ✅ beforeEach throws an error when "String" is provided as a first argument to it + ✅ beforeEach throws an error when 1 is provided as a first argument to it + ✅ beforeEach throws an error when [] is provided as a first argument to it + ✅ beforeEach throws an error when {} is provided as a first argument to it + ✅ beforeEach throws an error when Symbol(hello) is provided as a first argument to it + ✅ beforeEach throws an error when true is provided as a first argument to it + ✅ beforeEach throws an error when null is provided as a first argument to it + ✅ beforeEach throws an error when undefined is provided as a first argument to it +beforeAll hooks error throwing + ✅ beforeAll throws an error when "String" is provided as a first argument to it + ✅ beforeAll throws an error when 1 is provided as a first argument to it + ✅ beforeAll throws an error when [] is provided as a first argument to it + ✅ beforeAll throws an error when {} is provided as a first argument to it + ✅ beforeAll throws an error when Symbol(hello) is provided as a first argument to it + ✅ beforeAll throws an error when true is provided as a first argument to it + ✅ beforeAll throws an error when null is provided as a first argument to it + ✅ beforeAll throws an error when undefined is provided as a first argument to it +afterEach hooks error throwing + ✅ afterEach throws an error when "String" is provided as a first argument to it + ✅ afterEach throws an error when 1 is provided as a first argument to it + ✅ afterEach throws an error when [] is provided as a first argument to it + ✅ afterEach throws an error when {} is provided as a first argument to it + ✅ afterEach throws an error when Symbol(hello) is provided as a first argument to it + ✅ afterEach throws an error when true is provided as a first argument to it + ✅ afterEach throws an error when null is provided as a first argument to it + ✅ afterEach throws an error when undefined is provided as a first argument to it +afterAll hooks error throwing + ✅ afterAll throws an error when "String" is provided as a first argument to it + ✅ afterAll throws an error when 1 is provided as a first argument to it + ✅ afterAll throws an error when [] is provided as a first argument to it + ✅ afterAll throws an error when {} is provided as a first argument to it + ✅ afterAll throws an error when Symbol(hello) is provided as a first argument to it + ✅ afterAll throws an error when true is provided as a first argument to it + ✅ afterAll throws an error when null is provided as a first argument to it + ✅ afterAll throws an error when undefined is provided as a first argument to it +``` +### ✅ packages/jest-cli/src/__tests__/cli/args.test.ts +``` +check + ✅ returns true if the arguments are valid + ✅ raises an exception if runInBand and maxWorkers are both specified + ✅ raises an exception if onlyChanged and watchAll are both specified + ✅ raises an exception if onlyFailures and watchAll are both specified + ✅ raises an exception when lastCommit and watchAll are both specified + ✅ raises an exception if findRelatedTests is specified with no file paths + ✅ raises an exception if maxWorkers is specified with no number + ✅ allows maxWorkers to be a % + ✅ allows using "js" file for --config option + ✅ allows using "ts" file for --config option + ✅ allows using "mjs" file for --config option + ✅ allows using "cjs" file for --config option + ✅ allows using "json" file for --config option + ✅ raises an exception if selectProjects is not provided any project names + ✅ raises an exception if config is not a valid JSON string + ✅ raises an exception if config is not a supported file type +buildArgv + ✅ should return only camelcased args +``` +### ✅ packages/jest-cli/src/init/__tests__/init.test.js +``` +init project with package.json and no jest config all questions answered with answer: "No" + ✅ should return the default configuration (an empty config) + ✅ should generate empty config with mjs extension +init project with package.json and no jest config some questions answered with answer: "Yes" + ✅ should create configuration for {clearMocks: true} + ✅ should create configuration for {coverage: true} + ✅ should create configuration for {coverageProvider: "babel"} + ✅ should create configuration for {coverageProvider: "v8"} + ✅ should create configuration for {environment: "jsdom"} + ✅ should create configuration for {environment: "node"} + ✅ should create package.json with configured test command when {scripts: true} +init no package json + ✅ should throw an error if there is no package.json file +init has-jest-config-file-js ask the user whether to override config or not + ✅ user answered with "Yes" + ✅ user answered with "No" +init has-jest-config-file-ts ask the user whether to override config or not + ✅ user answered with "Yes" + ✅ user answered with "No" +init has-jest-config-file-mjs ask the user whether to override config or not + ✅ user answered with "Yes" + ✅ user answered with "No" +init has-jest-config-file-cjs ask the user whether to override config or not + ✅ user answered with "Yes" + ✅ user answered with "No" +init has-jest-config-file-json ask the user whether to override config or not + ✅ user answered with "Yes" + ✅ user answered with "No" +init project using jest.config.ts ask the user whether he wants to use Typescript or not + ✅ user answered with "Yes" + ✅ user answered with "No" +init has jest config in package.json + ✅ should ask the user whether to override config or not +init already has "jest" in packageJson.scripts.test + ✅ should not ask "test script question" +``` +### ✅ packages/jest-cli/src/init/__tests__/modifyPackageJson.test.ts +``` +✅ should remove jest config if exists +✅ should add test script when there are no scripts +✅ should add test script when there are scripts +✅ should not add test script when { shouldModifyScripts: false } +``` +### ✅ packages/jest-config/src/__tests__/Defaults.test.ts +``` +✅ get configuration defaults +``` +### ✅ packages/jest-config/src/__tests__/getMaxWorkers.test.ts +``` +getMaxWorkers + ✅ Returns 1 when runInBand + ✅ Returns 1 when the OS CPUs are not available + ✅ Returns the `maxWorkers` when specified + ✅ Returns based on the number of cpus +getMaxWorkers % based + ✅ 50% = 2 workers + ✅ < 0 workers should become 1 + ✅ 0% shouldn't break +``` +### ✅ packages/jest-config/src/__tests__/normalize.test.js +``` +✅ picks a name based on the rootDir +✅ keeps custom project name based on the projects rootDir +✅ keeps custom names based on the rootDir +✅ minimal config is stable across runs +✅ sets coverageReporters correctly when argv.json is set +rootDir + ✅ throws if the options is missing a rootDir property +automock + ✅ falsy automock is not overwritten +collectCoverageOnlyFrom + ✅ normalizes all paths relative to rootDir + ✅ does not change absolute paths + ✅ substitutes tokens +collectCoverageFrom + ✅ substitutes tokens +findRelatedTests + ✅ it generates --coverageCoverageFrom patterns when needed +roots + ✅ normalizes all paths relative to rootDir + ✅ does not change absolute paths + ✅ substitutes tokens +transform + ✅ normalizes the path + ✅ pulls in config if it's passed as an array, and defaults to empty object +haste + ✅ normalizes the path for hasteImplModulePath +setupFilesAfterEnv + ✅ normalizes the path according to rootDir + ✅ does not change absolute paths + ✅ substitutes tokens +setupTestFrameworkScriptFile + ✅ logs a deprecation warning when `setupTestFrameworkScriptFile` is used + ✅ logs an error when `setupTestFrameworkScriptFile` and `setupFilesAfterEnv` are used +coveragePathIgnorePatterns + ✅ does not normalize paths relative to rootDir + ✅ does not normalize trailing slashes + ✅ substitutes tokens +watchPathIgnorePatterns + ✅ does not normalize paths relative to rootDir + ✅ does not normalize trailing slashes + ✅ substitutes tokens +testPathIgnorePatterns + ✅ does not normalize paths relative to rootDir + ✅ does not normalize trailing slashes + ✅ substitutes tokens +modulePathIgnorePatterns + ✅ does not normalize paths relative to rootDir + ✅ does not normalize trailing slashes + ✅ substitutes tokens +testRunner + ✅ defaults to Circus + ✅ resolves jasmine + ✅ is overwritten by argv +coverageDirectory + ✅ defaults to /coverage +testEnvironment + ✅ resolves to an environment and prefers jest-environment-`name` + ✅ throws on invalid environment names + ✅ works with rootDir +babel-jest + ✅ correctly identifies and uses babel-jest + ✅ uses babel-jest if babel-jest is explicitly specified in a custom transform options +Upgrade help + ✅ logs a warning when `scriptPreprocessor` and/or `preprocessorIgnorePatterns` are used +testRegex + ✅ testRegex empty string is mapped to empty array + ✅ testRegex string is mapped to an array + ✅ testRegex array is preserved +testMatch + ✅ testMatch default not applied if testRegex is set + ✅ testRegex default not applied if testMatch is set + ✅ throws if testRegex and testMatch are both specified + ✅ normalizes testMatch +moduleDirectories + ✅ defaults to node_modules + ✅ normalizes moduleDirectories +preset + ✅ throws when preset not found + ✅ throws when module was found but no "jest-preset.js" or "jest-preset.json" files + ✅ throws when a dependency is missing in the preset + ✅ throws when preset is invalid + ✅ throws when preset evaluation throws type error + ✅ works with "react-native" + ✅ searches for .json and .js preset files + ✅ merges with options + ✅ merges with options and moduleNameMapper preset is overridden by options + ✅ merges with options and transform preset is overridden by options + ✅ extracts setupFilesAfterEnv from preset +preset with globals + ✅ should merge the globals preset correctly +preset without setupFiles + ✅ should normalize setupFiles correctly +preset without setupFilesAfterEnv + ✅ should normalize setupFilesAfterEnv correctly +runner + ✅ defaults to `jest-runner` + ✅ resolves to runners that do not have the prefix + ✅ resolves to runners and prefers jest-runner-`name` + ✅ throw error when a runner is not found +watchPlugins + ✅ defaults to undefined + ✅ resolves to watch plugins and prefers jest-watch-`name` + ✅ resolves watch plugins that do not have the prefix + ✅ normalizes multiple watchPlugins + ✅ throw error when a watch plugin is not found +testPathPattern + ✅ defaults to empty + ✅ joins multiple --testPathPatterns and + ✅ gives precedence to --all +testPathPattern --testPathPattern + ✅ uses --testPathPattern if set + ✅ ignores invalid regular expressions and logs a warning + ✅ joins multiple --testPathPattern if set +testPathPattern --testPathPattern posix + ✅ should not escape the pattern +testPathPattern --testPathPattern win32 + ✅ preserves any use of "\" + ✅ replaces POSIX path separators + ✅ replaces POSIX paths in multiple args + ✅ coerces all patterns to strings +testPathPattern + ✅ uses if set + ✅ ignores invalid regular expressions and logs a warning + ✅ joins multiple if set +testPathPattern posix + ✅ should not escape the pattern +testPathPattern win32 + ✅ preserves any use of "\" + ✅ replaces POSIX path separators + ✅ replaces POSIX paths in multiple args + ✅ coerces all patterns to strings +moduleFileExtensions + ✅ defaults to something useful + ✅ throws if missing `js` but using jest-runner + ✅ does not throw if missing `js` with a custom runner +cwd + ✅ is set to process.cwd + ✅ is not lost if the config has its own cwd property +Defaults + ✅ should be accepted by normalize +displayName + ✅ should throw an error when displayName is is an empty object + ✅ should throw an error when displayName is missing color + ✅ should throw an error when displayName is missing name + ✅ should throw an error when displayName is using invalid values + ✅ generates a default color for the runner undefined + ✅ generates a default color for the runner jest-runner + ✅ generates a default color for the runner jest-runner-eslint + ✅ generates a default color for the runner jest-runner-tslint + ✅ generates a default color for the runner jest-runner-tsc +testTimeout + ✅ should return timeout value if defined + ✅ should throw an error if timeout is a negative number +extensionsToTreatAsEsm + ✅ should pass valid config through + ✅ should enforce leading dots + ✅ throws on .js + ✅ throws on .mjs + ✅ throws on .cjs +``` +### ✅ packages/jest-config/src/__tests__/readConfig.test.ts +``` +✅ readConfig() throws when an object is passed without a file path +``` +### ✅ packages/jest-config/src/__tests__/readConfigs.test.ts +``` +✅ readConfigs() throws when called without project paths +✅ readConfigs() loads async config file +✅ readConfigs() reject if async was rejected +``` +### ✅ packages/jest-config/src/__tests__/resolveConfigPath.test.ts +``` +Resolve config path .js + ✅ file path with ".js" + ✅ directory path with ".js" +Resolve config path .ts + ✅ file path with ".ts" + ✅ directory path with ".ts" +Resolve config path .mjs + ✅ file path with ".mjs" + ✅ directory path with ".mjs" +Resolve config path .cjs + ✅ file path with ".cjs" + ✅ directory path with ".cjs" +Resolve config path .json + ✅ file path with ".json" + ✅ directory path with ".json" +``` +### ✅ packages/jest-config/src/__tests__/setFromArgv.test.ts +``` +✅ maps special values to valid options +✅ maps regular values to themselves +✅ works with string objects +✅ explicit flags override those from --config +``` +### ✅ packages/jest-config/src/__tests__/validatePattern.test.ts +``` +validate pattern function + ✅ without passed args returns true + ✅ returns true for empty pattern + ✅ returns true for valid pattern + ✅ returns false for invalid pattern +``` +### ✅ packages/jest-console/src/__tests__/bufferedConsole.test.ts +``` +CustomConsole assert + ✅ do not log when the assertion is truthy + ✅ do not log when the assertion is truthy and there is a message + ✅ log the assertion error when the assertion is falsy + ✅ log the assertion error when the assertion is falsy with another message argument +CustomConsole count + ✅ count using the default counter + ✅ count using the a labeled counter + ✅ countReset restarts default counter + ✅ countReset restarts custom counter +CustomConsole group + ✅ group without label + ✅ group with label + ✅ groupEnd remove the indentation of the current group + ✅ groupEnd can not remove the indentation below the starting point +CustomConsole time + ✅ should return the time between time() and timeEnd() on default timer + ✅ should return the time between time() and timeEnd() on custom timer +CustomConsole dir + ✅ should print the deepest value +CustomConsole timeLog + ✅ should return the time between time() and timeEnd() on default timer + ✅ should return the time between time() and timeEnd() on custom timer + ✅ default timer with data + ✅ custom timer with data +CustomConsole console + ✅ should be able to initialize console instance +``` +### ✅ packages/jest-console/src/__tests__/CustomConsole.test.ts +``` +CustomConsole log + ✅ should print to stdout +CustomConsole error + ✅ should print to stderr +CustomConsole warn + ✅ should print to stderr +CustomConsole assert + ✅ do not log when the assertion is truthy + ✅ do not log when the assertion is truthy and there is a message + ✅ log the assertion error when the assertion is falsy + ✅ log the assertion error when the assertion is falsy with another message argument +CustomConsole count + ✅ count using the default counter + ✅ count using the a labeled counter + ✅ countReset restarts default counter + ✅ countReset restarts custom counter +CustomConsole group + ✅ group without label + ✅ group with label + ✅ groupEnd remove the indentation of the current group + ✅ groupEnd can not remove the indentation below the starting point +CustomConsole time + ✅ should return the time between time() and timeEnd() on default timer + ✅ should return the time between time() and timeEnd() on custom timer +CustomConsole dir + ✅ should print the deepest value +CustomConsole timeLog + ✅ should return the time between time() and timeEnd() on default timer + ✅ should return the time between time() and timeEnd() on custom timer + ✅ default timer with data + ✅ custom timer with data +CustomConsole console + ✅ should be able to initialize console instance +``` +### ✅ packages/jest-console/src/__tests__/getConsoleOutput.test.ts +``` +getConsoleOutput + ✅ takes noStackTrace and pass it on for assert + ✅ takes noStackTrace and pass it on for count + ✅ takes noStackTrace and pass it on for debug + ✅ takes noStackTrace and pass it on for dir + ✅ takes noStackTrace and pass it on for dirxml + ✅ takes noStackTrace and pass it on for error + ✅ takes noStackTrace and pass it on for group + ✅ takes noStackTrace and pass it on for groupCollapsed + ✅ takes noStackTrace and pass it on for info + ✅ takes noStackTrace and pass it on for log + ✅ takes noStackTrace and pass it on for time + ✅ takes noStackTrace and pass it on for warn +``` +### ✅ packages/jest-core/src/__tests__/FailedTestsCache.test.js +``` +FailedTestsCache + ✅ should filter tests +``` +### ✅ packages/jest-core/src/__tests__/getNoTestsFoundMessage.test.js +``` +getNoTestsFoundMessage + ✅ returns correct message when monitoring only failures + ✅ returns correct message when monitoring only changed + ✅ returns correct message with verbose option + ✅ returns correct message without options + ✅ returns correct message with passWithNoTests +``` +### ✅ packages/jest-core/src/__tests__/globals.test.ts +``` +Common globals + ✅ check process +``` +### ✅ packages/jest-core/src/__tests__/runJest.test.js +``` +runJest + ✅ when watch is set then exit process + ✅ when watch is set then an error message is printed +``` +### ✅ packages/jest-core/src/__tests__/SearchSource.test.ts +``` +SearchSource isTestFilePath + ✅ supports ../ paths and unix separators via testRegex + ✅ supports unix separators + ✅ supports win32 separators +SearchSource testPathsMatching + ✅ finds tests matching a pattern via testRegex + ✅ finds tests matching a pattern via testMatch + ✅ finds tests matching a JS regex pattern + ✅ finds tests matching a JS glob pattern + ✅ finds tests matching a JS with overriding glob patterns + ✅ finds tests with default file extensions using testRegex + ✅ finds tests with default file extensions using testMatch + ✅ finds tests with parentheses in their rootDir when using testMatch + ✅ finds tests with similar but custom file extensions + ✅ finds tests with totally custom foobar file extensions + ✅ finds tests with many kinds of file extensions + ✅ finds tests using a regex only + ✅ finds tests using a glob only +SearchSource findRelatedTests + ✅ makes sure a file is related to itself + ✅ finds tests that depend directly on the path + ✅ excludes untested files from coverage +SearchSource findRelatedTestsFromPattern + ✅ returns empty search result for empty input + ✅ returns empty search result for invalid input + ✅ returns empty search result if no related tests were found + ✅ finds tests for a single file + ✅ finds tests for multiple files + ✅ does not mistake roots folders with prefix names +SearchSource findRelatedSourcesFromTestsInChangedFiles + ✅ return empty set if no SCM + ✅ return sources required by tests +``` +### ✅ packages/jest-core/src/__tests__/SnapshotInteractiveMode.test.js +``` +SnapshotInteractiveMode + ✅ is inactive at construction + ✅ call to run process the first file + ✅ call to abort + ✅ call to reset + ✅ press Q or ESC triggers an abort + ✅ press ENTER trigger a run + ✅ skip 1 test, then restart + ✅ skip 1 test, then quit + ✅ update 1 test, then finish and return + ✅ skip 2 tests, then finish and restart + ✅ update 2 tests, then finish and return + ✅ update 1 test, skip 1 test, then finish and restart + ✅ skip 1 test, update 1 test, then finish and restart +``` +### ✅ packages/jest-core/src/__tests__/TestScheduler.test.js +``` +✅ config for reporters supports `default` +✅ .addReporter() .removeReporter() +✅ schedule tests run in parallel per default +✅ schedule tests run in serial if the runner flags them +✅ should bail after `n` failures +✅ should not bail if less than `n` failures +✅ should set runInBand to run in serial +✅ should set runInBand to not run in serial +``` +### ✅ packages/jest-core/src/__tests__/testSchedulerHelper.test.js +``` +✅ shouldRunInBand() - should return true for runInBand mode +✅ shouldRunInBand() - should return true for runInBand mode +✅ shouldRunInBand() - should return false for runInBand mode +✅ shouldRunInBand() - should return false for runInBand mode +✅ shouldRunInBand() - should return false for runInBand mode +✅ shouldRunInBand() - should return true for runInBand mode +✅ shouldRunInBand() - should return false for runInBand mode +✅ shouldRunInBand() - should return true for runInBand mode +✅ shouldRunInBand() - should return true for runInBand mode +✅ shouldRunInBand() - should return false for runInBand mode +✅ shouldRunInBand() - should return false for runInBand mode +✅ shouldRunInBand() - should return true for runInBand mode +``` +### ✅ packages/jest-core/src/__tests__/watch.test.js +``` +Watch mode flows + ✅ Correctly passing test path pattern + ✅ Correctly passing test name pattern + ✅ Runs Jest once by default and shows usage + ✅ Runs Jest in a non-interactive environment not showing usage + ✅ resolves relative to the package root + ✅ shows prompts for WatchPlugins in alphabetical order + ✅ shows update snapshot prompt (without interactive) + ✅ shows update snapshot prompt (with interactive) + ✅ allows WatchPlugins to hook into JestHook + ✅ allows WatchPlugins to override eligible internal plugins + ✅ allows WatchPlugins to be configured + ✅ allows WatchPlugins to hook into file system changes + ✅ makes watch plugin initialization errors look nice + ✅ allows WatchPlugins to modify only white-listed global config keys + ✅ allows WatchPlugins to modify only white-listed global config keys + ✅ allows WatchPlugins to modify only white-listed global config keys + ✅ allows WatchPlugins to modify only white-listed global config keys + ✅ allows WatchPlugins to modify only white-listed global config keys + ✅ allows WatchPlugins to modify only white-listed global config keys + ✅ allows WatchPlugins to modify only white-listed global config keys + ✅ allows WatchPlugins to modify only white-listed global config keys + ✅ allows WatchPlugins to modify only white-listed global config keys + ✅ allows WatchPlugins to modify only white-listed global config keys + ✅ allows WatchPlugins to modify only white-listed global config keys + ✅ allows WatchPlugins to modify only white-listed global config keys + ✅ allows WatchPlugins to modify only white-listed global config keys + ✅ allows WatchPlugins to modify only white-listed global config keys + ✅ allows WatchPlugins to modify only white-listed global config keys + ✅ allows WatchPlugins to modify only white-listed global config keys + ✅ allows WatchPlugins to modify only white-listed global config keys + ✅ allows WatchPlugins to modify only white-listed global config keys + ✅ allows WatchPlugins to modify only white-listed global config keys + ✅ allows WatchPlugins to modify only white-listed global config keys + ✅ allows WatchPlugins to modify only white-listed global config keys + ✅ allows WatchPlugins to modify only white-listed global config keys + ✅ allows WatchPlugins to modify only white-listed global config keys + ✅ allows WatchPlugins to modify only white-listed global config keys + ✅ allows WatchPlugins to modify only white-listed global config keys + ✅ allows WatchPlugins to modify only white-listed global config keys + ✅ allows WatchPlugins to modify only white-listed global config keys + ✅ allows WatchPlugins to modify only white-listed global config keys + ✅ allows WatchPlugins to modify only white-listed global config keys + ✅ allows WatchPlugins to modify only white-listed global config keys + ✅ allows WatchPlugins to modify only white-listed global config keys + ✅ allows WatchPlugins to modify only white-listed global config keys + ✅ allows WatchPlugins to modify only white-listed global config keys + ✅ allows WatchPlugins to modify only white-listed global config keys + ✅ allows WatchPlugins to modify only white-listed global config keys + ✅ allows WatchPlugins to modify only white-listed global config keys + ✅ allows WatchPlugins to modify only white-listed global config keys + ✅ allows WatchPlugins to modify only white-listed global config keys + ✅ allows WatchPlugins to modify only white-listed global config keys + ✅ allows WatchPlugins to modify only white-listed global config keys + ✅ allows WatchPlugins to modify only white-listed global config keys + ✅ allows WatchPlugins to modify only white-listed global config keys + ✅ allows WatchPlugins to modify only white-listed global config keys + ✅ allows WatchPlugins to modify only white-listed global config keys + ✅ allows WatchPlugins to modify only white-listed global config keys + ✅ allows WatchPlugins to modify only white-listed global config keys + ✅ allows WatchPlugins to modify only white-listed global config keys + ✅ allows WatchPlugins to modify only white-listed global config keys + ✅ allows WatchPlugins to modify only white-listed global config keys + ✅ allows WatchPlugins to modify only white-listed global config keys + ✅ triggers enter on a WatchPlugin when its key is pressed + ✅ prevents Jest from handling keys when active and returns control when end is called + ✅ Pressing "o" runs test in "only changed files" mode + ✅ Pressing "a" runs test in "watch all" mode + ✅ Pressing "ENTER" reruns the tests + ✅ Pressing "t" reruns the tests in "test name pattern" mode + ✅ Pressing "p" reruns the tests in "filename pattern" mode + ✅ Can combine "p" and "t" filters + ✅ Pressing "u" reruns the tests in "update snapshot" mode + ✅ passWithNoTest should be set to true in watch mode + ✅ shows the correct usage for the f key in "only failed tests" mode +Watch mode flows when dealing with potential watch plugin key conflicts + ✅ forbids WatchPlugins overriding reserved internal plugins + ✅ forbids WatchPlugins overriding reserved internal plugins + ✅ forbids WatchPlugins overriding reserved internal plugins + ✅ allows WatchPlugins to override non-reserved internal plugins + ✅ allows WatchPlugins to override non-reserved internal plugins + ✅ forbids third-party WatchPlugins overriding each other +``` +### ✅ packages/jest-core/src/__tests__/watchFileChanges.test.ts +``` +Watch mode flows with changed files + ✅ should correct require new files without legacy cache +``` +### ✅ packages/jest-core/src/__tests__/watchFilenamePatternMode.test.js +``` +Watch mode flows + ✅ Pressing "P" enters pattern mode + ✅ Pressing "c" clears the filters +``` +### ✅ packages/jest-core/src/__tests__/watchTestNamePatternMode.test.js +``` +Watch mode flows + ✅ Pressing "T" enters pattern mode +``` +### ✅ packages/jest-core/src/lib/__tests__/isValidPath.test.ts +``` +✅ is valid when it is a file inside roots +✅ is not valid when it is a snapshot file +✅ is not valid when it is a file in the coverage dir +``` +### ✅ packages/jest-core/src/lib/__tests__/logDebugMessages.test.ts +``` +✅ prints the jest version +✅ prints the test framework name +✅ prints the config object +``` +### ✅ packages/jest-create-cache-key-function/src/__tests__/index.test.ts +``` +✅ creation of a cache key +``` +### ✅ packages/jest-diff/src/__tests__/diff.test.ts +``` +different types + ✅ '1' and 'a' + ✅ '[object Object]' and 'a' + ✅ '' and '2' + ✅ 'null' and 'undefined' + ✅ '() => {}' and '3' +no visual difference + ✅ '"a"' and '"a"' + ✅ '{}' and '{}' + ✅ '[]' and '[]' + ✅ '[1,2]' and '[1,2]' + ✅ '11' and '11' + ✅ 'null' and 'null' + ✅ 'null' and 'null' + ✅ 'undefined' and 'undefined' + ✅ 'null' and 'null' + ✅ 'undefined' and 'undefined' + ✅ 'false' and 'false' + ✅ '{"a":1}' and '{"a":1}' + ✅ '{"a":{"b":5}}' and '{"a":{"b":5}}' + ✅ Map key order should be irrelevant + ✅ Set value order should be irrelevant +✅ oneline strings +✅ numbers +✅ -0 and 0 +✅ booleans +✅ collapses big diffs to patch format +falls back to not call toJSON if serialization has no differences + ✅ but then objects have differences + ✅ and then objects have no differences +falls back to not call toJSON if it throws + ✅ and then objects have differences + ✅ and then objects have no differences +multiline strings + ✅ (unexpanded) + ✅ (expanded) +objects + ✅ (unexpanded) + ✅ (expanded) +multiline string non-snapshot + ✅ (unexpanded) + ✅ (expanded) +multiline string snapshot + ✅ (unexpanded) + ✅ (expanded) +React elements + ✅ (unexpanded) + ✅ (expanded) +multiline string as value of object property (non-snapshot) + ✅ (unexpanded) + ✅ (expanded) +multiline string as value of object property (snapshot) + ✅ (unexpanded) + ✅ (expanded) +indentation in JavaScript structures from less to more + ✅ (unexpanded) + ✅ (expanded) +indentation in JavaScript structures from more to less + ✅ (unexpanded) + ✅ (expanded) +color of text + ✅ (expanded) + ✅ (unexpanded) +indentation in React elements (non-snapshot) from less to more + ✅ (unexpanded) + ✅ (expanded) +indentation in React elements (non-snapshot) from more to less + ✅ (unexpanded) + ✅ (expanded) +indentation in React elements (snapshot) from less to more + ✅ (unexpanded) + ✅ (expanded) +indentation in React elements (snapshot) from more to less + ✅ (unexpanded) + ✅ (expanded) +outer React element (non-snapshot) from less to more + ✅ (unexpanded) + ✅ (expanded) +outer React element (non-snapshot) from more to less + ✅ (unexpanded) + ✅ (expanded) +trailing newline in multiline string not enclosed in quotes from less to more + ✅ (unexpanded) + ✅ (expanded) +trailing newline in multiline string not enclosed in quotes from more to less + ✅ (unexpanded) + ✅ (expanded) +context + ✅ number of lines: -1 (5 default) + ✅ number of lines: 0 + ✅ number of lines: 1 + ✅ number of lines: 2 + ✅ number of lines: 3.1 (5 default) + ✅ number of lines: undefined (5 default) +diffLinesUnified edge cases + ✅ a empty string b empty string + ✅ a empty string b one line + ✅ a multiple lines b empty string + ✅ a one line b multiple lines +diffLinesUnified2 edge cases + ✅ a empty string b empty string + ✅ a empty string b one line + ✅ a multiple lines b empty string + ✅ a one line b multiple lines +diffLinesUnified2 edge cases lengths not equal + ✅ a + ✅ b +diffStringsUnified edge cases + ✅ empty both a and b + ✅ empty only a + ✅ empty only b + ✅ equal both non-empty + ✅ multiline has no common after clean up chaff + ✅ one-line has no common after clean up chaff +options 7980 + ✅ diff + ✅ diffStringsUnified +options change indicators + ✅ diff +options change color + ✅ diffStringsUnified + ✅ no diff +options common + ✅ diff + ✅ no diff +options includeChangeCounts false + ✅ diffLinesUnified + ✅ diffStringsUnified +options includeChangeCounts true padding + ✅ diffLinesUnified a has 2 digits + ✅ diffLinesUnified b has 2 digits + ✅ diffStringsUnified +options omitAnnotationLines true + ✅ diff + ✅ diffStringsUnified and includeChangeCounts true + ✅ diffStringsUnified empty strings +options trailingSpaceFormatter + ✅ diffDefault default no color + ✅ diffDefault middle dot + ✅ diffDefault yellowish common +options emptyFirstOrLastLinePlaceholder default empty string + ✅ diffDefault + ✅ diffStringsUnified +``` +### ✅ packages/jest-diff/src/__tests__/diffStringsRaw.test.ts +``` +diffStringsRaw + ✅ one-line with cleanup + ✅ one-line without cleanup +``` +### ✅ packages/jest-diff/src/__tests__/getAlignedDiffs.test.ts +``` +getAlignedDiffs lines + ✅ change preceding and following common + ✅ common preceding and following change + ✅ common at end when both current change lines are empty + ✅ common between delete and insert + ✅ common between insert and delete +getAlignedDiffs newline + ✅ delete only + ✅ insert only + ✅ delete with adjacent change + ✅ insert with adjacent changes + ✅ change from space + ✅ change to space +getAlignedDiffs substrings first + ✅ common when both current change lines are empty + ✅ common when either current change line is non-empty + ✅ delete completes the current line + ✅ insert completes the current line +getAlignedDiffs substrings middle + ✅ is empty in delete between common + ✅ is empty in insert at start + ✅ is non-empty in delete at end + ✅ is non-empty in insert between common +getAlignedDiffs substrings last + ✅ is empty in delete at end + ✅ is empty in insert at end + ✅ is non-empty in common not at end +getAlignedDiffs strings + ✅ change at start and delete or insert at end + ✅ delete or insert at start and change at end +``` +### ✅ packages/jest-diff/src/__tests__/joinAlignedDiffs.test.ts +``` +joinAlignedDiffsExpand + ✅ first line is empty common +joinAlignedDiffsNoExpand + ✅ patch 0 with context 1 and change at start and end + ✅ patch 0 with context 5 and first line is empty common + ✅ patch 1 with context 4 and last line is empty common + ✅ patch 2 with context 3 + ✅ patch 3 with context 2 and omit excess common at start +``` +### ✅ packages/jest-docblock/src/__tests__/index.test.ts +``` +docblock + ✅ extracts valid docblock with line comment + ✅ extracts valid docblock + ✅ extracts valid docblock with more comments + ✅ extracts from invalid docblock + ✅ returns extract and parsedocblock + ✅ parses directives out of a docblock + ✅ parses multiple of the same directives out of a docblock + ✅ parses >=3 of the same directives out of a docblock + ✅ parses directives out of a docblock with comments + ✅ parses directives out of a docblock with line comments + ✅ parses multiline directives + ✅ parses multiline directives even if there are linecomments within the docblock + ✅ supports slashes in @team directive + ✅ extracts comments from docblock + ✅ extracts multiline comments from docblock + ✅ preserves leading whitespace in multiline comments from docblock + ✅ removes leading newlines in multiline comments from docblock + ✅ extracts comments from beginning and end of docblock + ✅ preserve urls within a pragma's values + ✅ strip linecomments from pragmas but preserve for comments + ✅ extracts docblock comments as CRLF when docblock contains CRLF + ✅ extracts docblock comments as LF when docblock contains LF + ✅ strips the docblock out of a file that contains a top docblock + ✅ returns a file unchanged if there is no top docblock to strip + ✅ prints docblocks with no pragmas as empty string + ✅ prints docblocks with one pragma on one line + ✅ prints docblocks with multiple pragmas on multiple lines + ✅ prints docblocks with multiple of the same pragma + ✅ prints docblocks with pragmas + ✅ prints docblocks with comments + ✅ prints docblocks with comments and no keys + ✅ prints docblocks with multiline comments + ✅ prints docblocks that are parseable + ✅ can augment existing docblocks with comments + ✅ prints docblocks using CRLF if comments contains CRLF + ✅ prints docblocks using LF if comments contains LF +``` +### ✅ packages/jest-each/src/__tests__/array.test.ts +``` +jest-each .test + ✅ throws an error when not called with an array + ✅ throws an error when called with an empty array + ✅ calls global with given title + ✅ calls global with given title when multiple tests cases exist + ✅ calls global with title containing param values when using printf format + ✅ does not call global test with title containing more param values than sprintf placeholders + ✅ calls global test title with %p placeholder injected at the correct positions + ✅ does not calls global test title with %p placeholder when no data is supplied at given position + ✅ calls global with cb function containing all parameters of each test case when given 1d array + ✅ calls global with cb function containing all parameters of each test case 2d array + ✅ calls global with given timeout +jest-each .test.concurrent + ✅ throws an error when not called with an array + ✅ throws an error when called with an empty array + ✅ calls global with given title + ✅ calls global with given title when multiple tests cases exist + ✅ calls global with title containing param values when using printf format + ✅ does not call global test with title containing more param values than sprintf placeholders + ✅ calls global test title with %p placeholder injected at the correct positions + ✅ does not calls global test title with %p placeholder when no data is supplied at given position + ✅ calls global with cb function containing all parameters of each test case when given 1d array + ✅ calls global with cb function containing all parameters of each test case 2d array + ✅ calls global with given timeout +jest-each .test.concurrent.only + ✅ throws an error when not called with an array + ✅ throws an error when called with an empty array + ✅ calls global with given title + ✅ calls global with given title when multiple tests cases exist + ✅ calls global with title containing param values when using printf format + ✅ does not call global test with title containing more param values than sprintf placeholders + ✅ calls global test title with %p placeholder injected at the correct positions + ✅ does not calls global test title with %p placeholder when no data is supplied at given position + ✅ calls global with cb function containing all parameters of each test case when given 1d array + ✅ calls global with cb function containing all parameters of each test case 2d array + ✅ calls global with given timeout +jest-each .test.concurrent.skip + ✅ throws an error when not called with an array + ✅ throws an error when called with an empty array + ✅ calls global with given title + ✅ calls global with given title when multiple tests cases exist + ✅ calls global with title containing param values when using printf format + ✅ does not call global test with title containing more param values than sprintf placeholders + ✅ calls global test title with %p placeholder injected at the correct positions + ✅ does not calls global test title with %p placeholder when no data is supplied at given position + ✅ calls global with cb function containing all parameters of each test case when given 1d array + ✅ calls global with cb function containing all parameters of each test case 2d array + ✅ calls global with given timeout + ✅ calls global with given title + ✅ calls global with given title when multiple tests cases exist + ✅ calls global with title containing param values when using sprintf format + ✅ calls global with title with placeholder values correctly interpolated +jest-each .test.only + ✅ throws an error when not called with an array + ✅ throws an error when called with an empty array + ✅ calls global with given title + ✅ calls global with given title when multiple tests cases exist + ✅ calls global with title containing param values when using printf format + ✅ does not call global test with title containing more param values than sprintf placeholders + ✅ calls global test title with %p placeholder injected at the correct positions + ✅ does not calls global test title with %p placeholder when no data is supplied at given position + ✅ calls global with cb function containing all parameters of each test case when given 1d array + ✅ calls global with cb function containing all parameters of each test case 2d array + ✅ calls global with given timeout +jest-each .it + ✅ throws an error when not called with an array + ✅ throws an error when called with an empty array + ✅ calls global with given title + ✅ calls global with given title when multiple tests cases exist + ✅ calls global with title containing param values when using printf format + ✅ does not call global test with title containing more param values than sprintf placeholders + ✅ calls global test title with %p placeholder injected at the correct positions + ✅ does not calls global test title with %p placeholder when no data is supplied at given position + ✅ calls global with cb function containing all parameters of each test case when given 1d array + ✅ calls global with cb function containing all parameters of each test case 2d array + ✅ calls global with given timeout +jest-each .fit + ✅ throws an error when not called with an array + ✅ throws an error when called with an empty array + ✅ calls global with given title + ✅ calls global with given title when multiple tests cases exist + ✅ calls global with title containing param values when using printf format + ✅ does not call global test with title containing more param values than sprintf placeholders + ✅ calls global test title with %p placeholder injected at the correct positions + ✅ does not calls global test title with %p placeholder when no data is supplied at given position + ✅ calls global with cb function containing all parameters of each test case when given 1d array + ✅ calls global with cb function containing all parameters of each test case 2d array + ✅ calls global with given timeout +jest-each .it.only + ✅ throws an error when not called with an array + ✅ throws an error when called with an empty array + ✅ calls global with given title + ✅ calls global with given title when multiple tests cases exist + ✅ calls global with title containing param values when using printf format + ✅ does not call global test with title containing more param values than sprintf placeholders + ✅ calls global test title with %p placeholder injected at the correct positions + ✅ does not calls global test title with %p placeholder when no data is supplied at given position + ✅ calls global with cb function containing all parameters of each test case when given 1d array + ✅ calls global with cb function containing all parameters of each test case 2d array + ✅ calls global with given timeout +jest-each .describe + ✅ throws an error when not called with an array + ✅ throws an error when called with an empty array + ✅ calls global with given title + ✅ calls global with given title when multiple tests cases exist + ✅ calls global with title containing param values when using printf format + ✅ does not call global test with title containing more param values than sprintf placeholders + ✅ calls global test title with %p placeholder injected at the correct positions + ✅ does not calls global test title with %p placeholder when no data is supplied at given position + ✅ calls global with cb function containing all parameters of each test case when given 1d array + ✅ calls global with cb function containing all parameters of each test case 2d array + ✅ calls global with given timeout +jest-each .fdescribe + ✅ throws an error when not called with an array + ✅ throws an error when called with an empty array + ✅ calls global with given title + ✅ calls global with given title when multiple tests cases exist + ✅ calls global with title containing param values when using printf format + ✅ does not call global test with title containing more param values than sprintf placeholders + ✅ calls global test title with %p placeholder injected at the correct positions + ✅ does not calls global test title with %p placeholder when no data is supplied at given position + ✅ calls global with cb function containing all parameters of each test case when given 1d array + ✅ calls global with cb function containing all parameters of each test case 2d array + ✅ calls global with given timeout +jest-each .describe.only + ✅ throws an error when not called with an array + ✅ throws an error when called with an empty array + ✅ calls global with given title + ✅ calls global with given title when multiple tests cases exist + ✅ calls global with title containing param values when using printf format + ✅ does not call global test with title containing more param values than sprintf placeholders + ✅ calls global test title with %p placeholder injected at the correct positions + ✅ does not calls global test title with %p placeholder when no data is supplied at given position + ✅ calls global with cb function containing all parameters of each test case when given 1d array + ✅ calls global with cb function containing all parameters of each test case 2d array + ✅ calls global with given timeout +jest-each done callback + ✅ calls [ 'test' ] with done when cb function has more args than params of given test row + ✅ calls [ 'test', 'only' ] with done when cb function has more args than params of given test row + ✅ calls [ 'test', 'concurrent' ] with done when cb function has more args than params of given test row + ✅ calls [ 'test', 'concurrent', 'only' ] with done when cb function has more args than params of given test row + ✅ calls [ 'it' ] with done when cb function has more args than params of given test row + ✅ calls [ 'fit' ] with done when cb function has more args than params of given test row + ✅ calls [ 'it', 'only' ] with done when cb function has more args than params of given test row + ✅ does not call [ 'describe' ] with done when test function has more args than params of given test row + ✅ does not call [ 'fdescribe' ] with done when test function has more args than params of given test row + ✅ does not call [ 'describe', 'only' ] with done when test function has more args than params of given test row +jest-each .xtest + ✅ calls global with given title + ✅ calls global with given title when multiple tests cases exist + ✅ calls global with title containing param values when using sprintf format + ✅ calls global with title with placeholder values correctly interpolated +jest-each .test.skip + ✅ calls global with given title + ✅ calls global with given title when multiple tests cases exist + ✅ calls global with title containing param values when using sprintf format + ✅ calls global with title with placeholder values correctly interpolated +jest-each .xit + ✅ calls global with given title + ✅ calls global with given title when multiple tests cases exist + ✅ calls global with title containing param values when using sprintf format + ✅ calls global with title with placeholder values correctly interpolated +jest-each .it.skip + ✅ calls global with given title + ✅ calls global with given title when multiple tests cases exist + ✅ calls global with title containing param values when using sprintf format + ✅ calls global with title with placeholder values correctly interpolated +jest-each .xdescribe + ✅ calls global with given title + ✅ calls global with given title when multiple tests cases exist + ✅ calls global with title containing param values when using sprintf format + ✅ calls global with title with placeholder values correctly interpolated +jest-each .describe.skip + ✅ calls global with given title + ✅ calls global with given title when multiple tests cases exist + ✅ calls global with title containing param values when using sprintf format + ✅ calls global with title with placeholder values correctly interpolated +``` +### ✅ packages/jest-each/src/__tests__/index.test.ts +``` +array .add + ✅ returns the result of adding 0 to 0 + ✅ returns the result of adding 0 to 1 + ✅ returns the result of adding 1 to 1 +concurrent .add + ✅ returns the result of adding 0 to 0 + ✅ returns the result of adding 0 to 1 + ✅ returns the result of adding 1 to 1 +template .add + ✅ returns 0 when given 0 and 0 + ✅ returns 1 when given 0 and 1 + ✅ returns 2 when given 1 and 1 +✅ throws an error when not called with the right number of arguments +``` +### ✅ packages/jest-each/src/__tests__/template.test.ts +``` +jest-each .test + ✅ throws error when there are additional words in first column heading + ✅ throws error when there are additional words in second column heading + ✅ throws error when there are additional words in last column heading + ✅ does not throw error when there is additional words in template after heading row + ✅ does not throw error when there is only one column + ✅ does not throw error when there is only one column with additional words in template after heading + ✅ throws error when there are no arguments for given headings + ✅ throws error when there are fewer arguments than headings when given one row + ✅ throws error when there are fewer arguments than headings over multiple rows + ✅ throws an error when called with an empty string + ✅ calls global with given title + ✅ calls global with given title when multiple tests cases exist + ✅ calls global with title containing param values when using $variable format + ✅ calls global with title containing $key in multiple positions + ✅ calls global with title containing $key.path + ✅ calls global with title containing last seen object when $key.path is invalid + ✅ calls global with cb function with object built from table headings and values + ✅ calls global with given timeout + ✅ formats primitive values using .toString() +jest-each .test.concurrent + ✅ throws error when there are additional words in first column heading + ✅ throws error when there are additional words in second column heading + ✅ throws error when there are additional words in last column heading + ✅ does not throw error when there is additional words in template after heading row + ✅ does not throw error when there is only one column + ✅ does not throw error when there is only one column with additional words in template after heading + ✅ throws error when there are no arguments for given headings + ✅ throws error when there are fewer arguments than headings when given one row + ✅ throws error when there are fewer arguments than headings over multiple rows + ✅ throws an error when called with an empty string + ✅ calls global with given title + ✅ calls global with given title when multiple tests cases exist + ✅ calls global with title containing param values when using $variable format + ✅ calls global with title containing $key in multiple positions + ✅ calls global with title containing $key.path + ✅ calls global with title containing last seen object when $key.path is invalid + ✅ calls global with cb function with object built from table headings and values + ✅ calls global with given timeout + ✅ formats primitive values using .toString() + ✅ calls global with given title + ✅ calls global with given title when multiple tests cases exist + ✅ calls global with title containing param values when using $variable format +jest-each .test.concurrent.only + ✅ throws error when there are additional words in first column heading + ✅ throws error when there are additional words in second column heading + ✅ throws error when there are additional words in last column heading + ✅ does not throw error when there is additional words in template after heading row + ✅ does not throw error when there is only one column + ✅ does not throw error when there is only one column with additional words in template after heading + ✅ throws error when there are no arguments for given headings + ✅ throws error when there are fewer arguments than headings when given one row + ✅ throws error when there are fewer arguments than headings over multiple rows + ✅ throws an error when called with an empty string + ✅ calls global with given title + ✅ calls global with given title when multiple tests cases exist + ✅ calls global with title containing param values when using $variable format + ✅ calls global with title containing $key in multiple positions + ✅ calls global with title containing $key.path + ✅ calls global with title containing last seen object when $key.path is invalid + ✅ calls global with cb function with object built from table headings and values + ✅ calls global with given timeout + ✅ formats primitive values using .toString() +jest-each .test.concurrent.skip + ✅ throws error when there are additional words in first column heading + ✅ throws error when there are additional words in second column heading + ✅ throws error when there are additional words in last column heading + ✅ does not throw error when there is additional words in template after heading row + ✅ does not throw error when there is only one column + ✅ does not throw error when there is only one column with additional words in template after heading + ✅ throws error when there are no arguments for given headings + ✅ throws error when there are fewer arguments than headings when given one row + ✅ throws error when there are fewer arguments than headings over multiple rows + ✅ throws an error when called with an empty string + ✅ calls global with given title + ✅ calls global with given title when multiple tests cases exist + ✅ calls global with title containing param values when using $variable format + ✅ calls global with title containing $key in multiple positions + ✅ calls global with title containing $key.path + ✅ calls global with title containing last seen object when $key.path is invalid + ✅ calls global with cb function with object built from table headings and values + ✅ calls global with given timeout + ✅ formats primitive values using .toString() + ✅ calls global with given title + ✅ calls global with given title when multiple tests cases exist + ✅ calls global with title containing param values when using $variable format +jest-each .test.only + ✅ throws error when there are additional words in first column heading + ✅ throws error when there are additional words in second column heading + ✅ throws error when there are additional words in last column heading + ✅ does not throw error when there is additional words in template after heading row + ✅ does not throw error when there is only one column + ✅ does not throw error when there is only one column with additional words in template after heading + ✅ throws error when there are no arguments for given headings + ✅ throws error when there are fewer arguments than headings when given one row + ✅ throws error when there are fewer arguments than headings over multiple rows + ✅ throws an error when called with an empty string + ✅ calls global with given title + ✅ calls global with given title when multiple tests cases exist + ✅ calls global with title containing param values when using $variable format + ✅ calls global with title containing $key in multiple positions + ✅ calls global with title containing $key.path + ✅ calls global with title containing last seen object when $key.path is invalid + ✅ calls global with cb function with object built from table headings and values + ✅ calls global with given timeout + ✅ formats primitive values using .toString() +jest-each .it + ✅ throws error when there are additional words in first column heading + ✅ throws error when there are additional words in second column heading + ✅ throws error when there are additional words in last column heading + ✅ does not throw error when there is additional words in template after heading row + ✅ does not throw error when there is only one column + ✅ does not throw error when there is only one column with additional words in template after heading + ✅ throws error when there are no arguments for given headings + ✅ throws error when there are fewer arguments than headings when given one row + ✅ throws error when there are fewer arguments than headings over multiple rows + ✅ throws an error when called with an empty string + ✅ calls global with given title + ✅ calls global with given title when multiple tests cases exist + ✅ calls global with title containing param values when using $variable format + ✅ calls global with title containing $key in multiple positions + ✅ calls global with title containing $key.path + ✅ calls global with title containing last seen object when $key.path is invalid + ✅ calls global with cb function with object built from table headings and values + ✅ calls global with given timeout + ✅ formats primitive values using .toString() +jest-each .fit + ✅ throws error when there are additional words in first column heading + ✅ throws error when there are additional words in second column heading + ✅ throws error when there are additional words in last column heading + ✅ does not throw error when there is additional words in template after heading row + ✅ does not throw error when there is only one column + ✅ does not throw error when there is only one column with additional words in template after heading + ✅ throws error when there are no arguments for given headings + ✅ throws error when there are fewer arguments than headings when given one row + ✅ throws error when there are fewer arguments than headings over multiple rows + ✅ throws an error when called with an empty string + ✅ calls global with given title + ✅ calls global with given title when multiple tests cases exist + ✅ calls global with title containing param values when using $variable format + ✅ calls global with title containing $key in multiple positions + ✅ calls global with title containing $key.path + ✅ calls global with title containing last seen object when $key.path is invalid + ✅ calls global with cb function with object built from table headings and values + ✅ calls global with given timeout + ✅ formats primitive values using .toString() +jest-each .it.only + ✅ throws error when there are additional words in first column heading + ✅ throws error when there are additional words in second column heading + ✅ throws error when there are additional words in last column heading + ✅ does not throw error when there is additional words in template after heading row + ✅ does not throw error when there is only one column + ✅ does not throw error when there is only one column with additional words in template after heading + ✅ throws error when there are no arguments for given headings + ✅ throws error when there are fewer arguments than headings when given one row + ✅ throws error when there are fewer arguments than headings over multiple rows + ✅ throws an error when called with an empty string + ✅ calls global with given title + ✅ calls global with given title when multiple tests cases exist + ✅ calls global with title containing param values when using $variable format + ✅ calls global with title containing $key in multiple positions + ✅ calls global with title containing $key.path + ✅ calls global with title containing last seen object when $key.path is invalid + ✅ calls global with cb function with object built from table headings and values + ✅ calls global with given timeout + ✅ formats primitive values using .toString() +jest-each .describe + ✅ throws error when there are additional words in first column heading + ✅ throws error when there are additional words in second column heading + ✅ throws error when there are additional words in last column heading + ✅ does not throw error when there is additional words in template after heading row + ✅ does not throw error when there is only one column + ✅ does not throw error when there is only one column with additional words in template after heading + ✅ throws error when there are no arguments for given headings + ✅ throws error when there are fewer arguments than headings when given one row + ✅ throws error when there are fewer arguments than headings over multiple rows + ✅ throws an error when called with an empty string + ✅ calls global with given title + ✅ calls global with given title when multiple tests cases exist + ✅ calls global with title containing param values when using $variable format + ✅ calls global with title containing $key in multiple positions + ✅ calls global with title containing $key.path + ✅ calls global with title containing last seen object when $key.path is invalid + ✅ calls global with cb function with object built from table headings and values + ✅ calls global with given timeout + ✅ formats primitive values using .toString() +jest-each .fdescribe + ✅ throws error when there are additional words in first column heading + ✅ throws error when there are additional words in second column heading + ✅ throws error when there are additional words in last column heading + ✅ does not throw error when there is additional words in template after heading row + ✅ does not throw error when there is only one column + ✅ does not throw error when there is only one column with additional words in template after heading + ✅ throws error when there are no arguments for given headings + ✅ throws error when there are fewer arguments than headings when given one row + ✅ throws error when there are fewer arguments than headings over multiple rows + ✅ throws an error when called with an empty string + ✅ calls global with given title + ✅ calls global with given title when multiple tests cases exist + ✅ calls global with title containing param values when using $variable format + ✅ calls global with title containing $key in multiple positions + ✅ calls global with title containing $key.path + ✅ calls global with title containing last seen object when $key.path is invalid + ✅ calls global with cb function with object built from table headings and values + ✅ calls global with given timeout + ✅ formats primitive values using .toString() +jest-each .describe.only + ✅ throws error when there are additional words in first column heading + ✅ throws error when there are additional words in second column heading + ✅ throws error when there are additional words in last column heading + ✅ does not throw error when there is additional words in template after heading row + ✅ does not throw error when there is only one column + ✅ does not throw error when there is only one column with additional words in template after heading + ✅ throws error when there are no arguments for given headings + ✅ throws error when there are fewer arguments than headings when given one row + ✅ throws error when there are fewer arguments than headings over multiple rows + ✅ throws an error when called with an empty string + ✅ calls global with given title + ✅ calls global with given title when multiple tests cases exist + ✅ calls global with title containing param values when using $variable format + ✅ calls global with title containing $key in multiple positions + ✅ calls global with title containing $key.path + ✅ calls global with title containing last seen object when $key.path is invalid + ✅ calls global with cb function with object built from table headings and values + ✅ calls global with given timeout + ✅ formats primitive values using .toString() +jest-each done callback + ✅ calls [ 'test' ] with done when cb function has more args than params of given test row + ✅ calls [ 'test', 'only' ] with done when cb function has more args than params of given test row + ✅ calls [ 'test', 'concurrent', 'only' ] with done when cb function has more args than params of given test row + ✅ calls [ 'it' ] with done when cb function has more args than params of given test row + ✅ calls [ 'fit' ] with done when cb function has more args than params of given test row + ✅ calls [ 'it', 'only' ] with done when cb function has more args than params of given test row + ✅ does not call [ 'describe' ] with done when test function has more args than params of given test row + ✅ does not call [ 'fdescribe' ] with done when test function has more args than params of given test row + ✅ does not call [ 'describe', 'only' ] with done when test function has more args than params of given test row +jest-each .xtest + ✅ calls global with given title + ✅ calls global with given title when multiple tests cases exist + ✅ calls global with title containing param values when using $variable format +jest-each .test.skip + ✅ calls global with given title + ✅ calls global with given title when multiple tests cases exist + ✅ calls global with title containing param values when using $variable format +jest-each .xit + ✅ calls global with given title + ✅ calls global with given title when multiple tests cases exist + ✅ calls global with title containing param values when using $variable format +jest-each .it.skip + ✅ calls global with given title + ✅ calls global with given title when multiple tests cases exist + ✅ calls global with title containing param values when using $variable format +jest-each .xdescribe + ✅ calls global with given title + ✅ calls global with given title when multiple tests cases exist + ✅ calls global with title containing param values when using $variable format +jest-each .describe.skip + ✅ calls global with given title + ✅ calls global with given title when multiple tests cases exist + ✅ calls global with title containing param values when using $variable format +``` +### ✅ packages/jest-environment-jsdom/src/__tests__/jsdom_environment.test.ts +``` +JSDomEnvironment + ✅ should configure setTimeout/setInterval to use the browser api + ✅ has modern fake timers implementation +``` +### ✅ packages/jest-environment-node/src/__tests__/node_environment.test.ts +``` +NodeEnvironment + ✅ uses a copy of the process object + ✅ exposes process.on + ✅ exposes global.global + ✅ should configure setTimeout/setInterval to use the node api + ✅ has modern fake timers implementation + ✅ TextEncoder references the same global Uint8Array constructor +``` +### ✅ packages/jest-fake-timers/src/__tests__/legacyFakeTimers.test.ts +``` +FakeTimers construction + ✅ installs setTimeout mock + ✅ accepts to promisify setTimeout mock + ✅ installs clearTimeout mock + ✅ installs setInterval mock + ✅ installs clearInterval mock + ✅ mocks process.nextTick if it exists on global + ✅ mocks setImmediate if it exists on global + ✅ mocks clearImmediate if setImmediate is on global +FakeTimers runAllTicks + ✅ runs all ticks, in order + ✅ does nothing when no ticks have been scheduled + ✅ only runs a scheduled callback once + ✅ cancels a callback even from native nextTick + ✅ cancels a callback even from native setImmediate + ✅ doesnt run a tick callback if native nextTick already did + ✅ doesnt run immediate if native setImmediate already did + ✅ native doesnt run immediate if fake already did + ✅ throws before allowing infinite recursion +FakeTimers runAllTimers + ✅ runs all timers in order + ✅ warns when trying to advance timers while real timers are used + ✅ does nothing when no timers have been scheduled + ✅ only runs a setTimeout callback once (ever) + ✅ runs callbacks with arguments after the interval + ✅ doesnt pass the callback to native setTimeout + ✅ throws before allowing infinite recursion + ✅ also clears ticks +FakeTimers advanceTimersByTime + ✅ runs timers in order + ✅ does nothing when no timers have been scheduled + ✅ throws before allowing infinite recursion +FakeTimers advanceTimersToNextTimer + ✅ runs timers in order + ✅ run correct amount of steps + ✅ setTimeout inside setTimeout + ✅ does nothing when no timers have been scheduled +FakeTimers reset + ✅ resets all pending setTimeouts + ✅ resets all pending setIntervals + ✅ resets all pending ticks callbacks & immediates + ✅ resets current advanceTimersByTime time cursor +FakeTimers runOnlyPendingTimers + ✅ runs all timers in order + ✅ does not run timers that were cleared in another timer +FakeTimers runWithRealTimers + ✅ executes callback with native timers + ✅ resets mock timers after executing callback + ✅ resets mock timer functions even if callback throws +FakeTimers useRealTimers + ✅ resets native timer APIs + ✅ resets native process.nextTick when present + ✅ resets native setImmediate when present +FakeTimers useFakeTimers + ✅ resets mock timer APIs + ✅ resets mock process.nextTick when present + ✅ resets mock setImmediate when present +FakeTimers getTimerCount + ✅ returns the correct count + ✅ includes immediates and ticks + ✅ not includes cancelled immediates +``` +### ✅ packages/jest-fake-timers/src/__tests__/modernFakeTimers.test.ts +``` +FakeTimers construction + ✅ installs setTimeout mock + ✅ installs clearTimeout mock + ✅ installs setInterval mock + ✅ installs clearInterval mock + ✅ mocks process.nextTick if it exists on global + ✅ mocks setImmediate if it exists on global + ✅ mocks clearImmediate if setImmediate is on global +FakeTimers runAllTicks + ✅ runs all ticks, in order + ✅ does nothing when no ticks have been scheduled + ✅ only runs a scheduled callback once + ✅ throws before allowing infinite recursion +FakeTimers runAllTimers + ✅ runs all timers in order + ✅ warns when trying to advance timers while real timers are used + ✅ does nothing when no timers have been scheduled + ✅ only runs a setTimeout callback once (ever) + ✅ runs callbacks with arguments after the interval + ✅ doesn't pass the callback to native setTimeout + ✅ throws before allowing infinite recursion + ✅ also clears ticks +FakeTimers advanceTimersByTime + ✅ runs timers in order + ✅ does nothing when no timers have been scheduled +FakeTimers advanceTimersToNextTimer + ✅ runs timers in order + ✅ run correct amount of steps + ✅ setTimeout inside setTimeout + ✅ does nothing when no timers have been scheduled +FakeTimers reset + ✅ resets all pending setTimeouts + ✅ resets all pending setIntervals + ✅ resets all pending ticks callbacks + ✅ resets current advanceTimersByTime time cursor +FakeTimers runOnlyPendingTimers + ✅ runs all timers in order + ✅ does not run timers that were cleared in another timer +FakeTimers useRealTimers + ✅ resets native timer APIs + ✅ resets native process.nextTick when present + ✅ resets native setImmediate when present +FakeTimers useFakeTimers + ✅ resets mock timer APIs + ✅ resets mock process.nextTick when present + ✅ resets mock setImmediate when present +FakeTimers getTimerCount + ✅ returns the correct count + ✅ includes immediates and ticks + ✅ not includes cancelled immediates +``` +### ✅ packages/jest-get-type/src/__tests__/getType.test.ts +``` +.getType() + ✅ null + ✅ undefined + ✅ object + ✅ array + ✅ number + ✅ string + ✅ function + ✅ boolean + ✅ symbol + ✅ regexp + ✅ map + ✅ set + ✅ date + ✅ bigint +``` +### ✅ packages/jest-get-type/src/__tests__/isPrimitive.test.ts +``` +.isPrimitive() + ✅ returns true when given primitive value of: null + ✅ returns true when given primitive value of: undefined + ✅ returns true when given primitive value of: 100 + ✅ returns true when given primitive value of: hello world + ✅ returns true when given primitive value of: true + ✅ returns true when given primitive value of: Symbol(a) + ✅ returns true when given primitive value of: 0 + ✅ returns true when given primitive value of: NaN + ✅ returns true when given primitive value of: Infinity + ✅ returns true when given primitive value of: 1n + ✅ returns false when given non primitive value of: {} + ✅ returns false when given non primitive value of: [] + ✅ returns false when given non primitive value of: undefined + ✅ returns false when given non primitive value of: {} + ✅ returns false when given non primitive value of: {} + ✅ returns false when given non primitive value of: {} + ✅ returns false when given non primitive value of: "2021-01-24T19:22:19.272Z" + ✅ returns false when given non primitive value of: {} +``` +### ✅ packages/jest-globals/src/__tests__/index.ts +``` +✅ throw when directly imported +``` +### ✅ packages/jest-haste-map/src/__tests__/get_mock_name.test.js +``` +getMockName + ✅ extracts mock name from file path +``` +### ✅ packages/jest-haste-map/src/__tests__/includes_dotfiles.test.ts +``` +✅ watchman crawler and node crawler both include dotfiles +``` +### ✅ packages/jest-haste-map/src/__tests__/index.test.js +``` +HasteMap + ✅ exports constants + ✅ creates valid cache file paths + ✅ creates different cache file paths for different roots + ✅ creates different cache file paths for different dependency extractor cache keys + ✅ creates different cache file paths for different hasteImplModulePath cache keys + ✅ creates different cache file paths for different projects + ✅ matches files against a pattern + ✅ ignores files given a pattern + ✅ ignores vcs directories without ignore pattern + ✅ ignores vcs directories with ignore pattern regex + ✅ warn on ignore pattern except for regex + ✅ builds a haste map on a fresh cache + ✅ does not crawl native files even if requested to do so + ✅ retains all files if `retainAllFiles` is specified + ✅ warns on duplicate mock files + ✅ warns on duplicate module ids + ✅ warns on duplicate module ids only once + ✅ throws on duplicate module ids if "throwOnModuleCollision" is set to true + ✅ splits up modules by platform + ✅ does not access the file system on a warm cache with no changes + ✅ only does minimal file system access when files change + ✅ correctly handles file deletions + ✅ correctly handles platform-specific file additions + ✅ correctly handles platform-specific file deletions + ✅ correctly handles platform-specific file renames + ✅ discards the cache when configuration changes + ✅ ignores files that do not exist + ✅ distributes work across workers + ✅ tries to crawl using node as a fallback + ✅ tries to crawl using node as a fallback when promise fails once + ✅ stops crawling when both crawlers fail +HasteMap builds a haste map on a fresh cache with SHA-1s + ✅ uses watchman: false + ✅ uses watchman: true +HasteMap duplicate modules + ✅ recovers when a duplicate file is deleted + ✅ recovers with the correct type when a duplicate file is deleted + ✅ recovers when a duplicate module is renamed +HasteMap file system changes processing + ✅ provides a new set of hasteHS and moduleMap + ✅ handles several change events at once + ✅ does not emit duplicate change events + ✅ emits a change even if a file in node_modules has changed + ✅ correctly tracks changes to both platform-specific versions of a single module name +HasteMap file system changes processing recovery from duplicate module IDs + ✅ recovers when the oldest version of the duplicates is fixed + ✅ recovers when the most recent duplicate is fixed + ✅ ignore directories +``` +### ✅ packages/jest-haste-map/src/__tests__/worker.test.js +``` +worker + ✅ parses JavaScript files and extracts module information + ✅ accepts a custom dependency extractor + ✅ delegates to hasteImplModulePath for getting the id + ✅ parses package.json files as haste packages + ✅ returns an error when a file cannot be accessed + ✅ simply computes SHA-1s when requested (works well with binary data) + ✅ avoids computing dependencies if not requested and Haste does not need it +``` +### ✅ packages/jest-haste-map/src/crawlers/__tests__/node.test.js +``` +node crawler + ✅ crawls for files based on patterns + ✅ updates only changed files + ✅ returns removed files + ✅ uses node fs APIs with incompatible find binary + ✅ uses node fs APIs without find binary + ✅ uses node fs APIs if "forceNodeFilesystemAPI" is set to true, regardless of platform + ✅ completes with empty roots + ✅ completes with fs.readdir throwing an error +node crawler readdir withFileTypes support + ✅ calls lstat for directories and symlinks if readdir withFileTypes is not supported + ✅ avoids calling lstat for directories and symlinks if readdir withFileTypes is supported +``` +### ✅ packages/jest-haste-map/src/crawlers/__tests__/watchman.test.js +``` +watchman watch + ✅ returns a list of all files when there are no clocks + ✅ updates file map and removedFiles when the clock is given + ✅ resets the file map and tracks removedFiles when watchman is fresh + ✅ properly resets the file map when only one watcher is reset + ✅ does not add directory filters to query when watching a ROOT + ✅ SHA-1 requested and available + ✅ SHA-1 requested and NOT available + ✅ source control query +``` +### ✅ packages/jest-haste-map/src/lib/__tests__/dependencyExtractor.test.js +``` +dependencyExtractor + ✅ should not extract dependencies inside comments + ✅ should not extract dependencies inside comments (windows line endings) + ✅ should not extract dependencies inside comments (unicode line endings) + ✅ should extract dependencies from `import` statements + ✅ should extract dependencies from side-effect only `import` statements + ✅ should not extract dependencies from `import type/typeof` statements + ✅ should extract dependencies from `export` statements + ✅ should extract dependencies from `export-from` statements + ✅ should not extract dependencies from `export type/typeof` statements + ✅ should extract dependencies from dynamic `import` calls + ✅ should extract dependencies from `require` calls + ✅ should extract dependencies from `jest.requireActual` calls + ✅ should extract dependencies from `jest.requireMock` calls + ✅ should extract dependencies from `jest.genMockFromModule` calls + ✅ should extract dependencies from `jest.createMockFromModule` calls +``` +### ✅ packages/jest-haste-map/src/lib/__tests__/fast_path.test.js +``` +fastPath.relative + ✅ should get relative paths inside the root + ✅ should get relative paths outside the root + ✅ should get relative paths outside the root when start with same word +fastPath.resolve + ✅ should get the absolute path for paths inside the root + ✅ should get the absolute path for paths outside the root +``` +### ✅ packages/jest-haste-map/src/lib/__tests__/getPlatformExtension.test.js +``` +getPlatformExtension + ✅ should get platform ext +``` +### ✅ packages/jest-haste-map/src/lib/__tests__/isRegExpSupported.test.js +``` +isRegExpSupported + ✅ should return true when passing valid regular expression + ✅ should return false when passing an invalid regular expression +``` +### ✅ packages/jest-haste-map/src/lib/__tests__/normalizePathSep.test.js +``` +normalizePathSep + ✅ does nothing on posix + ✅ replace slashes on windows +``` +### ✅ packages/jest-jasmine2/src/__tests__/concurrent.test.ts +``` +concurrent + ✅ should add 1 to number + ✅ should add 1 to number + ✅ should add 1 to number +``` +### ✅ packages/jest-jasmine2/src/__tests__/expectationResultFactory.test.ts +``` +expectationResultFactory + ✅ returns the result if passed. + ✅ returns the result if failed. + ✅ returns the result if failed (with `message`). + ✅ returns the result if failed (with `error`). + ✅ returns the error name if the error message is empty + ✅ returns the result if failed (with `error` as a string). + ✅ returns the result if failed (with `error.stack` not as a string). +``` +### ✅ packages/jest-jasmine2/src/__tests__/hooksError.test.ts +``` +beforeEach hooks error throwing + ✅ beforeEach throws an error when "String" is provided as a first argument to it + ✅ beforeEach throws an error when 1 is provided as a first argument to it + ✅ beforeEach throws an error when [] is provided as a first argument to it + ✅ beforeEach throws an error when {} is provided as a first argument to it + ✅ beforeEach throws an error when Symbol(hello) is provided as a first argument to it + ✅ beforeEach throws an error when true is provided as a first argument to it + ✅ beforeEach throws an error when null is provided as a first argument to it + ✅ beforeEach throws an error when undefined is provided as a first argument to it +beforeAll hooks error throwing + ✅ beforeAll throws an error when "String" is provided as a first argument to it + ✅ beforeAll throws an error when 1 is provided as a first argument to it + ✅ beforeAll throws an error when [] is provided as a first argument to it + ✅ beforeAll throws an error when {} is provided as a first argument to it + ✅ beforeAll throws an error when Symbol(hello) is provided as a first argument to it + ✅ beforeAll throws an error when true is provided as a first argument to it + ✅ beforeAll throws an error when null is provided as a first argument to it + ✅ beforeAll throws an error when undefined is provided as a first argument to it +afterEach hooks error throwing + ✅ afterEach throws an error when "String" is provided as a first argument to it + ✅ afterEach throws an error when 1 is provided as a first argument to it + ✅ afterEach throws an error when [] is provided as a first argument to it + ✅ afterEach throws an error when {} is provided as a first argument to it + ✅ afterEach throws an error when Symbol(hello) is provided as a first argument to it + ✅ afterEach throws an error when true is provided as a first argument to it + ✅ afterEach throws an error when null is provided as a first argument to it + ✅ afterEach throws an error when undefined is provided as a first argument to it +afterAll hooks error throwing + ✅ afterAll throws an error when "String" is provided as a first argument to it + ✅ afterAll throws an error when 1 is provided as a first argument to it + ✅ afterAll throws an error when [] is provided as a first argument to it + ✅ afterAll throws an error when {} is provided as a first argument to it + ✅ afterAll throws an error when Symbol(hello) is provided as a first argument to it + ✅ afterAll throws an error when true is provided as a first argument to it + ✅ afterAll throws an error when null is provided as a first argument to it + ✅ afterAll throws an error when undefined is provided as a first argument to it +``` +### ✅ packages/jest-jasmine2/src/__tests__/iterators.test.ts +``` +iterators + ✅ works for arrays + ✅ works for custom iterables + ✅ works for Sets + ✅ works for Maps +``` +### ✅ packages/jest-jasmine2/src/__tests__/itTestError.test.ts +``` +test/it error throwing + ✅ it throws error with missing callback function + ✅ it throws an error when first argument isn't a string + ✅ it throws an error when callback function is not a function + ✅ test throws error with missing callback function + ✅ test throws an error when first argument isn't a string + ✅ test throws an error when callback function is not a function +``` +### ✅ packages/jest-jasmine2/src/__tests__/itToTestAlias.test.ts +``` +✅ global.test +``` +### ✅ packages/jest-jasmine2/src/__tests__/pTimeout.test.ts +``` +pTimeout + ✅ calls `clearTimeout` and resolves when `promise` resolves. + ✅ calls `clearTimeout` and rejects when `promise` rejects. + ✅ calls `onTimeout` on timeout. +``` +### ✅ packages/jest-jasmine2/src/__tests__/queueRunner.test.ts +``` +queueRunner + ✅ runs every function in the queue. + ✅ exposes `fail` to `next`. + ✅ passes errors to `onException`. + ✅ passes an error to `onException` on timeout. + ✅ calls `fail` with arguments + ✅ calls `fail` when done(error) is invoked +``` +### ✅ packages/jest-jasmine2/src/__tests__/reporter.test.ts +``` +Jasmine2Reporter + ✅ reports nested suites +``` +### ✅ packages/jest-jasmine2/src/__tests__/Suite.test.ts +``` +Suite + ✅ doesn't throw on addExpectationResult when there are no children +``` +### ✅ packages/jest-jasmine2/src/__tests__/todoError.test.ts +``` +test/it.todo error throwing + ✅ it throws error when given no arguments + ✅ it throws error when given more than one argument + ✅ it throws error when given none string description +``` +### ✅ packages/jest-leak-detector/src/__tests__/index.test.ts +``` +✅ complains if the value is a primitive +✅ does not show the GC if hidden +✅ does not hide the GC if visible +✅ correctly checks simple leaks +✅ tests different objects +✅ correctly checks more complex leaks +``` +### ✅ packages/jest-matcher-utils/src/__tests__/deepCyclicCopyReplaceable.test.ts +``` +✅ returns the same value for primitive or function values +✅ convert accessor descriptor into value descriptor +✅ shuold not skips non-enumerables +✅ copies symbols +✅ copies arrays as array objects +✅ handles cyclic dependencies +✅ Copy Map +✅ Copy cyclic Map +✅ return same value for built-in object type except array, map and object +✅ should copy object symbol key property +✅ should set writable, configurable to true +``` +### ✅ packages/jest-matcher-utils/src/__tests__/deepCyclicCopyReplaceableDom.test.ts +``` +✅ should copy dom element +✅ should copy complex element +``` +### ✅ packages/jest-matcher-utils/src/__tests__/index.test.ts +``` +stringify() + ✅ [] + ✅ {} + ✅ 1 + ✅ 0 + ✅ 1.5 + ✅ null + ✅ undefined + ✅ "abc" + ✅ Symbol(abc) + ✅ NaN + ✅ Infinity + ✅ -Infinity + ✅ /ab\.c/gi + ✅ 1n + ✅ 0n + ✅ circular references + ✅ toJSON error + ✅ toJSON errors when comparing two objects + ✅ reduces maxDepth if stringifying very large objects +ensureNumbers() + ✅ dont throw error when variables are numbers + ✅ throws error when expected is not a number (backward compatibility) + ✅ throws error when received is not a number (backward compatibility) +ensureNumbers() with options + ✅ promise empty isNot false received + ✅ promise empty isNot true expected + ✅ promise rejects isNot false expected + ✅ promise rejects isNot true received + ✅ promise resolves isNot false received + ✅ promise resolves isNot true expected +ensureNoExpected() + ✅ dont throw error when undefined + ✅ throws error when expected is not undefined with matcherName + ✅ throws error when expected is not undefined with matcherName and options +diff + ✅ forwards to jest-diff + ✅ two booleans + ✅ two numbers + ✅ two bigints +pluralize() + ✅ one + ✅ two + ✅ 20 +getLabelPrinter + ✅ 0 args + ✅ 1 empty string + ✅ 1 non-empty string + ✅ 2 equal lengths + ✅ 2 unequal lengths + ✅ returns incorrect padding if inconsistent arg is shorter + ✅ throws if inconsistent arg is longer +matcherHint + ✅ expectedColor + ✅ receivedColor + ✅ secondArgumentColor +``` +### ✅ packages/jest-matcher-utils/src/__tests__/printDiffOrStringify.test.ts +``` +printDiffOrStringify + ✅ expected is empty and received is single line + ✅ expected is multi line and received is empty + ✅ expected and received are single line with multiple changes + ✅ expected and received are multi line with trailing spaces + ✅ has no common after clean up chaff multiline + ✅ has no common after clean up chaff one-line + ✅ object contain readonly symbol key object +printDiffOrStringify MAX_DIFF_STRING_LENGTH + ✅ both are less + ✅ expected is more + ✅ received is more +printDiffOrStringify asymmetricMatcher + ✅ minimal test + ✅ jest asymmetricMatcher + ✅ custom asymmetricMatcher + ✅ nested object + ✅ array + ✅ object in array + ✅ map + ✅ circular object + ✅ transitive circular + ✅ circular array + ✅ circular map +``` +### ✅ packages/jest-matcher-utils/src/__tests__/Replaceable.test.ts +``` +Replaceable constructor + ✅ init with object + ✅ init with array + ✅ init with Map + ✅ init with other type should throw error +Replaceable get + ✅ get object item + ✅ get array item + ✅ get Map item +Replaceable set + ✅ set object item + ✅ set array item + ✅ set Map item +Replaceable forEach + ✅ object forEach + ✅ array forEach + ✅ map forEach + ✅ forEach should ignore nonenumerable property +Replaceable isReplaceable + ✅ should return true if two object types equal and support + ✅ should return false if two object types not equal + ✅ should return false if object types not support +``` +### ✅ packages/jest-message-util/src/__tests__/messages.test.ts +``` +✅ should exclude jasmine from stack trace for Unix paths. +✅ .formatExecError() +✅ formatStackTrace should strip node internals +✅ should not exclude vendor from stack trace +✅ retains message in babel code frame error +✅ codeframe +✅ no codeframe +✅ no stack +formatStackTrace + ✅ prints code frame and stacktrace + ✅ does not print code frame when noCodeFrame = true + ✅ does not print codeframe when noStackTrace = true +``` +### ✅ packages/jest-mock/src/__tests__/index.test.ts +``` +moduleMocker getMetadata + ✅ returns the function `name` property + ✅ mocks constant values + ✅ does not retrieve metadata for arrays + ✅ does not retrieve metadata for undefined + ✅ does not retrieve metadata for null + ✅ retrieves metadata for ES6 classes + ✅ retrieves synchronous function metadata + ✅ retrieves asynchronous function metadata + ✅ retrieves metadata for object literals and it's members + ✅ retrieves Date object metadata +moduleMocker generateFromMetadata + ✅ forwards the function name property + ✅ fixes illegal function name properties + ✅ special cases the mockConstructor name + ✅ wont interfere with previous mocks on a shared prototype + ✅ does not mock non-enumerable getters + ✅ mocks getters of ES modules + ✅ mocks ES2015 non-enumerable methods + ✅ mocks ES2015 non-enumerable static properties and methods + ✅ mocks methods in all the prototype chain (null prototype) + ✅ does not mock methods from Object.prototype + ✅ does not mock methods from Object.prototype (in mock context) + ✅ does not mock methods from Function.prototype + ✅ does not mock methods from Function.prototype (in mock context) + ✅ does not mock methods from RegExp.prototype + ✅ does not mock methods from RegExp.prototype (in mock context) + ✅ mocks methods that are bound multiple times + ✅ mocks methods that are bound after mocking + ✅ mocks regexp instances + ✅ mocks functions with numeric names + ✅ mocks the method in the passed object itself + ✅ should delete previously inexistent methods when restoring + ✅ supports mock value returning undefined + ✅ supports mock value once returning undefined + ✅ mockReturnValueOnce mocks value just once + ✅ supports mocking resolvable async functions + ✅ supports mocking resolvable async functions only once + ✅ supports mocking rejectable async functions + ✅ supports mocking rejectable async functions only once + ✅ tracks thrown errors without interfering with other tracking + ✅ a call that throws undefined is tracked properly + ✅ results of recursive calls are tracked properly + ✅ test results of recursive calls from within the recursive call + ✅ call mockClear inside recursive mock +moduleMocker generateFromMetadata mocked functions + ✅ tracks calls to mocks + ✅ tracks instances made by mocks + ✅ supports clearing mock calls + ✅ supports clearing mocks + ✅ supports clearing all mocks + ✅ supports resetting mock return values + ✅ supports resetting single use mock return values + ✅ supports resetting mock implementations + ✅ supports resetting single use mock implementations + ✅ supports resetting all mocks + ✅ maintains function arity +moduleMocker generateFromMetadata return values + ✅ tracks return values + ✅ tracks mocked return values + ✅ supports resetting return values +moduleMocker generateFromMetadata invocationCallOrder + ✅ tracks invocationCallOrder made by mocks + ✅ supports clearing mock invocationCallOrder + ✅ supports clearing all mocks invocationCallOrder + ✅ handles a property called `prototype` +moduleMocker getMockImplementation + ✅ should mock calls to a mock function +moduleMocker mockImplementationOnce + ✅ should mock constructor + ✅ should mock single call to a mock function + ✅ should fallback to default mock function when no specific mock is available +moduleMocker + ✅ mockReturnValue does not override mockImplementationOnce + ✅ mockImplementation resets the mock + ✅ should recognize a mocked function + ✅ default mockName is jest.fn() + ✅ mockName sets the mock name + ✅ mockName gets reset by mockReset + ✅ mockName gets reset by mockRestore + ✅ mockName is not reset by mockClear +moduleMocker spyOn + ✅ should work + ✅ should throw on invalid input + ✅ supports restoring all spies + ✅ should work with getters +moduleMocker spyOnProperty + ✅ should work - getter + ✅ should work - setter + ✅ should throw on invalid input + ✅ supports restoring all spies + ✅ should work with getters on the prototype chain + ✅ should work with setters on the prototype chain + ✅ supports restoring all spies on the prototype chain +``` +### ✅ packages/jest-regex-util/src/__tests__/index.test.ts +``` +replacePathSepForRegex() posix + ✅ should return the path +replacePathSepForRegex() win32 + ✅ should replace POSIX path separators + ✅ should escape Windows path separators + ✅ should not escape an escaped dot + ✅ should not escape an escaped regexp symbol + ✅ should escape Windows path separators inside groups + ✅ should escape Windows path separator at the beginning + ✅ should not escape several already escaped path separators +``` +### ✅ packages/jest-repl/src/__tests__/jest_repl.test.js +``` +Repl cli + ✅ runs without errors +``` +### ✅ packages/jest-repl/src/__tests__/runtime_cli.test.js +``` +Runtime CLI + ✅ fails with no path + ✅ displays script output + ✅ always disables automocking + ✅ throws script errors +``` +### ✅ packages/jest-reporters/src/__tests__/CoverageReporter.test.js +``` +onRunComplete + ✅ getLastError() returns an error when threshold is not met for global + ✅ getLastError() returns an error when threshold is not met for file + ✅ getLastError() returns `undefined` when threshold is met + ✅ getLastError() returns an error when threshold is not met for non-covered file + ✅ getLastError() returns an error when threshold is not met for directory + ✅ getLastError() returns `undefined` when threshold is met for directory + ✅ getLastError() returns an error when there is no coverage data for a threshold + ✅ getLastError() returns 'undefined' when global threshold group + is empty because PATH and GLOB threshold groups have matched all the + files in the coverage data. + ✅ getLastError() returns 'undefined' when file and directory path + threshold groups overlap + ✅ that if globs or paths are specified alongside global, coverage + data for matching paths will be subtracted from overall coverage + and thresholds will be applied independently + ✅ that files are matched by all matching threshold groups + ✅ that it passes custom options when creating reporters +``` +### ✅ packages/jest-reporters/src/__tests__/CoverageWorker.test.js +``` +✅ resolves to the result of generateEmptyCoverage upon success +✅ throws errors on invalid JavaScript +``` +### ✅ packages/jest-reporters/src/__tests__/DefaultReporter.test.js +``` +✅ normal output, everything goes to stdout +✅ when using stderr as output, no stdout call is made +``` +### ✅ packages/jest-reporters/src/__tests__/generateEmptyCoverage.test.js +``` +generateEmptyCoverage + ✅ generates an empty coverage object for a file without running it + ✅ generates a null coverage result when using /* istanbul ignore file */ + ✅ generates a null coverage result when collectCoverage global config is false +``` +### ✅ packages/jest-reporters/src/__tests__/getResultHeader.test.js +``` +✅ should call `terminal-link` correctly +✅ should render the terminal link +✅ should display test time for slow test +✅ should not display test time for fast test +``` +### ✅ packages/jest-reporters/src/__tests__/getSnapshotStatus.test.js +``` +✅ Retrieves the snapshot status +✅ Shows no snapshot updates if all snapshots matched +✅ Retrieves the snapshot status after a snapshot update +``` +### ✅ packages/jest-reporters/src/__tests__/getSnapshotSummary.test.js +``` +✅ creates a snapshot summary +✅ creates a snapshot summary after an update +✅ creates a snapshot summary with multiple snapshot being written/updated +✅ returns nothing if there are no updates +``` +### ✅ packages/jest-reporters/src/__tests__/getWatermarks.test.ts +``` +getWatermarks + ✅ that watermarks use thresholds as upper target + ✅ that watermarks are created always created +``` +### ✅ packages/jest-reporters/src/__tests__/NotifyReporter.test.ts +``` +✅ test always +✅ test success +✅ test change +✅ test success-change +✅ test failure-change +✅ test always with rootDir +✅ test success with rootDir +✅ test change with rootDir +✅ test success-change with rootDir +✅ test failure-change with rootDir +✅ test always with moduleName +✅ test success with moduleName +✅ test change with moduleName +✅ test success-change with moduleName +✅ test failure-change with moduleName +node-notifier is an optional dependency + ✅ without node-notifier uses mock function that throws an error + ✅ throws the error when require throws an unexpected error + ✅ uses node-notifier when it is available +``` +### ✅ packages/jest-reporters/src/__tests__/SummaryReporter.test.js +``` +✅ snapshots needs update with npm test +✅ snapshots needs update with yarn test +✅ snapshots all have results (no update) +✅ snapshots all have results (after update) +``` +### ✅ packages/jest-reporters/src/__tests__/utils.test.ts +``` +wrapAnsiString() + ✅ wraps a long string containing ansi chars + ✅ returns the string unaltered if given a terminal width of zero +trimAndFormatPath() + ✅ trims dirname + ✅ trims dirname (longer line width) + ✅ trims dirname and basename + ✅ does not trim anything + ✅ split at the path.sep index +printDisplayName + ✅ should default displayName color to white when displayName is a string + ✅ should default displayName color to white when color is not a valid value + ✅ should correctly print the displayName when color and name are valid values +``` +### ✅ packages/jest-reporters/src/__tests__/VerboseReporter.test.js +``` +groupTestsBySuites + ✅ should handle empty results + ✅ should group A1 in A + ✅ should group A1 in A; B1 in B + ✅ should group A1, A2 in A + ✅ should group A1, A2 in A; B1, B2 in B + ✅ should group AB1 in AB + ✅ should group AB1, AB2 in AB + ✅ should group A1 in A; AB1 in AB + ✅ should group AB1 in AB; A1 in A + ✅ should group AB1 in AB; CD1 in CD + ✅ should group ABC1 in ABC; BC1 in BC; D1 in D; A1 in A +``` +### ✅ packages/jest-resolve-dependencies/src/__tests__/dependency_resolver.test.ts +``` +✅ resolves no dependencies for non-existent path +✅ resolves dependencies for existing path +✅ includes the mocks of dependencies as dependencies +✅ resolves dependencies for scoped packages +✅ resolves no inverse dependencies for empty paths set +✅ resolves no inverse dependencies for set of non-existent paths +✅ resolves inverse dependencies for existing path +✅ resolves inverse dependencies of mock +✅ resolves inverse dependencies from available snapshot +✅ resolves dependencies correctly when dependency resolution fails +✅ resolves dependencies correctly when mock dependency resolution fails +``` +### ✅ packages/jest-resolve/src/__tests__/isBuiltinModule.test.ts +``` +isBuiltinModule + ✅ should return true for the `path` module + ✅ should return false for the `chalk` module + ✅ should return true for the `_http_common` module + ✅ should return false for any internal node builtins +``` +### ✅ packages/jest-resolve/src/__tests__/resolve.test.ts +``` +isCoreModule + ✅ returns false if `hasCoreModules` is false. + ✅ returns true if `hasCoreModules` is true and `moduleName` is a core module. + ✅ returns false if `hasCoreModules` is true and `moduleName` is not a core module. + ✅ returns false if `hasCoreModules` is true and `moduleNameMapper` alias a module same name with core module +findNodeModule + ✅ is possible to override the default resolver + ✅ passes packageFilter to the resolve module when using the default resolver +resolveModule + ✅ is possible to resolve node modules + ✅ is possible to resolve node modules with custom extensions + ✅ is possible to resolve node modules with custom extensions and platforms + ✅ is possible to resolve node modules by resolving their realpath + ✅ is possible to specify custom resolve paths + ✅ does not confuse directories with files +getMockModule + ✅ is possible to use custom resolver to resolve deps inside mock modules with moduleNameMapper +nodeModulesPaths + ✅ provides custom module paths after node_modules +Resolver.getModulePaths() -> nodeModulesPaths() + ✅ can resolve node modules relative to absolute paths in "moduleDirectories" on Windows platforms + ✅ can resolve node modules relative to absolute paths in "moduleDirectories" on Posix platforms +``` +### ✅ packages/jest-runner/src/__tests__/testRunner.test.ts +``` +✅ injects the serializable module map into each worker in watch mode +✅ assign process.env.JEST_WORKER_ID = 1 when in runInBand mode +``` +### ✅ packages/jest-runtime/src/__tests__/instrumentation.test.ts +``` +✅ instruments files +``` +### ✅ packages/jest-runtime/src/__tests__/runtime_create_mock_from_module.test.js +``` +Runtime createMockFromModule + ✅ does not cause side effects in the rest of the module system when generating a mock + ✅ resolves mapped modules correctly +Runtime + ✅ creates mock objects in the right environment +``` +### ✅ packages/jest-runtime/src/__tests__/runtime_environment.test.js +``` +Runtime requireModule + ✅ emulates a node stack trace during module load + ✅ emulates a node stack trace during function execution +``` +### ✅ packages/jest-runtime/src/__tests__/runtime_internal_module.test.js +``` +Runtime internalModule + ✅ loads modules and applies transforms + ✅ loads internal modules without applying transforms + ✅ loads JSON modules and applies transforms + ✅ loads internal JSON modules without applying transforms +``` +### ✅ packages/jest-runtime/src/__tests__/runtime_jest_fn.js +``` +Runtime jest.fn + ✅ creates mock functions + ✅ creates mock functions with mock implementations +Runtime jest.isMockFunction + ✅ recognizes a mocked function +Runtime jest.clearAllMocks + ✅ clears all mocks +``` +### ✅ packages/jest-runtime/src/__tests__/runtime_jest_spy_on.test.js +``` +Runtime jest.spyOn + ✅ calls the original function +Runtime jest.spyOnProperty + ✅ calls the original function +``` +### ✅ packages/jest-runtime/src/__tests__/runtime_mock.test.js +``` +Runtime jest.mock + ✅ uses explicitly set mocks instead of automocking + ✅ sets virtual mock for non-existing module required from same directory + ✅ sets virtual mock for non-existing module required from different directory +Runtime jest.setMock + ✅ uses explicitly set mocks instead of automocking +``` +### ✅ packages/jest-runtime/src/__tests__/runtime_module_directories.test.js +``` +Runtime + ✅ uses configured moduleDirectories + ✅ resolves packages + ✅ finds closest module from moduleDirectories + ✅ only checks the configured directories +``` +### ✅ packages/jest-runtime/src/__tests__/runtime_node_path.test.js +``` +Runtime + ✅ uses NODE_PATH to find modules + ✅ uses modulePaths to find modules + ✅ finds modules in NODE_PATH containing multiple paths + ✅ does not find modules if NODE_PATH is relative +``` +### ✅ packages/jest-runtime/src/__tests__/runtime_require_actual.test.js +``` +Runtime requireActual + ✅ requires node module when manual mock exists + ✅ requireActual with moduleNameMapper +``` +### ✅ packages/jest-runtime/src/__tests__/runtime_require_cache.test.js +``` +Runtime require.cache + ✅ require.cache returns loaded module list as native Nodejs require does + ✅ require.cache is tolerant readonly +``` +### ✅ packages/jest-runtime/src/__tests__/runtime_require_mock.test.js +``` +Runtime requireMock + ✅ uses manual mocks before attempting to automock + ✅ can resolve modules that are only referenced from mocks + ✅ stores and re-uses manual mock exports + ✅ automocks haste modules without a manual mock + ✅ automocks relative-path modules without a file extension + ✅ automocks relative-path modules with a file extension + ✅ just falls back when loading a native module + ✅ stores and re-uses automocked haste exports + ✅ stores and re-uses automocked relative-path modules + ✅ multiple node core modules returns correct module + ✅ throws on non-existent haste modules + ✅ uses manual mocks when using a custom resolver + ✅ provides `require.main` in mock +``` +### ✅ packages/jest-runtime/src/__tests__/runtime_require_module_no_ext.test.js +``` +Runtime requireModule with no extension + ✅ throws error pointing out file with extension +``` +### ✅ packages/jest-runtime/src/__tests__/runtime_require_module_or_mock_transitive_deps.test.js +``` +transitive dependencies + ✅ mocks a manually mocked and mapped module + ✅ unmocks transitive dependencies in node_modules by default + ✅ unmocks transitive dependencies in node_modules when using unmock + ✅ unmocks transitive dependencies in node_modules by default when using both patterns and unmock + ✅ mocks deep dependencies when using unmock + ✅ does not mock deep dependencies when using deepUnmock +``` +### ✅ packages/jest-runtime/src/__tests__/runtime_require_module_or_mock.test.js +``` +✅ mocks modules by default when using automocking +✅ doesn't mock modules when explicitly unmocked when using automocking +✅ doesn't mock modules when explicitly unmocked via a different name +✅ doesn't mock modules when disableAutomock() has been called +✅ uses manual mock when automocking on and mock is available +✅ does not use manual mock when automocking is off and a real module is available +✅ resolves mapped module names and unmocks them by default +✅ automocking is disabled by default +✅ unmocks modules in config.unmockedModulePathPatterns for tests with automock enabled when automock is false +✅ unmocks virtual mocks after they have been mocked previously +resetModules + ✅ resets all the modules +isolateModules + ✅ keeps it's registry isolated from global one + ✅ resets all modules after the block + ✅ resets module after failing + ✅ cannot nest isolateModules blocks + ✅ can call resetModules within a isolateModules block +isolateModules can use isolateModules from a beforeEach block + ✅ can use the required module from beforeEach and re-require it +``` +### ✅ packages/jest-runtime/src/__tests__/runtime_require_module.test.js +``` +Runtime requireModule + ✅ finds haste modules + ✅ provides `module` to modules + ✅ provides `module.parent` to modules + ✅ `module.parent` should be undefined for entrypoints + ✅ resolve module.parent.require correctly + ✅ resolve module.parent.filename correctly + ✅ provides `module.loaded` to modules + ✅ provides `module.filename` to modules + ✅ provides `module.paths` to modules + ✅ provides `require.main` to modules + ✅ throws on non-existent haste modules + ✅ finds relative-path modules without file extension + ✅ finds relative-path modules with file extension + ✅ throws on non-existent relative-path modules + ✅ finds node core built-in modules + ✅ finds and loads JSON files without file extension + ✅ finds and loads JSON files with file extension + ✅ requires a JSON file twice successfully + ✅ provides manual mock when real module doesnt exist + ✅ doesn't override real modules with manual mocks when explicitly unmocked + ✅ resolves haste packages properly + ✅ resolves platform extensions based on the default platform + ✅ finds modules encoded in UTF-8 *with BOM* + ✅ finds and loads JSON files encoded in UTF-8 *with BOM* + ✅ should export a constructable Module class + ✅ caches Module correctly +Runtime requireModule on node >=12.12.0 + ✅ overrides module.createRequire +``` +### ✅ packages/jest-runtime/src/__tests__/runtime_require_resolve.test.ts +``` +Runtime require.resolve + ✅ resolves a module path + ✅ resolves a module path with moduleNameMapper +Runtime require.resolve with the jest-resolve-outside-vm-option + ✅ forwards to the real Node require in an internal context + ✅ ignores the option in an external context + ✅ does not understand a self-constructed outsideJestVmPath in an external context +``` +### ✅ packages/jest-runtime/src/__tests__/runtime_wrap.js +``` +Runtime wrapCodeInModuleWrapper + ✅ generates the correct args for the module wrapper + ✅ injects "extra globals" +``` +### ✅ packages/jest-runtime/src/__tests__/Runtime-sourceMaps.test.js +``` +Runtime requireModule + ✅ installs source maps if available +``` +### ✅ packages/jest-runtime/src/__tests__/Runtime-statics.test.js +``` +Runtime statics + ✅ Runtime.createHasteMap passes correct ignore files to HasteMap + ✅ Runtime.createHasteMap passes correct ignore files to HasteMap in watch mode +``` +### ✅ packages/jest-serializer/src/__tests__/index.test.ts +``` +Using V8 implementation + ✅ throws the error with an invalid serialization +Using V8 implementation Object 0 + ✅ serializes/deserializes in memory + ✅ serializes/deserializes in disk +Using V8 implementation Object 1 + ✅ serializes/deserializes in memory + ✅ serializes/deserializes in disk +Using V8 implementation Object 2 + ✅ serializes/deserializes in memory + ✅ serializes/deserializes in disk +Using V8 implementation Object 3 + ✅ serializes/deserializes in memory + ✅ serializes/deserializes in disk +Using V8 implementation Object 4 + ✅ serializes/deserializes in memory + ✅ serializes/deserializes in disk +Using V8 implementation Object 5 + ✅ serializes/deserializes in memory + ✅ serializes/deserializes in disk +Using V8 implementation Object 6 + ✅ serializes/deserializes in memory + ✅ serializes/deserializes in disk +Using V8 implementation Object 7 + ✅ serializes/deserializes in memory + ✅ serializes/deserializes in disk +``` +### ✅ packages/jest-snapshot/src/__tests__/dedentLines.test.ts +``` +dedentLines non-null + ✅ no lines + ✅ one line empty string + ✅ one line empty object + ✅ one line self-closing element + ✅ object value empty string + ✅ object value string includes double-quote marks + ✅ markup with props and text + ✅ markup with components as props +dedentLines null + ✅ object key multi-line + ✅ object value multi-line + ✅ object key and value multi-line + ✅ markup prop multi-line + ✅ markup prop component with multi-line text + ✅ markup text multi-line + ✅ markup text multiple lines + ✅ markup unclosed self-closing start tag + ✅ markup unclosed because no end tag +``` +### ✅ packages/jest-snapshot/src/__tests__/InlineSnapshots.test.ts +``` +✅ saveInlineSnapshots() replaces empty function call with a template literal +✅ saveInlineSnapshots() without prettier leaves formatting outside of snapshots alone +✅ saveInlineSnapshots() can handle typescript without prettier +✅ saveInlineSnapshots() can handle tsx without prettier +✅ saveInlineSnapshots() can handle flow and jsx without prettier +✅ saveInlineSnapshots() can use prettier to fix formatting for whole file +✅ saveInlineSnapshots() replaces existing template literal - babel parser +✅ saveInlineSnapshots() replaces existing template literal - flow parser +✅ saveInlineSnapshots() replaces existing template literal - typescript parser +✅ saveInlineSnapshots() replaces existing template literal with property matchers +✅ saveInlineSnapshots() creates template literal with property matchers +✅ saveInlineSnapshots() creates template literal with property matchers +✅ saveInlineSnapshots() throws if frame does not match +✅ saveInlineSnapshots() throws if multiple calls to to the same location +✅ saveInlineSnapshots() uses escaped backticks +✅ saveInlineSnapshots() works with non-literals in expect call +✅ saveInlineSnapshots() indents multi-line snapshots with spaces +✅ saveInlineSnapshots() does not re-indent error snapshots +✅ saveInlineSnapshots() does not re-indent already indented snapshots +✅ saveInlineSnapshots() indents multi-line snapshots with tabs +✅ saveInlineSnapshots() indents snapshots after prettier reformats +✅ saveInlineSnapshots() does not indent empty lines +``` +### ✅ packages/jest-snapshot/src/__tests__/matcher.test.ts +``` +✅ matcher returns matcher name, expected and actual values +``` +### ✅ packages/jest-snapshot/src/__tests__/mockSerializer.test.ts +``` +✅ mock with 0 calls and default name +✅ mock with 2 calls, 1 return, 1 throw +✅ mock with 0 calls and default name in React element +✅ mock with 0 calls and non-default name +✅ mock with 1 calls and non-default name via new in object +✅ mock with 1 calls in React element +✅ mock with 2 calls +✅ indent option +✅ min option +✅ maxDepth option +``` +### ✅ packages/jest-snapshot/src/__tests__/printSnapshot.test.ts +``` +chalk + ✅ level 0 + ✅ level 1 + ✅ level 2 + ✅ level 3 +matcher error toMatchInlineSnapshot + ✅ Expected properties must be an object (non-null) without snapshot + ✅ Expected properties must be an object (null) with snapshot + ✅ Inline snapshot must be a string + ✅ Snapshot matchers cannot be used with not +matcher error toMatchSnapshot + ✅ Expected properties must be an object (non-null) + ✅ Expected properties must be an object (null) with hint + ✅ Expected properties must be an object (null) without hint + ✅ Snapshot state must be initialized +matcher error toMatchSnapshot received value must be an object + ✅ (non-null) + ✅ (null) +matcher error toThrowErrorMatchingInlineSnapshot + ✅ Inline snapshot must be a string + ✅ Snapshot state must be initialized +matcher error toThrowErrorMatchingSnapshot + ✅ Received value must be a function + ✅ Snapshot matchers cannot be used with not +other error toThrowErrorMatchingSnapshot + ✅ Received function did not throw +pass false toMatchInlineSnapshot with properties equals false + ✅ with snapshot + ✅ without snapshot +pass false toMatchInlineSnapshot with properties + ✅ equals true +pass false toMatchSnapshot + ✅ New snapshot was not written (multi line) + ✅ New snapshot was not written (single line) +pass false toMatchSnapshot with properties equals false + ✅ isLineDiffable false + ✅ isLineDiffable true +pass false toMatchSnapshot with properties + ✅ equals true +pass false toThrowErrorMatchingInlineSnapshot + ✅ with snapshot +pass true toMatchSnapshot + ✅ without properties +printPropertiesAndReceived + ✅ omit missing properties +printSnapshotAndReceived backtick + ✅ single line expected and received +printSnapshotAndReceived empty string + ✅ expected and received single line + ✅ received and expected multi line +printSnapshotAndReceived escape + ✅ double quote marks in string + ✅ backslash in multi line string + ✅ backslash in single line string + ✅ regexp +printSnapshotAndReceived expand + ✅ false + ✅ true +printSnapshotAndReceived + ✅ fallback to line diff + ✅ multi line small change in one line and other is unchanged + ✅ multi line small changes + ✅ single line large changes +printSnapshotAndReceived has no common after clean up chaff + ✅ array + ✅ string single line +printSnapshotAndReceived MAX_DIFF_STRING_LENGTH unquoted + ✅ both are less + ✅ expected is more + ✅ received is more +printSnapshotAndReceived MAX_DIFF_STRING_LENGTH quoted + ✅ both are less + ✅ expected is more + ✅ received is more +printSnapshotAndReceived isLineDiffable false + ✅ asymmetric matcher + ✅ boolean + ✅ date + ✅ error + ✅ function + ✅ number +printSnapshotAndReceived isLineDiffable true + ✅ array + ✅ object + ✅ single line expected and received + ✅ single line expected and multi line received +printSnapshotAndReceived ignore indentation + ✅ markup delete + ✅ markup fall back + ✅ markup insert +printSnapshotAndReceived ignore indentation object + ✅ delete + ✅ insert +printSnapshotAndReceived without serialize + ✅ backtick single line expected and received + ✅ backtick single line expected and multi line received + ✅ has no common after clean up chaff multi line + ✅ has no common after clean up chaff single line + ✅ prettier/pull/5590 +``` +### ✅ packages/jest-snapshot/src/__tests__/SnapshotResolver.test.ts +``` +defaults + ✅ returns cached object if called multiple times + ✅ resolveSnapshotPath() + ✅ resolveTestPath() +custom resolver in project config + ✅ returns cached object if called multiple times + ✅ resolveSnapshotPath() + ✅ resolveTestPath() +malformed custom resolver in project config + ✅ missing resolveSnapshotPath throws + ✅ missing resolveTestPath throws + ✅ missing testPathForConsistencyCheck throws + ✅ inconsistent functions throws +``` +### ✅ packages/jest-snapshot/src/__tests__/throwMatcher.test.ts +``` +✅ throw matcher can take func +throw matcher from promise + ✅ can take error + ✅ can take custom error +``` +### ✅ packages/jest-snapshot/src/__tests__/utils.test.ts +``` +✅ keyToTestName() +✅ testNameToKey +✅ saveSnapshotFile() works with +✅ saveSnapshotFile() works with +✅ getSnapshotData() throws when no snapshot version +✅ getSnapshotData() throws for older snapshot version +✅ getSnapshotData() throws for newer snapshot version +✅ getSnapshotData() does not throw for when updating +✅ getSnapshotData() marks invalid snapshot dirty when updating +✅ getSnapshotData() marks valid snapshot not dirty when updating +✅ escaping +✅ serialize handles \r\n +ExtraLineBreaks + ✅ 0 empty string + ✅ 1 line has double quote marks at edges + ✅ 1 line has spaces at edges + ✅ 2 lines both are blank + ✅ 2 lines have double quote marks at edges + ✅ 2 lines first is blank + ✅ 2 lines last is blank +removeLinesBeforeExternalMatcherTrap + ✅ contains external matcher trap + ✅ doesn't contain external matcher trap +DeepMerge with property matchers + ✅ Correctly merges a nested object + ✅ Correctly merges an object with an array of objects + ✅ Correctly merges an object with an array of strings + ✅ Correctly merges an array of objects + ✅ Correctly merges an array of arrays +``` +### ✅ packages/jest-source-map/src/__tests__/getCallsite.test.ts +``` +getCallsite + ✅ without source map + ✅ ignores errors when fs throws + ✅ reads source map file to determine line and column +``` +### ✅ packages/jest-test-result/src/__tests__/formatTestResults.test.ts +``` +formatTestResults + ✅ includes test full name +``` +### ✅ packages/jest-test-sequencer/src/__tests__/test_sequencer.test.js +``` +✅ sorts by file size if there is no timing information +✅ sorts based on timing information +✅ sorts based on failures and timing information +✅ sorts based on failures, timing information and file size +✅ writes the cache based on results without existing cache +✅ returns failed tests in sorted order +✅ writes the cache based on the results +✅ works with multiple contexts +``` +### ✅ packages/jest-transform/src/__tests__/ScriptTransformer.test.ts +``` +ScriptTransformer + ✅ transforms a file properly + ✅ does not transform Node core modules + ✅ throws an error if `process` doesn't return a string or an objectcontaining `code` key with processed string + ✅ throws an error if `process` doesn't defined + ✅ throws an error if createTransformer returns object without `process` method + ✅ shouldn't throw error without process method. But with corrent createTransformer method + ✅ uses the supplied preprocessor + ✅ uses multiple preprocessors + ✅ writes source map if preprocessor supplies it + ✅ writes source map if preprocessor inlines it + ✅ warns of unparseable inlined source maps from the preprocessor + ✅ writes source maps if given by the transformer + ✅ does not write source map if not given by the transformer + ✅ should write a source map for the instrumented file when transformed + ✅ should write a source map for the instrumented file when not transformed + ✅ passes expected transform options to getCacheKey + ✅ creates transformer with config + ✅ reads values from the cache + ✅ reads values from the cache when the file contains colons + ✅ should reuse the value from in-memory cache which is set by custom transformer + ✅ does not reuse the in-memory cache between different projects + ✅ preload transformer when using `preloadTransformer` +``` +### ✅ packages/jest-transform/src/__tests__/shouldInstrument.test.ts +``` +shouldInstrument should return true + ✅ when testRegex is provided and file is not a test file + ✅ when more than one testRegex is provided and filename is not a test file + ✅ when testMatch is provided and file is not a test file + ✅ when testPathIgnorePatterns is provided and file is not a test file + ✅ when more than one testPathIgnorePatterns is provided and filename is not a test file + ✅ when testRegex and testPathIgnorePatterns are provided and file is not a test file + ✅ when testMatch and testPathIgnorePatterns are provided and file is not a test file + ✅ should return true when file is in collectCoverageOnlyFrom when provided + ✅ should return true when filename matches collectCoverageFrom + ✅ should return true if the file is not in coveragePathIgnorePatterns + ✅ should return true if file is a testfile but forceCoverageMatch is set +shouldInstrument should return false + ✅ if collectCoverage is falsy + ✅ when testRegex is provided and filename is a test file + ✅ when more than one testRegex is provided and filename matches one of the patterns + ✅ when testMatch is provided and file is a test file + ✅ when testRegex and testPathIgnorePatterns are provided and filename is a test file + ✅ when testMatch and testPathIgnorePatterns are provided and file is a test file + ✅ when file is not in collectCoverageOnlyFrom when provided + ✅ when filename does not match collectCoverageFrom + ✅ if the file is in coveragePathIgnorePatterns + ✅ if file is in mock patterns + ✅ if file is a globalSetup file + ✅ if file is globalTeardown file + ✅ if file is in setupFiles + ✅ if file is in setupFilesAfterEnv +``` +### ✅ packages/jest-util/src/__tests__/createProcessObject.test.ts +``` +✅ creates a process object that looks like the original one +✅ fakes require("process") so it is equal to "global.process" +✅ checks that process.env works as expected on Linux platforms +✅ checks that process.env works as expected in Windows platforms +``` +### ✅ packages/jest-util/src/__tests__/deepCyclicCopy.test.ts +``` +✅ returns the same value for primitive or function values +✅ does not execute getters/setters, but copies them +✅ copies symbols +✅ copies arrays as array objects +✅ handles cyclic dependencies +✅ uses the blacklist to avoid copying properties on the first level +✅ does not keep the prototype by default when top level is object +✅ does not keep the prototype by default when top level is array +✅ does not keep the prototype of arrays when keepPrototype = false +✅ keeps the prototype of arrays when keepPrototype = true +✅ does not keep the prototype for objects when keepPrototype = false +✅ keeps the prototype for objects when keepPrototype = true +``` +### ✅ packages/jest-util/src/__tests__/errorWithStack.test.ts +``` +ErrorWithStack + ✅ calls Error.captureStackTrace with given callsite when capture exists +``` +### ✅ packages/jest-util/src/__tests__/formatTime.test.ts +``` +✅ defaults to milliseconds +✅ formats seconds properly +✅ formats milliseconds properly +✅ formats microseconds properly +✅ formats nanoseconds properly +✅ interprets lower than lowest powers as nanoseconds +✅ interprets higher than highest powers as seconds +✅ interprets non-multiple-of-3 powers as next higher prefix +✅ formats the quantity properly when pad length is lower +✅ formats the quantity properly when pad length is equal +✅ left pads the quantity properly when pad length is higher +``` +### ✅ packages/jest-util/src/__tests__/globsToMatcher.test.ts +``` +✅ works like micromatch with only positive globs +✅ works like micromatch with a mix of overlapping positive and negative globs +✅ works like micromatch with only negative globs +✅ works like micromatch with empty globs +``` +### ✅ packages/jest-util/src/__tests__/installCommonGlobals.test.ts +``` +✅ returns the passed object +✅ turns a V8 global object into a Node global object +``` +### ✅ packages/jest-util/src/__tests__/isInteractive.test.ts +``` +✅ Returns true when running on interactive environment +✅ Returns false when running on a non-interactive environment +``` +### ✅ packages/jest-util/src/__tests__/isPromise.test.ts +``` +not a Promise: + ✅ undefined + ✅ null + ✅ true + ✅ 42 + ✅ "1337" + ✅ Symbol() + ✅ [] + ✅ {} +✅ a resolved Promise +✅ a rejected Promise +``` +### ✅ packages/jest-validate/src/__tests__/validate.test.ts +``` +✅ recursively validates default Jest config +✅ recursively validates default jest-validate config +✅ pretty prints valid config for Boolean +✅ pretty prints valid config for Array +✅ pretty prints valid config for String +✅ pretty prints valid config for Object +✅ pretty prints valid config for Function +✅ omits null and undefined config values +✅ recursively omits null and undefined config values +✅ treat async and non-async functions as equivalent +✅ treat async and non-async functions as equivalent +✅ treat async and non-async functions as equivalent +✅ treat async and non-async functions as equivalent +✅ respects recursiveDenylist +✅ displays warning for unknown config options +✅ displays warning for deprecated config options +✅ works with custom warnings +✅ works with custom errors +✅ works with custom deprecations +✅ works with multiple valid types +✅ reports errors nicely when failing with multiple valid options +✅ Repeated types within multiple valid examples are coalesced in error report +✅ Comments in config JSON using "//" key are not warned +``` +### ✅ packages/jest-validate/src/__tests__/validateCLIOptions.test.js +``` +✅ validates yargs special options +✅ validates testURL +✅ fails for unknown option +✅ fails for multiple unknown options +✅ does not show suggestion when unrecognized cli param length <= 1 +✅ shows suggestion when unrecognized cli param length > 1 +``` +### ✅ packages/jest-watcher/src/lib/__tests__/formatTestNameByPattern.test.ts +``` +for multiline test name returns + ✅ test name with highlighted pattern and replaced line breaks +for one line test name with pattern in the head returns + ✅ test name with highlighted pattern + ✅ test name with cutted tail and highlighted pattern + ✅ test name with cutted tail and cutted highlighted pattern +for one line test name pattern in the middle + ✅ test name with highlighted pattern returns + ✅ test name with cutted tail and highlighted pattern + ✅ test name with cutted tail and cutted highlighted pattern + ✅ test name with highlighted cutted +for one line test name pattern in the tail returns + ✅ test name with highlighted pattern + ✅ test name with cutted tail and cutted highlighted pattern + ✅ test name with highlighted cutted +``` +### ✅ packages/jest-watcher/src/lib/__tests__/prompt.test.ts +``` +✅ calls handler on change value +✅ calls handler on success prompt +✅ calls handler on cancel prompt +``` +### ✅ packages/jest-watcher/src/lib/__tests__/scroll.test.ts +``` +✅ When offset is -1 +✅ When offset is in the first set of items +✅ When offset is in the middle of the list +✅ When offset is at the end of the list +✅ When offset is at the end and size is smaller than max +``` +### ✅ packages/jest-worker/src/__tests__/Farm.test.js +``` +Farm + ✅ sends a request to one worker + ✅ sends four requests to four unique workers + ✅ handles null computeWorkerKey, sending to first worker + ✅ sends the same worker key to the same worker + ✅ returns the result if the call worked + ✅ throws if the call failed + ✅ checks that once a sticked task finishes, next time is sent to that worker + ✅ checks that even before a sticked task finishes, next time is sent to that worker + ✅ checks that locking works, and jobs are never lost + ✅ can receive custom messages from workers +``` +### ✅ packages/jest-worker/src/__tests__/FifoQueue.test.js +``` +✅ returns the shared tasks in FIFO ordering +✅ returns the worker specific tasks in FIFO ordering +✅ maintains global FIFO ordering between worker specific and shared tasks +``` +### ✅ packages/jest-worker/src/__tests__/index.test.js +``` +✅ exposes the right API using default working +✅ exposes the right API using passed worker +✅ breaks if any of the forbidden methods is tried to be exposed +✅ works with minimal options +✅ does not let make calls after the farm is ended +✅ does not let end the farm after it is ended +✅ calls doWork +✅ calls getStderr and getStdout from worker +``` +### ✅ packages/jest-worker/src/__tests__/PriorityQueue.test.js +``` +✅ returns the tasks in order +✅ returns the task with the lowest priority value if inserted in reversed order +✅ returns the task with the lowest priority value if inserted in correct order +✅ uses different queues for each worker +✅ process task in the global and shared queue in order +``` +### ✅ packages/jest-worker/src/__tests__/process-integration.test.js +``` +Jest Worker Integration + ✅ calls a single method from the worker + ✅ distributes sequential calls across child processes + ✅ schedules the task on the first available child processes if the scheduling policy is in-order + ✅ distributes concurrent calls across child processes + ✅ sticks parallel calls to children +``` +### ✅ packages/jest-worker/src/__tests__/thread-integration.test.js +``` +Jest Worker Process Integration + ✅ calls a single method from the worker + ✅ distributes sequential calls across child processes + ✅ schedules the task on the first available child processes if the scheduling policy is in-order + ✅ schedules the task on the first available child processes + ✅ distributes concurrent calls across child processes + ✅ sticks parallel calls to children +``` +### ✅ packages/jest-worker/src/__tests__/WorkerPool.test.js +``` +WorkerPool + ✅ should create a ChildProcessWorker and send to it + ✅ should create a NodeThreadWorker and send to it + ✅ should avoid NodeThreadWorker if not passed enableWorkerThreads +``` +### ✅ packages/jest-worker/src/base/__tests__/BaseWorkerPool.test.js +``` +BaseWorkerPool + ✅ throws error when createWorker is not defined + ✅ creates and exposes n workers + ✅ creates and expoeses n workers + ✅ creates workers with the right options + ✅ makes a non-existing relative worker throw + ✅ create multiple workers with unique worker ids + ✅ aggregates all stdouts and stderrs from all workers + ✅ works when stdout and stderr are not piped to the parent +BaseWorkerPool end + ✅ ends all workers + ✅ resolves with forceExited=false if workers exited gracefully + ✅ force exits workers that do not exit gracefully and resolves with forceExited=true +``` +### ✅ packages/jest-worker/src/workers/__tests__/ChildProcessWorker.test.js +``` +✅ passes fork options down to child_process.fork, adding the defaults +✅ passes workerId to the child process and assign it to 1-indexed env.JEST_WORKER_ID +✅ initializes the child process with the given workerPath +✅ stops initializing the worker after the amount of retries is exceeded +✅ provides stdout and stderr from the child processes +✅ sends the task to the child process +✅ resends the task to the child process after a retry +✅ calls the onProcessStart method synchronously if the queue is empty +✅ can send multiple messages to parent +✅ creates error instances for known errors +✅ throws when the child process returns a strange message +✅ does not restart the child if it cleanly exited +✅ resolves waitForExit() after the child process cleanly exited +✅ restarts the child when the child process dies +✅ sends SIGTERM when forceExit() is called +✅ sends SIGKILL some time after SIGTERM +✅ does not send SIGKILL if SIGTERM exited the process +``` +### ✅ packages/jest-worker/src/workers/__tests__/NodeThreadsWorker.test.js +``` +✅ passes fork options down to child_process.fork, adding the defaults +✅ passes workerId to the thread and assign it to env.JEST_WORKER_ID +✅ initializes the thread with the given workerPath +✅ stops initializing the worker after the amount of retries is exceeded +✅ provides stdout and stderr from the threads +✅ sends the task to the thread +✅ resends the task to the thread after a retry +✅ calls the onProcessStart method synchronously if the queue is empty +✅ can send multiple messages to parent +✅ creates error instances for known errors +✅ throws when the thread returns a strange message +✅ does not restart the thread if it cleanly exited +✅ resolves waitForExit() after the thread cleanly exited +✅ restarts the thread when the thread dies +✅ terminates the thread when forceExit() is called +``` +### ✅ packages/jest-worker/src/workers/__tests__/processChild.test.js +``` +✅ lazily requires the file +✅ calls initialize with the correct arguments +✅ returns results immediately when function is synchronous +✅ returns results when it gets resolved if function is asynchronous +✅ calls the main module if the method call is "default" +✅ calls the main export if the method call is "default" and it is a Babel transpiled one +✅ removes the message listener on END message +✅ calls the teardown method +✅ throws if an invalid message is detected +✅ throws if child is not forked +``` +### ✅ packages/jest-worker/src/workers/__tests__/threadChild.test.js +``` +✅ lazily requires the file +✅ calls initialize with the correct arguments +✅ returns results immediately when function is synchronous +✅ returns results when it gets resolved if function is asynchronous +✅ calls the main module if the method call is "default" +✅ calls the main export if the method call is "default" and it is a Babel transpiled one +✅ removes the message listener on END message +✅ calls the teardown method +✅ throws if an invalid message is detected +✅ throws if child is not forked +``` +### ✅ packages/pretty-format/src/__tests__/AsymmetricMatcher.test.ts +``` +✅ supports any(String) +✅ supports nested any(String) +✅ supports any(Function) +✅ supports nested any(Function) +✅ supports any(Array) +✅ supports nested any(Array) +✅ supports any(Object) +✅ supports nested any(Object) +✅ supports any(RegExp) +✅ supports nested any(RegExp) +✅ supports any(Symbol) +✅ supports nested any(Symbol) +✅ supports any(Function) +✅ supports nested any(Function) +✅ supports any() +✅ supports nested any() +✅ supports any(namedFuntction) +✅ supports nested any(namedFuntction) +✅ anything() +✅ arrayContaining() +✅ arrayNotContaining() +✅ objectContaining() +✅ objectNotContaining() +✅ stringContaining(string) +✅ not.stringContaining(string) +✅ stringMatching(string) +✅ stringMatching(regexp) +✅ stringMatching(regexp) {escapeRegex: false} +✅ stringMatching(regexp) {escapeRegex: true} +✅ stringNotMatching(string) +✅ supports multiple nested asymmetric matchers +✅ min option +indent option + ✅ default implicit: 2 spaces + ✅ default explicit: 2 spaces + ✅ non-default: 0 spaces + ✅ non-default: 4 spaces +maxDepth option + ✅ matchers as leaf nodes + ✅ matchers as internal nodes +``` +### ✅ packages/pretty-format/src/__tests__/ConvertAnsi.test.ts +``` +ConvertAnsi plugin + ✅ supports style.red + ✅ supports style.green + ✅ supports style.reset + ✅ supports style.bold + ✅ supports style.dim + ✅ does not support other colors +``` +### ✅ packages/pretty-format/src/__tests__/DOMCollection.test.ts +``` +DOMCollection plugin for object properties + ✅ supports DOMStringMap + ✅ supports NamedNodeMap + ✅ supports config.min option +DOMCollection plugin for list items + ✅ supports HTMLCollection for getElementsByTagName + ✅ supports HTMLCollection for children + ✅ supports config.maxDepth option + ✅ supports NodeList for querySelectorAll + ✅ supports NodeList for childNodes + ✅ supports HTMLOptionsCollection for select options + ✅ supports HTMLCollection for form elements +``` +### ✅ packages/pretty-format/src/__tests__/DOMElement.test.ts +``` +pretty-format + ✅ prints global window as constructor name alone +DOMElement Plugin + ✅ supports a single HTML element + ✅ supports an HTML element with a class property + ✅ supports an HTML element with a title property + ✅ escapes double quote in attribute value + ✅ supports an HTML element with a single attribute + ✅ supports an HTML element with multiple attributes + ✅ supports an HTML element with attribute and text content + ✅ supports an element with text content + ✅ supports nested elements + ✅ supports nested elements with attributes + ✅ supports nested elements with attribute and text content + ✅ supports nested elements with text content + ✅ supports siblings + ✅ supports multiline text node in pre + ✅ supports multiline text node preceding span in pre + ✅ supports multiline text node in textarea + ✅ supports empty text node + ✅ supports non-empty text node + ✅ supports comment node + ✅ supports fragment node + ✅ supports custom elements + ✅ supports SVG elements + ✅ supports indentation for array of elements + ✅ supports maxDepth option + ✅ handles `tagName` not being a string +DOMElement Plugin matches constructor name of SVG elements + ✅ jsdom 9 and 10 + ✅ jsdom 11 +``` +### ✅ packages/pretty-format/src/__tests__/Immutable.test.ts +``` +✅ does not incorrectly match identity-obj-proxy as Immutable object +Immutable.OrderedSet + ✅ supports an empty collection {min: true} + ✅ supports an empty collection {min: false} + ✅ supports a single string element + ✅ supports a single integer element + ✅ supports multiple string elements {min: true} + ✅ supports multiple string elements {min: false} + ✅ supports multiple integer elements {min: true} + ✅ supports multiple integer elements {min: false} + ✅ supports object elements {min: true} + ✅ supports object elements {min: false} + ✅ supports React elements {min: true} + ✅ supports React elements {min: false} +Immutable.List + ✅ supports an empty collection {min: true} + ✅ supports an empty collection {min: false} + ✅ supports a single string element + ✅ supports a single integer element + ✅ supports multiple string elements {min: true} + ✅ supports multiple string elements {min: false} + ✅ supports multiple integer elements {min: true} + ✅ supports multiple integer elements {min: false} + ✅ supports object elements {min: true} + ✅ supports object elements {min: false} + ✅ supports React elements {min: true} + ✅ supports React elements {min: false} +Immutable.Stack + ✅ supports an empty collection {min: true} + ✅ supports an empty collection {min: false} + ✅ supports a single string element + ✅ supports a single integer element + ✅ supports multiple string elements {min: true} + ✅ supports multiple string elements {min: false} + ✅ supports multiple integer elements {min: true} + ✅ supports multiple integer elements {min: false} + ✅ supports object elements {min: true} + ✅ supports object elements {min: false} + ✅ supports React elements {min: true} + ✅ supports React elements {min: false} +Immutable.Set + ✅ supports an empty collection {min: true} + ✅ supports an empty collection {min: false} + ✅ supports a single string element + ✅ supports a single integer element + ✅ supports multiple string elements {min: true} + ✅ supports multiple string elements {min: false} + ✅ supports multiple integer elements {min: true} + ✅ supports multiple integer elements {min: false} + ✅ supports object elements {min: true} + ✅ supports object elements {min: false} + ✅ supports React elements {min: true} + ✅ supports React elements {min: false} +Immutable.Map + ✅ supports an empty collection {min: true} + ✅ supports an empty collection {min: false} + ✅ supports an object with single key + ✅ supports an object with multiple keys {min: true} + ✅ supports an object with multiple keys {min: false} + ✅ supports object elements {min: true} + ✅ supports object elements {min: false} + ✅ supports React elements {min: true} + ✅ supports React elements {min: false} +Immutable.OrderedMap + ✅ supports an empty collection {min: true} + ✅ supports an empty collection {min: false} + ✅ supports an object with single key + ✅ supports an object with multiple keys {min: true} + ✅ supports an object with multiple keys {min: false} + ✅ supports object elements {min: true} + ✅ supports object elements {min: false} + ✅ supports React elements {min: true} + ✅ supports React elements {min: false} + ✅ supports non-string keys +Immutable.Record + ✅ supports an empty record {min: true} + ✅ supports an empty record {min: false} + ✅ supports a record with descriptive name + ✅ supports a record without descriptive name + ✅ supports a record with values {min: true} + ✅ supports a record with values {min: false} + ✅ supports a record with Map value {min: true} + ✅ supports a record with Map value {min: false} + ✅ supports imbricated Record {min: true} + ✅ supports imbricated Record {min: false} +indentation of heterogeneous collections + ✅ empty Immutable.List as child of Object + ✅ empty Immutable.Map as child of Array + ✅ non-empty Array as child of Immutable.Map + ✅ non-empty Object as child of Immutable.List +indent option + ✅ default implicit: 2 spaces + ✅ default explicit: 2 spaces + ✅ non-default: 0 spaces + ✅ non-default: 4 spaces +maxDepth option + ✅ Immutable.List as child of Object + ✅ Immutable.Map as child of Array + ✅ Immutable.Seq as child of Immutable.Map + ✅ Immutable.Map as descendants in immutable collection +Immutable.Seq + ✅ supports an empty sequence from array {min: true} + ✅ supports an empty sequence from array {min: false} + ✅ supports a non-empty sequence from array {min: true} + ✅ supports a non-empty sequence from array {min: false} + ✅ supports a non-empty sequence from arguments + ✅ supports an empty sequence from object {min: true} + ✅ supports an empty sequence from object {min: false} + ✅ supports a non-empty sequence from object {min: true} + ✅ supports a non-empty sequence from object {min: false} + ✅ supports a sequence of entries from Immutable.Map + ✅ supports a sequence of values from ECMAScript Set + ✅ supports a sequence of values from Immutable.List + ✅ supports a sequence of values from Immutable.Set + ✅ supports a sequence of values from Immutable.Stack +Immutable.Seq lazy entries + ✅ from object properties + ✅ from Immutable.Map entries +Immutable.Seq lazy values + ✅ from Immutable.Range + ✅ from iterator + ✅ from array items + ✅ from Immutable.List values + ✅ from ECMAScript Set values +``` +### ✅ packages/pretty-format/src/__tests__/prettyFormat.test.ts +``` +prettyFormat() + ✅ prints empty arguments + ✅ prints arguments + ✅ prints an empty array + ✅ prints an array with items + ✅ prints a empty typed array + ✅ prints a typed array with items + ✅ prints an array buffer + ✅ prints a nested array + ✅ prints true + ✅ prints false + ✅ prints an error + ✅ prints a typed error with a message + ✅ prints a function constructor + ✅ prints an anonymous callback function + ✅ prints an anonymous assigned function + ✅ prints a named function + ✅ prints a named generator function + ✅ can customize function names + ✅ prints Infinity + ✅ prints -Infinity + ✅ prints an empty map + ✅ prints a map with values + ✅ prints a map with non-string keys + ✅ prints NaN + ✅ prints null + ✅ prints a positive number + ✅ prints a negative number + ✅ prints zero + ✅ prints negative zero + ✅ prints a positive bigint + ✅ prints a negative bigint + ✅ prints zero bigint + ✅ prints negative zero bigint + ✅ prints a date + ✅ prints an invalid date + ✅ prints an empty object + ✅ prints an object with properties + ✅ prints an object with properties and symbols + ✅ prints an object without non-enumerable properties which have string key + ✅ prints an object without non-enumerable properties which have symbol key + ✅ prints an object with sorted properties + ✅ prints regular expressions from constructors + ✅ prints regular expressions from literals + ✅ prints regular expressions {escapeRegex: false} + ✅ prints regular expressions {escapeRegex: true} + ✅ escapes regular expressions nested inside object + ✅ prints an empty set + ✅ prints a set with values + ✅ prints a string + ✅ prints and escape a string + ✅ doesn't escape string with {excapeString: false} + ✅ prints a string with escapes + ✅ prints a multiline string + ✅ prints a multiline string as value of object property + ✅ prints a symbol + ✅ prints undefined + ✅ prints a WeakMap + ✅ prints a WeakSet + ✅ prints deeply nested objects + ✅ prints circular references + ✅ prints parallel references + ✅ can customize the max depth + ✅ throws on invalid options + ✅ supports plugins + ✅ supports plugins that return empty string + ✅ throws if plugin does not return a string + ✅ throws PrettyFormatPluginError if test throws an error + ✅ throws PrettyFormatPluginError if print throws an error + ✅ throws PrettyFormatPluginError if serialize throws an error + ✅ supports plugins with deeply nested arrays (#24) + ✅ should call plugins on nested basic values + ✅ prints objects with no constructor + ✅ prints identity-obj-proxy with string constructor + ✅ calls toJSON and prints its return value + ✅ calls toJSON and prints an internal representation. + ✅ calls toJSON only on functions + ✅ does not call toJSON recursively + ✅ calls toJSON on Sets + ✅ disables toJSON calls through options +prettyFormat() indent option + ✅ default implicit: 2 spaces + ✅ default explicit: 2 spaces + ✅ non-default: 0 spaces + ✅ non-default: 4 spaces +prettyFormat() min + ✅ prints some basic values in min mode + ✅ prints some complex values in min mode + ✅ does not allow indent !== 0 in min mode +``` +### ✅ packages/pretty-format/src/__tests__/react.test.tsx +``` +✅ supports a single element with no props or children +✅ supports a single element with non-empty string child +✅ supports a single element with empty string child +✅ supports a single element with non-zero number child +✅ supports a single element with zero number child +✅ supports a single element with mixed children +✅ supports props with strings +✅ supports props with multiline strings +✅ supports props with numbers +✅ supports a single element with a function prop +✅ supports a single element with a object prop +✅ supports an element with and object prop and children +✅ supports an element with complex props and mixed children +✅ escapes children properly +✅ supports everything all together +✅ sorts props in nested components +✅ supports a single element with React elements as props +✅ supports a single element with React elements with props +✅ supports a single element with custom React elements with props +✅ supports a single element with custom React elements with props (using displayName) +✅ supports a single element with custom React elements with props (using anonymous function) +✅ supports a single element with custom React elements with a child +✅ supports undefined element type +✅ supports a fragment with no children +✅ supports a fragment with string child +✅ supports a fragment with element child +✅ supports suspense +✅ supports a single element with React elements with a child +✅ supports a single element with React elements with children +✅ supports a single element with React elements with array children +✅ supports array of elements +✅ min option +✅ ReactElement plugin highlights syntax +✅ ReactTestComponent plugin highlights syntax +✅ throws if theme option is null +✅ throws if theme option is not of type "object" +✅ throws if theme option has value that is undefined in ansi-styles +✅ ReactElement plugin highlights syntax with color from theme option +✅ ReactTestComponent plugin highlights syntax with color from theme option +✅ supports forwardRef with a child +✅ supports context Provider with a child +✅ supports context Consumer with a child +✅ ReactElement removes undefined props +✅ ReactTestComponent removes undefined props +test object for subset match + ✅ undefined props + ✅ undefined children +indent option + ✅ default implicit: 2 spaces + ✅ default explicit: 2 spaces + ✅ non-default: 0 spaces + ✅ non-default: 4 spaces +maxDepth option + ✅ elements + ✅ array of elements +React.memo without displayName + ✅ renders the component name +React.memo with displayName + ✅ renders the displayName of component before memoizing + ✅ renders the displayName of memoized component +``` +### ✅ packages/pretty-format/src/__tests__/ReactElement.test.ts +``` +ReactElement Plugin + ✅ serializes forwardRef without displayName + ✅ serializes forwardRef with displayName + ✅ serializes forwardRef component with displayName ``` \ No newline at end of file diff --git a/__tests__/__outputs__/junit-with-message.md b/__tests__/__outputs__/junit-with-message.md index 948309a..634a402 100644 --- a/__tests__/__outputs__/junit-with-message.md +++ b/__tests__/__outputs__/junit-with-message.md @@ -1,13 +1,13 @@ ![Tests failed](https://img.shields.io/badge/tests-1%20failed-critical) |Report|Passed|Failed|Skipped|Time| |:---|---:|---:|---:|---:| -|fixtures/junit-with-message.xml||1 ❌||1ms| -## ❌ fixtures/junit-with-message.xml +|[fixtures/junit-with-message.xml](#user-content-r0)||1 ❌||1ms| +## ❌ fixtures/junit-with-message.xml **1** tests were completed in **1ms** with **0** passed, **1** failed and **0** skipped. |Test suite|Passed|Failed|Skipped|Time| |:---|---:|---:|---:|---:| -|[Test](#r0s0)||1 ❌||1ms| -### ❌ Test +|[Test](#user-content-r0s0)||1 ❌||1ms| +### ❌ Test ``` Fails ❌ Test diff --git a/__tests__/__outputs__/mocha-json.md b/__tests__/__outputs__/mocha-json.md index 7474b54..875f881 100644 --- a/__tests__/__outputs__/mocha-json.md +++ b/__tests__/__outputs__/mocha-json.md @@ -1,14 +1,14 @@ ![Tests failed](https://img.shields.io/badge/tests-1%20passed%2C%204%20failed%2C%201%20skipped-critical) |Report|Passed|Failed|Skipped|Time| |:---|---:|---:|---:|---:| -|fixtures/mocha-json.json|1 ✅|4 ❌|1 ⚪|12ms| -## ❌ fixtures/mocha-json.json +|[fixtures/mocha-json.json](#user-content-r0)|1 ✅|4 ❌|1 ⚪|12ms| +## ❌ fixtures/mocha-json.json **6** tests were completed in **12ms** with **1** passed, **4** failed and **1** skipped. |Test suite|Passed|Failed|Skipped|Time| |:---|---:|---:|---:|---:| -|[test/main.test.js](#r0s0)|1 ✅|3 ❌||1ms| -|[test/second.test.js](#r0s1)||1 ❌|1 ⚪|8ms| -### ❌ test/main.test.js +|[test/main.test.js](#user-content-r0s0)|1 ✅|3 ❌||1ms| +|[test/second.test.js](#user-content-r0s1)||1 ❌|1 ⚪|8ms| +### ❌ test/main.test.js ``` Test 1 ✅ Passing test @@ -24,7 +24,7 @@ Test 2 ❌ Exception in test Some error ``` -### ❌ test/second.test.js +### ❌ test/second.test.js ``` ⚪ Skipped test ❌ Timeout test diff --git a/__tests__/__outputs__/mocha-test-results.md b/__tests__/__outputs__/mocha-test-results.md index 4fe3802..4a6e2f6 100644 --- a/__tests__/__outputs__/mocha-test-results.md +++ b/__tests__/__outputs__/mocha-test-results.md @@ -3,48 +3,48 @@ |Report|Passed|Failed|Skipped|Time| |:---|---:|---:|---:|---:| -|fixtures/external/mocha/mocha-test-results.json|833 ✅||6 ⚪|6s| -## ✅ fixtures/external/mocha/mocha-test-results.json +|[fixtures/external/mocha/mocha-test-results.json](#user-content-r0)|833 ✅||6 ⚪|6s| +## ✅ fixtures/external/mocha/mocha-test-results.json **839** tests were completed in **6s** with **833** passed, **0** failed and **6** skipped. |Test suite|Passed|Failed|Skipped|Time| |:---|---:|---:|---:|---:| -|[test/node-unit/buffered-worker-pool.spec.js](#r0s0)|14 ✅|||8ms| -|[test/node-unit/cli/config.spec.js](#r0s1)|10 ✅|||8ms| -|[test/node-unit/cli/node-flags.spec.js](#r0s2)|105 ✅|||9ms| -|[test/node-unit/cli/options.spec.js](#r0s3)|36 ✅|||250ms| -|[test/node-unit/cli/run-helpers.spec.js](#r0s4)|9 ✅|||8ms| -|[test/node-unit/cli/run.spec.js](#r0s5)|40 ✅|||4ms| -|[test/node-unit/mocha.spec.js](#r0s6)|24 ✅|||33ms| -|[test/node-unit/parallel-buffered-runner.spec.js](#r0s7)|19 ✅|||23ms| -|[test/node-unit/reporters/parallel-buffered.spec.js](#r0s8)|6 ✅|||16ms| -|[test/node-unit/serializer.spec.js](#r0s9)|40 ✅|||31ms| -|[test/node-unit/stack-trace-filter.spec.js](#r0s10)|2 ✅||4 ⚪|1ms| -|[test/node-unit/utils.spec.js](#r0s11)|5 ✅|||1ms| -|[test/node-unit/worker.spec.js](#r0s12)|15 ✅|||92ms| -|[test/unit/context.spec.js](#r0s13)|8 ✅|||5ms| -|[test/unit/duration.spec.js](#r0s14)|3 ✅|||166ms| -|[test/unit/errors.spec.js](#r0s15)|13 ✅|||5ms| -|[test/unit/globals.spec.js](#r0s16)|4 ✅|||0ms| -|[test/unit/grep.spec.js](#r0s17)|8 ✅|||2ms| -|[test/unit/hook-async.spec.js](#r0s18)|3 ✅|||1ms| -|[test/unit/hook-sync-nested.spec.js](#r0s19)|4 ✅|||1ms| -|[test/unit/hook-sync.spec.js](#r0s20)|3 ✅|||0ms| -|[test/unit/hook-timeout.spec.js](#r0s21)|1 ✅|||0ms| -|[test/unit/hook.spec.js](#r0s22)|4 ✅|||0ms| -|[test/unit/mocha.spec.js](#r0s23)|115 ✅||1 ⚪|128ms| -|[test/unit/overspecified-async.spec.js](#r0s24)|1 ✅|||3ms| -|[test/unit/parse-query.spec.js](#r0s25)|2 ✅|||1ms| -|[test/unit/plugin-loader.spec.js](#r0s26)|41 ✅||1 ⚪|16ms| -|[test/unit/required-tokens.spec.js](#r0s27)|1 ✅|||0ms| -|[test/unit/root.spec.js](#r0s28)|1 ✅|||0ms| -|[test/unit/runnable.spec.js](#r0s29)|55 ✅|||122ms| -|[test/unit/runner.spec.js](#r0s30)|77 ✅|||43ms| -|[test/unit/suite.spec.js](#r0s31)|57 ✅|||14ms| -|[test/unit/test.spec.js](#r0s32)|15 ✅|||0ms| -|[test/unit/throw.spec.js](#r0s33)|9 ✅|||9ms| -|[test/unit/timeout.spec.js](#r0s34)|8 ✅|||109ms| -|[test/unit/utils.spec.js](#r0s35)|75 ✅|||24ms| -### ✅ test/node-unit/buffered-worker-pool.spec.js +|[test/node-unit/buffered-worker-pool.spec.js](#user-content-r0s0)|14 ✅|||8ms| +|[test/node-unit/cli/config.spec.js](#user-content-r0s1)|10 ✅|||8ms| +|[test/node-unit/cli/node-flags.spec.js](#user-content-r0s2)|105 ✅|||9ms| +|[test/node-unit/cli/options.spec.js](#user-content-r0s3)|36 ✅|||250ms| +|[test/node-unit/cli/run-helpers.spec.js](#user-content-r0s4)|9 ✅|||8ms| +|[test/node-unit/cli/run.spec.js](#user-content-r0s5)|40 ✅|||4ms| +|[test/node-unit/mocha.spec.js](#user-content-r0s6)|24 ✅|||33ms| +|[test/node-unit/parallel-buffered-runner.spec.js](#user-content-r0s7)|19 ✅|||23ms| +|[test/node-unit/reporters/parallel-buffered.spec.js](#user-content-r0s8)|6 ✅|||16ms| +|[test/node-unit/serializer.spec.js](#user-content-r0s9)|40 ✅|||31ms| +|[test/node-unit/stack-trace-filter.spec.js](#user-content-r0s10)|2 ✅||4 ⚪|1ms| +|[test/node-unit/utils.spec.js](#user-content-r0s11)|5 ✅|||1ms| +|[test/node-unit/worker.spec.js](#user-content-r0s12)|15 ✅|||92ms| +|[test/unit/context.spec.js](#user-content-r0s13)|8 ✅|||5ms| +|[test/unit/duration.spec.js](#user-content-r0s14)|3 ✅|||166ms| +|[test/unit/errors.spec.js](#user-content-r0s15)|13 ✅|||5ms| +|[test/unit/globals.spec.js](#user-content-r0s16)|4 ✅|||0ms| +|[test/unit/grep.spec.js](#user-content-r0s17)|8 ✅|||2ms| +|[test/unit/hook-async.spec.js](#user-content-r0s18)|3 ✅|||1ms| +|[test/unit/hook-sync-nested.spec.js](#user-content-r0s19)|4 ✅|||1ms| +|[test/unit/hook-sync.spec.js](#user-content-r0s20)|3 ✅|||0ms| +|[test/unit/hook-timeout.spec.js](#user-content-r0s21)|1 ✅|||0ms| +|[test/unit/hook.spec.js](#user-content-r0s22)|4 ✅|||0ms| +|[test/unit/mocha.spec.js](#user-content-r0s23)|115 ✅||1 ⚪|128ms| +|[test/unit/overspecified-async.spec.js](#user-content-r0s24)|1 ✅|||3ms| +|[test/unit/parse-query.spec.js](#user-content-r0s25)|2 ✅|||1ms| +|[test/unit/plugin-loader.spec.js](#user-content-r0s26)|41 ✅||1 ⚪|16ms| +|[test/unit/required-tokens.spec.js](#user-content-r0s27)|1 ✅|||0ms| +|[test/unit/root.spec.js](#user-content-r0s28)|1 ✅|||0ms| +|[test/unit/runnable.spec.js](#user-content-r0s29)|55 ✅|||122ms| +|[test/unit/runner.spec.js](#user-content-r0s30)|77 ✅|||43ms| +|[test/unit/suite.spec.js](#user-content-r0s31)|57 ✅|||14ms| +|[test/unit/test.spec.js](#user-content-r0s32)|15 ✅|||0ms| +|[test/unit/throw.spec.js](#user-content-r0s33)|9 ✅|||9ms| +|[test/unit/timeout.spec.js](#user-content-r0s34)|8 ✅|||109ms| +|[test/unit/utils.spec.js](#user-content-r0s35)|75 ✅|||24ms| +### ✅ test/node-unit/buffered-worker-pool.spec.js ``` class BufferedWorkerPool constructor ✅ should apply defaults @@ -73,7 +73,7 @@ class BufferedWorkerPool static method serializeOptions() when called multiple t class BufferedWorkerPool static method serializeOptions() when passed no arguments ✅ should not throw ``` -### ✅ test/node-unit/cli/config.spec.js +### ✅ test/node-unit/cli/config.spec.js ``` cli/config findConfig() ✅ should look for one of the config files using findup-sync @@ -95,7 +95,7 @@ cli/config loadConfig() when parsing succeeds when supplied a filepath with ".ym cli/config loadConfig() when supplied a filepath with unsupported extension ✅ should use the JSON parser ``` -### ✅ test/node-unit/cli/node-flags.spec.js +### ✅ test/node-unit/cli/node-flags.spec.js ``` node-flags impliesNoTimeouts() ✅ should return true for inspect flags @@ -209,7 +209,7 @@ node-flags unparseNodeFlags() ✅ should handle multiple v8 flags ✅ should handle single v8 flags ``` -### ✅ test/node-unit/cli/options.spec.js +### ✅ test/node-unit/cli/options.spec.js ``` options loadOptions() "extension" handling when user does not supply "extension" option ✅ should retain the default @@ -268,7 +268,7 @@ options loadOptions() when parameter provided rc file when path to config (`--co ✅ should not look for a config ✅ should throw to warn the user ``` -### ✅ test/node-unit/cli/run-helpers.spec.js +### ✅ test/node-unit/cli/run-helpers.spec.js ``` helpers list() when given a comma-delimited string ✅ should return a flat array @@ -287,7 +287,7 @@ helpers validateLegacyPlugin() when used with an "interfaces" key helpers validateLegacyPlugin() when used with an unknown plugin type ✅ should fail ``` -### ✅ test/node-unit/cli/run.spec.js +### ✅ test/node-unit/cli/run.spec.js ``` command run builder array type ✅ should include option extension @@ -334,7 +334,7 @@ command run builder string type ✅ should include option timeout ✅ should include option ui ``` -### ✅ test/node-unit/mocha.spec.js +### ✅ test/node-unit/mocha.spec.js ``` Mocha instance method addFile() ✅ should add the given file to the files array @@ -378,7 +378,7 @@ Mocha instance method unloadFiles() Mocha static method unloadFile() ✅ should unload a specific file from cache ``` -### ✅ test/node-unit/parallel-buffered-runner.spec.js +### ✅ test/node-unit/parallel-buffered-runner.spec.js ``` parallel-buffered-runner ParallelBufferedRunner constructor ✅ should start in "IDLE" state @@ -416,7 +416,7 @@ parallel-buffered-runner ParallelBufferedRunner instance method workerReporter() parallel-buffered-runner ParallelBufferedRunner instance property _state ✅ should disallow an invalid state transition ``` -### ✅ test/node-unit/reporters/parallel-buffered.spec.js +### ✅ test/node-unit/reporters/parallel-buffered.spec.js ``` ParallelBuffered constructor ✅ should listen for Runner events @@ -429,7 +429,7 @@ ParallelBuffered instance method done ✅ should execute its callback with a SerializableWorkerResult ✅ should reset its `events` prop ``` -### ✅ test/node-unit/serializer.spec.js +### ✅ test/node-unit/serializer.spec.js ``` serializer function deserialize when passed a non-object value ✅ should return the value @@ -505,7 +505,7 @@ serializer SerializableWorkerResult static method isSerializedWorkerResult when serializer SerializableWorkerResult static method isSerializedWorkerResult when passed an object without an appropriate `__type` prop ✅ should return `false` ``` -### ✅ test/node-unit/stack-trace-filter.spec.js +### ✅ test/node-unit/stack-trace-filter.spec.js ``` stackTraceFilter() on browser ✅ does not strip out other bower_components @@ -517,7 +517,7 @@ stackTraceFilter() on node on POSIX OS stackTraceFilter() on node on Windows ✅ should work on Windows ``` -### ✅ test/node-unit/utils.spec.js +### ✅ test/node-unit/utils.spec.js ``` utils function canonicalType() ✅ should return "asyncfunction" if the parameter is an async function @@ -528,7 +528,7 @@ utils function type() ✅ should return "error" if the parameter is an Error ✅ should return "function" if the parameter is an async function ``` -### ✅ test/node-unit/worker.spec.js +### ✅ test/node-unit/worker.spec.js ``` worker when run as main process ✅ should throw @@ -557,7 +557,7 @@ worker when run as worker process function run() when the file at "filepath" is worker when run as worker process function run() when the file at "filepath" is loadable when serialization succeeds ✅ should resolve with a SerializedWorkerResult ``` -### ✅ test/unit/context.spec.js +### ✅ test/unit/context.spec.js ``` Context nested ✅ should work @@ -574,7 +574,7 @@ methods slow() methods timeout() ✅ should return the timeout ``` -### ✅ test/unit/duration.spec.js +### ✅ test/unit/duration.spec.js ``` durations when fast ✅ should not highlight @@ -583,7 +583,7 @@ durations when reasonable durations when slow ✅ should highlight in red ``` -### ✅ test/unit/errors.spec.js +### ✅ test/unit/errors.spec.js ``` Errors createForbiddenExclusivityError() when Mocha instance is not running in a worker process ✅ should output a message regarding --forbid-only @@ -608,7 +608,7 @@ Errors warn() ✅ should ignore falsy messages ✅ should not cache messages ``` -### ✅ test/unit/globals.spec.js +### ✅ test/unit/globals.spec.js ``` global leaks ✅ should cause tests to fail @@ -616,7 +616,7 @@ global leaks ✅ should pass when prefixed "mocha-" ✅ should pass with wildcard ``` -### ✅ test/unit/grep.spec.js +### ✅ test/unit/grep.spec.js ``` Mocha .grep() ✅ should add a RegExp to the mocha.options object @@ -631,14 +631,14 @@ Mocha "grep" option Mocha "invert" option ✅ should add a Boolean to the mocha.options object ``` -### ✅ test/unit/hook-async.spec.js +### ✅ test/unit/hook-async.spec.js ``` async hooks ✅ one ✅ three ✅ two ``` -### ✅ test/unit/hook-sync-nested.spec.js +### ✅ test/unit/hook-sync-nested.spec.js ``` serial nested ✅ bar @@ -647,19 +647,19 @@ serial nested hooks ✅ one ✅ two ``` -### ✅ test/unit/hook-sync.spec.js +### ✅ test/unit/hook-sync.spec.js ``` serial hooks ✅ one ✅ three ✅ two ``` -### ✅ test/unit/hook-timeout.spec.js +### ✅ test/unit/hook-timeout.spec.js ``` hook timeout ✅ should work ``` -### ✅ test/unit/hook.spec.js +### ✅ test/unit/hook.spec.js ``` Hook error ✅ should get the hook._error when called without arguments @@ -668,7 +668,7 @@ Hook reset ✅ should call Runnable.reset ✅ should reset the error state ``` -### ✅ test/unit/mocha.spec.js +### ✅ test/unit/mocha.spec.js ``` Mocha constructor ✅ should set _cleanReferencesAfterRun to true @@ -868,18 +868,18 @@ Mocha instance method runGlobalTeardown() when fixture(s) are present Mocha instance method unloadFile() when run in a browser ✅ should throw ``` -### ✅ test/unit/overspecified-async.spec.js +### ✅ test/unit/overspecified-async.spec.js ``` overspecified asynchronous resolution method ✅ should fail when multiple methods are used ``` -### ✅ test/unit/parse-query.spec.js +### ✅ test/unit/parse-query.spec.js ``` parseQuery() ✅ should get queryString and return key-value object ✅ should parse "+" as a space ``` -### ✅ test/unit/plugin-loader.spec.js +### ✅ test/unit/plugin-loader.spec.js ``` plugin module class PluginLoader constructor when passed custom plugins ✅ should register the custom plugins @@ -958,17 +958,17 @@ plugin module root hooks plugin 🎣 when impl is an array plugin module root hooks plugin 🎣 when impl is an object of functions ⚪ should pass validation ``` -### ✅ test/unit/required-tokens.spec.js +### ✅ test/unit/required-tokens.spec.js ``` using imported describe ✅ using imported it ``` -### ✅ test/unit/root.spec.js +### ✅ test/unit/root.spec.js ``` root ✅ should be a valid suite ``` -### ✅ test/unit/runnable.spec.js +### ✅ test/unit/runnable.spec.js ``` Runnable(title, fn) .run(fn) if async ✅ this.skip() should halt synchronous execution @@ -1069,7 +1069,7 @@ Runnable(title, fn) when arity >= 1 ✅ should be .async ✅ should not be .sync ``` -### ✅ test/unit/runner.spec.js +### ✅ test/unit/runner.spec.js ``` Runner instance method _uncaught() when called with a non-Runner context ✅ should throw @@ -1185,7 +1185,7 @@ Runner instance method uncaught() when provided an object argument when argument Runner instance method workerReporter() ✅ should throw ``` -### ✅ test/unit/suite.spec.js +### ✅ test/unit/suite.spec.js ``` Suite instance method addSuite() ✅ adds the suite to the suites collection @@ -1278,7 +1278,7 @@ Test initialization ✅ should not throw if the title is a string ✅ should throw an error if the title isn't a string ``` -### ✅ test/unit/test.spec.js +### ✅ test/unit/test.spec.js ``` Test .clone() ✅ should add/keep the retriedTest value @@ -1300,7 +1300,7 @@ Test .reset() ✅ should call Runnable.reset ✅ should reset the run state ``` -### ✅ test/unit/throw.spec.js +### ✅ test/unit/throw.spec.js ``` a test that throws non-extensible ✅ should not pass if throwing async and test is async @@ -1315,7 +1315,7 @@ a test that throws undefined ✅ should not pass if throwing sync and test is async ✅ should not pass if throwing sync and test is sync ``` -### ✅ test/unit/timeout.spec.js +### ✅ test/unit/timeout.spec.js ``` timeouts ✅ should allow overriding per-test @@ -1333,7 +1333,7 @@ timeouts disabling using beforeEach timeouts disabling using timeout(0) ✅ should suppress timeout(4) ``` -### ✅ test/unit/utils.spec.js +### ✅ test/unit/utils.spec.js ``` lib/utils canonicalType() ✅ should recognize various types diff --git a/__tests__/__outputs__/provider-test-results.md b/__tests__/__outputs__/provider-test-results.md index 36abb6e..172f070 100644 --- a/__tests__/__outputs__/provider-test-results.md +++ b/__tests__/__outputs__/provider-test-results.md @@ -1,28 +1,28 @@ ![Tests failed](https://img.shields.io/badge/tests-268%20passed%2C%201%20failed-critical) |Report|Passed|Failed|Skipped|Time| |:---|---:|---:|---:|---:| -|fixtures/external/flutter/provider-test-results.json|268 ✅|1 ❌||0ms| -## ❌ fixtures/external/flutter/provider-test-results.json +|[fixtures/external/flutter/provider-test-results.json](#user-content-r0)|268 ✅|1 ❌||0ms| +## ❌ fixtures/external/flutter/provider-test-results.json **269** tests were completed in **0ms** with **268** passed, **1** failed and **0** skipped. |Test suite|Passed|Failed|Skipped|Time| |:---|---:|---:|---:|---:| -|[test/builder_test.dart](#r0s0)|24 ✅|||402ms| -|[test/change_notifier_provider_test.dart](#r0s1)|10 ✅|||306ms| -|[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 ✅|||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| -|[test/provider_test.dart](#r0s9)|11 ✅|||306ms| -|[test/proxy_provider_test.dart](#r0s10)|16 ✅|||438ms| -|[test/reassemble_test.dart](#r0s11)|3 ✅|||221ms| -|[test/selector_test.dart](#r0s12)|17 ✅|||364ms| -|[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| -### ✅ test/builder_test.dart +|[test/builder_test.dart](#user-content-r0s0)|24 ✅|||402ms| +|[test/change_notifier_provider_test.dart](#user-content-r0s1)|10 ✅|||306ms| +|[test/consumer_test.dart](#user-content-r0s2)|18 ✅|||340ms| +|[test/context_test.dart](#user-content-r0s3)|31 ✅|||698ms| +|[test/future_provider_test.dart](#user-content-r0s4)|10 ✅|||305ms| +|[test/inherited_provider_test.dart](#user-content-r0s5)|81 ✅|||1s| +|[test/listenable_provider_test.dart](#user-content-r0s6)|16 ✅|||353ms| +|[test/listenable_proxy_provider_test.dart](#user-content-r0s7)|12 ✅|||373ms| +|[test/multi_provider_test.dart](#user-content-r0s8)|3 ✅|||198ms| +|[test/provider_test.dart](#user-content-r0s9)|11 ✅|||306ms| +|[test/proxy_provider_test.dart](#user-content-r0s10)|16 ✅|||438ms| +|[test/reassemble_test.dart](#user-content-r0s11)|3 ✅|||221ms| +|[test/selector_test.dart](#user-content-r0s12)|17 ✅|||364ms| +|[test/stateful_provider_test.dart](#user-content-r0s13)|4 ✅|||254ms| +|[test/stream_provider_test.dart](#user-content-r0s14)|8 ✅|||282ms| +|[test/value_listenable_provider_test.dart](#user-content-r0s15)|4 ✅|1 ❌||327ms| +### ✅ test/builder_test.dart ``` ChangeNotifierProvider ✅ default @@ -54,7 +54,7 @@ MultiProvider ✅ with ProxyProvider5 ✅ with ProxyProvider6 ``` -### ✅ test/change_notifier_provider_test.dart +### ✅ test/change_notifier_provider_test.dart ``` ✅ Use builder property, not child ChangeNotifierProvider @@ -68,7 +68,7 @@ ChangeNotifierProvider ✅ builder6 ✅ builder0 ``` -### ✅ test/consumer_test.dart +### ✅ test/consumer_test.dart ``` consumer ✅ obtains value from Provider @@ -95,7 +95,7 @@ consumer6 ✅ crashed with no builder ✅ can be used inside MultiProvider ``` -### ✅ test/context_test.dart +### ✅ test/context_test.dart ``` ✅ watch in layoutbuilder ✅ select in layoutbuilder @@ -130,7 +130,7 @@ BuildContext ✅ context.select deeply compares sets ✅ context.watch listens to value changes ``` -### ✅ test/future_provider_test.dart +### ✅ test/future_provider_test.dart ``` ✅ works with MultiProvider ✅ (catchError) previous future completes after transition is no-op @@ -144,7 +144,7 @@ BuildContext FutureProvider() ✅ crashes if builder is null ``` -### ✅ test/inherited_provider_test.dart +### ✅ test/inherited_provider_test.dart ``` ✅ regression test #377 ✅ rebuild on dependency flags update @@ -233,7 +233,7 @@ DeferredInheritedProvider() ✅ dispose ✅ dispose no-op if never built ``` -### ✅ test/listenable_provider_test.dart +### ✅ test/listenable_provider_test.dart ``` ListenableProvider ✅ works with MultiProvider @@ -255,7 +255,7 @@ ListenableProvider stateful constructor ✅ pass down key ✅ throws if create is null ``` -### ✅ test/listenable_proxy_provider_test.dart +### ✅ test/listenable_proxy_provider_test.dart ``` ListenableProxyProvider ✅ throws if update is missing @@ -272,14 +272,14 @@ ListenableProxyProvider variants ✅ ListenableProxyProvider5 ✅ ListenableProxyProvider6 ``` -### ✅ test/multi_provider_test.dart +### ✅ test/multi_provider_test.dart ``` MultiProvider ✅ throw if providers is null ✅ MultiProvider children can only access parent providers ✅ MultiProvider.providers with ignored child ``` -### ✅ test/provider_test.dart +### ✅ test/provider_test.dart ``` ✅ works with MultiProvider Provider.of @@ -295,7 +295,7 @@ Provider ✅ throws an error if no provider found ✅ update should notify ``` -### ✅ test/proxy_provider_test.dart +### ✅ test/proxy_provider_test.dart ``` ProxyProvider ✅ throws if the provided value is a Listenable/Stream @@ -316,13 +316,13 @@ ProxyProvider variants ✅ ProxyProvider5 ✅ ProxyProvider6 ``` -### ✅ test/reassemble_test.dart +### ✅ test/reassemble_test.dart ``` ✅ ReassembleHandler ✅ unevaluated create ✅ unevaluated create ``` -### ✅ test/selector_test.dart +### ✅ test/selector_test.dart ``` ✅ asserts that builder/selector are not null ✅ Deep compare maps by default @@ -342,14 +342,14 @@ ProxyProvider variants ✅ Selector5 ✅ Selector6 ``` -### ✅ test/stateful_provider_test.dart +### ✅ test/stateful_provider_test.dart ``` ✅ asserts ✅ works with MultiProvider ✅ calls create only once ✅ dispose ``` -### ✅ test/stream_provider_test.dart +### ✅ test/stream_provider_test.dart ``` ✅ works with MultiProvider ✅ transition from stream to stream preserve state @@ -361,7 +361,7 @@ StreamProvider() ✅ create and dispose stream with builder ✅ crashes if builder is null ``` -### ❌ test/value_listenable_provider_test.dart +### ❌ test/value_listenable_provider_test.dart ``` valueListenableProvider ✅ rebuilds when value change diff --git a/__tests__/__outputs__/pulsar-test-results-no-merge.md b/__tests__/__outputs__/pulsar-test-results-no-merge.md index 99539b9..de5a9b6 100644 --- a/__tests__/__outputs__/pulsar-test-results-no-merge.md +++ b/__tests__/__outputs__/pulsar-test-results-no-merge.md @@ -1,13 +1,13 @@ ![Tests failed](https://img.shields.io/badge/tests-1%20failed%2C%201%20skipped-critical) |Report|Passed|Failed|Skipped|Time| |:---|---:|---:|---:|---:| -|fixtures/external/java/TEST-org.apache.pulsar.AddMissingPatchVersionTest.xml||1 ❌|1 ⚪|116ms| -## ❌ fixtures/external/java/TEST-org.apache.pulsar.AddMissingPatchVersionTest.xml +|[fixtures/external/java/TEST-org.apache.pulsar.AddMissingPatchVersionTest.xml](#user-content-r0)||1 ❌|1 ⚪|116ms| +## ❌ fixtures/external/java/TEST-org.apache.pulsar.AddMissingPatchVersionTest.xml **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| -### ❌ org.apache.pulsar.AddMissingPatchVersionTest +|[org.apache.pulsar.AddMissingPatchVersionTest](#user-content-r0s0)||1 ❌|1 ⚪|116ms| +### ❌ org.apache.pulsar.AddMissingPatchVersionTest ``` ⚪ testVersionStrings ❌ testVersionStrings diff --git a/__tests__/__outputs__/pulsar-test-results.md b/__tests__/__outputs__/pulsar-test-results.md index b6d910c..aaaa82e 100644 --- a/__tests__/__outputs__/pulsar-test-results.md +++ b/__tests__/__outputs__/pulsar-test-results.md @@ -1,194 +1,194 @@ ![Tests failed](https://img.shields.io/badge/tests-793%20passed%2C%201%20failed%2C%2014%20skipped-critical) |Report|Passed|Failed|Skipped|Time| |:---|---:|---:|---:|---:| -|fixtures/external/java/pulsar-test-report.xml|793 ✅|1 ❌|14 ⚪|2127s| -## ❌ fixtures/external/java/pulsar-test-report.xml +|[fixtures/external/java/pulsar-test-report.xml](#user-content-r0)|793 ✅|1 ❌|14 ⚪|2127s| +## ❌ fixtures/external/java/pulsar-test-report.xml **808** tests were completed in **2127s** with **793** passed, **1** failed and **14** skipped. |Test suite|Passed|Failed|Skipped|Time| |:---|---:|---:|---:|---:| -|[org.apache.pulsar.AddMissingPatchVersionTest](#r0s0)||1 ❌|1 ⚪|116ms| -|[org.apache.pulsar.broker.admin.AdminApiOffloadTest](#r0s1)|7 ✅|||19s| -|[org.apache.pulsar.broker.auth.AuthenticationServiceTest](#r0s2)|2 ✅|||185ms| -|[org.apache.pulsar.broker.auth.AuthLogsTest](#r0s3)|2 ✅|||1s| -|[org.apache.pulsar.broker.auth.AuthorizationTest](#r0s4)|1 ✅|||2s| -|[org.apache.pulsar.broker.lookup.http.HttpTopicLookupv2Test](#r0s5)|4 ✅|||2s| -|[org.apache.pulsar.broker.namespace.NamespaceCreateBundlesTest](#r0s6)|2 ✅|||33s| -|[org.apache.pulsar.broker.namespace.NamespaceOwnershipListenerTests](#r0s7)|2 ✅|||32s| -|[org.apache.pulsar.broker.namespace.NamespaceServiceTest](#r0s8)|10 ✅|||75s| -|[org.apache.pulsar.broker.namespace.NamespaceUnloadingTest](#r0s9)|2 ✅|||14s| -|[org.apache.pulsar.broker.namespace.OwnerShipCacheForCurrentServerTest](#r0s10)|1 ✅|||16s| -|[org.apache.pulsar.broker.namespace.OwnershipCacheTest](#r0s11)|8 ✅|||16s| -|[org.apache.pulsar.broker.protocol.ProtocolHandlersTest](#r0s12)|6 ✅|||946ms| -|[org.apache.pulsar.broker.protocol.ProtocolHandlerUtilsTest](#r0s13)|3 ✅|||7s| -|[org.apache.pulsar.broker.protocol.ProtocolHandlerWithClassLoaderTest](#r0s14)|1 ✅|||15ms| -|[org.apache.pulsar.broker.PulsarServiceTest](#r0s15)|2 ✅|||96ms| -|[org.apache.pulsar.broker.service.MessagePublishBufferThrottleTest](#r0s16)|3 ✅|||14s| -|[org.apache.pulsar.broker.service.ReplicatorTest](#r0s17)|22 ✅|||40s| -|[org.apache.pulsar.broker.service.TopicOwnerTest](#r0s18)|8 ✅|||114s| -|[org.apache.pulsar.broker.SLAMonitoringTest](#r0s19)|4 ✅|||9s| -|[org.apache.pulsar.broker.stats.BookieClientsStatsGeneratorTest](#r0s20)|2 ✅|||49ms| -|[org.apache.pulsar.broker.stats.ConsumerStatsTest](#r0s21)|3 ✅|||21s| -|[org.apache.pulsar.broker.stats.ManagedCursorMetricsTest](#r0s22)|1 ✅|||281ms| -|[org.apache.pulsar.broker.stats.ManagedLedgerMetricsTest](#r0s23)|1 ✅|||285ms| -|[org.apache.pulsar.broker.stats.prometheus.AggregatedNamespaceStatsTest](#r0s24)|1 ✅|||40ms| -|[org.apache.pulsar.broker.stats.PrometheusMetricsTest](#r0s25)|15 ✅|||83s| -|[org.apache.pulsar.broker.stats.SubscriptionStatsTest](#r0s26)|2 ✅|||2s| -|[org.apache.pulsar.broker.systopic.NamespaceEventsSystemTopicServiceTest](#r0s27)|1 ✅|||1s| -|[org.apache.pulsar.broker.transaction.buffer.InMemTransactionBufferReaderTest](#r0s28)|3 ✅|||28ms| -|[org.apache.pulsar.broker.transaction.buffer.TransactionBufferClientTest](#r0s29)|4 ✅|||93ms| -|[org.apache.pulsar.broker.transaction.buffer.TransactionBufferTest](#r0s30)|7 ✅|||81ms| -|[org.apache.pulsar.broker.transaction.buffer.TransactionEntryImplTest](#r0s31)|1 ✅|||14ms| -|[org.apache.pulsar.broker.transaction.buffer.TransactionLowWaterMarkTest](#r0s32)|2 ✅|||38s| -|[org.apache.pulsar.broker.transaction.buffer.TransactionStablePositionTest](#r0s33)|2 ✅||1 ⚪|49s| -|[org.apache.pulsar.broker.transaction.coordinator.TransactionCoordinatorClientTest](#r0s34)|3 ✅|||95ms| -|[org.apache.pulsar.broker.transaction.coordinator.TransactionMetaStoreAssignmentTest](#r0s35)|1 ✅|||1s| -|[org.apache.pulsar.broker.transaction.pendingack.PendingAckInMemoryDeleteTest](#r0s36)|2 ✅||1 ⚪|57s| -|[org.apache.pulsar.broker.transaction.TransactionConsumeTest](#r0s37)|2 ✅|||30s| -|[org.apache.pulsar.broker.web.RestExceptionTest](#r0s38)|3 ✅|||37ms| -|[org.apache.pulsar.broker.web.WebServiceTest](#r0s39)|9 ✅|||27s| -|[org.apache.pulsar.client.impl.AdminApiKeyStoreTlsAuthTest](#r0s40)|4 ✅|||8s| -|[org.apache.pulsar.client.impl.BatchMessageIdImplSerializationTest](#r0s41)|4 ✅|||30ms| -|[org.apache.pulsar.client.impl.BatchMessageIndexAckDisableTest](#r0s42)|4 ✅|||14s| -|[org.apache.pulsar.client.impl.BatchMessageIndexAckTest](#r0s43)|5 ✅|||44s| -|[org.apache.pulsar.client.impl.BrokerClientIntegrationTest](#r0s44)|15 ✅|||148s| -|[org.apache.pulsar.client.impl.CompactedOutBatchMessageTest](#r0s45)|1 ✅|||1s| -|[org.apache.pulsar.client.impl.ConsumerAckResponseTest](#r0s46)|1 ✅|||549ms| -|[org.apache.pulsar.client.impl.ConsumerConfigurationTest](#r0s47)|4 ✅|||12s| -|[org.apache.pulsar.client.impl.ConsumerDedupPermitsUpdate](#r0s48)|7 ✅|||4s| -|[org.apache.pulsar.client.impl.ConsumerUnsubscribeTest](#r0s49)|1 ✅|||129ms| -|[org.apache.pulsar.client.impl.KeyStoreTlsProducerConsumerTestWithAuth](#r0s50)|3 ✅|||23s| -|[org.apache.pulsar.client.impl.KeyStoreTlsProducerConsumerTestWithoutAuth](#r0s51)|3 ✅|||8s| -|[org.apache.pulsar.client.impl.KeyStoreTlsTest](#r0s52)|1 ✅|||183ms| -|[org.apache.pulsar.client.impl.MessageChecksumTest](#r0s53)|3 ✅|||47s| -|[org.apache.pulsar.client.impl.MessageChunkingTest](#r0s54)|8 ✅||1 ⚪|73s| -|[org.apache.pulsar.client.impl.MessageParserTest](#r0s55)|2 ✅|||5s| -|[org.apache.pulsar.client.impl.MultiTopicsReaderTest](#r0s56)|8 ✅|||35s| -|[org.apache.pulsar.client.impl.NegativeAcksTest](#r0s57)|32 ✅|||11s| -|[org.apache.pulsar.client.impl.PatternTopicsConsumerImplTest](#r0s58)|11 ✅|||63s| -|[org.apache.pulsar.client.impl.PerMessageUnAcknowledgedRedeliveryTest](#r0s59)|5 ✅|||34s| -|[org.apache.pulsar.client.impl.PulsarMultiHostClientTest](#r0s60)|3 ✅|||15s| -|[org.apache.pulsar.client.impl.RawMessageSerDeserTest](#r0s61)|1 ✅|||10ms| -|[org.apache.pulsar.client.impl.SchemaDeleteTest](#r0s62)|1 ✅|||2s| -|[org.apache.pulsar.client.impl.SequenceIdWithErrorTest](#r0s63)|3 ✅||2 ⚪|18s| -|[org.apache.pulsar.client.impl.TopicDoesNotExistsTest](#r0s64)|2 ✅|||4s| -|[org.apache.pulsar.client.impl.TopicFromMessageTest](#r0s65)|5 ✅|||14s| -|[org.apache.pulsar.client.impl.TopicsConsumerImplTest](#r0s66)|17 ✅|||133s| -|[org.apache.pulsar.client.impl.UnAcknowledgedMessagesTimeoutTest](#r0s67)|7 ✅|||44s| -|[org.apache.pulsar.client.impl.ZeroQueueSizeTest](#r0s68)|14 ✅|||16s| -|[org.apache.pulsar.common.api.raw.RawMessageImplTest](#r0s69)|1 ✅|||316ms| -|[org.apache.pulsar.common.compression.CommandsTest](#r0s70)|1 ✅|||30ms| -|[org.apache.pulsar.common.compression.CompressorCodecBackwardCompatTest](#r0s71)|6 ✅|||223ms| -|[org.apache.pulsar.common.compression.CompressorCodecTest](#r0s72)|45 ✅|||737ms| -|[org.apache.pulsar.common.compression.Crc32cChecksumTest](#r0s73)|6 ✅|||5s| -|[org.apache.pulsar.common.lookup.data.LookupDataTest](#r0s74)|4 ✅|||2s| -|[org.apache.pulsar.common.naming.MetadataTests](#r0s75)|2 ✅|||161ms| -|[org.apache.pulsar.common.naming.NamespaceBundlesTest](#r0s76)|5 ✅|||99ms| -|[org.apache.pulsar.common.naming.NamespaceBundleTest](#r0s77)|6 ✅|||64ms| -|[org.apache.pulsar.common.naming.NamespaceNameTest](#r0s78)|2 ✅|||207ms| -|[org.apache.pulsar.common.naming.ServiceConfigurationTest](#r0s79)|4 ✅|||48ms| -|[org.apache.pulsar.common.naming.TopicNameTest](#r0s80)|4 ✅|||529ms| -|[org.apache.pulsar.common.net.ServiceURITest](#r0s81)|21 ✅|||237ms| -|[org.apache.pulsar.common.policies.data.AutoFailoverPolicyDataTest](#r0s82)|1 ✅|||15ms| -|[org.apache.pulsar.common.policies.data.AutoFailoverPolicyTypeTest](#r0s83)|1 ✅|||19ms| -|[org.apache.pulsar.common.policies.data.AutoTopicCreationOverrideTest](#r0s84)|6 ✅|||64ms| -|[org.apache.pulsar.common.policies.data.BacklogQuotaTest](#r0s85)|1 ✅|||12ms| -|[org.apache.pulsar.common.policies.data.ClusterDataTest](#r0s86)|1 ✅|||9ms| -|[org.apache.pulsar.common.policies.data.ConsumerStatsTest](#r0s87)|1 ✅|||8ms| -|[org.apache.pulsar.common.policies.data.EnsemblePlacementPolicyConfigTest](#r0s88)|2 ✅|||948ms| -|[org.apache.pulsar.common.policies.data.LocalPolicesTest](#r0s89)|1 ✅|||48ms| -|[org.apache.pulsar.common.policies.data.NamespaceIsolationDataTest](#r0s90)|1 ✅|||76ms| -|[org.apache.pulsar.common.policies.data.NamespaceOwnershipStatusTest](#r0s91)|1 ✅|||45ms| -|[org.apache.pulsar.common.policies.data.OffloadPoliciesTest](#r0s92)|6 ✅|||216ms| -|[org.apache.pulsar.common.policies.data.PartitionedTopicStatsTest](#r0s93)|1 ✅|||12ms| -|[org.apache.pulsar.common.policies.data.PersistencePoliciesTest](#r0s94)|1 ✅|||19ms| -|[org.apache.pulsar.common.policies.data.PersistentOfflineTopicStatsTest](#r0s95)|1 ✅|||29ms| -|[org.apache.pulsar.common.policies.data.PersistentTopicStatsTest](#r0s96)|2 ✅|||51ms| -|[org.apache.pulsar.common.policies.data.PoliciesDataTest](#r0s97)|4 ✅|||1s| -|[org.apache.pulsar.common.policies.data.PublisherStatsTest](#r0s98)|2 ✅|||37ms| -|[org.apache.pulsar.common.policies.data.ReplicatorStatsTest](#r0s99)|2 ✅|||30ms| -|[org.apache.pulsar.common.policies.data.ResourceQuotaTest](#r0s100)|2 ✅|||45ms| -|[org.apache.pulsar.common.policies.data.RetentionPolicesTest](#r0s101)|1 ✅|||8ms| -|[org.apache.pulsar.common.policies.impl.AutoFailoverPolicyFactoryTest](#r0s102)|1 ✅|||22ms| -|[org.apache.pulsar.common.policies.impl.MinAvailablePolicyTest](#r0s103)|1 ✅|||1ms| -|[org.apache.pulsar.common.policies.impl.NamespaceIsolationPoliciesTest](#r0s104)|7 ✅|||265ms| -|[org.apache.pulsar.common.policies.impl.NamespaceIsolationPolicyImplTest](#r0s105)|7 ✅|||309ms| -|[org.apache.pulsar.common.protocol.ByteBufPairTest](#r0s106)|2 ✅|||5s| -|[org.apache.pulsar.common.protocol.CommandUtilsTests](#r0s107)|7 ✅|||3s| -|[org.apache.pulsar.common.protocol.MarkersTest](#r0s108)|6 ✅|||3s| -|[org.apache.pulsar.common.protocol.PulsarDecoderTest](#r0s109)|1 ✅|||4s| -|[org.apache.pulsar.common.stats.JvmDefaultGCMetricsLoggerTest](#r0s110)|1 ✅|||82ms| -|[org.apache.pulsar.common.util.collections.BitSetRecyclableRecyclableTest](#r0s111)|2 ✅|||13ms| -|[org.apache.pulsar.common.util.collections.ConcurrentBitSetRecyclableTest](#r0s112)|2 ✅|||63ms| -|[org.apache.pulsar.common.util.collections.ConcurrentLongHashMapTest](#r0s113)|13 ✅|||28s| -|[org.apache.pulsar.common.util.collections.ConcurrentLongPairSetTest](#r0s114)|15 ✅|||2s| -|[org.apache.pulsar.common.util.collections.ConcurrentOpenHashMapTest](#r0s115)|12 ✅|||9s| -|[org.apache.pulsar.common.util.collections.ConcurrentOpenHashSetTest](#r0s116)|11 ✅|||7s| -|[org.apache.pulsar.common.util.collections.ConcurrentOpenLongPairRangeSetTest](#r0s117)|13 ✅|||1s| -|[org.apache.pulsar.common.util.collections.ConcurrentSortedLongPairSetTest](#r0s118)|9 ✅|||342ms| -|[org.apache.pulsar.common.util.collections.FieldParserTest](#r0s119)|2 ✅|||64ms| -|[org.apache.pulsar.common.util.collections.GrowableArrayBlockingQueueTest](#r0s120)|6 ✅|||350ms| -|[org.apache.pulsar.common.util.collections.GrowablePriorityLongPairQueueTest](#r0s121)|15 ✅|||3s| -|[org.apache.pulsar.common.util.collections.TripleLongPriorityQueueTest](#r0s122)|3 ✅|||238ms| -|[org.apache.pulsar.common.util.FieldParserTest](#r0s123)|1 ✅|||242ms| -|[org.apache.pulsar.common.util.FileModifiedTimeUpdaterTest](#r0s124)|6 ✅|||6s| -|[org.apache.pulsar.common.util.netty.ChannelFuturesTest](#r0s125)|5 ✅|||2s| -|[org.apache.pulsar.common.util.RateLimiterTest](#r0s126)|11 ✅|||7s| -|[org.apache.pulsar.common.util.ReflectionsTest](#r0s127)|12 ✅|||172ms| -|[org.apache.pulsar.common.util.RelativeTimeUtilTest](#r0s128)|1 ✅|||39ms| -|[org.apache.pulsar.discovery.service.web.DiscoveryServiceWebTest](#r0s129)|1 ✅|||5s| -|[org.apache.pulsar.functions.worker.PulsarFunctionE2ESecurityTest](#r0s130)|2 ✅|||28s| -|[org.apache.pulsar.functions.worker.PulsarFunctionPublishTest](#r0s131)|3 ✅|||42s| -|[org.apache.pulsar.functions.worker.PulsarFunctionTlsTest](#r0s132)|1 ✅|||12s| -|[org.apache.pulsar.io.PulsarFunctionTlsTest](#r0s133)|1 ✅|||30s| -|[org.apache.pulsar.proxy.server.AdminProxyHandlerTest](#r0s134)|1 ✅|||474ms| -|[org.apache.pulsar.proxy.server.AuthedAdminProxyHandlerTest](#r0s135)|1 ✅|||2s| -|[org.apache.pulsar.proxy.server.FunctionWorkerRoutingTest](#r0s136)|1 ✅|||10ms| -|[org.apache.pulsar.proxy.server.ProxyAdditionalServletTest](#r0s137)|1 ✅|||125ms| -|[org.apache.pulsar.proxy.server.ProxyAuthenticatedProducerConsumerTest](#r0s138)|1 ✅|||2s| -|[org.apache.pulsar.proxy.server.ProxyAuthenticationTest](#r0s139)|1 ✅|||17s| -|[org.apache.pulsar.proxy.server.ProxyConnectionThrottlingTest](#r0s140)|1 ✅|||2s| -|[org.apache.pulsar.proxy.server.ProxyEnableHAProxyProtocolTest](#r0s141)|1 ✅|||511ms| -|[org.apache.pulsar.proxy.server.ProxyForwardAuthDataTest](#r0s142)|1 ✅|||32s| -|[org.apache.pulsar.proxy.server.ProxyIsAHttpProxyTest](#r0s143)|10 ✅|||2s| -|[org.apache.pulsar.proxy.server.ProxyKeyStoreTlsTestWithAuth](#r0s144)|3 ✅|||7s| -|[org.apache.pulsar.proxy.server.ProxyKeyStoreTlsTestWithoutAuth](#r0s145)|3 ✅|||7s| -|[org.apache.pulsar.proxy.server.ProxyLookupThrottlingTest](#r0s146)|1 ✅|||3s| -|[org.apache.pulsar.proxy.server.ProxyParserTest](#r0s147)|5 ✅|||1s| -|[org.apache.pulsar.proxy.server.ProxyRolesEnforcementTest](#r0s148)|1 ✅|||10s| -|[org.apache.pulsar.proxy.server.ProxyStatsTest](#r0s149)|3 ✅|||533ms| -|[org.apache.pulsar.proxy.server.ProxyTest](#r0s150)|6 ✅|||3s| -|[org.apache.pulsar.proxy.server.ProxyTlsTest](#r0s151)|2 ✅|||414ms| -|[org.apache.pulsar.proxy.server.ProxyTlsTestWithAuth](#r0s152)|1 ✅|||4ms| -|[org.apache.pulsar.proxy.server.ProxyWithAuthorizationNegTest](#r0s153)|1 ✅|||2s| -|[org.apache.pulsar.proxy.server.ProxyWithAuthorizationTest](#r0s154)|13 ✅|||33s| -|[org.apache.pulsar.proxy.server.ProxyWithoutServiceDiscoveryTest](#r0s155)|1 ✅|||2s| -|[org.apache.pulsar.proxy.server.SuperUserAuthedAdminProxyHandlerTest](#r0s156)|3 ✅|||8s| -|[org.apache.pulsar.proxy.server.UnauthedAdminProxyHandlerTest](#r0s157)|2 ✅|||114ms| -|[org.apache.pulsar.PulsarBrokerStarterTest](#r0s158)|9 ✅|||591ms| -|[org.apache.pulsar.schema.compatibility.SchemaCompatibilityCheckTest](#r0s159)|23 ✅|||107s| -|[org.apache.pulsar.schema.PartitionedTopicSchemaTest](#r0s160)|1 ✅|||29s| -|[org.apache.pulsar.schema.SchemaTest](#r0s161)|3 ✅|||31s| -|[org.apache.pulsar.stats.client.PulsarBrokerStatsClientTest](#r0s162)|2 ✅|||41s| -|[org.apache.pulsar.tests.EnumValuesDataProviderTest](#r0s163)|6 ✅|||23ms| -|[org.apache.pulsar.tests.TestRetrySupportBeforeMethodRetryTest](#r0s164)|1 ✅||4 ⚪|36ms| -|[org.apache.pulsar.tests.TestRetrySupportRetryTest](#r0s165)|1 ✅||4 ⚪|27ms| -|[org.apache.pulsar.tests.TestRetrySupportSuccessTest](#r0s166)|3 ✅|||1ms| -|[org.apache.pulsar.tests.ThreadDumpUtilTest](#r0s167)|2 ✅|||17ms| -|[org.apache.pulsar.utils.SimpleTextOutputStreamTest](#r0s168)|4 ✅|||50ms| -|[org.apache.pulsar.utils.StatsOutputStreamTest](#r0s169)|6 ✅|||59ms| -|[org.apache.pulsar.websocket.proxy.ProxyAuthenticationTest](#r0s170)|4 ✅|||29s| -|[org.apache.pulsar.websocket.proxy.ProxyAuthorizationTest](#r0s171)|1 ✅|||1s| -|[org.apache.pulsar.websocket.proxy.ProxyConfigurationTest](#r0s172)|2 ✅|||9s| -|[org.apache.pulsar.websocket.proxy.ProxyPublishConsumeTlsTest](#r0s173)|1 ✅|||11s| -|[org.apache.pulsar.websocket.proxy.ProxyPublishConsumeWithoutZKTest](#r0s174)|1 ✅|||7s| -|[org.apache.pulsar.websocket.proxy.v1.V1_ProxyAuthenticationTest](#r0s175)|4 ✅|||30s| -### ❌ org.apache.pulsar.AddMissingPatchVersionTest +|[org.apache.pulsar.AddMissingPatchVersionTest](#user-content-r0s0)||1 ❌|1 ⚪|116ms| +|[org.apache.pulsar.broker.admin.AdminApiOffloadTest](#user-content-r0s1)|7 ✅|||19s| +|[org.apache.pulsar.broker.auth.AuthenticationServiceTest](#user-content-r0s2)|2 ✅|||185ms| +|[org.apache.pulsar.broker.auth.AuthLogsTest](#user-content-r0s3)|2 ✅|||1s| +|[org.apache.pulsar.broker.auth.AuthorizationTest](#user-content-r0s4)|1 ✅|||2s| +|[org.apache.pulsar.broker.lookup.http.HttpTopicLookupv2Test](#user-content-r0s5)|4 ✅|||2s| +|[org.apache.pulsar.broker.namespace.NamespaceCreateBundlesTest](#user-content-r0s6)|2 ✅|||33s| +|[org.apache.pulsar.broker.namespace.NamespaceOwnershipListenerTests](#user-content-r0s7)|2 ✅|||32s| +|[org.apache.pulsar.broker.namespace.NamespaceServiceTest](#user-content-r0s8)|10 ✅|||75s| +|[org.apache.pulsar.broker.namespace.NamespaceUnloadingTest](#user-content-r0s9)|2 ✅|||14s| +|[org.apache.pulsar.broker.namespace.OwnerShipCacheForCurrentServerTest](#user-content-r0s10)|1 ✅|||16s| +|[org.apache.pulsar.broker.namespace.OwnershipCacheTest](#user-content-r0s11)|8 ✅|||16s| +|[org.apache.pulsar.broker.protocol.ProtocolHandlersTest](#user-content-r0s12)|6 ✅|||946ms| +|[org.apache.pulsar.broker.protocol.ProtocolHandlerUtilsTest](#user-content-r0s13)|3 ✅|||7s| +|[org.apache.pulsar.broker.protocol.ProtocolHandlerWithClassLoaderTest](#user-content-r0s14)|1 ✅|||15ms| +|[org.apache.pulsar.broker.PulsarServiceTest](#user-content-r0s15)|2 ✅|||96ms| +|[org.apache.pulsar.broker.service.MessagePublishBufferThrottleTest](#user-content-r0s16)|3 ✅|||14s| +|[org.apache.pulsar.broker.service.ReplicatorTest](#user-content-r0s17)|22 ✅|||40s| +|[org.apache.pulsar.broker.service.TopicOwnerTest](#user-content-r0s18)|8 ✅|||114s| +|[org.apache.pulsar.broker.SLAMonitoringTest](#user-content-r0s19)|4 ✅|||9s| +|[org.apache.pulsar.broker.stats.BookieClientsStatsGeneratorTest](#user-content-r0s20)|2 ✅|||49ms| +|[org.apache.pulsar.broker.stats.ConsumerStatsTest](#user-content-r0s21)|3 ✅|||21s| +|[org.apache.pulsar.broker.stats.ManagedCursorMetricsTest](#user-content-r0s22)|1 ✅|||281ms| +|[org.apache.pulsar.broker.stats.ManagedLedgerMetricsTest](#user-content-r0s23)|1 ✅|||285ms| +|[org.apache.pulsar.broker.stats.prometheus.AggregatedNamespaceStatsTest](#user-content-r0s24)|1 ✅|||40ms| +|[org.apache.pulsar.broker.stats.PrometheusMetricsTest](#user-content-r0s25)|15 ✅|||83s| +|[org.apache.pulsar.broker.stats.SubscriptionStatsTest](#user-content-r0s26)|2 ✅|||2s| +|[org.apache.pulsar.broker.systopic.NamespaceEventsSystemTopicServiceTest](#user-content-r0s27)|1 ✅|||1s| +|[org.apache.pulsar.broker.transaction.buffer.InMemTransactionBufferReaderTest](#user-content-r0s28)|3 ✅|||28ms| +|[org.apache.pulsar.broker.transaction.buffer.TransactionBufferClientTest](#user-content-r0s29)|4 ✅|||93ms| +|[org.apache.pulsar.broker.transaction.buffer.TransactionBufferTest](#user-content-r0s30)|7 ✅|||81ms| +|[org.apache.pulsar.broker.transaction.buffer.TransactionEntryImplTest](#user-content-r0s31)|1 ✅|||14ms| +|[org.apache.pulsar.broker.transaction.buffer.TransactionLowWaterMarkTest](#user-content-r0s32)|2 ✅|||38s| +|[org.apache.pulsar.broker.transaction.buffer.TransactionStablePositionTest](#user-content-r0s33)|2 ✅||1 ⚪|49s| +|[org.apache.pulsar.broker.transaction.coordinator.TransactionCoordinatorClientTest](#user-content-r0s34)|3 ✅|||95ms| +|[org.apache.pulsar.broker.transaction.coordinator.TransactionMetaStoreAssignmentTest](#user-content-r0s35)|1 ✅|||1s| +|[org.apache.pulsar.broker.transaction.pendingack.PendingAckInMemoryDeleteTest](#user-content-r0s36)|2 ✅||1 ⚪|57s| +|[org.apache.pulsar.broker.transaction.TransactionConsumeTest](#user-content-r0s37)|2 ✅|||30s| +|[org.apache.pulsar.broker.web.RestExceptionTest](#user-content-r0s38)|3 ✅|||37ms| +|[org.apache.pulsar.broker.web.WebServiceTest](#user-content-r0s39)|9 ✅|||27s| +|[org.apache.pulsar.client.impl.AdminApiKeyStoreTlsAuthTest](#user-content-r0s40)|4 ✅|||8s| +|[org.apache.pulsar.client.impl.BatchMessageIdImplSerializationTest](#user-content-r0s41)|4 ✅|||30ms| +|[org.apache.pulsar.client.impl.BatchMessageIndexAckDisableTest](#user-content-r0s42)|4 ✅|||14s| +|[org.apache.pulsar.client.impl.BatchMessageIndexAckTest](#user-content-r0s43)|5 ✅|||44s| +|[org.apache.pulsar.client.impl.BrokerClientIntegrationTest](#user-content-r0s44)|15 ✅|||148s| +|[org.apache.pulsar.client.impl.CompactedOutBatchMessageTest](#user-content-r0s45)|1 ✅|||1s| +|[org.apache.pulsar.client.impl.ConsumerAckResponseTest](#user-content-r0s46)|1 ✅|||549ms| +|[org.apache.pulsar.client.impl.ConsumerConfigurationTest](#user-content-r0s47)|4 ✅|||12s| +|[org.apache.pulsar.client.impl.ConsumerDedupPermitsUpdate](#user-content-r0s48)|7 ✅|||4s| +|[org.apache.pulsar.client.impl.ConsumerUnsubscribeTest](#user-content-r0s49)|1 ✅|||129ms| +|[org.apache.pulsar.client.impl.KeyStoreTlsProducerConsumerTestWithAuth](#user-content-r0s50)|3 ✅|||23s| +|[org.apache.pulsar.client.impl.KeyStoreTlsProducerConsumerTestWithoutAuth](#user-content-r0s51)|3 ✅|||8s| +|[org.apache.pulsar.client.impl.KeyStoreTlsTest](#user-content-r0s52)|1 ✅|||183ms| +|[org.apache.pulsar.client.impl.MessageChecksumTest](#user-content-r0s53)|3 ✅|||47s| +|[org.apache.pulsar.client.impl.MessageChunkingTest](#user-content-r0s54)|8 ✅||1 ⚪|73s| +|[org.apache.pulsar.client.impl.MessageParserTest](#user-content-r0s55)|2 ✅|||5s| +|[org.apache.pulsar.client.impl.MultiTopicsReaderTest](#user-content-r0s56)|8 ✅|||35s| +|[org.apache.pulsar.client.impl.NegativeAcksTest](#user-content-r0s57)|32 ✅|||11s| +|[org.apache.pulsar.client.impl.PatternTopicsConsumerImplTest](#user-content-r0s58)|11 ✅|||63s| +|[org.apache.pulsar.client.impl.PerMessageUnAcknowledgedRedeliveryTest](#user-content-r0s59)|5 ✅|||34s| +|[org.apache.pulsar.client.impl.PulsarMultiHostClientTest](#user-content-r0s60)|3 ✅|||15s| +|[org.apache.pulsar.client.impl.RawMessageSerDeserTest](#user-content-r0s61)|1 ✅|||10ms| +|[org.apache.pulsar.client.impl.SchemaDeleteTest](#user-content-r0s62)|1 ✅|||2s| +|[org.apache.pulsar.client.impl.SequenceIdWithErrorTest](#user-content-r0s63)|3 ✅||2 ⚪|18s| +|[org.apache.pulsar.client.impl.TopicDoesNotExistsTest](#user-content-r0s64)|2 ✅|||4s| +|[org.apache.pulsar.client.impl.TopicFromMessageTest](#user-content-r0s65)|5 ✅|||14s| +|[org.apache.pulsar.client.impl.TopicsConsumerImplTest](#user-content-r0s66)|17 ✅|||133s| +|[org.apache.pulsar.client.impl.UnAcknowledgedMessagesTimeoutTest](#user-content-r0s67)|7 ✅|||44s| +|[org.apache.pulsar.client.impl.ZeroQueueSizeTest](#user-content-r0s68)|14 ✅|||16s| +|[org.apache.pulsar.common.api.raw.RawMessageImplTest](#user-content-r0s69)|1 ✅|||316ms| +|[org.apache.pulsar.common.compression.CommandsTest](#user-content-r0s70)|1 ✅|||30ms| +|[org.apache.pulsar.common.compression.CompressorCodecBackwardCompatTest](#user-content-r0s71)|6 ✅|||223ms| +|[org.apache.pulsar.common.compression.CompressorCodecTest](#user-content-r0s72)|45 ✅|||737ms| +|[org.apache.pulsar.common.compression.Crc32cChecksumTest](#user-content-r0s73)|6 ✅|||5s| +|[org.apache.pulsar.common.lookup.data.LookupDataTest](#user-content-r0s74)|4 ✅|||2s| +|[org.apache.pulsar.common.naming.MetadataTests](#user-content-r0s75)|2 ✅|||161ms| +|[org.apache.pulsar.common.naming.NamespaceBundlesTest](#user-content-r0s76)|5 ✅|||99ms| +|[org.apache.pulsar.common.naming.NamespaceBundleTest](#user-content-r0s77)|6 ✅|||64ms| +|[org.apache.pulsar.common.naming.NamespaceNameTest](#user-content-r0s78)|2 ✅|||207ms| +|[org.apache.pulsar.common.naming.ServiceConfigurationTest](#user-content-r0s79)|4 ✅|||48ms| +|[org.apache.pulsar.common.naming.TopicNameTest](#user-content-r0s80)|4 ✅|||529ms| +|[org.apache.pulsar.common.net.ServiceURITest](#user-content-r0s81)|21 ✅|||237ms| +|[org.apache.pulsar.common.policies.data.AutoFailoverPolicyDataTest](#user-content-r0s82)|1 ✅|||15ms| +|[org.apache.pulsar.common.policies.data.AutoFailoverPolicyTypeTest](#user-content-r0s83)|1 ✅|||19ms| +|[org.apache.pulsar.common.policies.data.AutoTopicCreationOverrideTest](#user-content-r0s84)|6 ✅|||64ms| +|[org.apache.pulsar.common.policies.data.BacklogQuotaTest](#user-content-r0s85)|1 ✅|||12ms| +|[org.apache.pulsar.common.policies.data.ClusterDataTest](#user-content-r0s86)|1 ✅|||9ms| +|[org.apache.pulsar.common.policies.data.ConsumerStatsTest](#user-content-r0s87)|1 ✅|||8ms| +|[org.apache.pulsar.common.policies.data.EnsemblePlacementPolicyConfigTest](#user-content-r0s88)|2 ✅|||948ms| +|[org.apache.pulsar.common.policies.data.LocalPolicesTest](#user-content-r0s89)|1 ✅|||48ms| +|[org.apache.pulsar.common.policies.data.NamespaceIsolationDataTest](#user-content-r0s90)|1 ✅|||76ms| +|[org.apache.pulsar.common.policies.data.NamespaceOwnershipStatusTest](#user-content-r0s91)|1 ✅|||45ms| +|[org.apache.pulsar.common.policies.data.OffloadPoliciesTest](#user-content-r0s92)|6 ✅|||216ms| +|[org.apache.pulsar.common.policies.data.PartitionedTopicStatsTest](#user-content-r0s93)|1 ✅|||12ms| +|[org.apache.pulsar.common.policies.data.PersistencePoliciesTest](#user-content-r0s94)|1 ✅|||19ms| +|[org.apache.pulsar.common.policies.data.PersistentOfflineTopicStatsTest](#user-content-r0s95)|1 ✅|||29ms| +|[org.apache.pulsar.common.policies.data.PersistentTopicStatsTest](#user-content-r0s96)|2 ✅|||51ms| +|[org.apache.pulsar.common.policies.data.PoliciesDataTest](#user-content-r0s97)|4 ✅|||1s| +|[org.apache.pulsar.common.policies.data.PublisherStatsTest](#user-content-r0s98)|2 ✅|||37ms| +|[org.apache.pulsar.common.policies.data.ReplicatorStatsTest](#user-content-r0s99)|2 ✅|||30ms| +|[org.apache.pulsar.common.policies.data.ResourceQuotaTest](#user-content-r0s100)|2 ✅|||45ms| +|[org.apache.pulsar.common.policies.data.RetentionPolicesTest](#user-content-r0s101)|1 ✅|||8ms| +|[org.apache.pulsar.common.policies.impl.AutoFailoverPolicyFactoryTest](#user-content-r0s102)|1 ✅|||22ms| +|[org.apache.pulsar.common.policies.impl.MinAvailablePolicyTest](#user-content-r0s103)|1 ✅|||1ms| +|[org.apache.pulsar.common.policies.impl.NamespaceIsolationPoliciesTest](#user-content-r0s104)|7 ✅|||265ms| +|[org.apache.pulsar.common.policies.impl.NamespaceIsolationPolicyImplTest](#user-content-r0s105)|7 ✅|||309ms| +|[org.apache.pulsar.common.protocol.ByteBufPairTest](#user-content-r0s106)|2 ✅|||5s| +|[org.apache.pulsar.common.protocol.CommandUtilsTests](#user-content-r0s107)|7 ✅|||3s| +|[org.apache.pulsar.common.protocol.MarkersTest](#user-content-r0s108)|6 ✅|||3s| +|[org.apache.pulsar.common.protocol.PulsarDecoderTest](#user-content-r0s109)|1 ✅|||4s| +|[org.apache.pulsar.common.stats.JvmDefaultGCMetricsLoggerTest](#user-content-r0s110)|1 ✅|||82ms| +|[org.apache.pulsar.common.util.collections.BitSetRecyclableRecyclableTest](#user-content-r0s111)|2 ✅|||13ms| +|[org.apache.pulsar.common.util.collections.ConcurrentBitSetRecyclableTest](#user-content-r0s112)|2 ✅|||63ms| +|[org.apache.pulsar.common.util.collections.ConcurrentLongHashMapTest](#user-content-r0s113)|13 ✅|||28s| +|[org.apache.pulsar.common.util.collections.ConcurrentLongPairSetTest](#user-content-r0s114)|15 ✅|||2s| +|[org.apache.pulsar.common.util.collections.ConcurrentOpenHashMapTest](#user-content-r0s115)|12 ✅|||9s| +|[org.apache.pulsar.common.util.collections.ConcurrentOpenHashSetTest](#user-content-r0s116)|11 ✅|||7s| +|[org.apache.pulsar.common.util.collections.ConcurrentOpenLongPairRangeSetTest](#user-content-r0s117)|13 ✅|||1s| +|[org.apache.pulsar.common.util.collections.ConcurrentSortedLongPairSetTest](#user-content-r0s118)|9 ✅|||342ms| +|[org.apache.pulsar.common.util.collections.FieldParserTest](#user-content-r0s119)|2 ✅|||64ms| +|[org.apache.pulsar.common.util.collections.GrowableArrayBlockingQueueTest](#user-content-r0s120)|6 ✅|||350ms| +|[org.apache.pulsar.common.util.collections.GrowablePriorityLongPairQueueTest](#user-content-r0s121)|15 ✅|||3s| +|[org.apache.pulsar.common.util.collections.TripleLongPriorityQueueTest](#user-content-r0s122)|3 ✅|||238ms| +|[org.apache.pulsar.common.util.FieldParserTest](#user-content-r0s123)|1 ✅|||242ms| +|[org.apache.pulsar.common.util.FileModifiedTimeUpdaterTest](#user-content-r0s124)|6 ✅|||6s| +|[org.apache.pulsar.common.util.netty.ChannelFuturesTest](#user-content-r0s125)|5 ✅|||2s| +|[org.apache.pulsar.common.util.RateLimiterTest](#user-content-r0s126)|11 ✅|||7s| +|[org.apache.pulsar.common.util.ReflectionsTest](#user-content-r0s127)|12 ✅|||172ms| +|[org.apache.pulsar.common.util.RelativeTimeUtilTest](#user-content-r0s128)|1 ✅|||39ms| +|[org.apache.pulsar.discovery.service.web.DiscoveryServiceWebTest](#user-content-r0s129)|1 ✅|||5s| +|[org.apache.pulsar.functions.worker.PulsarFunctionE2ESecurityTest](#user-content-r0s130)|2 ✅|||28s| +|[org.apache.pulsar.functions.worker.PulsarFunctionPublishTest](#user-content-r0s131)|3 ✅|||42s| +|[org.apache.pulsar.functions.worker.PulsarFunctionTlsTest](#user-content-r0s132)|1 ✅|||12s| +|[org.apache.pulsar.io.PulsarFunctionTlsTest](#user-content-r0s133)|1 ✅|||30s| +|[org.apache.pulsar.proxy.server.AdminProxyHandlerTest](#user-content-r0s134)|1 ✅|||474ms| +|[org.apache.pulsar.proxy.server.AuthedAdminProxyHandlerTest](#user-content-r0s135)|1 ✅|||2s| +|[org.apache.pulsar.proxy.server.FunctionWorkerRoutingTest](#user-content-r0s136)|1 ✅|||10ms| +|[org.apache.pulsar.proxy.server.ProxyAdditionalServletTest](#user-content-r0s137)|1 ✅|||125ms| +|[org.apache.pulsar.proxy.server.ProxyAuthenticatedProducerConsumerTest](#user-content-r0s138)|1 ✅|||2s| +|[org.apache.pulsar.proxy.server.ProxyAuthenticationTest](#user-content-r0s139)|1 ✅|||17s| +|[org.apache.pulsar.proxy.server.ProxyConnectionThrottlingTest](#user-content-r0s140)|1 ✅|||2s| +|[org.apache.pulsar.proxy.server.ProxyEnableHAProxyProtocolTest](#user-content-r0s141)|1 ✅|||511ms| +|[org.apache.pulsar.proxy.server.ProxyForwardAuthDataTest](#user-content-r0s142)|1 ✅|||32s| +|[org.apache.pulsar.proxy.server.ProxyIsAHttpProxyTest](#user-content-r0s143)|10 ✅|||2s| +|[org.apache.pulsar.proxy.server.ProxyKeyStoreTlsTestWithAuth](#user-content-r0s144)|3 ✅|||7s| +|[org.apache.pulsar.proxy.server.ProxyKeyStoreTlsTestWithoutAuth](#user-content-r0s145)|3 ✅|||7s| +|[org.apache.pulsar.proxy.server.ProxyLookupThrottlingTest](#user-content-r0s146)|1 ✅|||3s| +|[org.apache.pulsar.proxy.server.ProxyParserTest](#user-content-r0s147)|5 ✅|||1s| +|[org.apache.pulsar.proxy.server.ProxyRolesEnforcementTest](#user-content-r0s148)|1 ✅|||10s| +|[org.apache.pulsar.proxy.server.ProxyStatsTest](#user-content-r0s149)|3 ✅|||533ms| +|[org.apache.pulsar.proxy.server.ProxyTest](#user-content-r0s150)|6 ✅|||3s| +|[org.apache.pulsar.proxy.server.ProxyTlsTest](#user-content-r0s151)|2 ✅|||414ms| +|[org.apache.pulsar.proxy.server.ProxyTlsTestWithAuth](#user-content-r0s152)|1 ✅|||4ms| +|[org.apache.pulsar.proxy.server.ProxyWithAuthorizationNegTest](#user-content-r0s153)|1 ✅|||2s| +|[org.apache.pulsar.proxy.server.ProxyWithAuthorizationTest](#user-content-r0s154)|13 ✅|||33s| +|[org.apache.pulsar.proxy.server.ProxyWithoutServiceDiscoveryTest](#user-content-r0s155)|1 ✅|||2s| +|[org.apache.pulsar.proxy.server.SuperUserAuthedAdminProxyHandlerTest](#user-content-r0s156)|3 ✅|||8s| +|[org.apache.pulsar.proxy.server.UnauthedAdminProxyHandlerTest](#user-content-r0s157)|2 ✅|||114ms| +|[org.apache.pulsar.PulsarBrokerStarterTest](#user-content-r0s158)|9 ✅|||591ms| +|[org.apache.pulsar.schema.compatibility.SchemaCompatibilityCheckTest](#user-content-r0s159)|23 ✅|||107s| +|[org.apache.pulsar.schema.PartitionedTopicSchemaTest](#user-content-r0s160)|1 ✅|||29s| +|[org.apache.pulsar.schema.SchemaTest](#user-content-r0s161)|3 ✅|||31s| +|[org.apache.pulsar.stats.client.PulsarBrokerStatsClientTest](#user-content-r0s162)|2 ✅|||41s| +|[org.apache.pulsar.tests.EnumValuesDataProviderTest](#user-content-r0s163)|6 ✅|||23ms| +|[org.apache.pulsar.tests.TestRetrySupportBeforeMethodRetryTest](#user-content-r0s164)|1 ✅||4 ⚪|36ms| +|[org.apache.pulsar.tests.TestRetrySupportRetryTest](#user-content-r0s165)|1 ✅||4 ⚪|27ms| +|[org.apache.pulsar.tests.TestRetrySupportSuccessTest](#user-content-r0s166)|3 ✅|||1ms| +|[org.apache.pulsar.tests.ThreadDumpUtilTest](#user-content-r0s167)|2 ✅|||17ms| +|[org.apache.pulsar.utils.SimpleTextOutputStreamTest](#user-content-r0s168)|4 ✅|||50ms| +|[org.apache.pulsar.utils.StatsOutputStreamTest](#user-content-r0s169)|6 ✅|||59ms| +|[org.apache.pulsar.websocket.proxy.ProxyAuthenticationTest](#user-content-r0s170)|4 ✅|||29s| +|[org.apache.pulsar.websocket.proxy.ProxyAuthorizationTest](#user-content-r0s171)|1 ✅|||1s| +|[org.apache.pulsar.websocket.proxy.ProxyConfigurationTest](#user-content-r0s172)|2 ✅|||9s| +|[org.apache.pulsar.websocket.proxy.ProxyPublishConsumeTlsTest](#user-content-r0s173)|1 ✅|||11s| +|[org.apache.pulsar.websocket.proxy.ProxyPublishConsumeWithoutZKTest](#user-content-r0s174)|1 ✅|||7s| +|[org.apache.pulsar.websocket.proxy.v1.V1_ProxyAuthenticationTest](#user-content-r0s175)|4 ✅|||30s| +### ❌ org.apache.pulsar.AddMissingPatchVersionTest ``` ⚪ testVersionStrings ❌ testVersionStrings java.lang.AssertionError: expected [1.2.1] but found [1.2.0] ``` -### ✅ org.apache.pulsar.broker.admin.AdminApiOffloadTest +### ✅ org.apache.pulsar.broker.admin.AdminApiOffloadTest ``` ✅ testOffloadPoliciesAppliedApi ✅ testOffloadV2 @@ -198,38 +198,38 @@ ✅ testOffloadPolicies ✅ testOffloadPoliciesApi ``` -### ✅ org.apache.pulsar.broker.auth.AuthenticationServiceTest +### ✅ org.apache.pulsar.broker.auth.AuthenticationServiceTest ``` ✅ testAuthentication ✅ testAuthenticationHttp ``` -### ✅ org.apache.pulsar.broker.auth.AuthLogsTest +### ✅ org.apache.pulsar.broker.auth.AuthLogsTest ``` ✅ httpEndpoint ✅ binaryEndpoint ``` -### ✅ org.apache.pulsar.broker.auth.AuthorizationTest +### ✅ org.apache.pulsar.broker.auth.AuthorizationTest ``` ✅ simple ``` -### ✅ org.apache.pulsar.broker.lookup.http.HttpTopicLookupv2Test +### ✅ org.apache.pulsar.broker.lookup.http.HttpTopicLookupv2Test ``` ✅ crossColoLookup ✅ testNotEnoughLookupPermits ✅ testValidateReplicationSettingsOnNamespace ✅ testDataPojo ``` -### ✅ org.apache.pulsar.broker.namespace.NamespaceCreateBundlesTest +### ✅ org.apache.pulsar.broker.namespace.NamespaceCreateBundlesTest ``` ✅ testCreateNamespaceWithDefaultBundles ✅ testSplitBundleUpdatesLocalPoliciesWithoutOverwriting ``` -### ✅ org.apache.pulsar.broker.namespace.NamespaceOwnershipListenerTests +### ✅ org.apache.pulsar.broker.namespace.NamespaceOwnershipListenerTests ``` ✅ testGetAllPartitions ✅ testNamespaceBundleOwnershipListener ``` -### ✅ org.apache.pulsar.broker.namespace.NamespaceServiceTest +### ✅ org.apache.pulsar.broker.namespace.NamespaceServiceTest ``` ✅ testSplitMapWithRefreshedStatMap ✅ testRemoveOwnershipNamespaceBundle @@ -242,16 +242,16 @@ ✅ testCreateNamespaceWithDefaultNumberOfBundles ✅ testRemoveOwnershipAndSplitBundle ``` -### ✅ org.apache.pulsar.broker.namespace.NamespaceUnloadingTest +### ✅ org.apache.pulsar.broker.namespace.NamespaceUnloadingTest ``` ✅ testUnloadNotLoadedNamespace ✅ testUnloadPartiallyLoadedNamespace ``` -### ✅ org.apache.pulsar.broker.namespace.OwnerShipCacheForCurrentServerTest +### ✅ org.apache.pulsar.broker.namespace.OwnerShipCacheForCurrentServerTest ``` ✅ testOwnershipForCurrentServer ``` -### ✅ org.apache.pulsar.broker.namespace.OwnershipCacheTest +### ✅ org.apache.pulsar.broker.namespace.OwnershipCacheTest ``` ✅ testGetOwnedServiceUnits ✅ testRemoveOwnership @@ -262,7 +262,7 @@ ✅ testDisableOwnership ✅ testReestablishOwnership ``` -### ✅ org.apache.pulsar.broker.protocol.ProtocolHandlersTest +### ✅ org.apache.pulsar.broker.protocol.ProtocolHandlersTest ``` ✅ testStart ✅ testGetProtocol @@ -271,28 +271,28 @@ ✅ testNewChannelInitializersOverlapped ✅ testGetProtocolDataToAdvertise ``` -### ✅ org.apache.pulsar.broker.protocol.ProtocolHandlerUtilsTest +### ✅ org.apache.pulsar.broker.protocol.ProtocolHandlerUtilsTest ``` ✅ testLoadProtocolHandler ✅ testLoadProtocolHandlerBlankHandlerClass ✅ testLoadProtocolHandlerWrongHandlerClass ``` -### ✅ org.apache.pulsar.broker.protocol.ProtocolHandlerWithClassLoaderTest +### ✅ org.apache.pulsar.broker.protocol.ProtocolHandlerWithClassLoaderTest ``` ✅ testWrapper ``` -### ✅ org.apache.pulsar.broker.PulsarServiceTest +### ✅ org.apache.pulsar.broker.PulsarServiceTest ``` ✅ testGetWorkerService ✅ testGetWorkerServiceException ``` -### ✅ org.apache.pulsar.broker.service.MessagePublishBufferThrottleTest +### ✅ org.apache.pulsar.broker.service.MessagePublishBufferThrottleTest ``` ✅ testMessagePublishBufferThrottleEnable ✅ testBlockByPublishRateLimiting ✅ testMessagePublishBufferThrottleDisabled ``` -### ✅ org.apache.pulsar.broker.service.ReplicatorTest +### ✅ org.apache.pulsar.broker.service.ReplicatorTest ``` ✅ testResumptionAfterBacklogRelaxed ✅ testReplicationOverrides @@ -317,7 +317,7 @@ ✅ testFailures ✅ testReplicatorProducerClosing ``` -### ✅ org.apache.pulsar.broker.service.TopicOwnerTest +### ✅ org.apache.pulsar.broker.service.TopicOwnerTest ``` ✅ testReleaseOwnershipWithZookeeperDisconnectedBeforeOwnershipNodeDeleted ✅ testAcquireOwnershipWithZookeeperDisconnectedAfterOwnershipNodeCreated @@ -328,37 +328,37 @@ ✅ testReleaseOwnershipWithZookeeperDisconnectedAfterOwnershipNodeDeleted ✅ testReestablishOwnershipAfterInvalidateCache ``` -### ✅ org.apache.pulsar.broker.SLAMonitoringTest +### ✅ org.apache.pulsar.broker.SLAMonitoringTest ``` ✅ testOwnedNamespaces ✅ testOwnershipAfterSetup ✅ testUnloadIfBrokerCrashes ✅ testOwnershipViaAdminAfterSetup ``` -### ✅ org.apache.pulsar.broker.stats.BookieClientsStatsGeneratorTest +### ✅ org.apache.pulsar.broker.stats.BookieClientsStatsGeneratorTest ``` ✅ testJvmDirectMemoryUsedMetric ✅ testBookieClientStatsGenerator ``` -### ✅ org.apache.pulsar.broker.stats.ConsumerStatsTest +### ✅ org.apache.pulsar.broker.stats.ConsumerStatsTest ``` ✅ testAckStatsOnPartitionedTopicForExclusiveSubscription ✅ testConsumerStatsOnZeroMaxUnackedMessagesPerConsumer ✅ testUpdateStatsForActiveConsumerAndSubscription ``` -### ✅ org.apache.pulsar.broker.stats.ManagedCursorMetricsTest +### ✅ org.apache.pulsar.broker.stats.ManagedCursorMetricsTest ``` ✅ testManagedCursorMetrics ``` -### ✅ org.apache.pulsar.broker.stats.ManagedLedgerMetricsTest +### ✅ org.apache.pulsar.broker.stats.ManagedLedgerMetricsTest ``` ✅ testManagedLedgerMetrics ``` -### ✅ org.apache.pulsar.broker.stats.prometheus.AggregatedNamespaceStatsTest +### ✅ org.apache.pulsar.broker.stats.prometheus.AggregatedNamespaceStatsTest ``` ✅ testSimpleAggregation ``` -### ✅ org.apache.pulsar.broker.stats.PrometheusMetricsTest +### ✅ org.apache.pulsar.broker.stats.PrometheusMetricsTest ``` ✅ testPerTopicStats ✅ testAuthMetrics @@ -376,29 +376,29 @@ ✅ testManagedLedgerCacheStats ✅ testManagedLedgerStats ``` -### ✅ org.apache.pulsar.broker.stats.SubscriptionStatsTest +### ✅ org.apache.pulsar.broker.stats.SubscriptionStatsTest ``` ✅ testConsumersAfterMarkDelete ✅ testNonContiguousDeletedMessagesRanges ``` -### ✅ org.apache.pulsar.broker.systopic.NamespaceEventsSystemTopicServiceTest +### ✅ org.apache.pulsar.broker.systopic.NamespaceEventsSystemTopicServiceTest ``` ✅ testSendAndReceiveNamespaceEvents ``` -### ✅ org.apache.pulsar.broker.transaction.buffer.InMemTransactionBufferReaderTest +### ✅ org.apache.pulsar.broker.transaction.buffer.InMemTransactionBufferReaderTest ``` ✅ testCloseReleaseAllEntries ✅ testInvalidNumEntriesArgument ✅ testEndOfTransactionException ``` -### ✅ org.apache.pulsar.broker.transaction.buffer.TransactionBufferClientTest +### ✅ org.apache.pulsar.broker.transaction.buffer.TransactionBufferClientTest ``` ✅ testAbortOnTopic ✅ testAbortOnSubscription ✅ testCommitOnTopic ✅ testCommitOnSubscription ``` -### ✅ org.apache.pulsar.broker.transaction.buffer.TransactionBufferTest +### ✅ org.apache.pulsar.broker.transaction.buffer.TransactionBufferTest ``` ✅ testOpenReaderOnNonExistentTxn ✅ testAbortCommittedTxn @@ -408,49 +408,49 @@ ✅ testCommitTxn ✅ testOpenReaderOnAnOpenTxn ``` -### ✅ org.apache.pulsar.broker.transaction.buffer.TransactionEntryImplTest +### ✅ org.apache.pulsar.broker.transaction.buffer.TransactionEntryImplTest ``` ✅ testCloseShouldReleaseBuffer ``` -### ✅ org.apache.pulsar.broker.transaction.buffer.TransactionLowWaterMarkTest +### ✅ org.apache.pulsar.broker.transaction.buffer.TransactionLowWaterMarkTest ``` ✅ testTransactionBufferLowWaterMark ✅ testPendingAckLowWaterMark ``` -### ✅ org.apache.pulsar.broker.transaction.buffer.TransactionStablePositionTest +### ✅ org.apache.pulsar.broker.transaction.buffer.TransactionStablePositionTest ``` ✅ commitTxnTest ✅ abortTxnTest ⚪ commitTxnTest ``` -### ✅ org.apache.pulsar.broker.transaction.coordinator.TransactionCoordinatorClientTest +### ✅ org.apache.pulsar.broker.transaction.coordinator.TransactionCoordinatorClientTest ``` ✅ testClientStart ✅ testCommitAndAbort ✅ testNewTxn ``` -### ✅ org.apache.pulsar.broker.transaction.coordinator.TransactionMetaStoreAssignmentTest +### ✅ org.apache.pulsar.broker.transaction.coordinator.TransactionMetaStoreAssignmentTest ``` ✅ testTransactionMetaStoreAssignAndFailover ``` -### ✅ org.apache.pulsar.broker.transaction.pendingack.PendingAckInMemoryDeleteTest +### ✅ org.apache.pulsar.broker.transaction.pendingack.PendingAckInMemoryDeleteTest ``` ⚪ txnAckTestNoBatchAndSharedSubMemoryDeleteTest ✅ txnAckTestNoBatchAndSharedSubMemoryDeleteTest ✅ txnAckTestBatchAndSharedSubMemoryDeleteTest ``` -### ✅ org.apache.pulsar.broker.transaction.TransactionConsumeTest +### ✅ org.apache.pulsar.broker.transaction.TransactionConsumeTest ``` ✅ noSortedTest ✅ sortedTest ``` -### ✅ org.apache.pulsar.broker.web.RestExceptionTest +### ✅ org.apache.pulsar.broker.web.RestExceptionTest ``` ✅ testRestException ✅ testWebApplicationException ✅ testOtherException ``` -### ✅ org.apache.pulsar.broker.web.WebServiceTest +### ✅ org.apache.pulsar.broker.web.WebServiceTest ``` ✅ testTlsAuthDisallowInsecure ✅ testBrokerReady @@ -462,28 +462,28 @@ ✅ testTlsDisabled ✅ testRateLimiting ``` -### ✅ org.apache.pulsar.client.impl.AdminApiKeyStoreTlsAuthTest +### ✅ org.apache.pulsar.client.impl.AdminApiKeyStoreTlsAuthTest ``` ✅ testAuthorizedUserAsOriginalPrincipal ✅ testSuperUserCantListNamespaces ✅ testPersistentList ✅ testSuperUserCanListTenants ``` -### ✅ org.apache.pulsar.client.impl.BatchMessageIdImplSerializationTest +### ✅ org.apache.pulsar.client.impl.BatchMessageIdImplSerializationTest ``` ✅ testSerializationEmpty ✅ testSerialization1 ✅ testSerializationNull ✅ testSerialization2 ``` -### ✅ org.apache.pulsar.client.impl.BatchMessageIndexAckDisableTest +### ✅ org.apache.pulsar.client.impl.BatchMessageIndexAckDisableTest ``` ✅ testBatchMessageIndexAckForExclusiveSubscription ✅ testBatchMessageIndexAckForSharedSubscription ✅ testBatchMessageIndexAckForExclusiveSubscription ✅ testBatchMessageIndexAckForSharedSubscription ``` -### ✅ org.apache.pulsar.client.impl.BatchMessageIndexAckTest +### ✅ org.apache.pulsar.client.impl.BatchMessageIndexAckTest ``` ✅ testBatchMessageIndexAckForSharedSubscription ✅ testBatchMessageIndexAckForSharedSubscription @@ -491,7 +491,7 @@ ✅ testBatchMessageIndexAckForExclusiveSubscription ✅ testBatchMessageIndexAckForExclusiveSubscription ``` -### ✅ org.apache.pulsar.client.impl.BrokerClientIntegrationTest +### ✅ org.apache.pulsar.client.impl.BrokerClientIntegrationTest ``` ✅ testDisconnectClientWithoutClosingConnection ✅ testResetCursor @@ -509,22 +509,22 @@ ✅ testMaxConcurrentTopicLoading ✅ testCloseConnectionOnInternalServerError ``` -### ✅ org.apache.pulsar.client.impl.CompactedOutBatchMessageTest +### ✅ org.apache.pulsar.client.impl.CompactedOutBatchMessageTest ``` ✅ testCompactedOutMessages ``` -### ✅ org.apache.pulsar.client.impl.ConsumerAckResponseTest +### ✅ org.apache.pulsar.client.impl.ConsumerAckResponseTest ``` ✅ testAckResponse ``` -### ✅ org.apache.pulsar.client.impl.ConsumerConfigurationTest +### ✅ org.apache.pulsar.client.impl.ConsumerConfigurationTest ``` ✅ testReadCompactNonPersistentExclusive ✅ testReadCompactPersistentExclusive ✅ testReadCompactPersistentFailover ✅ testReadCompactPersistentShared ``` -### ✅ org.apache.pulsar.client.impl.ConsumerDedupPermitsUpdate +### ✅ org.apache.pulsar.client.impl.ConsumerDedupPermitsUpdate ``` ✅ testConsumerDedup ✅ testConsumerDedup @@ -534,33 +534,33 @@ ✅ testConsumerDedup ✅ testConsumerDedup ``` -### ✅ org.apache.pulsar.client.impl.ConsumerUnsubscribeTest +### ✅ org.apache.pulsar.client.impl.ConsumerUnsubscribeTest ``` ✅ testConsumerUnsubscribeReference ``` -### ✅ org.apache.pulsar.client.impl.KeyStoreTlsProducerConsumerTestWithAuth +### ✅ org.apache.pulsar.client.impl.KeyStoreTlsProducerConsumerTestWithAuth ``` ✅ testTlsClientAuthOverHTTPProtocol ✅ testTlsClientAuthOverBinaryProtocol ✅ testTlsLargeSizeMessage ``` -### ✅ org.apache.pulsar.client.impl.KeyStoreTlsProducerConsumerTestWithoutAuth +### ✅ org.apache.pulsar.client.impl.KeyStoreTlsProducerConsumerTestWithoutAuth ``` ✅ testTlsClientAuthOverHTTPProtocol ✅ testTlsClientAuthOverBinaryProtocol ✅ testTlsLargeSizeMessage ``` -### ✅ org.apache.pulsar.client.impl.KeyStoreTlsTest +### ✅ org.apache.pulsar.client.impl.KeyStoreTlsTest ``` ✅ testValidate ``` -### ✅ org.apache.pulsar.client.impl.MessageChecksumTest +### ✅ org.apache.pulsar.client.impl.MessageChecksumTest ``` ✅ testChecksumCompatibilityInMixedVersionBrokerCluster ✅ testTamperingMessageIsDetected ✅ testChecksumCompatibilityInMixedVersionBrokerCluster ``` -### ✅ org.apache.pulsar.client.impl.MessageChunkingTest +### ✅ org.apache.pulsar.client.impl.MessageChunkingTest ``` ✅ testPublishWithFailure ✅ testInvalidUseCaseForChunking @@ -572,12 +572,12 @@ ✅ testLargeMessage ⚪ testMaxPendingChunkMessages ``` -### ✅ org.apache.pulsar.client.impl.MessageParserTest +### ✅ org.apache.pulsar.client.impl.MessageParserTest ``` ✅ testWithoutBatches ✅ testWithBatches ``` -### ✅ org.apache.pulsar.client.impl.MultiTopicsReaderTest +### ✅ org.apache.pulsar.client.impl.MultiTopicsReaderTest ``` ✅ testReadMessageWithBatchingWithMessageInclusive ✅ testKeyHashRangeReader @@ -588,7 +588,7 @@ ✅ testReadMessageWithoutBatching ✅ testReaderWithTimeLong ``` -### ✅ org.apache.pulsar.client.impl.NegativeAcksTest +### ✅ org.apache.pulsar.client.impl.NegativeAcksTest ``` ✅ testNegativeAcks ✅ testNegativeAcks @@ -623,7 +623,7 @@ ✅ testNegativeAcks ✅ testNegativeAcks ``` -### ✅ org.apache.pulsar.client.impl.PatternTopicsConsumerImplTest +### ✅ org.apache.pulsar.client.impl.PatternTopicsConsumerImplTest ``` ✅ testStartEmptyPatternConsumer ✅ testBinaryProtoToGetTopicsOfNamespaceAll @@ -637,7 +637,7 @@ ✅ testTopicsListMinus ✅ testAutoSubscribePatternConsumer ``` -### ✅ org.apache.pulsar.client.impl.PerMessageUnAcknowledgedRedeliveryTest +### ✅ org.apache.pulsar.client.impl.PerMessageUnAcknowledgedRedeliveryTest ``` ✅ testSharedAckedNormalTopic ✅ testUnAckedMessageTrackerSize @@ -645,21 +645,21 @@ ✅ testExclusiveAckedNormalTopic ✅ testFailoverAckedNormalTopic ``` -### ✅ org.apache.pulsar.client.impl.PulsarMultiHostClientTest +### ✅ org.apache.pulsar.client.impl.PulsarMultiHostClientTest ``` ✅ testMultiHostUrlRetrySuccess ✅ testGetPartitionedTopicDataTimeout ✅ testGetPartitionedTopicMetaData ``` -### ✅ org.apache.pulsar.client.impl.RawMessageSerDeserTest +### ✅ org.apache.pulsar.client.impl.RawMessageSerDeserTest ``` ✅ testSerializationAndDeserialization ``` -### ✅ org.apache.pulsar.client.impl.SchemaDeleteTest +### ✅ org.apache.pulsar.client.impl.SchemaDeleteTest ``` ✅ createTopicDeleteTopicCreateTopic ``` -### ✅ org.apache.pulsar.client.impl.SequenceIdWithErrorTest +### ✅ org.apache.pulsar.client.impl.SequenceIdWithErrorTest ``` ✅ testCheckSequenceId ✅ testDeleteTopicWithMissingData @@ -667,12 +667,12 @@ ⚪ testCrashBrokerWithoutCursorLedgerLeak ⚪ testSkipCorruptDataLedger ``` -### ✅ org.apache.pulsar.client.impl.TopicDoesNotExistsTest +### ✅ org.apache.pulsar.client.impl.TopicDoesNotExistsTest ``` ✅ testCreateConsumerOnNotExistsTopic ✅ testCreateProducerOnNotExistsTopic ``` -### ✅ org.apache.pulsar.client.impl.TopicFromMessageTest +### ✅ org.apache.pulsar.client.impl.TopicFromMessageTest ``` ✅ testSingleTopicConsumerNoBatchFullName ✅ testMultiTopicConsumerBatchShortName @@ -680,7 +680,7 @@ ✅ testMultiTopicConsumerNoBatchShortName ✅ testSingleTopicConsumerBatchShortName ``` -### ✅ org.apache.pulsar.client.impl.TopicsConsumerImplTest +### ✅ org.apache.pulsar.client.impl.TopicsConsumerImplTest ``` ✅ testTopicAutoUpdatePartitions ✅ testDifferentTopicsNameSubscribe @@ -700,7 +700,7 @@ ✅ testTopicNameValid ✅ testAsyncConsumer ``` -### ✅ org.apache.pulsar.client.impl.UnAcknowledgedMessagesTimeoutTest +### ✅ org.apache.pulsar.client.impl.UnAcknowledgedMessagesTimeoutTest ``` ✅ testCheckUnAcknowledgedMessageTimer ✅ testExclusiveSingleAckedNormalTopic @@ -710,7 +710,7 @@ ✅ testExclusiveCumulativeAckedNormalTopic ✅ testSingleMessageBatch ``` -### ✅ org.apache.pulsar.client.impl.ZeroQueueSizeTest +### ✅ org.apache.pulsar.client.impl.ZeroQueueSizeTest ``` ✅ zeroQueueSizeSharedSubscription ✅ testPauseAndResume @@ -727,15 +727,15 @@ ✅ testFailedZeroQueueSizeBatchMessage ✅ testPauseAndResumeWithUnloading ``` -### ✅ org.apache.pulsar.common.api.raw.RawMessageImplTest +### ✅ org.apache.pulsar.common.api.raw.RawMessageImplTest ``` ✅ testGetProperties ``` -### ✅ org.apache.pulsar.common.compression.CommandsTest +### ✅ org.apache.pulsar.common.compression.CommandsTest ``` ✅ testChecksumSendCommand ``` -### ✅ org.apache.pulsar.common.compression.CompressorCodecBackwardCompatTest +### ✅ org.apache.pulsar.common.compression.CompressorCodecBackwardCompatTest ``` ✅ testCompressDecompress ✅ testCompressDecompress @@ -744,7 +744,7 @@ ✅ testCompressDecompress ✅ testCompressDecompress ``` -### ✅ org.apache.pulsar.common.compression.CompressorCodecTest +### ✅ org.apache.pulsar.common.compression.CompressorCodecTest ``` ✅ testCompressDecompress ✅ testMultpileUsages @@ -792,7 +792,7 @@ ✅ testDecompressReadonlyByteBuf ✅ testMultpileUsages ``` -### ✅ org.apache.pulsar.common.compression.Crc32cChecksumTest +### ✅ org.apache.pulsar.common.compression.Crc32cChecksumTest ``` ✅ testCrc32cHardware ✅ testCrc32cDirectMemoryHardware @@ -801,19 +801,19 @@ ✅ testCrc32cIncremental ✅ testCrc32cIncrementalUsingProvider ``` -### ✅ org.apache.pulsar.common.lookup.data.LookupDataTest +### ✅ org.apache.pulsar.common.lookup.data.LookupDataTest ``` ✅ testLoadReportSerialization ✅ testUrlEncoder ✅ serializeToJsonTest ✅ withConstructor ``` -### ✅ org.apache.pulsar.common.naming.MetadataTests +### ✅ org.apache.pulsar.common.naming.MetadataTests ``` ✅ testInvalidMetadata ✅ testValidMetadata ``` -### ✅ org.apache.pulsar.common.naming.NamespaceBundlesTest +### ✅ org.apache.pulsar.common.naming.NamespaceBundlesTest ``` ✅ testConstructor ✅ testSplitBundleInTwo @@ -821,7 +821,7 @@ ✅ testFindBundle ✅ testSplitBundleByFixBoundary ``` -### ✅ org.apache.pulsar.common.naming.NamespaceBundleTest +### ✅ org.apache.pulsar.common.naming.NamespaceBundleTest ``` ✅ testIncludes ✅ testGetBundle @@ -830,26 +830,26 @@ ✅ testToString ✅ testEquals ``` -### ✅ org.apache.pulsar.common.naming.NamespaceNameTest +### ✅ org.apache.pulsar.common.naming.NamespaceNameTest ``` ✅ namespace ✅ testNewScheme ``` -### ✅ org.apache.pulsar.common.naming.ServiceConfigurationTest +### ✅ org.apache.pulsar.common.naming.ServiceConfigurationTest ``` ✅ testOptionalSettingPresent ✅ testOptionalSettingEmpty ✅ testInit ✅ testInitFailure ``` -### ✅ org.apache.pulsar.common.naming.TopicNameTest +### ✅ org.apache.pulsar.common.naming.TopicNameTest ``` ✅ testShortTopicName ✅ topic ✅ testTopicNameWithoutCluster ✅ testDecodeEncode ``` -### ✅ org.apache.pulsar.common.net.ServiceURITest +### ✅ org.apache.pulsar.common.net.ServiceURITest ``` ✅ testEmptyServiceUriString ✅ testMultipleHostsSemiColon @@ -873,15 +873,15 @@ ✅ testMultipleHostsWithoutPulsarPorts ✅ testIpv6Uri ``` -### ✅ org.apache.pulsar.common.policies.data.AutoFailoverPolicyDataTest +### ✅ org.apache.pulsar.common.policies.data.AutoFailoverPolicyDataTest ``` ✅ testAutoFailoverPolicyData ``` -### ✅ org.apache.pulsar.common.policies.data.AutoFailoverPolicyTypeTest +### ✅ org.apache.pulsar.common.policies.data.AutoFailoverPolicyTypeTest ``` ✅ testAutoFailoverPolicyType ``` -### ✅ org.apache.pulsar.common.policies.data.AutoTopicCreationOverrideTest +### ✅ org.apache.pulsar.common.policies.data.AutoTopicCreationOverrideTest ``` ✅ testInvalidTopicType ✅ testNumPartitionsTooLow @@ -890,36 +890,36 @@ ✅ testNumPartitionsOnNonPartitioned ✅ testValidOverridePartitioned ``` -### ✅ org.apache.pulsar.common.policies.data.BacklogQuotaTest +### ✅ org.apache.pulsar.common.policies.data.BacklogQuotaTest ``` ✅ testBacklogQuotaIdentity ``` -### ✅ org.apache.pulsar.common.policies.data.ClusterDataTest +### ✅ org.apache.pulsar.common.policies.data.ClusterDataTest ``` ✅ simple ``` -### ✅ org.apache.pulsar.common.policies.data.ConsumerStatsTest +### ✅ org.apache.pulsar.common.policies.data.ConsumerStatsTest ``` ✅ testConsumerStats ``` -### ✅ org.apache.pulsar.common.policies.data.EnsemblePlacementPolicyConfigTest +### ✅ org.apache.pulsar.common.policies.data.EnsemblePlacementPolicyConfigTest ``` ✅ testDecodeFailed ✅ testEncodeDecodeSuccessfully ``` -### ✅ org.apache.pulsar.common.policies.data.LocalPolicesTest +### ✅ org.apache.pulsar.common.policies.data.LocalPolicesTest ``` ✅ testLocalPolices ``` -### ✅ org.apache.pulsar.common.policies.data.NamespaceIsolationDataTest +### ✅ org.apache.pulsar.common.policies.data.NamespaceIsolationDataTest ``` ✅ testNamespaceIsolationData ``` -### ✅ org.apache.pulsar.common.policies.data.NamespaceOwnershipStatusTest +### ✅ org.apache.pulsar.common.policies.data.NamespaceOwnershipStatusTest ``` ✅ testSerialization ``` -### ✅ org.apache.pulsar.common.policies.data.OffloadPoliciesTest +### ✅ org.apache.pulsar.common.policies.data.OffloadPoliciesTest ``` ✅ testGcsConfiguration ✅ mergeTest @@ -928,58 +928,58 @@ ✅ testS3Configuration ✅ oldPoliciesCompatibleTest ``` -### ✅ org.apache.pulsar.common.policies.data.PartitionedTopicStatsTest +### ✅ org.apache.pulsar.common.policies.data.PartitionedTopicStatsTest ``` ✅ testPartitionedTopicStats ``` -### ✅ org.apache.pulsar.common.policies.data.PersistencePoliciesTest +### ✅ org.apache.pulsar.common.policies.data.PersistencePoliciesTest ``` ✅ testPersistencePolicies ``` -### ✅ org.apache.pulsar.common.policies.data.PersistentOfflineTopicStatsTest +### ✅ org.apache.pulsar.common.policies.data.PersistentOfflineTopicStatsTest ``` ✅ testPersistentOfflineTopicStats ``` -### ✅ org.apache.pulsar.common.policies.data.PersistentTopicStatsTest +### ✅ org.apache.pulsar.common.policies.data.PersistentTopicStatsTest ``` ✅ testPersistentTopicStatsAggregation ✅ testPersistentTopicStats ``` -### ✅ org.apache.pulsar.common.policies.data.PoliciesDataTest +### ✅ org.apache.pulsar.common.policies.data.PoliciesDataTest ``` ✅ propertyAdmin ✅ policies ✅ bundlesData ✅ bundlesPolicies ``` -### ✅ org.apache.pulsar.common.policies.data.PublisherStatsTest +### ✅ org.apache.pulsar.common.policies.data.PublisherStatsTest ``` ✅ testPublisherStats ✅ testPublisherStatsAggregation ``` -### ✅ org.apache.pulsar.common.policies.data.ReplicatorStatsTest +### ✅ org.apache.pulsar.common.policies.data.ReplicatorStatsTest ``` ✅ testReplicatorStatsAdd ✅ testReplicatorStatsNull ``` -### ✅ org.apache.pulsar.common.policies.data.ResourceQuotaTest +### ✅ org.apache.pulsar.common.policies.data.ResourceQuotaTest ``` ✅ testResourceQuotaDefault ✅ testResourceQuotaEqual ``` -### ✅ org.apache.pulsar.common.policies.data.RetentionPolicesTest +### ✅ org.apache.pulsar.common.policies.data.RetentionPolicesTest ``` ✅ testRetentionPolices ``` -### ✅ org.apache.pulsar.common.policies.impl.AutoFailoverPolicyFactoryTest +### ✅ org.apache.pulsar.common.policies.impl.AutoFailoverPolicyFactoryTest ``` ✅ testAutoFailoverPolicyFactory ``` -### ✅ org.apache.pulsar.common.policies.impl.MinAvailablePolicyTest +### ✅ org.apache.pulsar.common.policies.impl.MinAvailablePolicyTest ``` ✅ testMinAvailablePolicty ``` -### ✅ org.apache.pulsar.common.policies.impl.NamespaceIsolationPoliciesTest +### ✅ org.apache.pulsar.common.policies.impl.NamespaceIsolationPoliciesTest ``` ✅ testBrokerAssignment ✅ testGetNamespaceIsolationPolicyByName @@ -989,7 +989,7 @@ ✅ testDefaultConstructor ✅ testGetNamespaceIsolationPolicyByNamespace ``` -### ✅ org.apache.pulsar.common.policies.impl.NamespaceIsolationPolicyImplTest +### ✅ org.apache.pulsar.common.policies.impl.NamespaceIsolationPolicyImplTest ``` ✅ testFindBrokers ✅ testGetSecondaryBrokers @@ -999,12 +999,12 @@ ✅ testConstructor ✅ testIsPrimaryOrSecondaryBroker ``` -### ✅ org.apache.pulsar.common.protocol.ByteBufPairTest +### ✅ org.apache.pulsar.common.protocol.ByteBufPairTest ``` ✅ testEncoder ✅ testDoubleByteBuf ``` -### ✅ org.apache.pulsar.common.protocol.CommandUtilsTests +### ✅ org.apache.pulsar.common.protocol.CommandUtilsTests ``` ✅ testSkipBrokerEntryMetadata ✅ testPeekBrokerEntryMetadata @@ -1014,7 +1014,7 @@ ✅ testAddBrokerEntryMetadata ✅ testByteBufComposite ``` -### ✅ org.apache.pulsar.common.protocol.MarkersTest +### ✅ org.apache.pulsar.common.protocol.MarkersTest ``` ✅ testSnapshot ✅ testTxnAbortMarker @@ -1023,25 +1023,25 @@ ✅ testSnapshotRequest ✅ testSnapshotResponse ``` -### ✅ org.apache.pulsar.common.protocol.PulsarDecoderTest +### ✅ org.apache.pulsar.common.protocol.PulsarDecoderTest ``` ✅ testChannelRead ``` -### ✅ org.apache.pulsar.common.stats.JvmDefaultGCMetricsLoggerTest +### ✅ org.apache.pulsar.common.stats.JvmDefaultGCMetricsLoggerTest ``` ✅ testInvokeJVMInternals ``` -### ✅ org.apache.pulsar.common.util.collections.BitSetRecyclableRecyclableTest +### ✅ org.apache.pulsar.common.util.collections.BitSetRecyclableRecyclableTest ``` ✅ testResetWords ✅ testRecycle ``` -### ✅ org.apache.pulsar.common.util.collections.ConcurrentBitSetRecyclableTest +### ✅ org.apache.pulsar.common.util.collections.ConcurrentBitSetRecyclableTest ``` ✅ testRecycle ✅ testGenerateByBitSet ``` -### ✅ org.apache.pulsar.common.util.collections.ConcurrentLongHashMapTest +### ✅ org.apache.pulsar.common.util.collections.ConcurrentLongHashMapTest ``` ✅ testRehashingWithDeletes ✅ concurrentInsertionsAndReads @@ -1057,7 +1057,7 @@ ✅ stressConcurrentInsertionsAndReads ✅ testNegativeUsedBucketCount ``` -### ✅ org.apache.pulsar.common.util.collections.ConcurrentLongPairSetTest +### ✅ org.apache.pulsar.common.util.collections.ConcurrentLongPairSetTest ``` ✅ concurrentInsertionsAndReads ✅ testEqualsObjects @@ -1075,7 +1075,7 @@ ✅ testConstructor ✅ concurrentInsertions ``` -### ✅ org.apache.pulsar.common.util.collections.ConcurrentOpenHashMapTest +### ✅ org.apache.pulsar.common.util.collections.ConcurrentOpenHashMapTest ``` ✅ testRemove ✅ simpleInsertions @@ -1090,7 +1090,7 @@ ✅ concurrentInsertionsAndReads ✅ testConstructor ``` -### ✅ org.apache.pulsar.common.util.collections.ConcurrentOpenHashSetTest +### ✅ org.apache.pulsar.common.util.collections.ConcurrentOpenHashSetTest ``` ✅ concurrentInsertions ✅ testRehashing @@ -1104,7 +1104,7 @@ ✅ testRehashingWithDeletes ✅ testRemove ``` -### ✅ org.apache.pulsar.common.util.collections.ConcurrentOpenLongPairRangeSetTest +### ✅ org.apache.pulsar.common.util.collections.ConcurrentOpenLongPairRangeSetTest ``` ✅ testAddForDifferentKey ✅ testToString @@ -1120,7 +1120,7 @@ ✅ testDeleteWithAtMost ✅ testRangeContaining ``` -### ✅ org.apache.pulsar.common.util.collections.ConcurrentSortedLongPairSetTest +### ✅ org.apache.pulsar.common.util.collections.ConcurrentSortedLongPairSetTest ``` ✅ concurrentInsertions ✅ testIfRemoval @@ -1132,12 +1132,12 @@ ✅ testIteration ✅ testToString ``` -### ✅ org.apache.pulsar.common.util.collections.FieldParserTest +### ✅ org.apache.pulsar.common.util.collections.FieldParserTest ``` ✅ testUpdateObject ✅ testConversion ``` -### ✅ org.apache.pulsar.common.util.collections.GrowableArrayBlockingQueueTest +### ✅ org.apache.pulsar.common.util.collections.GrowableArrayBlockingQueueTest ``` ✅ removeTest ✅ growArray @@ -1146,7 +1146,7 @@ ✅ pollTimeout2 ✅ blockingTake ``` -### ✅ org.apache.pulsar.common.util.collections.GrowablePriorityLongPairQueueTest +### ✅ org.apache.pulsar.common.util.collections.GrowablePriorityLongPairQueueTest ``` ✅ testItems ✅ testRemove @@ -1164,17 +1164,17 @@ ✅ testRemoval ✅ testIfRemoval ``` -### ✅ org.apache.pulsar.common.util.collections.TripleLongPriorityQueueTest +### ✅ org.apache.pulsar.common.util.collections.TripleLongPriorityQueueTest ``` ✅ testQueue ✅ testCheckForEmpty ✅ testCompareWithSamePrefix ``` -### ✅ org.apache.pulsar.common.util.FieldParserTest +### ✅ org.apache.pulsar.common.util.FieldParserTest ``` ✅ testMap ``` -### ✅ org.apache.pulsar.common.util.FileModifiedTimeUpdaterTest +### ✅ org.apache.pulsar.common.util.FileModifiedTimeUpdaterTest ``` ✅ testFileNotModified ✅ testFileModified @@ -1183,7 +1183,7 @@ ✅ testFileModified ✅ testFileNotModified ``` -### ✅ org.apache.pulsar.common.util.netty.ChannelFuturesTest +### ✅ org.apache.pulsar.common.util.netty.ChannelFuturesTest ``` ✅ toCompletableFuture_shouldCompleteExceptionally_channelFutureCompletedAfter ✅ toCompletableFuture_shouldCompleteSuccessfully_channelFutureCompletedAfter @@ -1191,7 +1191,7 @@ ✅ toCompletableFuture_shouldCompleteExceptionally_channelFutureCompletedBefore ✅ toCompletableFuture_shouldRequireNonNullArgument ``` -### ✅ org.apache.pulsar.common.util.RateLimiterTest +### ✅ org.apache.pulsar.common.util.RateLimiterTest ``` ✅ testMultipleTryAcquire ✅ testRateLimiterWithPermitUpdater @@ -1205,7 +1205,7 @@ ✅ testRateLimiterWithFunction ✅ testAcquireBlock ``` -### ✅ org.apache.pulsar.common.util.ReflectionsTest +### ✅ org.apache.pulsar.common.util.ReflectionsTest ``` ✅ testCreateInstanceNoNoArgConstructor ✅ testCreateInstanceConstructorThrowsException @@ -1220,70 +1220,70 @@ ✅ testLoadClass ✅ testClassInJarImplementsIface ``` -### ✅ org.apache.pulsar.common.util.RelativeTimeUtilTest +### ✅ org.apache.pulsar.common.util.RelativeTimeUtilTest ``` ✅ testParseRelativeTime ``` -### ✅ org.apache.pulsar.discovery.service.web.DiscoveryServiceWebTest +### ✅ org.apache.pulsar.discovery.service.web.DiscoveryServiceWebTest ``` ✅ testRedirectUrlWithServerStarted ``` -### ✅ org.apache.pulsar.functions.worker.PulsarFunctionE2ESecurityTest +### ✅ org.apache.pulsar.functions.worker.PulsarFunctionE2ESecurityTest ``` ✅ testAuthorizationWithAnonymousUser ✅ testAuthorization ``` -### ✅ org.apache.pulsar.functions.worker.PulsarFunctionPublishTest +### ✅ org.apache.pulsar.functions.worker.PulsarFunctionPublishTest ``` ✅ testPulsarFunctionState ✅ testMultipleAddress ✅ testPulsarFunctionBKCleanup ``` -### ✅ org.apache.pulsar.functions.worker.PulsarFunctionTlsTest +### ✅ org.apache.pulsar.functions.worker.PulsarFunctionTlsTest ``` ✅ testFunctionsCreation ``` -### ✅ org.apache.pulsar.io.PulsarFunctionTlsTest +### ✅ org.apache.pulsar.io.PulsarFunctionTlsTest ``` ✅ testAuthorization ``` -### ✅ org.apache.pulsar.proxy.server.AdminProxyHandlerTest +### ✅ org.apache.pulsar.proxy.server.AdminProxyHandlerTest ``` ✅ replayableProxyContentProviderTest ``` -### ✅ org.apache.pulsar.proxy.server.AuthedAdminProxyHandlerTest +### ✅ org.apache.pulsar.proxy.server.AuthedAdminProxyHandlerTest ``` ✅ testAuthenticatedProxyAsNonAdmin ``` -### ✅ org.apache.pulsar.proxy.server.FunctionWorkerRoutingTest +### ✅ org.apache.pulsar.proxy.server.FunctionWorkerRoutingTest ``` ✅ testFunctionWorkerRedirect ``` -### ✅ org.apache.pulsar.proxy.server.ProxyAdditionalServletTest +### ✅ org.apache.pulsar.proxy.server.ProxyAdditionalServletTest ``` ✅ test ``` -### ✅ org.apache.pulsar.proxy.server.ProxyAuthenticatedProducerConsumerTest +### ✅ org.apache.pulsar.proxy.server.ProxyAuthenticatedProducerConsumerTest ``` ✅ testTlsSyncProducerAndConsumer ``` -### ✅ org.apache.pulsar.proxy.server.ProxyAuthenticationTest +### ✅ org.apache.pulsar.proxy.server.ProxyAuthenticationTest ``` ✅ testAuthentication ``` -### ✅ org.apache.pulsar.proxy.server.ProxyConnectionThrottlingTest +### ✅ org.apache.pulsar.proxy.server.ProxyConnectionThrottlingTest ``` ✅ testInboundConnection ``` -### ✅ org.apache.pulsar.proxy.server.ProxyEnableHAProxyProtocolTest +### ✅ org.apache.pulsar.proxy.server.ProxyEnableHAProxyProtocolTest ``` ✅ testSimpleProduceAndConsume ``` -### ✅ org.apache.pulsar.proxy.server.ProxyForwardAuthDataTest +### ✅ org.apache.pulsar.proxy.server.ProxyForwardAuthDataTest ``` ✅ testForwardAuthData ``` -### ✅ org.apache.pulsar.proxy.server.ProxyIsAHttpProxyTest +### ✅ org.apache.pulsar.proxy.server.ProxyIsAHttpProxyTest ``` ✅ testProxyToEndsInSlash ✅ testStreaming @@ -1296,23 +1296,23 @@ ✅ testSingleRedirect ✅ testRedirectNotSpecified ``` -### ✅ org.apache.pulsar.proxy.server.ProxyKeyStoreTlsTestWithAuth +### ✅ org.apache.pulsar.proxy.server.ProxyKeyStoreTlsTestWithAuth ``` ✅ testProducerFailed ✅ testPartitions ✅ testProducer ``` -### ✅ org.apache.pulsar.proxy.server.ProxyKeyStoreTlsTestWithoutAuth +### ✅ org.apache.pulsar.proxy.server.ProxyKeyStoreTlsTestWithoutAuth ``` ✅ testPartitions ✅ testProducerFailed ✅ testProducer ``` -### ✅ org.apache.pulsar.proxy.server.ProxyLookupThrottlingTest +### ✅ org.apache.pulsar.proxy.server.ProxyLookupThrottlingTest ``` ✅ testLookup ``` -### ✅ org.apache.pulsar.proxy.server.ProxyParserTest +### ✅ org.apache.pulsar.proxy.server.ProxyParserTest ``` ✅ testRegexSubscription ✅ testProducerConsumer @@ -1320,17 +1320,17 @@ ✅ testPartitions ✅ testProtocolVersionAdvertisement ``` -### ✅ org.apache.pulsar.proxy.server.ProxyRolesEnforcementTest +### ✅ org.apache.pulsar.proxy.server.ProxyRolesEnforcementTest ``` ✅ testIncorrectRoles ``` -### ✅ org.apache.pulsar.proxy.server.ProxyStatsTest +### ✅ org.apache.pulsar.proxy.server.ProxyStatsTest ``` ✅ testChangeLogLevel ✅ testConnectionsStats ✅ testTopicStats ``` -### ✅ org.apache.pulsar.proxy.server.ProxyTest +### ✅ org.apache.pulsar.proxy.server.ProxyTest ``` ✅ testPartitions ✅ testRegexSubscription @@ -1339,20 +1339,20 @@ ✅ testProducer ✅ testProducerConsumer ``` -### ✅ org.apache.pulsar.proxy.server.ProxyTlsTest +### ✅ org.apache.pulsar.proxy.server.ProxyTlsTest ``` ✅ testProducer ✅ testPartitions ``` -### ✅ org.apache.pulsar.proxy.server.ProxyTlsTestWithAuth +### ✅ org.apache.pulsar.proxy.server.ProxyTlsTestWithAuth ``` ✅ testServiceStartup ``` -### ✅ org.apache.pulsar.proxy.server.ProxyWithAuthorizationNegTest +### ✅ org.apache.pulsar.proxy.server.ProxyWithAuthorizationNegTest ``` ✅ testProxyAuthorization ``` -### ✅ org.apache.pulsar.proxy.server.ProxyWithAuthorizationTest +### ✅ org.apache.pulsar.proxy.server.ProxyWithAuthorizationTest ``` ✅ tlsCiphersAndProtocols ✅ testTlsHostVerificationProxyToClient @@ -1368,22 +1368,22 @@ ✅ testTlsHostVerificationProxyToClient ✅ tlsCiphersAndProtocols ``` -### ✅ org.apache.pulsar.proxy.server.ProxyWithoutServiceDiscoveryTest +### ✅ org.apache.pulsar.proxy.server.ProxyWithoutServiceDiscoveryTest ``` ✅ testDiscoveryService ``` -### ✅ org.apache.pulsar.proxy.server.SuperUserAuthedAdminProxyHandlerTest +### ✅ org.apache.pulsar.proxy.server.SuperUserAuthedAdminProxyHandlerTest ``` ✅ testAuthWithRandoCert ✅ testAuthenticatedProxyAsAdmin ✅ testAuthenticatedProxyAsNonAdmin ``` -### ✅ org.apache.pulsar.proxy.server.UnauthedAdminProxyHandlerTest +### ✅ org.apache.pulsar.proxy.server.UnauthedAdminProxyHandlerTest ``` ✅ testUnauthenticatedProxy ✅ testVipStatus ``` -### ✅ org.apache.pulsar.PulsarBrokerStarterTest +### ✅ org.apache.pulsar.PulsarBrokerStarterTest ``` ✅ testMainRunBookieNoConfig ✅ testLoadConfigWithException @@ -1395,7 +1395,7 @@ ✅ testMainEnableRunBookieThroughBrokerConfig ✅ testMainRunBookieAndAutoRecoveryNoConfig ``` -### ✅ org.apache.pulsar.schema.compatibility.SchemaCompatibilityCheckTest +### ✅ org.apache.pulsar.schema.compatibility.SchemaCompatibilityCheckTest ``` ✅ testConsumerCompatibilityCheckCanReadLastTest ✅ testConsumerWithNotCompatibilitySchema @@ -1421,22 +1421,22 @@ ✅ testConsumerCompatibilityCheckCanReadLastTest ✅ testIsAutoUpdateSchema ``` -### ✅ org.apache.pulsar.schema.PartitionedTopicSchemaTest +### ✅ org.apache.pulsar.schema.PartitionedTopicSchemaTest ``` ✅ test ``` -### ✅ org.apache.pulsar.schema.SchemaTest +### ✅ org.apache.pulsar.schema.SchemaTest ``` ✅ testIsUsingAvroSchemaParser ✅ testBytesSchemaDeserialize ✅ testMultiTopicSetSchemaProvider ``` -### ✅ org.apache.pulsar.stats.client.PulsarBrokerStatsClientTest +### ✅ org.apache.pulsar.stats.client.PulsarBrokerStatsClientTest ``` ✅ testServiceException ✅ testTopicInternalStats ``` -### ✅ org.apache.pulsar.tests.EnumValuesDataProviderTest +### ✅ org.apache.pulsar.tests.EnumValuesDataProviderTest ``` ✅ shouldFailIfEnumParameterIsMissing ✅ testEnumValuesProvider @@ -1445,7 +1445,7 @@ ✅ shouldContainAllEnumValues ✅ testEnumValuesProvider ``` -### ✅ org.apache.pulsar.tests.TestRetrySupportBeforeMethodRetryTest +### ✅ org.apache.pulsar.tests.TestRetrySupportBeforeMethodRetryTest ``` ✅ shouldNotDoAnythingWhenThereIsBeforeAndAfterMethod ⚪ shouldNotDoAnythingWhenThereIsBeforeAndAfterMethod @@ -1453,7 +1453,7 @@ ⚪ shouldNotDoAnythingWhenThereIsBeforeAndAfterMethod ⚪ shouldNotDoAnythingWhenThereIsBeforeAndAfterMethod ``` -### ✅ org.apache.pulsar.tests.TestRetrySupportRetryTest +### ✅ org.apache.pulsar.tests.TestRetrySupportRetryTest ``` ⚪ shouldCallSetupBeforeRetrying ✅ shouldCallSetupBeforeRetrying @@ -1461,25 +1461,25 @@ ⚪ shouldCallSetupBeforeRetrying ⚪ shouldCallSetupBeforeRetrying ``` -### ✅ org.apache.pulsar.tests.TestRetrySupportSuccessTest +### ✅ org.apache.pulsar.tests.TestRetrySupportSuccessTest ``` ✅ shouldCallSetupOnce1 ✅ shouldCallSetupOnce3 ✅ shouldCallSetupOnce2 ``` -### ✅ org.apache.pulsar.tests.ThreadDumpUtilTest +### ✅ org.apache.pulsar.tests.ThreadDumpUtilTest ``` ✅ testHelp ✅ testThreadDump ``` -### ✅ org.apache.pulsar.utils.SimpleTextOutputStreamTest +### ✅ org.apache.pulsar.utils.SimpleTextOutputStreamTest ``` ✅ testBooleanFormat ✅ testDoubleFormat ✅ testLongFormat ✅ testString ``` -### ✅ org.apache.pulsar.utils.StatsOutputStreamTest +### ✅ org.apache.pulsar.utils.StatsOutputStreamTest ``` ✅ testLists ✅ testNamedObjects @@ -1488,31 +1488,31 @@ ✅ testPairs ✅ testObjects ``` -### ✅ org.apache.pulsar.websocket.proxy.ProxyAuthenticationTest +### ✅ org.apache.pulsar.websocket.proxy.ProxyAuthenticationTest ``` ✅ unauthenticatedSocketTest ✅ authenticatedSocketTest ✅ statsTest ✅ anonymousSocketTest ``` -### ✅ org.apache.pulsar.websocket.proxy.ProxyAuthorizationTest +### ✅ org.apache.pulsar.websocket.proxy.ProxyAuthorizationTest ``` ✅ test ``` -### ✅ org.apache.pulsar.websocket.proxy.ProxyConfigurationTest +### ✅ org.apache.pulsar.websocket.proxy.ProxyConfigurationTest ``` ✅ configTest ✅ configTest ``` -### ✅ org.apache.pulsar.websocket.proxy.ProxyPublishConsumeTlsTest +### ✅ org.apache.pulsar.websocket.proxy.ProxyPublishConsumeTlsTest ``` ✅ socketTest ``` -### ✅ org.apache.pulsar.websocket.proxy.ProxyPublishConsumeWithoutZKTest +### ✅ org.apache.pulsar.websocket.proxy.ProxyPublishConsumeWithoutZKTest ``` ✅ socketTest ``` -### ✅ org.apache.pulsar.websocket.proxy.v1.V1_ProxyAuthenticationTest +### ✅ org.apache.pulsar.websocket.proxy.v1.V1_ProxyAuthenticationTest ``` ✅ anonymousSocketTest ✅ authenticatedSocketTest diff --git a/__tests__/__outputs__/python-xunit-pytest.md b/__tests__/__outputs__/python-xunit-pytest.md new file mode 100644 index 0000000..7b13e28 --- /dev/null +++ b/__tests__/__outputs__/python-xunit-pytest.md @@ -0,0 +1,26 @@ +![Tests failed](https://img.shields.io/badge/tests-6%20passed%2C%202%20failed%2C%202%20skipped-critical) +|Report|Passed|Failed|Skipped|Time| +|:---|---:|---:|---:|---:| +|[fixtures/python-xunit-pytest.xml](#user-content-r0)|6 ✅|2 ❌|2 ⚪|19ms| +## ❌ fixtures/python-xunit-pytest.xml +**10** tests were completed in **19ms** with **6** passed, **2** failed and **2** skipped. +|Test suite|Passed|Failed|Skipped|Time| +|:---|---:|---:|---:|---:| +|[pytest](#user-content-r0s0)|6 ✅|2 ❌|2 ⚪|19ms| +### ❌ pytest +``` +tests.test_lib + ✅ test_always_pass + ✅ test_with_subtests + ✅ test_parameterized[param1] + ✅ test_parameterized[param2] + ⚪ test_always_skip + ❌ test_always_fail + assert False + ⚪ test_expected_failure + ❌ test_error + Exception: error + ✅ test_with_record_property +custom_classname + ✅ test_with_record_xml_attribute +``` \ No newline at end of file diff --git a/__tests__/__outputs__/python-xunit-unittest.md b/__tests__/__outputs__/python-xunit-unittest.md new file mode 100644 index 0000000..230d186 --- /dev/null +++ b/__tests__/__outputs__/python-xunit-unittest.md @@ -0,0 +1,23 @@ +![Tests failed](https://img.shields.io/badge/tests-4%20passed%2C%202%20failed%2C%202%20skipped-critical) +|Report|Passed|Failed|Skipped|Time| +|:---|---:|---:|---:|---:| +|[fixtures/python-xunit-unittest.xml](#user-content-r0)|4 ✅|2 ❌|2 ⚪|1ms| +## ❌ fixtures/python-xunit-unittest.xml +**8** tests were completed in **1ms** with **4** passed, **2** failed and **2** skipped. +|Test suite|Passed|Failed|Skipped|Time| +|:---|---:|---:|---:|---:| +|[TestAcme-20251114214921](#user-content-r0s0)|4 ✅|2 ❌|2 ⚪|1ms| +### ❌ TestAcme-20251114214921 +``` +TestAcme + ✅ test_always_pass + ✅ test_parameterized_0_param1 + ✅ test_parameterized_1_param2 + ✅ test_with_subtests + ❌ test_always_fail + AssertionError: failed + ❌ test_error + Exception: error + ⚪ test_always_skip + ⚪ test_expected_failure +``` \ No newline at end of file diff --git a/__tests__/__outputs__/rspec-json.md b/__tests__/__outputs__/rspec-json.md index 88336be..d64cf44 100644 --- a/__tests__/__outputs__/rspec-json.md +++ b/__tests__/__outputs__/rspec-json.md @@ -1,13 +1,13 @@ ![Tests failed](https://img.shields.io/badge/tests-1%20passed%2C%201%20failed%2C%201%20skipped-critical) |Report|Passed|Failed|Skipped|Time| |:---|---:|---:|---:|---:| -|fixtures/rspec-json.json|1 ✅|1 ❌|1 ⚪|0ms| -## ❌ fixtures/rspec-json.json +|[fixtures/rspec-json.json](#user-content-r0)|1 ✅|1 ❌|1 ⚪|0ms| +## ❌ fixtures/rspec-json.json **3** tests were completed in **0ms** with **1** passed, **1** failed and **1** skipped. |Test suite|Passed|Failed|Skipped|Time| |:---|---:|---:|---:|---:| -|[./spec/config/check_env_vars_spec.rb](#r0s0)|1 ✅|1 ❌|1 ⚪|0ms| -### ❌ ./spec/config/check_env_vars_spec.rb +|[./spec/config/check_env_vars_spec.rb](#user-content-r0s0)|1 ✅|1 ❌|1 ⚪|0ms| +### ❌ ./spec/config/check_env_vars_spec.rb ``` CheckEnvVars#call when all env vars are defined behaves like success load ❌ CheckEnvVars#call when all env vars are defined behaves like success load fails in assertion diff --git a/__tests__/__outputs__/silent-notes-test-results.md b/__tests__/__outputs__/silent-notes-test-results.md index 9cd23f5..e3abc49 100644 --- a/__tests__/__outputs__/silent-notes-test-results.md +++ b/__tests__/__outputs__/silent-notes-test-results.md @@ -3,25 +3,25 @@ |Report|Passed|Failed|Skipped|Time| |:---|---:|---:|---:|---:| -|fixtures/external/SilentNotes.trx|67 ✅||12 ⚪|1s| -## ✅ fixtures/external/SilentNotes.trx +|[fixtures/external/SilentNotes.trx](#user-content-r0)|67 ✅||12 ⚪|1s| +## ✅ fixtures/external/SilentNotes.trx **79** tests were completed in **1s** with **67** passed, **0** failed and **12** skipped. |Test suite|Passed|Failed|Skipped|Time| |:---|---:|---:|---:|---:| -|[VanillaCloudStorageClientTest.CloudStorageCredentialsTest](#r0s0)|6 ✅|||30ms| -|[VanillaCloudStorageClientTest.CloudStorageProviders.DropboxCloudStorageClientTest](#r0s1)|2 ✅||3 ⚪|101ms| -|[VanillaCloudStorageClientTest.CloudStorageProviders.FtpCloudStorageClientTest](#r0s2)|4 ✅||3 ⚪|166ms| -|[VanillaCloudStorageClientTest.CloudStorageProviders.GmxCloudStorageClientTest](#r0s3)|2 ✅|||7ms| -|[VanillaCloudStorageClientTest.CloudStorageProviders.GoogleCloudStorageClientTest](#r0s4)|1 ✅||3 ⚪|40ms| -|[VanillaCloudStorageClientTest.CloudStorageProviders.OnedriveCloudStorageClientTest](#r0s5)|1 ✅||3 ⚪|15ms| -|[VanillaCloudStorageClientTest.CloudStorageProviders.WebdavCloudStorageClientTest](#r0s6)|5 ✅|||16ms| -|[VanillaCloudStorageClientTest.CloudStorageTokenTest](#r0s7)|9 ✅|||0ms| -|[VanillaCloudStorageClientTest.OAuth2.AuthorizationResponseErrorTest](#r0s8)|3 ✅|||3ms| -|[VanillaCloudStorageClientTest.OAuth2.OAuth2UtilsTest](#r0s9)|9 ✅|||12ms| -|[VanillaCloudStorageClientTest.OAuth2CloudStorageClientTest](#r0s10)|5 ✅|||13ms| -|[VanillaCloudStorageClientTest.SecureStringExtensionsTest](#r0s11)|7 ✅|||0ms| -|[VanillaCloudStorageClientTest.SerializeableCloudStorageCredentialsTest](#r0s12)|13 ✅|||43ms| -### ✅ VanillaCloudStorageClientTest.CloudStorageCredentialsTest +|[VanillaCloudStorageClientTest.CloudStorageCredentialsTest](#user-content-r0s0)|6 ✅|||30ms| +|[VanillaCloudStorageClientTest.CloudStorageProviders.DropboxCloudStorageClientTest](#user-content-r0s1)|2 ✅||3 ⚪|101ms| +|[VanillaCloudStorageClientTest.CloudStorageProviders.FtpCloudStorageClientTest](#user-content-r0s2)|4 ✅||3 ⚪|166ms| +|[VanillaCloudStorageClientTest.CloudStorageProviders.GmxCloudStorageClientTest](#user-content-r0s3)|2 ✅|||7ms| +|[VanillaCloudStorageClientTest.CloudStorageProviders.GoogleCloudStorageClientTest](#user-content-r0s4)|1 ✅||3 ⚪|40ms| +|[VanillaCloudStorageClientTest.CloudStorageProviders.OnedriveCloudStorageClientTest](#user-content-r0s5)|1 ✅||3 ⚪|15ms| +|[VanillaCloudStorageClientTest.CloudStorageProviders.WebdavCloudStorageClientTest](#user-content-r0s6)|5 ✅|||16ms| +|[VanillaCloudStorageClientTest.CloudStorageTokenTest](#user-content-r0s7)|9 ✅|||0ms| +|[VanillaCloudStorageClientTest.OAuth2.AuthorizationResponseErrorTest](#user-content-r0s8)|3 ✅|||3ms| +|[VanillaCloudStorageClientTest.OAuth2.OAuth2UtilsTest](#user-content-r0s9)|9 ✅|||12ms| +|[VanillaCloudStorageClientTest.OAuth2CloudStorageClientTest](#user-content-r0s10)|5 ✅|||13ms| +|[VanillaCloudStorageClientTest.SecureStringExtensionsTest](#user-content-r0s11)|7 ✅|||0ms| +|[VanillaCloudStorageClientTest.SerializeableCloudStorageCredentialsTest](#user-content-r0s12)|13 ✅|||43ms| +### ✅ VanillaCloudStorageClientTest.CloudStorageCredentialsTest ``` ✅ AreEqualWorksWithDifferentPassword ✅ AreEqualWorksWithSameContent @@ -30,7 +30,7 @@ ✅ ValidateAcceptsValidCredentials ✅ ValidateRejectsInvalidCredentials ``` -### ✅ VanillaCloudStorageClientTest.CloudStorageProviders.DropboxCloudStorageClientTest +### ✅ VanillaCloudStorageClientTest.CloudStorageProviders.DropboxCloudStorageClientTest ``` ✅ FileLifecycleWorks ⚪ ReallyDoFetchToken @@ -38,7 +38,7 @@ ⚪ ReallyDoRefreshToken ✅ ThrowsAccessDeniedExceptionWithInvalidToken ``` -### ✅ VanillaCloudStorageClientTest.CloudStorageProviders.FtpCloudStorageClientTest +### ✅ VanillaCloudStorageClientTest.CloudStorageProviders.FtpCloudStorageClientTest ``` ✅ FileLifecycleWorks ✅ SanitizeCredentials_ChangesInvalidPrefix @@ -48,26 +48,26 @@ ⚪ ThrowsWithInvalidUrl ⚪ ThrowsWithInvalidUsername ``` -### ✅ VanillaCloudStorageClientTest.CloudStorageProviders.GmxCloudStorageClientTest +### ✅ VanillaCloudStorageClientTest.CloudStorageProviders.GmxCloudStorageClientTest ``` ✅ ChoosesCorrectUrlForGmxComEmail ✅ ChoosesCorrectUrlForGmxNetEmail ``` -### ✅ VanillaCloudStorageClientTest.CloudStorageProviders.GoogleCloudStorageClientTest +### ✅ VanillaCloudStorageClientTest.CloudStorageProviders.GoogleCloudStorageClientTest ``` ✅ FileLifecycleWorks ⚪ ReallyDoFetchToken ⚪ ReallyDoOpenAuthorizationPageInBrowser ⚪ ReallyDoRefreshToken ``` -### ✅ VanillaCloudStorageClientTest.CloudStorageProviders.OnedriveCloudStorageClientTest +### ✅ VanillaCloudStorageClientTest.CloudStorageProviders.OnedriveCloudStorageClientTest ``` ✅ FileLifecycleWorks ⚪ ReallyDoFetchToken ⚪ ReallyDoOpenAuthorizationPageInBrowser ⚪ ReallyDoRefreshToken ``` -### ✅ VanillaCloudStorageClientTest.CloudStorageProviders.WebdavCloudStorageClientTest +### ✅ VanillaCloudStorageClientTest.CloudStorageProviders.WebdavCloudStorageClientTest ``` ✅ FileLifecycleWorks ✅ ParseGmxWebdavResponseCorrectly @@ -75,7 +75,7 @@ ✅ ThrowsWithInvalidPath ✅ ThrowsWithInvalidUsername ``` -### ✅ VanillaCloudStorageClientTest.CloudStorageTokenTest +### ✅ VanillaCloudStorageClientTest.CloudStorageTokenTest ``` ✅ AreEqualWorksWithNullDate ✅ AreEqualWorksWithSameContent @@ -87,13 +87,13 @@ ✅ SetExpiryDateBySecondsWorksWithNull ✅ SetExpiryDateBySecondsWorksWithVeryShortPeriod ``` -### ✅ VanillaCloudStorageClientTest.OAuth2.AuthorizationResponseErrorTest +### ✅ VanillaCloudStorageClientTest.OAuth2.AuthorizationResponseErrorTest ``` ✅ ParsesAllErrorCodesCorrectly ✅ ParsesNullErrorCodeCorrectly ✅ ParsesUnknownErrorCodeCorrectly ``` -### ✅ VanillaCloudStorageClientTest.OAuth2.OAuth2UtilsTest +### ✅ VanillaCloudStorageClientTest.OAuth2.OAuth2UtilsTest ``` ✅ BuildAuthorizationRequestUrlEscapesParameters ✅ BuildAuthorizationRequestUrlLeavesOutOptionalParameters @@ -105,7 +105,7 @@ ✅ ParseRealWorldGoogleRejectResponse ✅ ParseRealWorldGoogleSuccessResponse ``` -### ✅ VanillaCloudStorageClientTest.OAuth2CloudStorageClientTest +### ✅ VanillaCloudStorageClientTest.OAuth2CloudStorageClientTest ``` ✅ BuildOAuth2AuthorizationRequestUrlWorks ✅ FetchTokenCanInterpretGoogleResponse @@ -113,7 +113,7 @@ ✅ FetchTokenThrowsWithWrongState ✅ RefreshTokenCanInterpretGoogleResponse ``` -### ✅ VanillaCloudStorageClientTest.SecureStringExtensionsTest +### ✅ VanillaCloudStorageClientTest.SecureStringExtensionsTest ``` ✅ AreEqualsWorksCorrectly ✅ CorrectlyConvertsSecureStringToString @@ -123,7 +123,7 @@ ✅ CorrectlyConvertsUnicodeBytesToSecureString ✅ CorrectlyConvertsUtf8BytesToSecureString ``` -### ✅ VanillaCloudStorageClientTest.SerializeableCloudStorageCredentialsTest +### ✅ VanillaCloudStorageClientTest.SerializeableCloudStorageCredentialsTest ``` ✅ DecryptAfterDesrializationCanReadAllPropertiesBack ✅ DecryptAfterDesrializationRespectsNullProperties diff --git a/__tests__/__outputs__/swift-xunit.md b/__tests__/__outputs__/swift-xunit.md index b84a926..b001151 100644 --- a/__tests__/__outputs__/swift-xunit.md +++ b/__tests__/__outputs__/swift-xunit.md @@ -1,13 +1,13 @@ ![Tests failed](https://img.shields.io/badge/tests-2%20passed%2C%201%20failed-critical) |Report|Passed|Failed|Skipped|Time| |:---|---:|---:|---:|---:| -|fixtures/swift-xunit.xml|2 ✅|1 ❌||220ms| -## ❌ fixtures/swift-xunit.xml +|[fixtures/swift-xunit.xml](#user-content-r0)|2 ✅|1 ❌||220ms| +## ❌ fixtures/swift-xunit.xml **3** tests were completed in **220ms** with **2** passed, **1** failed and **0** skipped. |Test suite|Passed|Failed|Skipped|Time| |:---|---:|---:|---:|---:| -|[TestResults](#r0s0)|2 ✅|1 ❌||220ms| -### ❌ TestResults +|[TestResults](#user-content-r0s0)|2 ✅|1 ❌||220ms| +### ❌ TestResults ``` AcmeLibTests.AcmeLibTests ✅ test_always_pass diff --git a/__tests__/__snapshots__/dart-json.test.ts.snap b/__tests__/__snapshots__/dart-json.test.ts.snap index a499822..88a7349 100644 --- a/__tests__/__snapshots__/dart-json.test.ts.snap +++ b/__tests__/__snapshots__/dart-json.test.ts.snap @@ -1,4 +1,4 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing exports[`dart-json tests matches report snapshot 1`] = ` TestRunResult { diff --git a/__tests__/__snapshots__/dotnet-nunit.test.ts.snap b/__tests__/__snapshots__/dotnet-nunit.test.ts.snap index 60d55f2..529f702 100644 --- a/__tests__/__snapshots__/dotnet-nunit.test.ts.snap +++ b/__tests__/__snapshots__/dotnet-nunit.test.ts.snap @@ -1,4 +1,4 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing exports[`dotnet-nunit tests report from ./reports/dotnet test results matches snapshot 1`] = ` TestRunResult { diff --git a/__tests__/__snapshots__/dotnet-trx.test.ts.snap b/__tests__/__snapshots__/dotnet-trx.test.ts.snap index 1ca07eb..b9d272d 100644 --- a/__tests__/__snapshots__/dotnet-trx.test.ts.snap +++ b/__tests__/__snapshots__/dotnet-trx.test.ts.snap @@ -1,6 +1,6 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing -exports[`dotnet-trx tests matches report snapshot 1`] = ` +exports[`dotnet-trx tests matches dotnet-trx report snapshot 1`] = ` TestRunResult { "path": "fixtures/dotnet-trx.trx", "suites": [ @@ -21,7 +21,9 @@ TestRunResult { at DotnetTests.Unit.Calculator.Div(Int32 a, Int32 b) in C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\dotnet\\DotnetTests.Unit\\Calculator.cs:line 9 at DotnetTests.XUnitTests.CalculatorTests.Exception_In_TargetTest() in C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\dotnet\\DotnetTests.XUnitTests\\CalculatorTests.cs:line 33", "line": 9, - "message": "System.DivideByZeroException : Attempted to divide by zero.", + "message": "System.DivideByZeroException : Attempted to divide by zero. + at DotnetTests.Unit.Calculator.Div(Int32 a, Int32 b) in C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\dotnet\\DotnetTests.Unit\\Calculator.cs:line 9 + at DotnetTests.XUnitTests.CalculatorTests.Exception_In_TargetTest() in C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\dotnet\\DotnetTests.XUnitTests\\CalculatorTests.cs:line 33", "path": "DotnetTests.Unit/Calculator.cs", }, "name": "Exception_In_TargetTest", @@ -33,7 +35,8 @@ TestRunResult { "details": "System.Exception : Test at DotnetTests.XUnitTests.CalculatorTests.Exception_In_Test() in C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\dotnet\\DotnetTests.XUnitTests\\CalculatorTests.cs:line 39", "line": 39, - "message": "System.Exception : Test", + "message": "System.Exception : Test + at DotnetTests.XUnitTests.CalculatorTests.Exception_In_Test() in C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\dotnet\\DotnetTests.XUnitTests\\CalculatorTests.cs:line 39", "path": "DotnetTests.XUnitTests/CalculatorTests.cs", }, "name": "Exception_In_Test", @@ -49,7 +52,8 @@ Actual: 2 "line": 27, "message": "Assert.Equal() Failure Expected: 3 -Actual: 2", +Actual: 2 + at DotnetTests.XUnitTests.CalculatorTests.Failing_Test() in C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\dotnet\\DotnetTests.XUnitTests\\CalculatorTests.cs:line 27", "path": "DotnetTests.XUnitTests/CalculatorTests.cs", }, "name": "Failing_Test", @@ -71,7 +75,8 @@ Actual: False "line": 59, "message": "Assert.True() Failure Expected: True -Actual: False", +Actual: False + at DotnetTests.XUnitTests.CalculatorTests.Is_Even_Number(Int32 i) in C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\dotnet\\DotnetTests.XUnitTests\\CalculatorTests.cs:line 59", "path": "DotnetTests.XUnitTests/CalculatorTests.cs", }, "name": "Is_Even_Number(i: 3)", @@ -99,7 +104,213 @@ Actual: False "line": 67, "message": "Assert.True() Failure Expected: True -Actual: False", +Actual: False + at DotnetTests.XUnitTests.CalculatorTests.Theory_With_Custom_Name(Int32 i) in C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\dotnet\\DotnetTests.XUnitTests\\CalculatorTests.cs:line 67", + "path": "DotnetTests.XUnitTests/CalculatorTests.cs", + }, + "name": "Should be even number(i: 3)", + "result": "failed", + "time": 0.6537000000000001, + }, + TestCaseResult { + "error": undefined, + "name": "Skipped_Test", + "result": "skipped", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "Timeout_Test", + "result": "success", + "time": 108.42580000000001, + }, + ], + }, + ], + "name": "DotnetTests.XUnitTests.CalculatorTests", + "totalTime": undefined, + }, + ], + "totalTime": 1116, +} +`; + +exports[`dotnet-trx tests matches dotnet-xunitv3 report snapshot 1`] = ` +TestRunResult { + "path": "fixtures/dotnet-xunitv3.trx", + "suites": [ + TestSuiteResult { + "groups": [ + TestGroupResult { + "name": null, + "tests": [ + TestCaseResult { + "error": { + "details": "Assert.Null() Failure: Value is not null +Expected: null +Actual: Fixture { } + at DotnetTests.XUnitV3Tests.FixtureTests.Failing_Test() in /_/reports/dotnet/DotnetTests.XUnitV3Tests/FixtureTests.cs:line 25 + at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) + at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)", + "line": 25, + "message": "Assert.Null() Failure: Value is not null +Expected: null +Actual: Fixture { } + at DotnetTests.XUnitV3Tests.FixtureTests.Failing_Test() in /_/reports/dotnet/DotnetTests.XUnitV3Tests/FixtureTests.cs:line 25 + at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) + at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)", + "path": "DotnetTests.XUnitV3Tests/FixtureTests.cs", + }, + "name": "Failing_Test", + "result": "failed", + "time": 17.0545, + }, + TestCaseResult { + "error": undefined, + "name": "Passing_Test", + "result": "success", + "time": 0.8786, + }, + ], + }, + ], + "name": "DotnetTests.XUnitV3Tests.FixtureTests", + "totalTime": undefined, + }, + TestSuiteResult { + "groups": [ + TestGroupResult { + "name": null, + "tests": [ + TestCaseResult { + "error": undefined, + "name": "[Test Class Cleanup Failure (DotnetTests.XUnitV3Tests.FixtureTests.Failing_Test)]", + "result": "failed", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "[Test Class Cleanup Failure (DotnetTests.XUnitV3Tests.FixtureTests.Passing_Test)]", + "result": "failed", + "time": 0, + }, + ], + }, + ], + "name": "Unclassified", + "totalTime": undefined, + }, + ], + "totalTime": 267, +} +`; + +exports[`dotnet-trx tests matches report snapshot (only failed tests) 1`] = ` +TestRunResult { + "path": "fixtures/dotnet-trx.trx", + "suites": [ + TestSuiteResult { + "groups": [ + TestGroupResult { + "name": null, + "tests": [ + TestCaseResult { + "error": undefined, + "name": "Custom Name", + "result": "success", + "time": 0.1371, + }, + TestCaseResult { + "error": { + "details": "System.DivideByZeroException : Attempted to divide by zero. + at DotnetTests.Unit.Calculator.Div(Int32 a, Int32 b) in C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\dotnet\\DotnetTests.Unit\\Calculator.cs:line 9 + at DotnetTests.XUnitTests.CalculatorTests.Exception_In_TargetTest() in C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\dotnet\\DotnetTests.XUnitTests\\CalculatorTests.cs:line 33", + "line": 9, + "message": "System.DivideByZeroException : Attempted to divide by zero. + at DotnetTests.Unit.Calculator.Div(Int32 a, Int32 b) in C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\dotnet\\DotnetTests.Unit\\Calculator.cs:line 9 + at DotnetTests.XUnitTests.CalculatorTests.Exception_In_TargetTest() in C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\dotnet\\DotnetTests.XUnitTests\\CalculatorTests.cs:line 33", + "path": "DotnetTests.Unit/Calculator.cs", + }, + "name": "Exception_In_TargetTest", + "result": "failed", + "time": 0.8377, + }, + TestCaseResult { + "error": { + "details": "System.Exception : Test + at DotnetTests.XUnitTests.CalculatorTests.Exception_In_Test() in C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\dotnet\\DotnetTests.XUnitTests\\CalculatorTests.cs:line 39", + "line": 39, + "message": "System.Exception : Test + at DotnetTests.XUnitTests.CalculatorTests.Exception_In_Test() in C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\dotnet\\DotnetTests.XUnitTests\\CalculatorTests.cs:line 39", + "path": "DotnetTests.XUnitTests/CalculatorTests.cs", + }, + "name": "Exception_In_Test", + "result": "failed", + "time": 2.5175, + }, + TestCaseResult { + "error": { + "details": "Assert.Equal() Failure +Expected: 3 +Actual: 2 + at DotnetTests.XUnitTests.CalculatorTests.Failing_Test() in C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\dotnet\\DotnetTests.XUnitTests\\CalculatorTests.cs:line 27", + "line": 27, + "message": "Assert.Equal() Failure +Expected: 3 +Actual: 2 + at DotnetTests.XUnitTests.CalculatorTests.Failing_Test() in C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\dotnet\\DotnetTests.XUnitTests\\CalculatorTests.cs:line 27", + "path": "DotnetTests.XUnitTests/CalculatorTests.cs", + }, + "name": "Failing_Test", + "result": "failed", + "time": 3.8697, + }, + TestCaseResult { + "error": undefined, + "name": "Is_Even_Number(i: 2)", + "result": "success", + "time": 0.0078, + }, + TestCaseResult { + "error": { + "details": "Assert.True() Failure +Expected: True +Actual: False + at DotnetTests.XUnitTests.CalculatorTests.Is_Even_Number(Int32 i) in C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\dotnet\\DotnetTests.XUnitTests\\CalculatorTests.cs:line 59", + "line": 59, + "message": "Assert.True() Failure +Expected: True +Actual: False + at DotnetTests.XUnitTests.CalculatorTests.Is_Even_Number(Int32 i) in C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\dotnet\\DotnetTests.XUnitTests\\CalculatorTests.cs:line 59", + "path": "DotnetTests.XUnitTests/CalculatorTests.cs", + }, + "name": "Is_Even_Number(i: 3)", + "result": "failed", + "time": 0.41409999999999997, + }, + TestCaseResult { + "error": undefined, + "name": "Passing_Test", + "result": "success", + "time": 0.1365, + }, + TestCaseResult { + "error": undefined, + "name": "Should be even number(i: 2)", + "result": "success", + "time": 0.0097, + }, + TestCaseResult { + "error": { + "details": "Assert.True() Failure +Expected: True +Actual: False + at DotnetTests.XUnitTests.CalculatorTests.Theory_With_Custom_Name(Int32 i) in C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\dotnet\\DotnetTests.XUnitTests\\CalculatorTests.cs:line 67", + "line": 67, + "message": "Assert.True() Failure +Expected: True +Actual: False + at DotnetTests.XUnitTests.CalculatorTests.Theory_With_Custom_Name(Int32 i) in C:\\Users\\Michal\\Workspace\\dorny\\test-reporter\\reports\\dotnet\\DotnetTests.XUnitTests\\CalculatorTests.cs:line 67", "path": "DotnetTests.XUnitTests/CalculatorTests.cs", }, "name": "Should be even number(i: 3)", diff --git a/__tests__/__snapshots__/golang-json.test.ts.snap b/__tests__/__snapshots__/golang-json.test.ts.snap new file mode 100644 index 0000000..bd28d4a --- /dev/null +++ b/__tests__/__snapshots__/golang-json.test.ts.snap @@ -0,0 +1,131 @@ +// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing + +exports[`golang-json tests report from ./reports/dotnet test results matches snapshot 1`] = ` +TestRunResult { + "path": "fixtures/golang-json.json", + "suites": [ + TestSuiteResult { + "groups": [ + TestGroupResult { + "name": null, + "tests": [ + TestCaseResult { + "error": undefined, + "name": "TestPassing", + "result": "success", + "time": 60, + }, + TestCaseResult { + "error": { + "details": "calculator_test.go:19: expected 1+1 = 3, got 2 +", + "message": "calculator_test.go:19: expected 1+1 = 3, got 2 +", + }, + "name": "TestFailing", + "result": "failed", + "time": 890, + }, + TestCaseResult { + "error": { + "details": "calculator_test.go:76: caught panic: runtime error: integer divide by zero +", + "message": "calculator_test.go:76: caught panic: runtime error: integer divide by zero +", + }, + "name": "TestPanicInsideFunction", + "result": "failed", + "time": 0, + }, + TestCaseResult { + "error": { + "details": "calculator_test.go:76: caught panic: bad stuff +", + "message": "calculator_test.go:76: caught panic: bad stuff +", + }, + "name": "TestPanicInsideTest", + "result": "failed", + "time": 0, + }, + TestCaseResult { + "error": { + "details": "calculator_test.go:45: skipping test +", + "message": "calculator_test.go:45: skipping test +", + }, + "name": "TestSkipped", + "result": "skipped", + "time": 940, + }, + TestCaseResult { + "error": { + "details": "", + "message": "", + }, + "name": "TestCases", + "result": "failed", + "time": 2250, + }, + ], + }, + TestGroupResult { + "name": "TestCases", + "tests": [ + TestCaseResult { + "error": undefined, + "name": "1_+_2_=_3", + "result": "success", + "time": 400, + }, + TestCaseResult { + "error": undefined, + "name": "4_+_7_=_11", + "result": "success", + "time": 460, + }, + TestCaseResult { + "error": { + "details": "calculator_test.go:67: expected 2 + 3 = 4, got 5 +", + "message": "calculator_test.go:67: expected 2 + 3 = 4, got 5 +", + }, + "name": "2_+_3_=_4", + "result": "failed", + "time": 90, + }, + TestCaseResult { + "error": { + "details": "calculator_test.go:67: expected 1 / 2 = 1, got 0 +", + "message": "calculator_test.go:67: expected 1 / 2 = 1, got 0 +", + }, + "name": "1_/_2_=_1", + "result": "failed", + "time": 920, + }, + TestCaseResult { + "error": undefined, + "name": "9_/_3_=_3", + "result": "success", + "time": 340, + }, + TestCaseResult { + "error": undefined, + "name": "14_/_7_=_2", + "result": "success", + "time": 40, + }, + ], + }, + ], + "name": "_/home/james_t/git/test-reporter/reports/go", + "totalTime": undefined, + }, + ], + "totalTime": undefined, +} +`; diff --git a/__tests__/__snapshots__/java-junit.test.ts.snap b/__tests__/__snapshots__/java-junit.test.ts.snap index 341b092..38daca9 100644 --- a/__tests__/__snapshots__/java-junit.test.ts.snap +++ b/__tests__/__snapshots__/java-junit.test.ts.snap @@ -1,4 +1,4 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing exports[`java-junit tests report from apache/pulsar single suite test results matches snapshot 1`] = ` TestRunResult { diff --git a/__tests__/__snapshots__/jest-junit.test.ts.snap b/__tests__/__snapshots__/jest-junit.test.ts.snap index eb20dfe..eca0092 100644 --- a/__tests__/__snapshots__/jest-junit.test.ts.snap +++ b/__tests__/__snapshots__/jest-junit.test.ts.snap @@ -1,4 +1,4 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing exports[`jest-junit tests parsing ESLint report without timing information works - PR #134 1`] = ` TestRunResult { diff --git a/__tests__/__snapshots__/mocha-json.test.ts.snap b/__tests__/__snapshots__/mocha-json.test.ts.snap index 7038239..4a1448c 100644 --- a/__tests__/__snapshots__/mocha-json.test.ts.snap +++ b/__tests__/__snapshots__/mocha-json.test.ts.snap @@ -1,4 +1,4 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing exports[`mocha-json tests report from ./reports/mocha-json test results matches snapshot 1`] = ` TestRunResult { diff --git a/__tests__/__snapshots__/python-xunit.test.ts.snap b/__tests__/__snapshots__/python-xunit.test.ts.snap new file mode 100644 index 0000000..f325c84 --- /dev/null +++ b/__tests__/__snapshots__/python-xunit.test.ts.snap @@ -0,0 +1,192 @@ +// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing + +exports[`python-xunit pytest report report from python test results matches snapshot 1`] = ` +TestRunResult { + "path": "fixtures/python-xunit-pytest.xml", + "suites": [ + TestSuiteResult { + "groups": [ + TestGroupResult { + "name": "tests.test_lib", + "tests": [ + TestCaseResult { + "error": undefined, + "name": "test_always_pass", + "result": "success", + "time": 2, + }, + TestCaseResult { + "error": undefined, + "name": "test_with_subtests", + "result": "success", + "time": 5, + }, + TestCaseResult { + "error": undefined, + "name": "test_parameterized[param1]", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "test_parameterized[param2]", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "test_always_skip", + "result": "skipped", + "time": 0, + }, + TestCaseResult { + "error": { + "details": "def test_always_fail(): + > assert False + E assert False + + tests/test_lib.py:25: AssertionError + ", + "line": undefined, + "message": "assert False", + "path": undefined, + }, + "name": "test_always_fail", + "result": "failed", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "test_expected_failure", + "result": "skipped", + "time": 0, + }, + TestCaseResult { + "error": { + "details": "def test_error(): + > raise Exception("error") + E Exception: error + + tests/test_lib.py:32: Exception + ", + "line": undefined, + "message": "Exception: error", + "path": undefined, + }, + "name": "test_error", + "result": "failed", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "test_with_record_property", + "result": "success", + "time": 0, + }, + ], + }, + TestGroupResult { + "name": "custom_classname", + "tests": [ + TestCaseResult { + "error": undefined, + "name": "test_with_record_xml_attribute", + "result": "success", + "time": 0, + }, + ], + }, + ], + "name": "pytest", + "totalTime": 19, + }, + ], + "totalTime": undefined, +} +`; + +exports[`python-xunit unittest report report from python test results matches snapshot 1`] = ` +TestRunResult { + "path": "fixtures/python-xunit-unittest.xml", + "suites": [ + TestSuiteResult { + "groups": [ + TestGroupResult { + "name": "TestAcme", + "tests": [ + TestCaseResult { + "error": undefined, + "name": "test_always_pass", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "test_parameterized_0_param1", + "result": "success", + "time": 1, + }, + TestCaseResult { + "error": undefined, + "name": "test_parameterized_1_param2", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "test_with_subtests", + "result": "success", + "time": 0, + }, + TestCaseResult { + "error": { + "details": "Traceback (most recent call last): + File "/Users/foo/Projects/python-test/tests/test_lib.py", line 24, in test_always_fail + self.fail("failed") +AssertionError: failed +", + "line": undefined, + "message": "AssertionError: failed", + "path": undefined, + }, + "name": "test_always_fail", + "result": "failed", + "time": 0, + }, + TestCaseResult { + "error": { + "details": "Traceback (most recent call last): + File "/Users/foo/Projects/python-test/tests/test_lib.py", line 31, in test_error + raise Exception("error") +Exception: error +", + "line": undefined, + "message": "Exception: error", + "path": undefined, + }, + "name": "test_error", + "result": "failed", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "test_always_skip", + "result": "skipped", + "time": 0, + }, + TestCaseResult { + "error": undefined, + "name": "test_expected_failure", + "result": "skipped", + "time": 0, + }, + ], + }, + ], + "name": "TestAcme-20251114214921", + "totalTime": 1, + }, + ], + "totalTime": 1, +} +`; diff --git a/__tests__/__snapshots__/rspec-json.test.ts.snap b/__tests__/__snapshots__/rspec-json.test.ts.snap index cc14bfb..51c1943 100644 --- a/__tests__/__snapshots__/rspec-json.test.ts.snap +++ b/__tests__/__snapshots__/rspec-json.test.ts.snap @@ -1,4 +1,4 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing exports[`rspec-json tests report from ./reports/rspec-json test results matches snapshot 1`] = ` TestRunResult { diff --git a/__tests__/__snapshots__/swift-xunit.test.ts.snap b/__tests__/__snapshots__/swift-xunit.test.ts.snap index ae34deb..bddc6ea 100644 --- a/__tests__/__snapshots__/swift-xunit.test.ts.snap +++ b/__tests__/__snapshots__/swift-xunit.test.ts.snap @@ -1,4 +1,4 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing exports[`swift-xunit tests report from swift test results matches snapshot 1`] = ` TestRunResult { diff --git a/__tests__/dart-json.test.ts b/__tests__/dart-json.test.ts index a2b959c..12b664b 100644 --- a/__tests__/dart-json.test.ts +++ b/__tests__/dart-json.test.ts @@ -3,7 +3,7 @@ import * as path from 'path' import {DartJsonParser} from '../src/parsers/dart-json/dart-json-parser' import {ParseOptions} from '../src/test-parser' -import {getReport} from '../src/report/get-report' +import {DEFAULT_OPTIONS, getReport} from '../src/report/get-report' import {normalizeFilePath} from '../src/utils/path-utils' describe('dart-json tests', () => { @@ -66,4 +66,66 @@ describe('dart-json tests', () => { fs.mkdirSync(path.dirname(outputPath), {recursive: true}) fs.writeFileSync(outputPath, report) }) + + it('report does not include a title by default', async () => { + const fixturePath = path.join(__dirname, 'fixtures', 'dart-json.json') + const filePath = normalizeFilePath(path.relative(__dirname, fixturePath)) + const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'}) + + const opts: ParseOptions = { + parseErrors: true, + trackedFiles: [] + } + + const parser = new DartJsonParser(opts, 'dart') + const result = await parser.parse(filePath, fileContent) + const report = getReport([result]) + // Report should have the badge as the first line + expect(report).toMatch(/^!\[Tests failed]/) + }) + + it.each([ + ['empty string', ''], + ['space', ' '], + ['tab', '\t'], + ['newline', '\n'] + ])('report does not include a title when configured value is %s', async (_, reportTitle) => { + const fixturePath = path.join(__dirname, 'fixtures', 'dart-json.json') + const filePath = normalizeFilePath(path.relative(__dirname, fixturePath)) + const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'}) + + const opts: ParseOptions = { + parseErrors: true, + trackedFiles: [] + } + + const parser = new DartJsonParser(opts, 'dart') + const result = await parser.parse(filePath, fileContent) + const report = getReport([result], { + ...DEFAULT_OPTIONS, + reportTitle + }) + // Report should have the badge as the first line + expect(report).toMatch(/^!\[Tests failed]/) + }) + + it('report includes a custom report title', async () => { + const fixturePath = path.join(__dirname, 'fixtures', 'dart-json.json') + const filePath = normalizeFilePath(path.relative(__dirname, fixturePath)) + const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'}) + + const opts: ParseOptions = { + parseErrors: true, + trackedFiles: [] + } + + const parser = new DartJsonParser(opts, 'dart') + const result = await parser.parse(filePath, fileContent) + const report = getReport([result], { + ...DEFAULT_OPTIONS, + reportTitle: 'My Custom Title' + }) + // Report should have the title as the first line + expect(report).toMatch(/^# My Custom Title\n/) + }) }) diff --git a/__tests__/dotnet-nunit.test.ts b/__tests__/dotnet-nunit.test.ts index e0b4778..6903c5a 100644 --- a/__tests__/dotnet-nunit.test.ts +++ b/__tests__/dotnet-nunit.test.ts @@ -3,7 +3,7 @@ import * as path from 'path' import {DotnetNunitParser} from '../src/parsers/dotnet-nunit/dotnet-nunit-parser' import {ParseOptions} from '../src/test-parser' -import {getReport} from '../src/report/get-report' +import {DEFAULT_OPTIONS, getReport} from '../src/report/get-report' import {normalizeFilePath} from '../src/utils/path-utils' describe('dotnet-nunit tests', () => { @@ -26,4 +26,66 @@ describe('dotnet-nunit tests', () => { fs.mkdirSync(path.dirname(outputPath), {recursive: true}) fs.writeFileSync(outputPath, report) }) + + it('report does not include a title by default', async () => { + const fixturePath = path.join(__dirname, 'fixtures', 'dotnet-nunit.xml') + const filePath = normalizeFilePath(path.relative(__dirname, fixturePath)) + const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'}) + + const opts: ParseOptions = { + parseErrors: true, + trackedFiles: [] + } + + const parser = new DotnetNunitParser(opts) + const result = await parser.parse(filePath, fileContent) + const report = getReport([result]) + // Report should have the badge as the first line + expect(report).toMatch(/^!\[Tests failed]/) + }) + + it.each([ + ['empty string', ''], + ['space', ' '], + ['tab', '\t'], + ['newline', '\n'] + ])('report does not include a title when configured value is %s', async (_, reportTitle) => { + const fixturePath = path.join(__dirname, 'fixtures', 'dotnet-nunit.xml') + const filePath = normalizeFilePath(path.relative(__dirname, fixturePath)) + const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'}) + + const opts: ParseOptions = { + parseErrors: true, + trackedFiles: [] + } + + const parser = new DotnetNunitParser(opts) + const result = await parser.parse(filePath, fileContent) + const report = getReport([result], { + ...DEFAULT_OPTIONS, + reportTitle + }) + // Report should have the badge as the first line + expect(report).toMatch(/^!\[Tests failed]/) + }) + + it('report includes a custom report title', async () => { + const fixturePath = path.join(__dirname, 'fixtures', 'dotnet-nunit.xml') + const filePath = normalizeFilePath(path.relative(__dirname, fixturePath)) + const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'}) + + const opts: ParseOptions = { + parseErrors: true, + trackedFiles: [] + } + + const parser = new DotnetNunitParser(opts) + const result = await parser.parse(filePath, fileContent) + const report = getReport([result], { + ...DEFAULT_OPTIONS, + reportTitle: 'My Custom Title' + }) + // Report should have the title as the first line + expect(report).toMatch(/^# My Custom Title\n/) + }) }) diff --git a/__tests__/dotnet-trx.test.ts b/__tests__/dotnet-trx.test.ts index d4d5dac..a7aead6 100644 --- a/__tests__/dotnet-trx.test.ts +++ b/__tests__/dotnet-trx.test.ts @@ -3,7 +3,7 @@ import * as path from 'path' import {DotnetTrxParser} from '../src/parsers/dotnet-trx/dotnet-trx-parser' import {ParseOptions} from '../src/test-parser' -import {getReport} from '../src/report/get-report' +import {DEFAULT_OPTIONS, getReport, ReportOptions} from '../src/report/get-report' import {normalizeFilePath} from '../src/utils/path-utils' describe('dotnet-trx tests', () => { @@ -23,9 +23,50 @@ describe('dotnet-trx tests', () => { expect(result.result).toBe('success') }) - it('matches report snapshot', async () => { + it('produces empty test run result when TestDefinitions is empty', async () => { + const fixturePath = path.join(__dirname, 'fixtures', 'empty', 'dotnet-trx-empty-test-definitions.trx') + const filePath = normalizeFilePath(path.relative(__dirname, fixturePath)) + const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'}) + + const opts: ParseOptions = { + parseErrors: true, + trackedFiles: [] + } + + const parser = new DotnetTrxParser(opts) + const result = await parser.parse(filePath, fileContent) + expect(result.tests).toBe(0) + expect(result.result).toBe('success') + }) + + it.each([['dotnet-trx'], ['dotnet-xunitv3']])('matches %s report snapshot', async reportName => { + const fixturePath = path.join(__dirname, 'fixtures', `${reportName}.trx`) + const outputPath = path.join(__dirname, '__outputs__', `${reportName}.md`) + const filePath = normalizeFilePath(path.relative(__dirname, fixturePath)) + const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'}) + + const opts: ParseOptions = { + parseErrors: true, + trackedFiles: [ + 'DotnetTests.Unit/Calculator.cs', + 'DotnetTests.XUnitTests/CalculatorTests.cs', + 'DotnetTests.XUnitV3Tests/FixtureTests.cs' + ] + //workDir: 'C:/Users/Michal/Workspace/dorny/test-check/reports/dotnet/' + } + + const parser = new DotnetTrxParser(opts) + const result = await parser.parse(filePath, fileContent) + expect(result).toMatchSnapshot() + + const report = getReport([result]) + fs.mkdirSync(path.dirname(outputPath), {recursive: true}) + fs.writeFileSync(outputPath, report) + }) + + it('matches report snapshot (only failed tests)', async () => { const fixturePath = path.join(__dirname, 'fixtures', 'dotnet-trx.trx') - const outputPath = path.join(__dirname, '__outputs__', 'dotnet-trx.md') + const outputPath = path.join(__dirname, '__outputs__', 'dotnet-trx-only-failed.md') const filePath = normalizeFilePath(path.relative(__dirname, fixturePath)) const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'}) @@ -39,7 +80,12 @@ describe('dotnet-trx tests', () => { const result = await parser.parse(filePath, fileContent) expect(result).toMatchSnapshot() - const report = getReport([result]) + const reportOptions: ReportOptions = { + ...DEFAULT_OPTIONS, + listSuites: 'all', + listTests: 'failed' + } + const report = getReport([result], reportOptions) fs.mkdirSync(path.dirname(outputPath), {recursive: true}) fs.writeFileSync(outputPath, report) }) @@ -83,4 +129,66 @@ describe('dotnet-trx tests', () => { fs.mkdirSync(path.dirname(outputPath), {recursive: true}) fs.writeFileSync(outputPath, report) }) + + it('report does not include a title by default', async () => { + const fixturePath = path.join(__dirname, 'fixtures', 'dotnet-trx.trx') + const filePath = normalizeFilePath(path.relative(__dirname, fixturePath)) + const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'}) + + const opts: ParseOptions = { + parseErrors: true, + trackedFiles: [] + } + + const parser = new DotnetTrxParser(opts) + const result = await parser.parse(filePath, fileContent) + const report = getReport([result]) + // Report should have the badge as the first line + expect(report).toMatch(/^!\[Tests failed]/) + }) + + it.each([ + ['empty string', ''], + ['space', ' '], + ['tab', '\t'], + ['newline', '\n'] + ])('report does not include a title when configured value is %s', async (_, reportTitle) => { + const fixturePath = path.join(__dirname, 'fixtures', 'dotnet-trx.trx') + const filePath = normalizeFilePath(path.relative(__dirname, fixturePath)) + const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'}) + + const opts: ParseOptions = { + parseErrors: true, + trackedFiles: [] + } + + const parser = new DotnetTrxParser(opts) + const result = await parser.parse(filePath, fileContent) + const report = getReport([result], { + ...DEFAULT_OPTIONS, + reportTitle + }) + // Report should have the badge as the first line + expect(report).toMatch(/^!\[Tests failed]/) + }) + + it('report includes a custom report title', async () => { + const fixturePath = path.join(__dirname, 'fixtures', 'dotnet-trx.trx') + const filePath = normalizeFilePath(path.relative(__dirname, fixturePath)) + const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'}) + + const opts: ParseOptions = { + parseErrors: true, + trackedFiles: [] + } + + const parser = new DotnetTrxParser(opts) + const result = await parser.parse(filePath, fileContent) + const report = getReport([result], { + ...DEFAULT_OPTIONS, + reportTitle: 'My Custom Title' + }) + // Report should have the title as the first line + expect(report).toMatch(/^# My Custom Title\n/) + }) }) diff --git a/__tests__/fixtures/dotnet-xunitv3.trx b/__tests__/fixtures/dotnet-xunitv3.trx new file mode 100644 index 0000000..6bd9c25 --- /dev/null +++ b/__tests__/fixtures/dotnet-xunitv3.trx @@ -0,0 +1,60 @@ + + + + + + + + + + + Assert.Null() Failure: Value is not null +Expected: null +Actual: Fixture { } + at DotnetTests.XUnitV3Tests.FixtureTests.Failing_Test() in /_/reports/dotnet/DotnetTests.XUnitV3Tests/FixtureTests.cs:line 25 + at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) + at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Exit code indicates failure: '2'. Please refer to https://aka.ms/testingplatform/exitcodes for more information. + + + + \ No newline at end of file diff --git a/__tests__/fixtures/empty/dotnet-trx-empty-test-definitions.trx b/__tests__/fixtures/empty/dotnet-trx-empty-test-definitions.trx new file mode 100644 index 0000000..7066144 --- /dev/null +++ b/__tests__/fixtures/empty/dotnet-trx-empty-test-definitions.trx @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + No test is available in (...). Make sure that test discoverer & executors are registered and platform & framework version settings are appropriate and try again. + + + + diff --git a/__tests__/fixtures/golang-json.json b/__tests__/fixtures/golang-json.json new file mode 100644 index 0000000..421a707 --- /dev/null +++ b/__tests__/fixtures/golang-json.json @@ -0,0 +1,59 @@ +{"Time":"2025-04-22T08:59:55.364618802-05:00","Action":"start","Package":"_/home/james_t/git/test-reporter/reports/go"} +{"Time":"2025-04-22T08:59:55.371779289-05:00","Action":"run","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestPassing"} +{"Time":"2025-04-22T08:59:55.371805677-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestPassing","Output":"=== RUN TestPassing\n"} +{"Time":"2025-04-22T08:59:55.428201983-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestPassing","Output":" calculator_test.go:11: pass!\n"} +{"Time":"2025-04-22T08:59:55.428265529-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestPassing","Output":"--- PASS: TestPassing (0.06s)\n"} +{"Time":"2025-04-22T08:59:55.428285649-05:00","Action":"pass","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestPassing","Elapsed":0.06} +{"Time":"2025-04-22T08:59:55.428299886-05:00","Action":"run","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestFailing"} +{"Time":"2025-04-22T08:59:55.428309029-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestFailing","Output":"=== RUN TestFailing\n"} +{"Time":"2025-04-22T08:59:56.317425091-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestFailing","Output":" calculator_test.go:19: expected 1+1 = 3, got 2\n"} +{"Time":"2025-04-22T08:59:56.31748077-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestFailing","Output":"--- FAIL: TestFailing (0.89s)\n"} +{"Time":"2025-04-22T08:59:56.317493452-05:00","Action":"fail","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestFailing","Elapsed":0.89} +{"Time":"2025-04-22T08:59:56.317506107-05:00","Action":"run","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestPanicInsideFunction"} +{"Time":"2025-04-22T08:59:56.317514487-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestPanicInsideFunction","Output":"=== RUN TestPanicInsideFunction\n"} +{"Time":"2025-04-22T08:59:56.317530448-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestPanicInsideFunction","Output":" calculator_test.go:76: caught panic: runtime error: integer divide by zero\n"} +{"Time":"2025-04-22T08:59:56.317541866-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestPanicInsideFunction","Output":"--- FAIL: TestPanicInsideFunction (0.00s)\n"} +{"Time":"2025-04-22T08:59:56.317552981-05:00","Action":"fail","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestPanicInsideFunction","Elapsed":0} +{"Time":"2025-04-22T08:59:56.317561057-05:00","Action":"run","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestPanicInsideTest"} +{"Time":"2025-04-22T08:59:56.317568742-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestPanicInsideTest","Output":"=== RUN TestPanicInsideTest\n"} +{"Time":"2025-04-22T08:59:56.317584113-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestPanicInsideTest","Output":" calculator_test.go:76: caught panic: bad stuff\n"} +{"Time":"2025-04-22T08:59:56.317598524-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestPanicInsideTest","Output":"--- FAIL: TestPanicInsideTest (0.00s)\n"} +{"Time":"2025-04-22T08:59:56.317608268-05:00","Action":"fail","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestPanicInsideTest","Elapsed":0} +{"Time":"2025-04-22T08:59:56.317615472-05:00","Action":"run","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestSkipped"} +{"Time":"2025-04-22T08:59:56.317623959-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestSkipped","Output":"=== RUN TestSkipped\n"} +{"Time":"2025-04-22T08:59:57.256475698-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestSkipped","Output":" calculator_test.go:45: skipping test\n"} +{"Time":"2025-04-22T08:59:57.256536372-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestSkipped","Output":"--- SKIP: TestSkipped (0.94s)\n"} +{"Time":"2025-04-22T08:59:57.256549142-05:00","Action":"skip","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestSkipped","Elapsed":0.94} +{"Time":"2025-04-22T08:59:57.256562053-05:00","Action":"run","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestCases"} +{"Time":"2025-04-22T08:59:57.256569388-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestCases","Output":"=== RUN TestCases\n"} +{"Time":"2025-04-22T08:59:57.256580104-05:00","Action":"run","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestCases/1_+_2_=_3"} +{"Time":"2025-04-22T08:59:57.256587408-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestCases/1_+_2_=_3","Output":"=== RUN TestCases/1_+_2_=_3\n"} +{"Time":"2025-04-22T08:59:57.653005399-05:00","Action":"run","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestCases/4_+_7_=_11"} +{"Time":"2025-04-22T08:59:57.653036336-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestCases/4_+_7_=_11","Output":"=== RUN TestCases/4_+_7_=_11\n"} +{"Time":"2025-04-22T08:59:58.112825221-05:00","Action":"run","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestCases/2_+_3_=_4"} +{"Time":"2025-04-22T08:59:58.112858016-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestCases/2_+_3_=_4","Output":"=== RUN TestCases/2_+_3_=_4\n"} +{"Time":"2025-04-22T08:59:58.201204209-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestCases/2_+_3_=_4","Output":" calculator_test.go:67: expected 2 + 3 = 4, got 5\n"} +{"Time":"2025-04-22T08:59:58.201245827-05:00","Action":"run","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestCases/1_/_2_=_1"} +{"Time":"2025-04-22T08:59:58.201255566-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestCases/1_/_2_=_1","Output":"=== RUN TestCases/1_/_2_=_1\n"} +{"Time":"2025-04-22T08:59:59.119852965-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestCases/1_/_2_=_1","Output":" calculator_test.go:67: expected 1 / 2 = 1, got 0\n"} +{"Time":"2025-04-22T08:59:59.119877603-05:00","Action":"run","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestCases/9_/_3_=_3"} +{"Time":"2025-04-22T08:59:59.119879955-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestCases/9_/_3_=_3","Output":"=== RUN TestCases/9_/_3_=_3\n"} +{"Time":"2025-04-22T08:59:59.460576385-05:00","Action":"run","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestCases/14_/_7_=_2"} +{"Time":"2025-04-22T08:59:59.460607599-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestCases/14_/_7_=_2","Output":"=== RUN TestCases/14_/_7_=_2\n"} +{"Time":"2025-04-22T08:59:59.504952672-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestCases","Output":"--- FAIL: TestCases (2.25s)\n"} +{"Time":"2025-04-22T08:59:59.504995938-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestCases/1_+_2_=_3","Output":" --- PASS: TestCases/1_+_2_=_3 (0.40s)\n"} +{"Time":"2025-04-22T08:59:59.505006062-05:00","Action":"pass","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestCases/1_+_2_=_3","Elapsed":0.4} +{"Time":"2025-04-22T08:59:59.505017551-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestCases/4_+_7_=_11","Output":" --- PASS: TestCases/4_+_7_=_11 (0.46s)\n"} +{"Time":"2025-04-22T08:59:59.505026099-05:00","Action":"pass","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestCases/4_+_7_=_11","Elapsed":0.46} +{"Time":"2025-04-22T08:59:59.505033963-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestCases/2_+_3_=_4","Output":" --- FAIL: TestCases/2_+_3_=_4 (0.09s)\n"} +{"Time":"2025-04-22T08:59:59.505042238-05:00","Action":"fail","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestCases/2_+_3_=_4","Elapsed":0.09} +{"Time":"2025-04-22T08:59:59.505050917-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestCases/1_/_2_=_1","Output":" --- FAIL: TestCases/1_/_2_=_1 (0.92s)\n"} +{"Time":"2025-04-22T08:59:59.505059901-05:00","Action":"fail","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestCases/1_/_2_=_1","Elapsed":0.92} +{"Time":"2025-04-22T08:59:59.505068125-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestCases/9_/_3_=_3","Output":" --- PASS: TestCases/9_/_3_=_3 (0.34s)\n"} +{"Time":"2025-04-22T08:59:59.505076976-05:00","Action":"pass","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestCases/9_/_3_=_3","Elapsed":0.34} +{"Time":"2025-04-22T08:59:59.5050845-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestCases/14_/_7_=_2","Output":" --- PASS: TestCases/14_/_7_=_2 (0.04s)\n"} +{"Time":"2025-04-22T08:59:59.505091554-05:00","Action":"pass","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestCases/14_/_7_=_2","Elapsed":0.04} +{"Time":"2025-04-22T08:59:59.505098998-05:00","Action":"fail","Package":"_/home/james_t/git/test-reporter/reports/go","Test":"TestCases","Elapsed":2.25} +{"Time":"2025-04-22T08:59:59.505107502-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Output":"FAIL\n"} +{"Time":"2025-04-22T08:59:59.505552861-05:00","Action":"output","Package":"_/home/james_t/git/test-reporter/reports/go","Output":"FAIL\t_/home/james_t/git/test-reporter/reports/go\t4.141s\n"} +{"Time":"2025-04-22T08:59:59.505584529-05:00","Action":"fail","Package":"_/home/james_t/git/test-reporter/reports/go","Elapsed":4.141} diff --git a/__tests__/fixtures/python-xunit-pytest.xml b/__tests__/fixtures/python-xunit-pytest.xml new file mode 100644 index 0000000..fcb044a --- /dev/null +++ b/__tests__/fixtures/python-xunit-pytest.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + /Users/mike/Projects/python-test/tests/test_lib.py:20: skipped + + + + def test_always_fail(): + > assert False + E assert False + + tests/test_lib.py:25: AssertionError + + + + + + + def test_error(): + > raise Exception("error") + E Exception: error + + tests/test_lib.py:32: Exception + + + + + + + + + + diff --git a/__tests__/fixtures/python-xunit-unittest.xml b/__tests__/fixtures/python-xunit-unittest.xml new file mode 100644 index 0000000..ecc67d4 --- /dev/null +++ b/__tests__/fixtures/python-xunit-unittest.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + diff --git a/__tests__/golang-json.test.ts b/__tests__/golang-json.test.ts new file mode 100644 index 0000000..0bfdd86 --- /dev/null +++ b/__tests__/golang-json.test.ts @@ -0,0 +1,29 @@ +import * as fs from 'fs' +import * as path from 'path' + +import {GolangJsonParser} from '../src/parsers/golang-json/golang-json-parser' +import {ParseOptions} from '../src/test-parser' +import {getReport} from '../src/report/get-report' +import {normalizeFilePath} from '../src/utils/path-utils' + +describe('golang-json tests', () => { + it('report from ./reports/dotnet test results matches snapshot', async () => { + const fixturePath = path.join(__dirname, 'fixtures', 'golang-json.json') + const outputPath = path.join(__dirname, '__outputs__', 'golang-json.md') + const filePath = normalizeFilePath(path.relative(__dirname, fixturePath)) + const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'}) + + const opts: ParseOptions = { + parseErrors: true, + trackedFiles: ['calculator.go', 'calculator_test.go'] + } + + const parser = new GolangJsonParser(opts) + const result = await parser.parse(filePath, fileContent) + expect(result).toMatchSnapshot() + + const report = getReport([result]) + fs.mkdirSync(path.dirname(outputPath), {recursive: true}) + fs.writeFileSync(outputPath, report) + }) +}) diff --git a/__tests__/java-junit.test.ts b/__tests__/java-junit.test.ts index e8111d4..83a7dec 100644 --- a/__tests__/java-junit.test.ts +++ b/__tests__/java-junit.test.ts @@ -3,7 +3,7 @@ import * as path from 'path' import {JavaJunitParser} from '../src/parsers/java-junit/java-junit-parser' import {ParseOptions} from '../src/test-parser' -import {getReport} from '../src/report/get-report' +import {DEFAULT_OPTIONS, getReport} from '../src/report/get-report' import {normalizeFilePath} from '../src/utils/path-utils' describe('java-junit tests', () => { @@ -90,4 +90,66 @@ describe('java-junit tests', () => { expect(result.result === 'failed') expect(result.failed === 1) }) + + it('report does not include a title by default', async () => { + const fixturePath = path.join(__dirname, 'fixtures', 'junit-with-message.xml') + const filePath = normalizeFilePath(path.relative(__dirname, fixturePath)) + const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'}) + + const opts: ParseOptions = { + parseErrors: true, + trackedFiles: [] + } + + const parser = new JavaJunitParser(opts) + const result = await parser.parse(filePath, fileContent) + const report = getReport([result]) + // Report should have the badge as the first line + expect(report).toMatch(/^!\[Tests failed]/) + }) + + it.each([ + ['empty string', ''], + ['space', ' '], + ['tab', '\t'], + ['newline', '\n'] + ])('report does not include a title when configured value is %s', async (_, reportTitle) => { + const fixturePath = path.join(__dirname, 'fixtures', 'junit-with-message.xml') + const filePath = normalizeFilePath(path.relative(__dirname, fixturePath)) + const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'}) + + const opts: ParseOptions = { + parseErrors: true, + trackedFiles: [] + } + + const parser = new JavaJunitParser(opts) + const result = await parser.parse(filePath, fileContent) + const report = getReport([result], { + ...DEFAULT_OPTIONS, + reportTitle + }) + // Report should have the badge as the first line + expect(report).toMatch(/^!\[Tests failed]/) + }) + + it('report includes a custom report title', async () => { + const fixturePath = path.join(__dirname, 'fixtures', 'empty', 'java-junit.xml') + const filePath = normalizeFilePath(path.relative(__dirname, fixturePath)) + const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'}) + + const opts: ParseOptions = { + parseErrors: true, + trackedFiles: [] + } + + const parser = new JavaJunitParser(opts) + const result = await parser.parse(filePath, fileContent) + const report = getReport([result], { + ...DEFAULT_OPTIONS, + reportTitle: 'My Custom Title' + }) + // Report should have the title as the first line + expect(report).toMatch(/^# My Custom Title\n/) + }) }) diff --git a/__tests__/jest-junit.test.ts b/__tests__/jest-junit.test.ts index d52c047..912ebde 100644 --- a/__tests__/jest-junit.test.ts +++ b/__tests__/jest-junit.test.ts @@ -3,7 +3,7 @@ import * as path from 'path' import {JestJunitParser} from '../src/parsers/jest-junit/jest-junit-parser' import {ParseOptions} from '../src/test-parser' -import {getReport} from '../src/report/get-report' +import {DEFAULT_OPTIONS, getReport} from '../src/report/get-report' import {normalizeFilePath} from '../src/utils/path-utils' describe('jest-junit tests', () => { @@ -145,4 +145,205 @@ describe('jest-junit tests', () => { fs.mkdirSync(path.dirname(outputPath), {recursive: true}) fs.writeFileSync(outputPath, report) }) + + it('report does not include a title by default', async () => { + const fixturePath = path.join(__dirname, 'fixtures', 'jest-junit.xml') + const filePath = normalizeFilePath(path.relative(__dirname, fixturePath)) + const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'}) + + const opts: ParseOptions = { + parseErrors: true, + trackedFiles: [] + } + + const parser = new JestJunitParser(opts) + const result = await parser.parse(filePath, fileContent) + const report = getReport([result]) + // Report should have the badge as the first line + expect(report).toMatch(/^!\[Tests failed]/) + }) + + it.each([ + ['empty string', ''], + ['space', ' '], + ['tab', '\t'], + ['newline', '\n'] + ])('report does not include a title when configured value is %s', async (_, reportTitle) => { + const fixturePath = path.join(__dirname, 'fixtures', 'jest-junit.xml') + const filePath = normalizeFilePath(path.relative(__dirname, fixturePath)) + const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'}) + + const opts: ParseOptions = { + parseErrors: true, + trackedFiles: [] + } + + const parser = new JestJunitParser(opts) + const result = await parser.parse(filePath, fileContent) + const report = getReport([result], { + ...DEFAULT_OPTIONS, + reportTitle + }) + // Report should have the badge as the first line + expect(report).toMatch(/^!\[Tests failed]/) + }) + + it('report includes a custom report title', async () => { + const fixturePath = path.join(__dirname, 'fixtures', 'jest-junit.xml') + const filePath = normalizeFilePath(path.relative(__dirname, fixturePath)) + const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'}) + + const opts: ParseOptions = { + parseErrors: true, + trackedFiles: [] + } + + const parser = new JestJunitParser(opts) + const result = await parser.parse(filePath, fileContent) + const report = getReport([result], { + ...DEFAULT_OPTIONS, + reportTitle: 'My Custom Title' + }) + // Report should have the title as the first line + expect(report).toMatch(/^# My Custom Title\n/) + }) + + it('report can be collapsed when configured', async () => { + const fixturePath = path.join(__dirname, 'fixtures', 'jest-junit.xml') + const filePath = normalizeFilePath(path.relative(__dirname, fixturePath)) + const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'}) + + const opts: ParseOptions = { + parseErrors: true, + trackedFiles: [] + } + + const parser = new JestJunitParser(opts) + const result = await parser.parse(filePath, fileContent) + const report = getReport([result], { + ...DEFAULT_OPTIONS, + collapsed: 'always' + }) + // Report should include collapsible details + expect(report).toContain('
Expand for details') + expect(report).toContain('
') + }) + + it('report is not collapsed when configured to never', async () => { + const fixturePath = path.join(__dirname, 'fixtures', 'jest-junit.xml') + const filePath = normalizeFilePath(path.relative(__dirname, fixturePath)) + const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'}) + + const opts: ParseOptions = { + parseErrors: true, + trackedFiles: [] + } + + const parser = new JestJunitParser(opts) + const result = await parser.parse(filePath, fileContent) + const report = getReport([result], { + ...DEFAULT_OPTIONS, + collapsed: 'never' + }) + // Report should not include collapsible details + expect(report).not.toContain('
Expand for details') + expect(report).not.toContain('
') + }) + + it('report auto-collapses when all tests pass', async () => { + // Test with a fixture that has all passing tests (no failures) + const fixturePath = path.join(__dirname, 'fixtures', 'jest-junit-eslint.xml') + const filePath = normalizeFilePath(path.relative(__dirname, fixturePath)) + const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'}) + + const opts: ParseOptions = { + parseErrors: true, + trackedFiles: [] + } + + const parser = new JestJunitParser(opts) + const result = await parser.parse(filePath, fileContent) + + // Verify this fixture has no failures + expect(result.failed).toBe(0) + + const report = getReport([result], { + ...DEFAULT_OPTIONS, + collapsed: 'auto' + }) + + // Should collapse when all tests pass + expect(report).toContain('
Expand for details') + expect(report).toContain('
') + }) + + it('report does not auto-collapse when tests fail', async () => { + // Test with a fixture that has failing tests + const fixturePath = path.join(__dirname, 'fixtures', 'jest-junit.xml') + const filePath = normalizeFilePath(path.relative(__dirname, fixturePath)) + const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'}) + + const opts: ParseOptions = { + parseErrors: true, + trackedFiles: [] + } + + const parser = new JestJunitParser(opts) + const result = await parser.parse(filePath, fileContent) + + // Verify this fixture has failures + expect(result.failed).toBeGreaterThan(0) + + const report = getReport([result], { + ...DEFAULT_OPTIONS, + collapsed: 'auto' + }) + + // Should not collapse when there are failures + expect(report).not.toContain('
Expand for details') + expect(report).not.toContain('
') + }) + + it('report includes the short summary', async () => { + const fixturePath = path.join(__dirname, 'fixtures', 'jest-junit.xml') + const filePath = normalizeFilePath(path.relative(__dirname, fixturePath)) + const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'}) + + const opts: ParseOptions = { + parseErrors: true, + trackedFiles: [] + } + + const parser = new JestJunitParser(opts) + const result = await parser.parse(filePath, fileContent) + const shortSummary = '1 passed, 4 failed and 1 skipped' + const report = getReport([result], DEFAULT_OPTIONS, shortSummary) + // Report should have the title as the first line + expect(report).toMatch(/^## 1 passed, 4 failed and 1 skipped\n/) + }) + + it('report includes a custom report title and short summary', async () => { + const fixturePath = path.join(__dirname, 'fixtures', 'jest-junit.xml') + const filePath = normalizeFilePath(path.relative(__dirname, fixturePath)) + const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'}) + + const opts: ParseOptions = { + parseErrors: true, + trackedFiles: [] + } + + const parser = new JestJunitParser(opts) + const result = await parser.parse(filePath, fileContent) + const shortSummary = '1 passed, 4 failed and 1 skipped' + const report = getReport( + [result], + { + ...DEFAULT_OPTIONS, + reportTitle: 'My Custom Title' + }, + shortSummary + ) + // Report should have the title as the first line + expect(report).toMatch(/^# My Custom Title\n## 1 passed, 4 failed and 1 skipped\n/) + }) }) diff --git a/__tests__/mocha-json.test.ts b/__tests__/mocha-json.test.ts index 05393fa..1272962 100644 --- a/__tests__/mocha-json.test.ts +++ b/__tests__/mocha-json.test.ts @@ -3,7 +3,7 @@ import * as path from 'path' import {MochaJsonParser} from '../src/parsers/mocha-json/mocha-json-parser' import {ParseOptions} from '../src/test-parser' -import {getReport} from '../src/report/get-report' +import {DEFAULT_OPTIONS, getReport} from '../src/report/get-report' import {normalizeFilePath} from '../src/utils/path-utils' describe('mocha-json tests', () => { @@ -64,4 +64,66 @@ describe('mocha-json tests', () => { fs.mkdirSync(path.dirname(outputPath), {recursive: true}) fs.writeFileSync(outputPath, report) }) + + it('report does not include a title by default', async () => { + const fixturePath = path.join(__dirname, 'fixtures', 'mocha-json.json') + const filePath = normalizeFilePath(path.relative(__dirname, fixturePath)) + const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'}) + + const opts: ParseOptions = { + parseErrors: true, + trackedFiles: [] + } + + const parser = new MochaJsonParser(opts) + const result = await parser.parse(filePath, fileContent) + const report = getReport([result]) + // Report should have the badge as the first line + expect(report).toMatch(/^!\[Tests failed]/) + }) + + it.each([ + ['empty string', ''], + ['space', ' '], + ['tab', '\t'], + ['newline', '\n'] + ])('report does not include a title when configured value is %s', async (_, reportTitle) => { + const fixturePath = path.join(__dirname, 'fixtures', 'mocha-json.json') + const filePath = normalizeFilePath(path.relative(__dirname, fixturePath)) + const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'}) + + const opts: ParseOptions = { + parseErrors: true, + trackedFiles: [] + } + + const parser = new MochaJsonParser(opts) + const result = await parser.parse(filePath, fileContent) + const report = getReport([result], { + ...DEFAULT_OPTIONS, + reportTitle + }) + // Report should have the badge as the first line + expect(report).toMatch(/^!\[Tests failed]/) + }) + + it('report includes a custom report title', async () => { + const fixturePath = path.join(__dirname, 'fixtures', 'mocha-json.json') + const filePath = normalizeFilePath(path.relative(__dirname, fixturePath)) + const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'}) + + const opts: ParseOptions = { + parseErrors: true, + trackedFiles: [] + } + + const parser = new MochaJsonParser(opts) + const result = await parser.parse(filePath, fileContent) + const report = getReport([result], { + ...DEFAULT_OPTIONS, + reportTitle: 'My Custom Title' + }) + // Report should have the title as the first line + expect(report).toMatch(/^# My Custom Title\n/) + }) }) diff --git a/__tests__/python-xunit.test.ts b/__tests__/python-xunit.test.ts new file mode 100644 index 0000000..c1550a4 --- /dev/null +++ b/__tests__/python-xunit.test.ts @@ -0,0 +1,93 @@ +import * as fs from 'fs' +import * as path from 'path' + +import {PythonXunitParser} from '../src/parsers/python-xunit/python-xunit-parser' +import {ParseOptions} from '../src/test-parser' +import {DEFAULT_OPTIONS, getReport} from '../src/report/get-report' +import {normalizeFilePath} from '../src/utils/path-utils' + +const defaultOpts: ParseOptions = { + parseErrors: true, + trackedFiles: [] +} + +describe('python-xunit unittest report', () => { + const fixturePath = path.join(__dirname, 'fixtures', 'python-xunit-unittest.xml') + const filePath = normalizeFilePath(path.relative(__dirname, fixturePath)) + const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'}) + const outputPath = path.join(__dirname, '__outputs__', 'python-xunit-unittest.md') + + it('report from python test results matches snapshot', async () => { + const trackedFiles = ['tests/test_lib.py'] + const opts: ParseOptions = { + ...defaultOpts, + trackedFiles + } + + const parser = new PythonXunitParser(opts) + const result = await parser.parse(filePath, fileContent) + expect(result).toMatchSnapshot() + + const report = getReport([result]) + fs.mkdirSync(path.dirname(outputPath), {recursive: true}) + fs.writeFileSync(outputPath, report) + }) + + it('report does not include a title by default', async () => { + const parser = new PythonXunitParser(defaultOpts) + const result = await parser.parse(filePath, fileContent) + const report = getReport([result]) + // Report should have the badge as the first line + expect(report).toMatch(/^!\[Tests failed]/) + }) + + it.each([ + ['empty string', ''], + ['space', ' '], + ['tab', '\t'], + ['newline', '\n'] + ])('report does not include a title when configured value is %s', async (_, reportTitle) => { + const parser = new PythonXunitParser(defaultOpts) + const result = await parser.parse(filePath, fileContent) + const report = getReport([result], { + ...DEFAULT_OPTIONS, + reportTitle + }) + // Report should have the badge as the first line + expect(report).toMatch(/^!\[Tests failed]/) + }) + + it('report includes a custom report title', async () => { + const parser = new PythonXunitParser(defaultOpts) + const result = await parser.parse(filePath, fileContent) + const report = getReport([result], { + ...DEFAULT_OPTIONS, + reportTitle: 'My Custom Title' + }) + // Report should have the title as the first line + expect(report).toMatch(/^# My Custom Title\n/) + }) +}) + +describe('python-xunit pytest report', () => { + const fixturePath = path.join(__dirname, 'fixtures', 'python-xunit-pytest.xml') + const filePath = normalizeFilePath(path.relative(__dirname, fixturePath)) + const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'}) + const outputPath = path.join(__dirname, '__outputs__', 'python-xunit-pytest.md') + + it('report from python test results matches snapshot', async () => { + const trackedFiles = ['tests/test_lib.py'] + const opts: ParseOptions = { + ...defaultOpts, + trackedFiles + } + + const parser = new PythonXunitParser(opts) + const result = await parser.parse(filePath, fileContent) + expect(result).toMatchSnapshot() + + const report = getReport([result]) + fs.mkdirSync(path.dirname(outputPath), {recursive: true}) + fs.writeFileSync(outputPath, report) + }) +}) diff --git a/__tests__/report/get-report.test.ts b/__tests__/report/get-report.test.ts new file mode 100644 index 0000000..670b0ad --- /dev/null +++ b/__tests__/report/get-report.test.ts @@ -0,0 +1,120 @@ +import {getBadge, DEFAULT_OPTIONS, ReportOptions} from '../../src/report/get-report' + +describe('getBadge', () => { + describe('URI encoding with special characters', () => { + it('generates correct URI with simple badge title', () => { + const options: ReportOptions = { + ...DEFAULT_OPTIONS, + badgeTitle: 'tests' + } + const badge = getBadge(5, 0, 1, options) + expect(badge).toBe('![Tests passed successfully](https://img.shields.io/badge/tests-5%20passed%2C%201%20skipped-success)') + }) + + it('handles badge title with single hyphen', () => { + const options: ReportOptions = { + ...DEFAULT_OPTIONS, + badgeTitle: 'unit-tests' + } + const badge = getBadge(3, 0, 0, options) + // The hyphen in the badge title should be encoded as -- + expect(badge).toBe('![Tests passed successfully](https://img.shields.io/badge/unit--tests-3%20passed-success)') + }) + + it('handles badge title with multiple hyphens', () => { + const options: ReportOptions = { + ...DEFAULT_OPTIONS, + badgeTitle: 'integration-api-tests' + } + const badge = getBadge(10, 0, 0, options) + // All hyphens in the title should be encoded as -- + expect(badge).toBe('![Tests passed successfully](https://img.shields.io/badge/integration--api--tests-10%20passed-success)') + }) + + it('handles badge title with multiple underscores', () => { + const options: ReportOptions = { + ...DEFAULT_OPTIONS, + badgeTitle: 'my_integration_test' + } + const badge = getBadge(10, 0, 0, options) + // All underscores in the title should be encoded as __ + expect(badge).toBe('![Tests passed successfully](https://img.shields.io/badge/my__integration__test-10%20passed-success)') + }) + + it('handles badge title with version format containing hyphen', () => { + const options: ReportOptions = { + ...DEFAULT_OPTIONS, + badgeTitle: 'MariaDb 12.0-ubi database tests' + } + const badge = getBadge(1, 0, 0, options) + // The hyphen in "12.0-ubi" should be encoded as -- + expect(badge).toBe('![Tests passed successfully](https://img.shields.io/badge/MariaDb%2012.0--ubi%20database%20tests-1%20passed-success)') + }) + + it('handles badge title with dots and hyphens', () => { + const options: ReportOptions = { + ...DEFAULT_OPTIONS, + badgeTitle: 'v1.2.3-beta-test' + } + const badge = getBadge(4, 1, 0, options) + expect(badge).toBe('![Tests failed](https://img.shields.io/badge/v1.2.3--beta--test-4%20passed%2C%201%20failed-critical)') + }) + + it('preserves structural hyphens between label and message', () => { + const options: ReportOptions = { + ...DEFAULT_OPTIONS, + badgeTitle: 'test-suite' + } + const badge = getBadge(2, 3, 1, options) + // The URI should have literal hyphens separating title-message-color + expect(badge).toBe('![Tests failed](https://img.shields.io/badge/test--suite-2%20passed%2C%203%20failed%2C%201%20skipped-critical)') + }) + }) + + describe('generates test outcome as color name for imgshields', () => { + it('uses success color when all tests pass', () => { + const options: ReportOptions = {...DEFAULT_OPTIONS} + const badge = getBadge(5, 0, 0, options) + expect(badge).toContain('-success)') + }) + + it('uses critical color when tests fail', () => { + const options: ReportOptions = {...DEFAULT_OPTIONS} + const badge = getBadge(5, 2, 0, options) + expect(badge).toContain('-critical)') + }) + + it('uses yellow color when no tests found', () => { + const options: ReportOptions = {...DEFAULT_OPTIONS} + const badge = getBadge(0, 0, 0, options) + expect(badge).toContain('-yellow)') + }) + }) + + describe('badge message composition', () => { + it('includes only passed count when no failures or skips', () => { + const options: ReportOptions = {...DEFAULT_OPTIONS} + const badge = getBadge(5, 0, 0, options) + expect(badge).toBe('![Tests passed successfully](https://img.shields.io/badge/tests-5%20passed-success)') + }) + + it('includes passed and failed counts', () => { + const options: ReportOptions = {...DEFAULT_OPTIONS} + const badge = getBadge(5, 2, 0, options) + expect(badge).toBe('![Tests failed](https://img.shields.io/badge/tests-5%20passed%2C%202%20failed-critical)') + }) + + it('includes passed, failed and skipped counts', () => { + const options: ReportOptions = {...DEFAULT_OPTIONS} + const badge = getBadge(5, 2, 1, options) + expect(badge).toBe('![Tests failed](https://img.shields.io/badge/tests-5%20passed%2C%202%20failed%2C%201%20skipped-critical)') + }) + + it('uses "none" message when no tests', () => { + const options: ReportOptions = {...DEFAULT_OPTIONS} + const badge = getBadge(0, 0, 0, options) + expect(badge).toBe('![Tests passed successfully](https://img.shields.io/badge/tests-none-yellow)') + }) + }) +}) + diff --git a/__tests__/rspec-json.test.ts b/__tests__/rspec-json.test.ts index f77475a..787420b 100644 --- a/__tests__/rspec-json.test.ts +++ b/__tests__/rspec-json.test.ts @@ -3,7 +3,7 @@ import * as path from 'path' import {RspecJsonParser} from '../src/parsers/rspec-json/rspec-json-parser' import {ParseOptions} from '../src/test-parser' -import {getReport} from '../src/report/get-report' +import {DEFAULT_OPTIONS, getReport} from '../src/report/get-report' import {normalizeFilePath} from '../src/utils/path-utils' describe('rspec-json tests', () => { @@ -42,4 +42,66 @@ describe('rspec-json tests', () => { fs.mkdirSync(path.dirname(outputPath), {recursive: true}) fs.writeFileSync(outputPath, report) }) + + it('report does not include a title by default', async () => { + const fixturePath = path.join(__dirname, 'fixtures', 'rspec-json.json') + const filePath = normalizeFilePath(path.relative(__dirname, fixturePath)) + const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'}) + + const opts: ParseOptions = { + parseErrors: true, + trackedFiles: [] + } + + const parser = new RspecJsonParser(opts) + const result = await parser.parse(filePath, fileContent) + const report = getReport([result]) + // Report should have the badge as the first line + expect(report).toMatch(/^!\[Tests failed]/) + }) + + it.each([ + ['empty string', ''], + ['space', ' '], + ['tab', '\t'], + ['newline', '\n'] + ])('report does not include a title when configured value is %s', async (_, reportTitle) => { + const fixturePath = path.join(__dirname, 'fixtures', 'rspec-json.json') + const filePath = normalizeFilePath(path.relative(__dirname, fixturePath)) + const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'}) + + const opts: ParseOptions = { + parseErrors: true, + trackedFiles: [] + } + + const parser = new RspecJsonParser(opts) + const result = await parser.parse(filePath, fileContent) + const report = getReport([result], { + ...DEFAULT_OPTIONS, + reportTitle + }) + // Report should have the badge as the first line + expect(report).toMatch(/^!\[Tests failed]/) + }) + + it('report includes a custom report title', async () => { + const fixturePath = path.join(__dirname, 'fixtures', 'rspec-json.json') + const filePath = normalizeFilePath(path.relative(__dirname, fixturePath)) + const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'}) + + const opts: ParseOptions = { + parseErrors: true, + trackedFiles: [] + } + + const parser = new RspecJsonParser(opts) + const result = await parser.parse(filePath, fileContent) + const report = getReport([result], { + ...DEFAULT_OPTIONS, + reportTitle: 'My Custom Title' + }) + // Report should have the title as the first line + expect(report).toMatch(/^# My Custom Title\n/) + }) }) diff --git a/__tests__/swift-xunit.test.ts b/__tests__/swift-xunit.test.ts index 474c868..9f063ee 100644 --- a/__tests__/swift-xunit.test.ts +++ b/__tests__/swift-xunit.test.ts @@ -3,7 +3,7 @@ import * as path from 'path' import {SwiftXunitParser} from '../src/parsers/swift-xunit/swift-xunit-parser' import {ParseOptions} from '../src/test-parser' -import {getReport} from '../src/report/get-report' +import {DEFAULT_OPTIONS, getReport} from '../src/report/get-report' import {normalizeFilePath} from '../src/utils/path-utils' describe('swift-xunit tests', () => { @@ -27,4 +27,66 @@ describe('swift-xunit tests', () => { fs.mkdirSync(path.dirname(outputPath), {recursive: true}) fs.writeFileSync(outputPath, report) }) + + it('report does not include a title by default', async () => { + const fixturePath = path.join(__dirname, 'fixtures', 'swift-xunit.xml') + const filePath = normalizeFilePath(path.relative(__dirname, fixturePath)) + const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'}) + + const opts: ParseOptions = { + parseErrors: true, + trackedFiles: [] + } + + const parser = new SwiftXunitParser(opts) + const result = await parser.parse(filePath, fileContent) + const report = getReport([result]) + // Report should have the badge as the first line + expect(report).toMatch(/^!\[Tests failed]/) + }) + + it.each([ + ['empty string', ''], + ['space', ' '], + ['tab', '\t'], + ['newline', '\n'] + ])('report does not include a title when configured value is %s', async (_, reportTitle) => { + const fixturePath = path.join(__dirname, 'fixtures', 'swift-xunit.xml') + const filePath = normalizeFilePath(path.relative(__dirname, fixturePath)) + const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'}) + + const opts: ParseOptions = { + parseErrors: true, + trackedFiles: [] + } + + const parser = new SwiftXunitParser(opts) + const result = await parser.parse(filePath, fileContent) + const report = getReport([result], { + ...DEFAULT_OPTIONS, + reportTitle + }) + // Report should have the badge as the first line + expect(report).toMatch(/^!\[Tests failed]/) + }) + + it('report includes a custom report title', async () => { + const fixturePath = path.join(__dirname, 'fixtures', 'swift-xunit.xml') + const filePath = normalizeFilePath(path.relative(__dirname, fixturePath)) + const fileContent = fs.readFileSync(fixturePath, {encoding: 'utf8'}) + + const opts: ParseOptions = { + parseErrors: true, + trackedFiles: [] + } + + const parser = new SwiftXunitParser(opts) + const result = await parser.parse(filePath, fileContent) + const report = getReport([result], { + ...DEFAULT_OPTIONS, + reportTitle: 'My Custom Title' + }) + // Report should have the title as the first line + expect(report).toMatch(/^# My Custom Title\n/) + }) }) diff --git a/__tests__/utils/parse-utils.test.ts b/__tests__/utils/parse-utils.test.ts index 83689ef..0f02867 100644 --- a/__tests__/utils/parse-utils.test.ts +++ b/__tests__/utils/parse-utils.test.ts @@ -32,6 +32,6 @@ describe('parseNetDuration', () => { }) it('throws when string has invalid format', () => { - expect(() => parseNetDuration('12:34:56 not a duration')).toThrowError(/^Invalid format/) + expect(() => parseNetDuration('12:34:56 not a duration')).toThrow(/^Invalid format/) }) }) diff --git a/action.yml b/action.yml index dae5bc0..530435c 100644 --- a/action.yml +++ b/action.yml @@ -1,6 +1,5 @@ name: Test Reporter -description: | - Shows test results in GitHub UI: .NET (xUnit, NUnit, MSTest), Dart, Flutter, Java (JUnit), JavaScript (JEST, Mocha) +description: Displays test results from popular testing frameworks directly in GitHub author: Michal Dorner inputs: artifact: @@ -29,9 +28,11 @@ inputs: - dotnet-nunit - dotnet-trx - flutter-json + - golang-json - java-junit - jest-junit - mocha-json + - python-xunit - rspec-json - swift-xunit required: true @@ -39,7 +40,7 @@ inputs: description: | Limits which test suites are listed. Supported options: - all - - only-failed + - failed - none required: false default: 'all' @@ -47,7 +48,7 @@ inputs: description: | Limits which test cases are listed. Supported options: - all - - only-failed + - failed - none required: false default: 'all' @@ -68,6 +69,10 @@ inputs: working-directory: description: Relative path under $GITHUB_WORKSPACE where the repository was checked out required: false + report-title: + description: Title for the test report summary + required: false + default: '' only-summary: description: | Allows you to generate only the summary. @@ -85,6 +90,14 @@ inputs: description: Customize badge title required: false default: 'tests' + collapsed: + description: | + Controls whether test report details are collapsed or expanded. Supported options: + - auto: Collapse only if all tests pass (default behavior) + - always: Always collapse the report details + - never: Always expand the report details + required: false + default: 'auto' token: description: GitHub Access Token required: false diff --git a/dist/index.js b/dist/index.js index 8dbf93d..42cb52e 100644 --- a/dist/index.js +++ b/dist/index.js @@ -273,9 +273,11 @@ const get_report_1 = __nccwpck_require__(7070); const dart_json_parser_1 = __nccwpck_require__(1254); const dotnet_nunit_parser_1 = __nccwpck_require__(6394); const dotnet_trx_parser_1 = __nccwpck_require__(1658); +const golang_json_parser_1 = __nccwpck_require__(5162); const java_junit_parser_1 = __nccwpck_require__(8342); const jest_junit_parser_1 = __nccwpck_require__(1042); const mocha_json_parser_1 = __nccwpck_require__(5402); +const python_xunit_parser_1 = __nccwpck_require__(6578); const rspec_json_parser_1 = __nccwpck_require__(9768); const swift_xunit_parser_1 = __nccwpck_require__(7330); const path_utils_1 = __nccwpck_require__(9132); @@ -307,6 +309,8 @@ class TestReporter { onlySummary = core.getInput('only-summary', { required: false }) === 'true'; useActionsSummary = core.getInput('use-actions-summary', { required: false }) === 'true'; badgeTitle = core.getInput('badge-title', { required: false }); + reportTitle = core.getInput('report-title', { required: false }); + collapsed = core.getInput('collapsed', { required: false }); token = core.getInput('token', { required: true }); octokit; context = (0, github_utils_1.getCheckRunContext)(); @@ -320,6 +324,10 @@ class TestReporter { core.setFailed(`Input parameter 'list-tests' has invalid value`); return; } + if (this.collapsed !== 'auto' && this.collapsed !== 'always' && this.collapsed !== 'never') { + core.setFailed(`Input parameter 'collapsed' has invalid value`); + return; + } if (isNaN(this.maxAnnotations) || this.maxAnnotations < 0 || this.maxAnnotations > 50) { core.setFailed(`Input parameter 'max-annotations' has invalid value`); return; @@ -399,10 +407,23 @@ class TestReporter { throw error; } } - const { listSuites, listTests, onlySummary, useActionsSummary, badgeTitle } = this; + const { listSuites, listTests, onlySummary, useActionsSummary, badgeTitle, reportTitle, collapsed } = this; + const passed = results.reduce((sum, tr) => sum + tr.passed, 0); + const failed = results.reduce((sum, tr) => sum + tr.failed, 0); + const skipped = results.reduce((sum, tr) => sum + tr.skipped, 0); + const shortSummary = `${passed} passed, ${failed} failed and ${skipped} skipped `; let baseUrl = ''; if (this.useActionsSummary) { - const summary = (0, get_report_1.getReport)(results, { listSuites, listTests, baseUrl, onlySummary, useActionsSummary, badgeTitle }); + const summary = (0, get_report_1.getReport)(results, { + listSuites, + listTests, + baseUrl, + onlySummary, + useActionsSummary, + badgeTitle, + reportTitle, + collapsed + }, shortSummary); core.info('Summary content:'); core.info(summary); await core.summary.addRaw(summary).write(); @@ -421,15 +442,20 @@ class TestReporter { }); core.info('Creating report summary'); baseUrl = createResp.data.html_url; - const summary = (0, get_report_1.getReport)(results, { listSuites, listTests, baseUrl, onlySummary, useActionsSummary, badgeTitle }); + const summary = (0, get_report_1.getReport)(results, { + listSuites, + listTests, + baseUrl, + onlySummary, + useActionsSummary, + badgeTitle, + reportTitle, + collapsed + }); core.info('Creating annotations'); const annotations = (0, get_annotations_1.getAnnotations)(results, this.maxAnnotations); const isFailed = this.failOnError && results.some(tr => tr.result === 'failed'); const conclusion = isFailed ? 'failure' : 'success'; - const passed = results.reduce((sum, tr) => sum + tr.passed, 0); - const failed = results.reduce((sum, tr) => sum + tr.failed, 0); - const skipped = results.reduce((sum, tr) => sum + tr.skipped, 0); - const shortSummary = `${passed} passed, ${failed} failed and ${skipped} skipped `; core.info(`Updating check run conclusion (${conclusion}) and output`); const resp = await this.octokit.rest.checks.update({ check_run_id: createResp.data.id, @@ -458,6 +484,8 @@ class TestReporter { return new dotnet_nunit_parser_1.DotnetNunitParser(options); case 'dotnet-trx': return new dotnet_trx_parser_1.DotnetTrxParser(options); + case 'golang-json': + return new golang_json_parser_1.GolangJsonParser(options); case 'flutter-json': return new dart_json_parser_1.DartJsonParser(options, 'flutter'); case 'java-junit': @@ -466,6 +494,8 @@ class TestReporter { return new jest_junit_parser_1.JestJunitParser(options); case 'mocha-json': return new mocha_json_parser_1.MochaJsonParser(options); + case 'python-xunit': + return new python_xunit_parser_1.PythonXunitParser(options); case 'rspec-json': return new rspec_json_parser_1.RspecJsonParser(options); case 'swift-xunit': @@ -816,12 +846,12 @@ class DotnetNunitParser { .map(suite => suite.$.name) .join('.'); const groupName = suitesWithoutTheories[suitesWithoutTheories.length - 1].$.name; - let existingSuite = result.find(existingSuite => existingSuite.name === suiteName); + let existingSuite = result.find(suite => suite.name === suiteName); if (existingSuite === undefined) { existingSuite = new test_results_1.TestSuiteResult(suiteName, []); result.push(existingSuite); } - let existingGroup = existingSuite.groups.find(existingGroup => existingGroup.name === groupName); + let existingGroup = existingSuite.groups.find(group => group.name === groupName); if (existingGroup === undefined) { existingGroup = new test_results_1.TestGroupResult(groupName, []); existingSuite.groups.push(existingGroup); @@ -937,7 +967,8 @@ class DotnetTrxParser { } } getTestClasses(trx) { - if (trx.TestRun.TestDefinitions === undefined || trx.TestRun.Results === undefined) { + if (trx.TestRun.TestDefinitions === undefined || trx.TestRun.Results === undefined || + !trx.TestRun.TestDefinitions.some(td => td.UnitTest && Array.isArray(td.UnitTest))) { return []; } const unitTests = {}; @@ -952,7 +983,7 @@ class DotnetTrxParser { })); const testClasses = {}; for (const r of unitTestsResults) { - const className = r.test.TestMethod[0].$.className; + const className = r.test.TestMethod[0].$.className ?? "Unclassified"; let tc = testClasses[className]; if (tc === undefined) { tc = new TestClass(className); @@ -1003,8 +1034,8 @@ class DotnetTrxParser { error.StackTrace.length === 0) { return undefined; } - const message = test.error.Message[0]; const stackTrace = test.error.StackTrace[0]; + const message = `${test.error.Message[0]}\n${stackTrace}`; let path; let line; const src = this.exceptionThrowSource(stackTrace); @@ -1016,7 +1047,7 @@ class DotnetTrxParser { path, line, message, - details: `${message}\n${stackTrace}` + details: `${message}` }; } exceptionThrowSource(stackTrace) { @@ -1048,6 +1079,106 @@ class DotnetTrxParser { exports.DotnetTrxParser = DotnetTrxParser; +/***/ }), + +/***/ 5162: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.GolangJsonParser = void 0; +const test_results_1 = __nccwpck_require__(613); +class GolangJsonParser { + options; + assumedWorkDir; + constructor(options) { + this.options = options; + } + async parse(path, content) { + const events = await this.getGolangTestEvents(path, content); + return this.getTestRunResult(path, events); + } + async getGolangTestEvents(path, content) { + return content.trim().split('\n').map((line, index) => { + try { + return JSON.parse(line); + } + catch (e) { + throw new Error(`Invalid JSON at ${path} line ${index + 1}\n\n${e}`); + } + }); + } + getTestRunResult(path, events) { + const eventGroups = new Map(); + for (const event of events) { + if (!event.Test) { + continue; + } + const k = `${event.Package}/${event.Test}`; + let g = eventGroups.get(k); + if (!g) { + g = []; + eventGroups.set(k, g); + } + g.push(event); + } + const suites = []; + for (const eventGroup of eventGroups.values()) { + const event = eventGroup[0]; + let suite = suites.find(s => s.name === event.Package); + if (!suite) { + suite = new test_results_1.TestSuiteResult(event.Package, []); + suites.push(suite); + } + if (!event.Test) { + continue; + } + let groupName; + let rest; + [groupName, ...rest] = event.Test.split('/'); + let testName = rest.join('/'); + if (!testName) { + testName = groupName; + groupName = null; + } + let group = suite.groups.find(g => g.name === groupName); + if (!group) { + group = new test_results_1.TestGroupResult(groupName, []); + suite.groups.push(group); + } + const lastEvent = eventGroup.at(-1); + const result = lastEvent.Action === 'pass' ? 'success' + : lastEvent.Action === 'skip' ? 'skipped' + : 'failed'; + if (lastEvent.Elapsed === undefined) { + throw new Error('missing elapsed on final test event'); + } + const time = lastEvent.Elapsed * 1000; + let error = undefined; + if (result !== 'success') { + const outputEvents = eventGroup + .filter(e => e.Action === 'output') + .map(e => e.Output ?? '') + // Go output prepends indentation to help group tests - remove it + .map(o => o.replace(/^ /, '')); + // First and last lines will be generic "test started" and "test finished" lines - remove them + outputEvents.splice(0, 1); + outputEvents.splice(-1, 1); + const details = outputEvents.join(''); + error = { + message: details, + details: details + }; + } + group.tests.push(new test_results_1.TestCaseResult(testName, result, time, error)); + } + return new test_results_1.TestRunResult(path, suites); + } +} +exports.GolangJsonParser = GolangJsonParser; + + /***/ }), /***/ 8342: @@ -1535,6 +1666,26 @@ class MochaJsonParser { exports.MochaJsonParser = MochaJsonParser; +/***/ }), + +/***/ 6578: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.PythonXunitParser = void 0; +const java_junit_parser_1 = __nccwpck_require__(8342); +class PythonXunitParser extends java_junit_parser_1.JavaJunitParser { + options; + constructor(options) { + super(options); + this.options = options; + } +} +exports.PythonXunitParser = PythonXunitParser; + + /***/ }), /***/ 9768: @@ -1785,27 +1936,30 @@ var __importStar = (this && this.__importStar) || (function () { }; })(); Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.DEFAULT_OPTIONS = void 0; exports.getReport = getReport; +exports.getBadge = getBadge; const core = __importStar(__nccwpck_require__(7484)); const markdown_utils_1 = __nccwpck_require__(5129); const node_utils_1 = __nccwpck_require__(5384); const parse_utils_1 = __nccwpck_require__(9633); const slugger_1 = __nccwpck_require__(9537); const MAX_REPORT_LENGTH = 65535; -const MAX_ACTIONS_SUMMARY_LENGTH = 131072; // 1048576 soon -const defaultOptions = { +const MAX_ACTIONS_SUMMARY_LENGTH = 1048576; +exports.DEFAULT_OPTIONS = { listSuites: 'all', listTests: 'all', baseUrl: '', onlySummary: false, useActionsSummary: true, - badgeTitle: 'tests' + badgeTitle: 'tests', + reportTitle: '', + collapsed: 'auto' }; -function getReport(results, options = defaultOptions) { - core.info('Generating check run summary'); +function getReport(results, options = exports.DEFAULT_OPTIONS, shortSummary = '') { applySort(results); const opts = { ...options }; - let lines = renderReport(results, opts); + let lines = renderReport(results, opts, shortSummary); let report = lines.join('\n'); if (getByteLength(report) <= getMaxReportLength(options)) { return report; @@ -1813,7 +1967,7 @@ function getReport(results, options = defaultOptions) { if (opts.listTests === 'all') { core.info("Test report summary is too big - setting 'listTests' to 'failed'"); opts.listTests = 'failed'; - lines = renderReport(results, opts); + lines = renderReport(results, opts, shortSummary); report = lines.join('\n'); if (getByteLength(report) <= getMaxReportLength(options)) { return report; @@ -1822,7 +1976,7 @@ function getReport(results, options = defaultOptions) { core.warning(`Test report summary exceeded limit of ${getMaxReportLength(options)} bytes and will be trimmed`); return trimReport(lines, options); } -function getMaxReportLength(options = defaultOptions) { +function getMaxReportLength(options = exports.DEFAULT_OPTIONS) { return options.useActionsSummary ? MAX_ACTIONS_SUMMARY_LENGTH : MAX_REPORT_LENGTH; } function trimReport(lines, options) { @@ -1860,8 +2014,15 @@ function applySort(results) { function getByteLength(text) { return Buffer.byteLength(text, 'utf8'); } -function renderReport(results, options) { +function renderReport(results, options, shortSummary) { const sections = []; + const reportTitle = options.reportTitle.trim(); + if (reportTitle) { + sections.push(`# ${reportTitle}`); + } + if (shortSummary) { + sections.push(`## ${shortSummary}`); + } const badge = getReportBadge(results, options); sections.push(badge); const runs = getTestRunsReport(results, options); @@ -1894,26 +2055,33 @@ function getBadge(passed, failed, skipped, options) { color = 'yellow'; } const hint = failed > 0 ? 'Tests failed' : 'Tests passed successfully'; - const uri = encodeURIComponent(`${options.badgeTitle}-${message}-${color}`); - return `![${hint}](https://img.shields.io/badge/${uri})`; + const encodedBadgeTitle = encodeImgShieldsURIComponent(options.badgeTitle); + const encodedMessage = encodeImgShieldsURIComponent(message); + const encodedColor = encodeImgShieldsURIComponent(color); + return `![${hint}](https://img.shields.io/badge/${encodedBadgeTitle}-${encodedMessage}-${encodedColor})`; } function getTestRunsReport(testRuns, options) { const sections = []; const totalFailed = testRuns.reduce((sum, tr) => sum + tr.failed, 0); - if (totalFailed === 0) { + // Determine if report should be collapsed based on collapsed option + const shouldCollapse = options.collapsed === 'always' || (options.collapsed === 'auto' && totalFailed === 0); + if (shouldCollapse) { sections.push(`
Expand for details`); sections.push(` `); } if (testRuns.length > 0 || options.onlySummary) { const tableData = testRuns - .filter(tr => tr.passed > 0 || tr.failed > 0 || tr.skipped > 0) - .map(tr => { + .map((tr, originalIndex) => ({ tr, originalIndex })) + .filter(({ tr }) => tr.passed > 0 || tr.failed > 0 || tr.skipped > 0) + .map(({ tr, originalIndex }) => { const time = (0, markdown_utils_1.formatTime)(tr.time); const name = tr.path; + const addr = options.baseUrl + makeRunSlug(originalIndex, options).link; + const nameLink = (0, markdown_utils_1.link)(name, addr); 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 skipped = tr.skipped > 0 ? `${tr.skipped} ${markdown_utils_1.Icon.skip}` : ''; - return [name, passed, failed, skipped, time]; + return [nameLink, passed, failed, skipped, time]; }); const resultsTable = (0, markdown_utils_1.table)(['Report', 'Passed', 'Failed', 'Skipped', 'Time'], [markdown_utils_1.Align.Left, markdown_utils_1.Align.Right, markdown_utils_1.Align.Right, markdown_utils_1.Align.Right, markdown_utils_1.Align.Right], ...tableData); sections.push(resultsTable); @@ -1922,7 +2090,7 @@ function getTestRunsReport(testRuns, options) { const suitesReports = testRuns.map((tr, i) => getSuitesReport(tr, i, options)).flat(); sections.push(...suitesReports); } - if (totalFailed === 0) { + if (shouldCollapse) { sections.push(`
`); } return sections; @@ -1931,7 +2099,7 @@ function getSuitesReport(tr, runIndex, options) { const sections = []; const suites = options.listSuites === 'failed' ? tr.failedSuites : tr.suites; if (options.listSuites !== 'none') { - const trSlug = makeRunSlug(runIndex); + const trSlug = makeRunSlug(runIndex, options); const nameLink = `${tr.path}`; const icon = getResultIcon(tr.result); sections.push(`## ${icon}\xa0${nameLink}`); @@ -1945,7 +2113,7 @@ function getSuitesReport(tr, runIndex, options) { const tsTime = (0, markdown_utils_1.formatTime)(s.time); const tsName = s.name; const skipLink = options.listTests === 'none' || (options.listTests === 'failed' && s.result !== 'failed'); - const tsAddr = options.baseUrl + makeSuiteSlug(runIndex, suiteIndex).link; + const tsAddr = options.baseUrl + makeSuiteSlug(runIndex, suiteIndex, options).link; const tsNameLink = skipLink ? tsName : (0, markdown_utils_1.link)(tsName, tsAddr); const passed = s.passed > 0 ? `${s.passed} ${markdown_utils_1.Icon.success}` : ''; const failed = s.failed > 0 ? `${s.failed} ${markdown_utils_1.Icon.fail}` : ''; @@ -1973,7 +2141,7 @@ function getTestsReport(ts, runIndex, suiteIndex, options) { } const sections = []; const tsName = ts.name; - const tsSlug = makeSuiteSlug(runIndex, suiteIndex); + const tsSlug = makeSuiteSlug(runIndex, suiteIndex, options); const tsNameLink = `${tsName}`; const icon = getResultIcon(ts.result); sections.push(`### ${icon}\xa0${tsNameLink}`); @@ -1984,6 +2152,9 @@ function getTestsReport(ts, runIndex, suiteIndex, options) { } const space = grp.name ? ' ' : ''; for (const tc of grp.tests) { + if (options.listTests === 'failed' && tc.result !== 'failed') { + continue; + } const result = getResultIcon(tc.result); sections.push(`${space}${result} ${tc.name}`); if (tc.error) { @@ -1999,13 +2170,13 @@ function getTestsReport(ts, runIndex, suiteIndex, options) { sections.push('```'); return sections; } -function makeRunSlug(runIndex) { +function makeRunSlug(runIndex, options) { // use prefix to avoid slug conflicts after escaping the paths - return (0, slugger_1.slug)(`r${runIndex}`); + return (0, slugger_1.slug)(`r${runIndex}`, options); } -function makeSuiteSlug(runIndex, suiteIndex) { +function makeSuiteSlug(runIndex, suiteIndex, options) { // use prefix to avoid slug conflicts after escaping the paths - return (0, slugger_1.slug)(`r${runIndex}s${suiteIndex}`); + return (0, slugger_1.slug)(`r${runIndex}s${suiteIndex}`, options); } function getResultIcon(result) { switch (result) { @@ -2019,6 +2190,9 @@ function getResultIcon(result) { return ''; } } +function encodeImgShieldsURIComponent(component) { + return encodeURIComponent(component).replace(/-/g, '--').replace(/_/g, '__'); +} /***/ }), @@ -2308,11 +2482,11 @@ async function downloadArtifact(octokit, artifactId, fileName, token) { }; const downloadStream = got_1.default.stream(req.url, { headers }); const fileWriterStream = (0, fs_1.createWriteStream)(fileName); - downloadStream.on('redirect', response => { + downloadStream.on('redirect', (response) => { core.info(`Downloading ${response.headers.location}`); }); - downloadStream.on('downloadProgress', ({ transferred }) => { - core.info(`Progress: ${transferred} B`); + downloadStream.on('downloadProgress', (progress) => { + core.info(`Progress: ${progress.transferred} B`); }); await asyncStream(downloadStream, fileWriterStream); } @@ -2544,17 +2718,15 @@ function getBasePath(path, trackedFiles) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.slug = slug; -// Returns HTML element id and href link usable as manual anchor links -// This is needed because Github in check run summary doesn't automatically -// create links out of headings as it normally does for other markdown content -function slug(name) { +function slug(name, options) { const slugId = name .trim() .replace(/_/g, '') .replace(/[./\\]/g, '-') .replace(/[^\w-]/g, ''); const id = `user-content-${slugId}`; - const link = `#${slugId}`; + // When using the Action Summary for display, links must include the "user-content-" prefix. + const link = options.useActionsSummary ? `#${id}` : `#${slugId}`; return { id, link }; } @@ -4442,6 +4614,7 @@ class Context { this.action = process.env.GITHUB_ACTION; this.actor = process.env.GITHUB_ACTOR; this.job = process.env.GITHUB_JOB; + this.runAttempt = parseInt(process.env.GITHUB_RUN_ATTEMPT, 10); this.runNumber = parseInt(process.env.GITHUB_RUN_NUMBER, 10); this.runId = parseInt(process.env.GITHUB_RUN_ID, 10); this.apiUrl = (_a = process.env.GITHUB_API_URL) !== null && _a !== void 0 ? _a : `https://api.github.com`; @@ -7027,11 +7200,11 @@ var __copyProps = (to, from, except, desc) => { var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // pkg/dist-src/index.js -var dist_src_exports = {}; -__export(dist_src_exports, { +var index_exports = {}; +__export(index_exports, { Octokit: () => Octokit }); -module.exports = __toCommonJS(dist_src_exports); +module.exports = __toCommonJS(index_exports); var import_universal_user_agent = __nccwpck_require__(3843); var import_before_after_hook = __nccwpck_require__(2732); var import_request = __nccwpck_require__(8636); @@ -7039,7 +7212,7 @@ var import_graphql = __nccwpck_require__(7); var import_auth_token = __nccwpck_require__(7864); // pkg/dist-src/version.js -var VERSION = "5.0.2"; +var VERSION = "5.2.1"; // pkg/dist-src/index.js var noop = () => { @@ -7206,7 +7379,7 @@ module.exports = __toCommonJS(dist_src_exports); var import_universal_user_agent = __nccwpck_require__(3843); // pkg/dist-src/version.js -var VERSION = "9.0.4"; +var VERSION = "9.0.6"; // pkg/dist-src/defaults.js var userAgent = `octokit-endpoint.js/${VERSION} ${(0, import_universal_user_agent.getUserAgent)()}`; @@ -7311,9 +7484,9 @@ function addQueryParameters(url, parameters) { } // pkg/dist-src/util/extract-url-variable-names.js -var urlVariableRegex = /\{[^}]+\}/g; +var urlVariableRegex = /\{[^{}}]+\}/g; function removeNonChars(variableName) { - return variableName.replace(/^\W+|\W+$/g, "").split(/,/); + return variableName.replace(/(?:^\W+)|(?:(? { const format = options.mediaType.format ? `.${options.mediaType.format}` : "+json"; return `application/vnd.github.${preview}-preview${format}`; @@ -7580,18 +7753,18 @@ var __copyProps = (to, from, except, desc) => { var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // pkg/dist-src/index.js -var dist_src_exports = {}; -__export(dist_src_exports, { +var index_exports = {}; +__export(index_exports, { GraphqlResponseError: () => GraphqlResponseError, graphql: () => graphql2, withCustomRequest: () => withCustomRequest }); -module.exports = __toCommonJS(dist_src_exports); +module.exports = __toCommonJS(index_exports); var import_request3 = __nccwpck_require__(8636); var import_universal_user_agent = __nccwpck_require__(3843); // pkg/dist-src/version.js -var VERSION = "7.0.2"; +var VERSION = "7.1.1"; // pkg/dist-src/with-defaults.js var import_request2 = __nccwpck_require__(8636); @@ -7639,8 +7812,7 @@ function graphql(request2, query, options) { ); } for (const key in options) { - if (!FORBIDDEN_VARIABLE_OPTIONS.includes(key)) - continue; + if (!FORBIDDEN_VARIABLE_OPTIONS.includes(key)) continue; return Promise.reject( new Error( `[@octokit/graphql] "${key}" cannot be used as variable name` @@ -7748,7 +7920,7 @@ __export(dist_src_exports, { module.exports = __toCommonJS(dist_src_exports); // pkg/dist-src/version.js -var VERSION = "9.1.5"; +var VERSION = "9.2.2"; // pkg/dist-src/normalize-paginated-list-response.js function normalizePaginatedListResponse(response) { @@ -7796,7 +7968,7 @@ function iterator(octokit, route, parameters) { const response = await requestMethod({ method, url, headers }); const normalizedResponse = normalizePaginatedListResponse(response); url = ((normalizedResponse.headers.link || "").match( - /<([^>]+)>;\s*rel="next"/ + /<([^<>]+)>;\s*rel="next"/ ) || [])[1]; return { value: normalizedResponse }; } catch (error) { @@ -7909,6 +8081,8 @@ var paginatingEndpoints = [ "GET /orgs/{org}/members/{username}/codespaces", "GET /orgs/{org}/migrations", "GET /orgs/{org}/migrations/{migration_id}/repositories", + "GET /orgs/{org}/organization-roles/{role_id}/teams", + "GET /orgs/{org}/organization-roles/{role_id}/users", "GET /orgs/{org}/outside_collaborators", "GET /orgs/{org}/packages", "GET /orgs/{org}/packages/{package_type}/{package_name}/versions", @@ -8145,7 +8319,7 @@ __export(dist_src_exports, { module.exports = __toCommonJS(dist_src_exports); // pkg/dist-src/version.js -var VERSION = "10.2.0"; +var VERSION = "10.4.1"; // pkg/dist-src/generated/endpoints.js var Endpoints = { @@ -8272,6 +8446,9 @@ var Endpoints = { "GET /repos/{owner}/{repo}/actions/permissions/selected-actions" ], getArtifact: ["GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}"], + getCustomOidcSubClaimForRepo: [ + "GET /repos/{owner}/{repo}/actions/oidc/customization/sub" + ], getEnvironmentPublicKey: [ "GET /repositories/{repository_id}/environments/{environment_name}/secrets/public-key" ], @@ -8424,6 +8601,9 @@ var Endpoints = { setCustomLabelsForSelfHostedRunnerForRepo: [ "PUT /repos/{owner}/{repo}/actions/runners/{runner_id}/labels" ], + setCustomOidcSubClaimForRepo: [ + "PUT /repos/{owner}/{repo}/actions/oidc/customization/sub" + ], setGithubActionsDefaultWorkflowPermissionsOrganization: [ "PUT /orgs/{org}/actions/permissions/workflow" ], @@ -8493,6 +8673,7 @@ var Endpoints = { listWatchersForRepo: ["GET /repos/{owner}/{repo}/subscribers"], markNotificationsAsRead: ["PUT /notifications"], markRepoNotificationsAsRead: ["PUT /repos/{owner}/{repo}/notifications"], + markThreadAsDone: ["DELETE /notifications/threads/{thread_id}"], markThreadAsRead: ["PATCH /notifications/threads/{thread_id}"], setRepoSubscription: ["PUT /repos/{owner}/{repo}/subscription"], setThreadSubscription: [ @@ -8769,10 +8950,10 @@ var Endpoints = { updateForAuthenticatedUser: ["PATCH /user/codespaces/{codespace_name}"] }, copilot: { - addCopilotForBusinessSeatsForTeams: [ + addCopilotSeatsForTeams: [ "POST /orgs/{org}/copilot/billing/selected_teams" ], - addCopilotForBusinessSeatsForUsers: [ + addCopilotSeatsForUsers: [ "POST /orgs/{org}/copilot/billing/selected_users" ], cancelCopilotSeatAssignmentForTeams: [ @@ -9085,10 +9266,24 @@ var Endpoints = { } ] }, + oidc: { + getOidcCustomSubTemplateForOrg: [ + "GET /orgs/{org}/actions/oidc/customization/sub" + ], + updateOidcCustomSubTemplateForOrg: [ + "PUT /orgs/{org}/actions/oidc/customization/sub" + ] + }, orgs: { addSecurityManagerTeam: [ "PUT /orgs/{org}/security-managers/teams/{team_slug}" ], + assignTeamToOrgRole: [ + "PUT /orgs/{org}/organization-roles/teams/{team_slug}/{role_id}" + ], + assignUserToOrgRole: [ + "PUT /orgs/{org}/organization-roles/users/{username}/{role_id}" + ], blockUser: ["PUT /orgs/{org}/blocks/{username}"], cancelInvitation: ["DELETE /orgs/{org}/invitations/{invitation_id}"], checkBlockedUser: ["GET /orgs/{org}/blocks/{username}"], @@ -9097,6 +9292,7 @@ var Endpoints = { convertMemberToOutsideCollaborator: [ "PUT /orgs/{org}/outside_collaborators/{username}" ], + createCustomOrganizationRole: ["POST /orgs/{org}/organization-roles"], createInvitation: ["POST /orgs/{org}/invitations"], createOrUpdateCustomProperties: ["PATCH /orgs/{org}/properties/schema"], createOrUpdateCustomPropertiesValuesForRepos: [ @@ -9107,6 +9303,9 @@ var Endpoints = { ], createWebhook: ["POST /orgs/{org}/hooks"], delete: ["DELETE /orgs/{org}"], + deleteCustomOrganizationRole: [ + "DELETE /orgs/{org}/organization-roles/{role_id}" + ], deleteWebhook: ["DELETE /orgs/{org}/hooks/{hook_id}"], enableOrDisableSecurityProductOnAllOrgRepos: [ "POST /orgs/{org}/{security_product}/{enablement}" @@ -9118,6 +9317,7 @@ var Endpoints = { ], getMembershipForAuthenticatedUser: ["GET /user/memberships/orgs/{org}"], getMembershipForUser: ["GET /orgs/{org}/memberships/{username}"], + getOrgRole: ["GET /orgs/{org}/organization-roles/{role_id}"], getWebhook: ["GET /orgs/{org}/hooks/{hook_id}"], getWebhookConfigForOrg: ["GET /orgs/{org}/hooks/{hook_id}/config"], getWebhookDelivery: [ @@ -9133,6 +9333,12 @@ var Endpoints = { listInvitationTeams: ["GET /orgs/{org}/invitations/{invitation_id}/teams"], listMembers: ["GET /orgs/{org}/members"], listMembershipsForAuthenticatedUser: ["GET /user/memberships/orgs"], + listOrgRoleTeams: ["GET /orgs/{org}/organization-roles/{role_id}/teams"], + listOrgRoleUsers: ["GET /orgs/{org}/organization-roles/{role_id}/users"], + listOrgRoles: ["GET /orgs/{org}/organization-roles"], + listOrganizationFineGrainedPermissions: [ + "GET /orgs/{org}/organization-fine-grained-permissions" + ], listOutsideCollaborators: ["GET /orgs/{org}/outside_collaborators"], listPatGrantRepositories: [ "GET /orgs/{org}/personal-access-tokens/{pat_id}/repositories" @@ -9147,6 +9353,9 @@ var Endpoints = { listSecurityManagerTeams: ["GET /orgs/{org}/security-managers"], listWebhookDeliveries: ["GET /orgs/{org}/hooks/{hook_id}/deliveries"], listWebhooks: ["GET /orgs/{org}/hooks"], + patchCustomOrganizationRole: [ + "PATCH /orgs/{org}/organization-roles/{role_id}" + ], pingWebhook: ["POST /orgs/{org}/hooks/{hook_id}/pings"], redeliverWebhookDelivery: [ "POST /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}/attempts" @@ -9171,6 +9380,18 @@ var Endpoints = { reviewPatGrantRequestsInBulk: [ "POST /orgs/{org}/personal-access-token-requests" ], + revokeAllOrgRolesTeam: [ + "DELETE /orgs/{org}/organization-roles/teams/{team_slug}" + ], + revokeAllOrgRolesUser: [ + "DELETE /orgs/{org}/organization-roles/users/{username}" + ], + revokeOrgRoleTeam: [ + "DELETE /orgs/{org}/organization-roles/teams/{team_slug}/{role_id}" + ], + revokeOrgRoleUser: [ + "DELETE /orgs/{org}/organization-roles/users/{username}/{role_id}" + ], setMembershipForUser: ["PUT /orgs/{org}/memberships/{username}"], setPublicMembershipForAuthenticatedUser: [ "PUT /orgs/{org}/public_members/{username}" @@ -9461,6 +9682,9 @@ var Endpoints = { {}, { mapToData: "users" } ], + cancelPagesDeployment: [ + "POST /repos/{owner}/{repo}/pages/deployments/{pages_deployment_id}/cancel" + ], checkAutomatedSecurityFixes: [ "GET /repos/{owner}/{repo}/automated-security-fixes" ], @@ -9496,12 +9720,15 @@ var Endpoints = { createForAuthenticatedUser: ["POST /user/repos"], createFork: ["POST /repos/{owner}/{repo}/forks"], createInOrg: ["POST /orgs/{org}/repos"], + createOrUpdateCustomPropertiesValues: [ + "PATCH /repos/{owner}/{repo}/properties/values" + ], createOrUpdateEnvironment: [ "PUT /repos/{owner}/{repo}/environments/{environment_name}" ], createOrUpdateFileContents: ["PUT /repos/{owner}/{repo}/contents/{path}"], createOrgRuleset: ["POST /orgs/{org}/rulesets"], - createPagesDeployment: ["POST /repos/{owner}/{repo}/pages/deployment"], + createPagesDeployment: ["POST /repos/{owner}/{repo}/pages/deployments"], createPagesSite: ["POST /repos/{owner}/{repo}/pages"], createRelease: ["POST /repos/{owner}/{repo}/releases"], createRepoRuleset: ["POST /repos/{owner}/{repo}/rulesets"], @@ -9654,6 +9881,9 @@ var Endpoints = { getOrgRulesets: ["GET /orgs/{org}/rulesets"], getPages: ["GET /repos/{owner}/{repo}/pages"], getPagesBuild: ["GET /repos/{owner}/{repo}/pages/builds/{build_id}"], + getPagesDeployment: [ + "GET /repos/{owner}/{repo}/pages/deployments/{pages_deployment_id}" + ], getPagesHealthCheck: ["GET /repos/{owner}/{repo}/pages/health"], getParticipationStats: ["GET /repos/{owner}/{repo}/stats/participation"], getPullRequestReviewProtection: [ @@ -9864,6 +10094,9 @@ var Endpoints = { ] }, securityAdvisories: { + createFork: [ + "POST /repos/{owner}/{repo}/security-advisories/{ghsa_id}/forks" + ], createPrivateVulnerabilityReport: [ "POST /repos/{owner}/{repo}/security-advisories/reports" ], @@ -10287,7 +10520,7 @@ var RequestError = class extends Error { if (options.request.headers.authorization) { requestCopy.headers = Object.assign({}, options.request.headers, { authorization: options.request.headers.authorization.replace( - / .*$/, + /(?]+)>; rel="deprecation"/); + const matches = headers.link && headers.link.match(/<([^<>]+)>; rel="deprecation"/); const deprecationLink = matches && matches.pop(); log.warn( `[@octokit/request] "${requestOptions.method} ${requestOptions.url}" is deprecated. It is scheduled to be removed on ${headers.sunset}${deprecationLink ? `. See ${deprecationLink}` : ""}` @@ -10499,11 +10733,17 @@ async function getResponseData(response) { function toErrorMessage(data) { if (typeof data === "string") return data; + let suffix; + if ("documentation_url" in data) { + suffix = ` - ${data.documentation_url}`; + } else { + suffix = ""; + } if ("message" in data) { if (Array.isArray(data.errors)) { - return `${data.message}: ${data.errors.map(JSON.stringify).join(", ")}`; + return `${data.message}: ${data.errors.map(JSON.stringify).join(", ")}${suffix}`; } - return data.message; + return `${data.message}${suffix}`; } return `Unknown error: ${JSON.stringify(data)}`; } @@ -27647,6 +27887,7 @@ module.exports = { // Replace globs with equivalent patterns to reduce parsing time. REPLACEMENTS: { + __proto__: null, '***': '*', '**/**': '**', '**/**/**': '**' @@ -30081,8 +30322,11 @@ function runParallel (tasks, cb) { /***/ 2560: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { -;(function (sax) { // wrapper for non-node envs - sax.parser = function (strict, opt) { return new SAXParser(strict, opt) } +;(function (sax) { + // wrapper for non-node envs + sax.parser = function (strict, opt) { + return new SAXParser(strict, opt) + } sax.SAXParser = SAXParser sax.SAXStream = SAXStream sax.createStream = createStream @@ -30099,9 +30343,18 @@ function runParallel (tasks, cb) { sax.MAX_BUFFER_LENGTH = 64 * 1024 var buffers = [ - 'comment', 'sgmlDecl', 'textNode', 'tagName', 'doctype', - 'procInstName', 'procInstBody', 'entity', 'attribName', - 'attribValue', 'cdata', 'script' + 'comment', + 'sgmlDecl', + 'textNode', + 'tagName', + 'doctype', + 'procInstName', + 'procInstBody', + 'entity', + 'attribName', + 'attribValue', + 'cdata', + 'script', ] sax.EVENTS = [ @@ -30122,10 +30375,10 @@ function runParallel (tasks, cb) { 'ready', 'script', 'opennamespace', - 'closenamespace' + 'closenamespace', ] - function SAXParser (strict, opt) { + function SAXParser(strict, opt) { if (!(this instanceof SAXParser)) { return new SAXParser(strict, opt) } @@ -30144,7 +30397,10 @@ function runParallel (tasks, cb) { parser.noscript = !!(strict || parser.opt.noscript) parser.state = S.BEGIN parser.strictEntities = parser.opt.strictEntities - parser.ENTITIES = parser.strictEntities ? Object.create(sax.XML_ENTITIES) : Object.create(sax.ENTITIES) + parser.ENTITIES = + parser.strictEntities ? + Object.create(sax.XML_ENTITIES) + : Object.create(sax.ENTITIES) parser.attribList = [] // namespaces form a prototype chain. @@ -30154,6 +30410,12 @@ function runParallel (tasks, cb) { parser.ns = Object.create(rootNS) } + // disallow unquoted attribute values if not otherwise configured + // and strict mode is true + if (parser.opt.unquotedAttributeValues === undefined) { + parser.opt.unquotedAttributeValues = !strict + } + // mostly just for error reporting parser.trackPosition = parser.opt.position !== false if (parser.trackPosition) { @@ -30164,7 +30426,7 @@ function runParallel (tasks, cb) { if (!Object.create) { Object.create = function (o) { - function F () {} + function F() {} F.prototype = o var newf = new F() return newf @@ -30179,7 +30441,7 @@ function runParallel (tasks, cb) { } } - function checkBufferLength (parser) { + function checkBufferLength(parser) { var maxAllowed = Math.max(sax.MAX_BUFFER_LENGTH, 10) var maxActual = 0 for (var i = 0, l = buffers.length; i < l; i++) { @@ -30215,13 +30477,13 @@ function runParallel (tasks, cb) { parser.bufferCheckPosition = m + parser.position } - function clearBuffers (parser) { + function clearBuffers(parser) { for (var i = 0, l = buffers.length; i < l; i++) { parser[buffers[i]] = '' } } - function flushBuffers (parser) { + function flushBuffers(parser) { closeText(parser) if (parser.cdata !== '') { emitNode(parser, 'oncdata', parser.cdata) @@ -30234,11 +30496,20 @@ function runParallel (tasks, cb) { } SAXParser.prototype = { - end: function () { end(this) }, + end: function () { + end(this) + }, write: write, - resume: function () { this.error = null; return this }, - close: function () { return this.write(null) }, - flush: function () { flushBuffers(this) } + resume: function () { + this.error = null + return this + }, + close: function () { + return this.write(null) + }, + flush: function () { + flushBuffers(this) + }, } var Stream @@ -30247,16 +30518,17 @@ function runParallel (tasks, cb) { } catch (ex) { Stream = function () {} } + if (!Stream) Stream = function () {} var streamWraps = sax.EVENTS.filter(function (ev) { return ev !== 'error' && ev !== 'end' }) - function createStream (strict, opt) { + function createStream(strict, opt) { return new SAXStream(strict, opt) } - function SAXStream (strict, opt) { + function SAXStream(strict, opt) { if (!(this instanceof SAXStream)) { return new SAXStream(strict, opt) } @@ -30297,21 +30569,23 @@ function runParallel (tasks, cb) { me.on(ev, h) }, enumerable: true, - configurable: false + configurable: false, }) }) } SAXStream.prototype = Object.create(Stream.prototype, { constructor: { - value: SAXStream - } + value: SAXStream, + }, }) SAXStream.prototype.write = function (data) { - if (typeof Buffer === 'function' && + if ( + typeof Buffer === 'function' && typeof Buffer.isBuffer === 'function' && - Buffer.isBuffer(data)) { + Buffer.isBuffer(data) + ) { if (!this._decoder) { var SD = (__nccwpck_require__(3193).StringDecoder) this._decoder = new SD('utf8') @@ -30336,7 +30610,10 @@ function runParallel (tasks, cb) { var me = this if (!me._parser['on' + ev] && streamWraps.indexOf(ev) !== -1) { me._parser['on' + ev] = function () { - var args = arguments.length === 1 ? [arguments[0]] : Array.apply(null, arguments) + var args = + arguments.length === 1 ? + [arguments[0]] + : Array.apply(null, arguments) args.splice(0, 0, ev) me.emit.apply(me, args) } @@ -30359,30 +30636,34 @@ function runParallel (tasks, cb) { // without a significant breaking change to either this parser, or the // JavaScript language. Implementation of an emoji-capable xml parser // is left as an exercise for the reader. - var nameStart = /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/ + var nameStart = + /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/ - var nameBody = /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040.\d-]/ + var nameBody = + /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040.\d-]/ - var entityStart = /[#:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/ - var entityBody = /[#:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040.\d-]/ + var entityStart = + /[#:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/ + var entityBody = + /[#:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040.\d-]/ - function isWhitespace (c) { + function isWhitespace(c) { return c === ' ' || c === '\n' || c === '\r' || c === '\t' } - function isQuote (c) { - return c === '"' || c === '\'' + function isQuote(c) { + return c === '"' || c === "'" } - function isAttribEnd (c) { + function isAttribEnd(c) { return c === '>' || isWhitespace(c) } - function isMatch (regex, c) { + function isMatch(regex, c) { return regex.test(c) } - function notMatch (regex, c) { + function notMatch(regex, c) { return !isMatch(regex, c) } @@ -30423,271 +30704,271 @@ function runParallel (tasks, cb) { CLOSE_TAG: S++, // SCRIPT: S++, //