You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pulsar.apache.org by lh...@apache.org on 2022/03/23 03:51:39 UTC

[pulsar-test-infra] 02/02: Add copy of dorny/test-reporter@v1 action

This is an automated email from the ASF dual-hosted git repository.

lhotari pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/pulsar-test-infra.git

commit 89acb76689a5432a1213532026f00584946284bb
Author: Lari Hotari <la...@hotari.net>
AuthorDate: Wed Mar 23 05:48:19 2022 +0200

    Add copy of dorny/test-reporter@v1 action
    
    from https://github.com/dorny/test-reporter hash 0d00bb1
---
 test-reporter/.editorconfig                        |    10 +
 test-reporter/.eslintignore                        |     3 +
 test-reporter/.eslintrc.json                       |    57 +
 test-reporter/.gitattributes                       |     2 +
 test-reporter/.github/workflows/ci.yml             |    36 +
 test-reporter/.github/workflows/test-report.yml    |    20 +
 test-reporter/.gitignore                           |   102 +
 test-reporter/.prettierignore                      |     5 +
 test-reporter/.prettierrc.json                     |    10 +
 test-reporter/.vscode/launch.json                  |    35 +
 test-reporter/CHANGELOG.md                         |    44 +
 test-reporter/LICENSE                              |    22 +
 test-reporter/README.md                            |   321 +
 test-reporter/__tests__/__outputs__/dart-json.md   |    28 +
 test-reporter/__tests__/__outputs__/dotnet-trx.md  |    31 +
 .../__outputs__/fluent-validation-test-results.md  |  1057 +
 test-reporter/__tests__/__outputs__/jest-junit.md  |    26 +
 .../__tests__/__outputs__/jest-test-results.md     |   432 +
 test-reporter/__tests__/__outputs__/mocha-json.md  |    29 +
 .../__tests__/__outputs__/mocha-test-results.md    |    41 +
 .../__tests__/__outputs__/provider-test-results.md |   374 +
 .../__outputs__/pulsar-test-results-no-merge.md    |    12 +
 .../__tests__/__outputs__/pulsar-test-results.md   |  1518 +
 .../__outputs__/silent-notes-test-results.md       |   136 +
 .../__tests__/__snapshots__/dart-json.test.ts.snap |  2052 ++
 .../__snapshots__/dotnet-trx.test.ts.snap          |  6271 ++++
 .../__snapshots__/java-junit.test.ts.snap          |  6880 ++++
 .../__snapshots__/jest-junit.test.ts.snap          | 32220 ++++++++++++++++++
 .../__snapshots__/mocha-json.test.ts.snap          |  7587 +++++
 test-reporter/__tests__/dart-json.test.ts          |    69 +
 test-reporter/__tests__/dotnet-trx.test.ts         |    86 +
 test-reporter/__tests__/fixtures/dart-json.json    |    32 +
 test-reporter/__tests__/fixtures/dotnet-trx.trx    |   184 +
 .../__tests__/fixtures/empty/dart-json.json        |     9 +
 .../__tests__/fixtures/empty/dotnet-trx.trx        |    19 +
 .../__tests__/fixtures/empty/java-junit.xml        |     3 +
 .../__tests__/fixtures/empty/jest-junit.xml        |     3 +
 .../__tests__/fixtures/empty/mocha-json.json       |    16 +
 .../fixtures/external/FluentValidation.Tests.trx   |  4662 +++
 .../__tests__/fixtures/external/SilentNotes.trx    |   609 +
 .../__tests__/fixtures/external/flutter/files.txt  |    57 +
 .../external/flutter/provider-test-results.json    |   637 +
 ...rg.apache.pulsar.AddMissingPatchVersionTest.xml |    34 +
 .../__tests__/fixtures/external/java/files.txt     |  5873 ++++
 .../fixtures/external/java/pulsar-test-report.xml  |   862 +
 .../__tests__/fixtures/external/jest/files.txt     |  2317 ++
 .../fixtures/external/jest/jest-test-results.xml   |  9357 ++++++
 .../__tests__/fixtures/external/mocha/files.txt    |   516 +
 .../external/mocha/mocha-test-results.json         | 15097 +++++++++
 test-reporter/__tests__/fixtures/jest-junit.xml    |    61 +
 test-reporter/__tests__/fixtures/mocha-json.json   |   158 +
 test-reporter/__tests__/java-junit.test.ts         |    75 +
 test-reporter/__tests__/jest-junit.test.ts         |    69 +
 test-reporter/__tests__/mocha-json.test.ts         |    67 +
 test-reporter/__tests__/utils/parse-utils.test.ts  |    37 +
 test-reporter/action.yml                           |    93 +
 test-reporter/assets/fluent-validation-report.png  |   Bin 0 -> 58858 bytes
 test-reporter/assets/mocha-groups.png              |   Bin 0 -> 42308 bytes
 test-reporter/assets/provider-error-details.png    |   Bin 0 -> 53949 bytes
 test-reporter/assets/provider-error-summary.png    |   Bin 0 -> 67397 bytes
 test-reporter/dist/index.js                        | 32687 +++++++++++++++++++
 test-reporter/dist/index.js.map                    |     1 +
 test-reporter/dist/licenses.txt                    |  1532 +
 test-reporter/dist/sourcemap-register.js           |     1 +
 test-reporter/jest.config.js                       |    11 +
 test-reporter/package-lock.json                    | 11080 +++++++
 test-reporter/package.json                         |    75 +
 test-reporter/reports/dart/.gitignore              |     9 +
 test-reporter/reports/dart/analysis_options.yaml   |    14 +
 test-reporter/reports/dart/lib/main.dart           |     3 +
 test-reporter/reports/dart/pubspec.lock            |   348 +
 test-reporter/reports/dart/pubspec.yaml            |     9 +
 test-reporter/reports/dart/test/main_test.dart     |    29 +
 test-reporter/reports/dart/test/second_test.dart   |    12 +
 test-reporter/reports/dotnet/.gitignore            |   362 +
 .../reports/dotnet/DotnetTests.Unit/Calculator.cs  |    11 +
 .../DotnetTests.Unit/DotnetTests.Unit.csproj       |     7 +
 .../DotnetTests.XUnitTests/CalculatorTests.cs      |    70 +
 .../DotnetTests.XUnitTests.csproj                  |    20 +
 test-reporter/reports/dotnet/DotnetTests.sln       |    36 +
 test-reporter/reports/jest/__tests__/main.test.js  |    23 +
 .../reports/jest/__tests__/second.test.js          |     7 +
 test-reporter/reports/jest/lib/main.js             |     5 +
 test-reporter/reports/jest/package-lock.json       |  4728 +++
 test-reporter/reports/jest/package.json            |    25 +
 test-reporter/reports/mocha/lib/main.js            |     5 +
 test-reporter/reports/mocha/package-lock.json      |   761 +
 test-reporter/reports/mocha/package.json           |    14 +
 test-reporter/reports/mocha/test/main.test.js      |    24 +
 test-reporter/reports/mocha/test/second.test.js    |     8 +
 .../src/input-providers/artifact-provider.ts       |   108 +
 .../src/input-providers/input-provider.ts          |    13 +
 .../src/input-providers/local-file-provider.ts     |    25 +
 test-reporter/src/main.ts                          |   219 +
 .../src/parsers/dart-json/dart-json-parser.ts      |   251 +
 .../src/parsers/dart-json/dart-json-types.ts       |   132 +
 .../src/parsers/dotnet-trx/dotnet-trx-parser.ts    |   196 +
 .../src/parsers/dotnet-trx/dotnet-trx-types.ts     |    60 +
 .../src/parsers/java-junit/java-junit-parser.ts    |   206 +
 .../src/parsers/java-junit/java-junit-types.ts     |    45 +
 .../src/parsers/jest-junit/jest-junit-parser.ts    |   117 +
 .../src/parsers/jest-junit/jest-junit-types.ts     |    34 +
 .../src/parsers/mocha-json/mocha-json-parser.ts    |   118 +
 .../src/parsers/mocha-json/mocha-json-types.ts     |    23 +
 test-reporter/src/report/get-annotations.ts        |   107 +
 test-reporter/src/report/get-report.ts             |   272 +
 test-reporter/src/test-parser.ts                   |    11 +
 test-reporter/src/test-results.ts                  |   123 +
 test-reporter/src/utils/exec.ts                    |    21 +
 test-reporter/src/utils/git.ts                     |    22 +
 test-reporter/src/utils/github-utils.ts            |   130 +
 test-reporter/src/utils/markdown-utils.ts          |    48 +
 test-reporter/src/utils/node-utils.ts              |    30 +
 test-reporter/src/utils/parse-utils.ts             |    24 +
 test-reporter/src/utils/path-utils.ts              |    39 +
 test-reporter/src/utils/slugger.ts                 |    14 +
 test-reporter/tsconfig.json                        |    13 +
 117 files changed, 154681 insertions(+)

diff --git a/test-reporter/.editorconfig b/test-reporter/.editorconfig
new file mode 100644
index 0000000..ba48812
--- /dev/null
+++ b/test-reporter/.editorconfig
@@ -0,0 +1,10 @@
+root = true
+
+[*]
+charset = utf-8
+indent_style = space
+indent_size = 2
+insert_final_newline = true
+
+[*.cs]
+indent_size = 4
diff --git a/test-reporter/.eslintignore b/test-reporter/.eslintignore
new file mode 100644
index 0000000..2186947
--- /dev/null
+++ b/test-reporter/.eslintignore
@@ -0,0 +1,3 @@
+dist/
+lib/
+node_modules/
\ No newline at end of file
diff --git a/test-reporter/.eslintrc.json b/test-reporter/.eslintrc.json
new file mode 100644
index 0000000..5e93274
--- /dev/null
+++ b/test-reporter/.eslintrc.json
@@ -0,0 +1,57 @@
+{
+    "plugins": ["jest", "@typescript-eslint"],
+    "extends": ["plugin:github/recommended"],
+    "parser": "@typescript-eslint/parser",
+    "parserOptions": {
+      "ecmaVersion": 9,
+      "sourceType": "module",
+      "project": "./tsconfig.json"
+    },
+    "rules": {
+      "camelcase": "off",
+      "eslint-comments/no-use": "off",
+      "import/no-namespace": "off",
+      "no-shadow": "off",
+      "no-unused-vars": "off",
+      "prefer-template": "off",
+      "semi": [ "error", "never"],
+      "@typescript-eslint/explicit-member-accessibility": ["error", {"accessibility": "no-public"}],
+      "@typescript-eslint/array-type": "error",
+      "@typescript-eslint/await-thenable": "error",
+      "@typescript-eslint/ban-ts-comment": "error",
+      "@typescript-eslint/consistent-type-assertions": "error",
+      "@typescript-eslint/explicit-function-return-type": ["error", {"allowExpressions": true}],
+      "@typescript-eslint/func-call-spacing": ["error", "never"],
+      "@typescript-eslint/no-array-constructor": "error",
+      "@typescript-eslint/no-empty-interface": "error",
+      "@typescript-eslint/no-explicit-any": "error",
+      "@typescript-eslint/no-extraneous-class": "error",
+      "@typescript-eslint/no-for-in-array": "error",
+      "@typescript-eslint/no-inferrable-types": "error",
+      "@typescript-eslint/no-misused-new": "error",
+      "@typescript-eslint/no-namespace": "error",
+      "@typescript-eslint/no-require-imports": "error",
+      "@typescript-eslint/no-shadow": "error",
+      "@typescript-eslint/no-non-null-assertion": "warn",
+      "@typescript-eslint/no-unnecessary-qualifier": "error",
+      "@typescript-eslint/no-unnecessary-type-assertion": "error",
+      "@typescript-eslint/no-unused-vars": ["error", {"varsIgnorePattern": "^_"}],
+      "@typescript-eslint/no-useless-constructor": "error",
+      "@typescript-eslint/no-var-requires": "error",
+      "@typescript-eslint/prefer-for-of": "warn",
+      "@typescript-eslint/prefer-function-type": "warn",
+      "@typescript-eslint/prefer-includes": "error",
+      "@typescript-eslint/prefer-string-starts-ends-with": "error",
+      "@typescript-eslint/promise-function-async": "error",
+      "@typescript-eslint/require-array-sort-compare": "error",
+      "@typescript-eslint/restrict-plus-operands": "error",
+      "@typescript-eslint/semi": ["error", "never"],
+      "@typescript-eslint/type-annotation-spacing": "error",
+      "@typescript-eslint/unbound-method": "error"
+    },
+    "env": {
+      "node": true,
+      "es6": true,
+      "jest/globals": true
+    }
+  }
diff --git a/test-reporter/.gitattributes b/test-reporter/.gitattributes
new file mode 100644
index 0000000..00f4c25
--- /dev/null
+++ b/test-reporter/.gitattributes
@@ -0,0 +1,2 @@
+* text=auto eol=lf
+dist/** -diff linguist-generated=true
diff --git a/test-reporter/.github/workflows/ci.yml b/test-reporter/.github/workflows/ci.yml
new file mode 100644
index 0000000..57144fc
--- /dev/null
+++ b/test-reporter/.github/workflows/ci.yml
@@ -0,0 +1,36 @@
+name: 'CI'
+on:
+  pull_request:
+    paths-ignore: [ '**.md' ]
+  push:
+    paths-ignore: [ '**.md' ]
+    branches:
+      - main
+  workflow_dispatch:
+
+jobs:
+  build-test:
+    name: Build & Test
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v2
+      - run: npm ci
+      - run: npm run build
+      - run: npm run format-check
+      - run: npm run lint
+      - run: npm test
+
+      - name: Upload test results
+        if: success() || failure()
+        uses: actions/upload-artifact@v2
+        with:
+          name: test-results
+          path: __tests__/__results__/*.xml
+
+      - name: Create test report
+        uses: ./
+        if: success() || failure()
+        with:
+          name: JEST Tests
+          path: __tests__/__results__/*.xml
+          reporter: jest-junit
diff --git a/test-reporter/.github/workflows/test-report.yml b/test-reporter/.github/workflows/test-report.yml
new file mode 100644
index 0000000..1cf8442
--- /dev/null
+++ b/test-reporter/.github/workflows/test-report.yml
@@ -0,0 +1,20 @@
+name: Test Report
+
+on:
+  workflow_run:
+    workflows: ['CI']
+    types:
+      - completed
+
+jobs:
+  report:
+    name: Workflow test
+    runs-on: ubuntu-latest
+    steps:
+    - uses: actions/checkout@v2
+    - uses: ./
+      with:
+        artifact: test-results
+        name: Workflow Report
+        path: '*.xml'
+        reporter: jest-junit
diff --git a/test-reporter/.gitignore b/test-reporter/.gitignore
new file mode 100644
index 0000000..639696a
--- /dev/null
+++ b/test-reporter/.gitignore
@@ -0,0 +1,102 @@
+# Dependency directory
+node_modules
+
+# Rest pulled from https://github.com/github/gitignore/blob/master/Node.gitignore
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+lerna-debug.log*
+
+# Diagnostic reports (https://nodejs.org/api/report.html)
+report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
+
+# Runtime data
+pids
+*.pid
+*.seed
+*.pid.lock
+
+# Directory for instrumented libs generated by jscoverage/JSCover
+lib-cov
+
+# Coverage directory used by tools like istanbul
+coverage
+*.lcov
+
+# nyc test coverage
+.nyc_output
+
+# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
+.grunt
+
+# Bower dependency directory (https://bower.io/)
+bower_components
+
+# node-waf configuration
+.lock-wscript
+
+# Compiled binary addons (https://nodejs.org/api/addons.html)
+build/Release
+
+# Dependency directories
+jspm_packages/
+
+# TypeScript v1 declaration files
+typings/
+
+# TypeScript cache
+*.tsbuildinfo
+
+# Optional npm cache directory
+.npm
+
+# Optional eslint cache
+.eslintcache
+
+# Optional REPL history
+.node_repl_history
+
+# Output of 'npm pack'
+*.tgz
+
+# Yarn Integrity file
+.yarn-integrity
+
+# dotenv environment variables file
+.env
+.env.test
+
+# parcel-bundler cache (https://parceljs.org/)
+.cache
+
+# next.js build output
+.next
+
+# nuxt.js build output
+.nuxt
+
+# vuepress build output
+.vuepress/dist
+
+# Serverless directories
+.serverless/
+
+# FuseBox cache
+.fusebox/
+
+# DynamoDB Local files
+.dynamodb/
+
+# OS metadata
+.DS_Store
+Thumbs.db
+
+# Ignore built ts files
+__tests__/runner/*
+lib/**/*
+
+# Project specific
+__tests__/__results__
diff --git a/test-reporter/.prettierignore b/test-reporter/.prettierignore
new file mode 100644
index 0000000..481914d
--- /dev/null
+++ b/test-reporter/.prettierignore
@@ -0,0 +1,5 @@
+dist/
+lib/
+node_modules/
+__tests__/__outputs__
+__tests__/__snapshots__
diff --git a/test-reporter/.prettierrc.json b/test-reporter/.prettierrc.json
new file mode 100644
index 0000000..e93a59d
--- /dev/null
+++ b/test-reporter/.prettierrc.json
@@ -0,0 +1,10 @@
+{
+  "printWidth": 120,
+  "tabWidth": 2,
+  "useTabs": false,
+  "semi": false,
+  "singleQuote": true,
+  "trailingComma": "none",
+  "bracketSpacing": false,
+  "arrowParens": "avoid"
+}
diff --git a/test-reporter/.vscode/launch.json b/test-reporter/.vscode/launch.json
new file mode 100644
index 0000000..19fe8b0
--- /dev/null
+++ b/test-reporter/.vscode/launch.json
@@ -0,0 +1,35 @@
+{
+  "version": "0.2.0",
+  "configurations": [
+    {
+      "type": "node",
+      "request": "launch",
+      "name": "Jest All",
+      "program": "${workspaceFolder}/node_modules/.bin/jest",
+      "args": ["--runInBand"],
+      "console": "integratedTerminal",
+      "internalConsoleOptions": "neverOpen",
+      "disableOptimisticBPs": true,
+      "windows": {
+        "program": "${workspaceFolder}/node_modules/jest/bin/jest",
+      }
+    },
+    {
+      "type": "node",
+      "request": "launch",
+      "name": "Jest Current File",
+      "program": "${workspaceFolder}/node_modules/.bin/jest",
+      "args": [
+        "${fileBasenameNoExtension}",
+        "--config",
+        "jest.config.js"
+      ],
+      "console": "integratedTerminal",
+      "internalConsoleOptions": "neverOpen",
+      "disableOptimisticBPs": true,
+      "windows": {
+        "program": "${workspaceFolder}/node_modules/jest/bin/jest",
+      }
+    }
+  ]
+}
diff --git a/test-reporter/CHANGELOG.md b/test-reporter/CHANGELOG.md
new file mode 100644
index 0000000..bb12289
--- /dev/null
+++ b/test-reporter/CHANGELOG.md
@@ -0,0 +1,44 @@
+# Changelog
+
+## v1.5.0
+- [Add option to convert backslashes in path pattern to forward slashes](https://github.com/dorny/test-reporter/pull/128)
+- [Add option to generate only the summary from processed test results files](https://github.com/dorny/test-reporter/pull/123)
+
+## v1.4.3
+- [Patch java-junit to handle missing time field](https://github.com/dorny/test-reporter/pull/115)
+- [Fix dart-json parsing broken by print message](https://github.com/dorny/test-reporter/pull/114)
+
+## v1.4.2
+- [Fix dotnet-trx parsing of passed tests with non-empty error info](https://github.com/dorny/test-reporter/commit/43d89d5ee509bcef7bd0287aacc0c4a4fb9c1657)
+
+## v1.4.1
+- [Fix dotnet-trx parsing of tests with custom display names](https://github.com/dorny/test-reporter/pull/105)
+
+## v1.4.0
+- [Add support for mocha-json](https://github.com/dorny/test-reporter/pull/90)
+- [Use full URL to fix navigation from summary to suite details](https://github.com/dorny/test-reporter/pull/89)
+- [New report rendering with code blocks instead of tables](https://github.com/dorny/test-reporter/pull/88)
+- [Improve test error messages from flutter](https://github.com/dorny/test-reporter/pull/87)
+
+## v1.3.1
+- [Fix: parsing of .NET duration string without milliseconds](https://github.com/dorny/test-reporter/pull/84)
+- [Fix: dart-json - remove group name from test case names](https://github.com/dorny/test-reporter/pull/85)
+- [Fix: net-trx parser crashing on missing duration attribute](https://github.com/dorny/test-reporter/pull/86)
+
+## v1.3.0
+- [Add support for java-junit](https://github.com/dorny/test-reporter/pull/80)
+- [Fix: Handle test reports with no test cases](https://github.com/dorny/test-reporter/pull/70)
+- [Fix: Reduce number of API calls to get list of files tracked by GitHub](https://github.com/dorny/test-reporter/pull/69)
+
+## v1.2.0
+- [Set `listTests` and `listSuites` to lower detail if report is too big](https://github.com/dorny/test-reporter/pull/60)
+
+## v1.1.0
+- [Support public repo PR workflow](https://github.com/dorny/test-reporter/pull/56)
+
+## v1.0.0
+Supported languages / frameworks:
+- .NET / xUnit / NUnit / MSTest
+- Dart / test
+- Flutter / test
+- JavaScript / JEST
diff --git a/test-reporter/LICENSE b/test-reporter/LICENSE
new file mode 100644
index 0000000..4f87bd8
--- /dev/null
+++ b/test-reporter/LICENSE
@@ -0,0 +1,22 @@
+
+The MIT License (MIT)
+
+Copyright (c) 2021 Michal Dorner and contributors
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/test-reporter/README.md b/test-reporter/README.md
new file mode 100644
index 0000000..a2d2d4a
--- /dev/null
+++ b/test-reporter/README.md
@@ -0,0 +1,321 @@
+# Test Reporter
+
+This [Github Action](https://github.com/features/actions) displays test results from popular testing frameworks directly in GitHub.
+
+✔️ Parses test results in XML or JSON format and creates nice report as Github Check Run
+
+✔️ Annotates code where it failed based on message and stack trace captured during test execution
+
+✔️ 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)|
+|:--:|:--:|:--:|:--:|
+
+**Supported languages / frameworks:**
+- .NET / [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)
+- Java / [JUnit](https://junit.org/)
+- JavaScript / [JEST](https://jestjs.io/) / [Mocha](https://mochajs.org/)
+
+For more information see [Supported formats](#supported-formats) section.
+
+Do you miss support for your favorite language or framework?
+Please create [Issue](https://github.com/dorny/test-reporter/issues/new) or contribute with PR.
+
+## Example
+
+Following setup does not work in workflows triggered by pull request from forked repository.
+If that's fine for you, using this action is as simple as:
+
+```yaml
+on:
+  pull_request:
+  push:
+jobs:
+  build-test:
+    name: Build & Test
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v2     # checkout the repo
+      - run: npm ci                   # install packages
+      - run: npm test                 # run tests (configured to use jest-junit reporter)
+
+      - name: Test Report
+        uses: dorny/test-reporter@v1
+        if: success() || failure()    # 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
+          reporter: jest-junit        # Format of test results
+```
+
+## Recommended setup for public repositories
+
+Workflows triggered by pull requests from forked repositories are executed with read-only token and therefore can't create check runs.
+To workaround this security restriction, it's required to use two separate workflows:
+1. `CI` runs in the context of the PR head branch with the read-only token. It executes the tests and uploads test results as a build artifact
+2. `Test Report` runs in the context of the repository main branch with read/write token. It will download test results and create reports
+
+**PR head branch:**  *.github/workflows/ci.yml*
+```yaml
+name: 'CI'
+on:
+  pull_request:
+jobs:
+  build-test:
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v2         # checkout the repo
+      - run: npm ci                       # install packages
+      - run: npm test                     # run tests (configured to use jest-junit reporter)
+      - uses: actions/upload-artifact@v2  # upload test results
+        if: success() || failure()        # run this step even if previous step failed
+        with:
+          name: test-results
+          path: jest-junit.xml
+```
+**default branch:**  *.github/workflows/test-report.yml*
+```yaml
+name: 'Test Report'
+on:
+  workflow_run:
+    workflows: ['CI']                     # runs after CI workflow
+    types:
+      - completed
+jobs:
+  report:
+    runs-on: ubuntu-latest
+    steps:
+    - uses: dorny/test-reporter@v1
+      with:
+        artifact: test-results            # artifact name
+        name: JEST Tests                  # Name of the check run which will be created
+        path: '*.xml'                     # Path to test results (inside artifact .zip)
+        reporter: jest-junit              # Format of test results
+```
+
+## Usage
+
+```yaml
+- uses: dorny/test-reporter@v1
+  with:
+
+    # Name or regex of artifact containing test results
+    # Regular expression must be enclosed in '/'.
+    # Values from captured groups will replace occurrences of $N in report name.
+    # Example:
+    #   artifact: /test-results-(.*)/
+    #   name: 'Test report $1'
+    #   -> Artifact 'test-result-ubuntu' would create report 'Test report ubuntu'
+    artifact: ''
+
+    # Name of the Check Run which will be created
+    name: ''
+
+    # Coma separated list of paths to test results
+    # Supports wildcards via [fast-glob](https://github.com/mrmlnc/fast-glob)
+    # All matched result files must be of the same format
+    path: ''
+
+    # The fast-glob library that is internally used interprets backslashes as escape characters.
+    # If enabled, all backslashes in provided path will be replaced by forward slashes and act as directory separators.
+    # It might be useful when path input variable is composed dynamically from existing directory paths on Windows.
+    path-replace-backslashes: 'false'
+
+    # Format of test results. Supported options:
+    #   dart-json
+    #   dotnet-trx
+    #   flutter-json
+    #   java-junit
+    #   jest-junit
+    #   mocha-json
+    reporter: ''
+
+    # Allows you to generate only the summary.
+    # If enabled, the report will contain a table listing each test results file and the number of passed, failed, and skipped tests.
+    # Detailed listing of test suites and test cases will be skipped.
+    only-summary: 'false'
+
+    # Limits which test suites are listed:
+    #   all
+    #   failed
+    list-suites: 'all'
+
+    # Limits which test cases are listed:
+    #   all
+    #   failed
+    #   none
+    list-tests: 'all'
+
+    # Limits number of created annotations with error message and stack trace captured during test execution.
+    # Must be less or equal to 50.
+    max-annotations: '10'
+
+    # Set action as failed if test report contains any failed test
+    fail-on-error: 'true'
+
+    # Relative path under $GITHUB_WORKSPACE where the repository was checked out.
+    working-directory: ''
+
+    # Personal access token used to interact with Github API
+    # Default: ${{ github.token }}
+    token: ''
+```
+
+## Output parameters
+| Name       | Description              |
+| :--        | :--                      |
+| conclusion | `success` or `failure`   |
+| passed     | Count of passed tests    |
+| failed     | Count of failed tests    |
+| skipped    | Count of skipped tests   |
+| time       | Test execution time [ms] |
+
+## Supported formats
+
+<details>
+  <summary>dart-json</summary>
+
+Test run must be configured to use [JSON](https://github.com/dart-lang/test/blob/master/pkgs/test/doc/configuration.md#reporter) reporter.
+You can configure it in `dart_test.yaml`:
+
+```yml
+file_reporters:
+  json: reports/test-results.json
+```
+
+Or with CLI arguments:
+
+[`dart test --file-reporter="json:test-results.json"`](https://pub.dev/packages/test)
+
+For more information see:
+- [test package](https://pub.dev/packages/test)
+- [test configuration](https://github.com/dart-lang/test/blob/master/pkgs/test/doc/configuration.md)
+</details>
+
+<details>
+  <summary>dotnet-trx</summary>
+
+Test execution must be configured to produce *Visual Studio Test Results* files (TRX).
+To get test results in TRX format you can execute your tests with CLI arguments:
+
+`dotnet test --logger "trx;LogFileName=test-results.trx"`
+
+Or you can configure TRX test output in `*.csproj` or `Directory.Build.props`:
+```xml
+<PropertyGroup>
+  <VSTestLogger>trx%3bLogFileName=$(MSBuildProjectName).trx</VSTestLogger>
+  <VSTestResultsDirectory>$(MSBuildThisFileDirectory)/TestResults/$(TargetFramework)</VSTestResultsDirectory>
+</PropertyGroup>
+```
+
+Supported testing frameworks:
+- [xUnit](https://xunit.net/)
+- [NUnit](https://nunit.org/)
+- [MSTest](https://github.com/Microsoft/testfx-docs)
+
+For more information see [dotnet test](https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-test#examples)
+</details>
+
+<details>
+  <summary>flutter-json</summary>
+
+Test run must be configured to use [JSON](https://github.com/dart-lang/test/blob/master/pkgs/test/doc/configuration.md#reporter) reporter.
+You can configure it in `dart_test.yaml`:
+```yml
+file_reporters:
+  json: reports/test-results.json
+```
+
+Or with (undocumented) CLI argument:
+
+`flutter test --machine > test-results.json`
+
+
+According to documentation `dart_test.yaml` should be at the root of the package, next to the package's pubspec.
+On current `stable` and `beta` channels it doesn't work, and you have to put `dart_test.yaml` inside your `test` folder.
+On `dev` channel, it's already fixed.
+
+For more information see:
+- [test package](https://pub.dev/packages/test)
+- [test configuration](https://github.com/dart-lang/test/blob/master/pkgs/test/doc/configuration.md)
+- [flutter-cli](https://flutter.dev/docs/reference/flutter-cli)
+- [unit testing introduction](https://flutter.dev/docs/cookbook/testing/unit/introduction)
+
+</details>
+
+<details>
+  <summary>java-junit (Experimental)</summary>
+
+Support for [JUnit](https://Junit.org/) XML is experimental - should work but it was not extensively tested.
+To have code annotations working properly, it's required your directory structure matches the package name.
+This is due to the fact Java stack traces don't contain a full path to the source file.
+Some heuristic was necessary to figure out the mapping between the line in the stack trace and an actual source file.
+</details>
+
+<details>
+  <summary>jest-Junit</summary>
+
+[JEST](https://jestjs.io/) testing framework support requires the usage of [jest-Junit](https://github.com/jest-community/jest-Junit) reporter.
+It will create test results in Junit XML format which can be then processed by this action.
+You can use the following example configuration in `package.json`:
+```json
+"scripts": {
+  "test": "jest --ci --reporters=default --reporters=jest-Junit"
+},
+"devDependencies": {
+  "jest": "^26.5.3",
+  "jest-junit": "^12.0.0"
+},
+"jest-junit": {
+  "outputDirectory": "reports",
+  "outputName": "jest-junit.xml",
+  "ancestorSeparator": " › ",
+  "uniqueOutputName": "false",
+  "suiteNameTemplate": "{filepath}",
+  "classNameTemplate": "{classname}",
+  "titleTemplate": "{title}"
+}
+```
+
+Configuration of `uniqueOutputName`, `suiteNameTemplate`, `classNameTemplate`, `titleTemplate` is important for proper visualization of test results.
+</details>
+
+<details>
+  <summary>mocha-json</summary>
+
+[Mocha](https://mochajs.org/) testing framework support requires:
+- Mocha version [v7.2.0](https://github.com/mochajs/mocha/releases/tag/v7.2.0) or higher
+- Usage of [json](https://mochajs.org/#json) reporter.
+
+You can use the following example configuration in `package.json`:
+```json
+"scripts": {
+  "test": "mocha --reporter json > test-results.json"
+}
+```
+
+Test processing might fail if any of your tests write anything on standard output.
+Mocha, unfortunately, doesn't have the option to store `json` output directly to the file, and we have to rely on redirecting its standard output.
+There is a work in progress to fix it: [mocha#4607](https://github.com/mochajs/mocha/pull/4607)
+</details>
+
+## GitHub limitations
+
+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.
+- 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@v2` 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
+  workflows are running for the same SHA. Thanks to this GitHub "feature" it's possible your test report will appear in an unexpected place in GitHub UI.
+  For more information, see [#67](https://github.com/dorny/test-reporter/issues/67).
+
+## See also
+- [paths-filter](https://github.com/dorny/paths-filter) - Conditionally run actions based on files modified by PR, feature branch, or pushed commits
+
+## License
+
+The scripts and documentation in this project are released under the [MIT License](https://github.com/dorny/test-reporter/blob/main/LICENSE)
diff --git a/test-reporter/__tests__/__outputs__/dart-json.md b/test-reporter/__tests__/__outputs__/dart-json.md
new file mode 100644
index 0000000..80a2846
--- /dev/null
+++ b/test-reporter/__tests__/__outputs__/dart-json.md
@@ -0,0 +1,28 @@
+![Tests failed](https://img.shields.io/badge/tests-1%20passed%2C%204%20failed%2C%201%20skipped-critical)
+## ❌ <a id="user-content-r0" href="#r0">fixtures/dart-json.json</a>
+**6** tests were completed in **4s** with **1** passed, **4** failed and **1** skipped.
+|Test suite|Passed|Failed|Skipped|Time|
+|:---|---:|---:|---:|---:|
+|[test/main_test.dart](#r0s0)|1✔️|3❌||74ms|
+|[test/second_test.dart](#r0s1)||1❌|1✖️|51ms|
+### ❌ <a id="user-content-r0s0" href="#r0s0">test/main_test.dart</a>
+```
+Test 1
+  ✔️ Passing test
+Test 1 Test 1.1
+  ❌ Failing test
+	Expected: <2>
+	  Actual: <1>
+	
+  ❌ Exception in target unit
+	Exception: Some error
+Test 2
+  ❌ Exception in test
+	Exception: Some error
+```
+### ❌ <a id="user-content-r0s1" href="#r0s1">test/second_test.dart</a>
+```
+❌ Timeout test
+	TimeoutException after 0:00:00.000001: Test timed out after 0 seconds.
+✖️ Skipped test
+```
\ No newline at end of file
diff --git a/test-reporter/__tests__/__outputs__/dotnet-trx.md b/test-reporter/__tests__/__outputs__/dotnet-trx.md
new file mode 100644
index 0000000..ddaaecd
--- /dev/null
+++ b/test-reporter/__tests__/__outputs__/dotnet-trx.md
@@ -0,0 +1,31 @@
+![Tests failed](https://img.shields.io/badge/tests-5%20passed%2C%205%20failed%2C%201%20skipped-critical)
+## ❌ <a id="user-content-r0" href="#r0">fixtures/dotnet-trx.trx</a>
+**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|
+### ❌ <a id="user-content-r0s0" href="#r0s0">DotnetTests.XUnitTests.CalculatorTests</a>
+```
+✔️ Custom Name
+❌ Exception_In_TargetTest
+	System.DivideByZeroException : Attempted to divide by zero.
+❌ Exception_In_Test
+	System.Exception : Test
+❌ Failing_Test
+	Assert.Equal() Failure
+	Expected: 3
+	Actual:   2
+✔️ Is_Even_Number(i: 2)
+❌ Is_Even_Number(i: 3)
+	Assert.True() Failure
+	Expected: True
+	Actual:   False
+✔️ Passing_Test
+✔️ Should be even number(i: 2)
+❌ Should be even number(i: 3)
+	Assert.True() Failure
+	Expected: True
+	Actual:   False
+✖️ Skipped_Test
+✔️ Timeout_Test
+```
\ No newline at end of file
diff --git a/test-reporter/__tests__/__outputs__/fluent-validation-test-results.md b/test-reporter/__tests__/__outputs__/fluent-validation-test-results.md
new file mode 100644
index 0000000..9f35f00
--- /dev/null
+++ b/test-reporter/__tests__/__outputs__/fluent-validation-test-results.md
@@ -0,0 +1,1057 @@
+![Tests passed successfully](https://img.shields.io/badge/tests-803%20passed%2C%201%20skipped-success)
+## ✔️ <a id="user-content-r0" href="#r0">fixtures/external/FluentValidation.Tests.trx</a>
+**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|
+### ✔️ <a id="user-content-r0s0" href="#r0s0">FluentValidation.Tests.AbstractValidatorTester</a>
+```
+✔️ Can_replace_default_errorcode_resolver
+✔️ CanValidateInstancesOfType_returns_false_when_comparing_against_some_other_type
+✔️ CanValidateInstancesOfType_returns_true_when_comparing_against_same_type
+✔️ CanValidateInstancesOfType_returns_true_when_comparing_against_subclass
+✔️ Default_error_code_should_be_class_name
+✔️ OverridePropertyName_should_override_property_name
+✔️ OverridePropertyName_with_lambda_should_override_property_name
+✔️ PreValidate_bypasses_nullcheck_on_instance
+✔️ RuleForeach_with_null_instances
+✔️ Should_be_valid_when_there_are_no_failures_for_single_property
+✔️ Should_not_main_state
+✔️ Should_throw_for_non_member_expression_when_validating_single_property
+✔️ Should_throw_when_rule_is_null
+✔️ Should_validate_public_Field
+✔️ Should_validate_single_Field
+✔️ Should_validate_single_property
+✔️ Should_validate_single_property_where_invalid_property_as_string
+✔️ Should_validate_single_property_where_property_as_string
+✔️ Uses_named_parameters_to_validate_ruleset
+✔️ Validates_single_property_by_path
+✔️ Validates_type_when_using_non_generic_validate_overload
+✔️ When_the_validators_fail_then_the_errors_Should_be_accessible_via_the_errors_property
+✔️ When_the_validators_fail_then_validatorrunner_should_return_false
+✔️ When_the_Validators_pass_then_the_validatorRunner_should_return_true
+✔️ WhenPreValidationReturnsFalse_ResultReturnToUserImmediatly_Validate(preValidationResult: )
+✔️ WhenPreValidationReturnsFalse_ResultReturnToUserImmediatly_Validate(preValidationResult: AnotherInt Test Message)
+✔️ WhenPreValidationReturnsFalse_ResultReturnToUserImmediatly_ValidateAsync(preValidationResult: )
+✔️ WhenPreValidationReturnsFalse_ResultReturnToUserImmediatly_ValidateAsync(preValidationResult: AnotherInt Test Message)
+✔️ WhenPreValidationReturnsTrue_ValidatorsGetHit_Validate
+✔️ WhenPreValidationReturnsTrue_ValidatorsGetHit_ValidateAsync
+✔️ WithErrorCode_should_override_error_code
+✔️ WithMessage_and_WithErrorCode_should_override_error_message_and_error_code
+✔️ WithMessage_should_override_error_message
+✔️ WithName_should_override_field_name
+✔️ WithName_should_override_field_name_with_value_from_other_property
+```
+### ✔️ <a id="user-content-r0s1" href="#r0s1">FluentValidation.Tests.AccessorCacheTests</a>
+```
+✖️ Benchmark
+✔️ Equality_comparison_check
+✔️ Gets_accessor
+✔️ Gets_member_for_nested_property
+✔️ Identifies_if_memberexp_acts_on_model_instance
+```
+### ✔️ <a id="user-content-r0s2" href="#r0s2">FluentValidation.Tests.AssemblyScannerTester</a>
+```
+✔️ Finds_validators_for_types
+✔️ ForEach_iterates_over_types
+```
+### ✔️ <a id="user-content-r0s3" href="#r0s3">FluentValidation.Tests.CascadingFailuresTester</a>
+```
+✔️ Cascade_mode_can_be_set_after_validator_instantiated
+✔️ Cascade_mode_can_be_set_after_validator_instantiated_async
+✔️ Cascade_mode_can_be_set_after_validator_instantiated_async_legacy
+✔️ Cascade_mode_can_be_set_after_validator_instantiated_legacy
+✔️ Validation_continues_on_failure
+✔️ Validation_continues_on_failure_async
+✔️ Validation_continues_on_failure_when_set_to_Stop_globally_and_overriden_at_rule_level
+✔️ Validation_continues_on_failure_when_set_to_Stop_globally_and_overriden_at_rule_level_async
+✔️ Validation_continues_on_failure_when_set_to_Stop_globally_and_overriden_at_rule_level_async_legacy
+✔️ Validation_continues_on_failure_when_set_to_Stop_globally_and_overriden_at_rule_level_legacy
+✔️ Validation_continues_on_failure_when_set_to_StopOnFirstFailure_at_validator_level_and_overriden_at_rule_level
+✔️ Validation_continues_on_failure_when_set_to_StopOnFirstFailure_at_validator_level_and_overriden_at_rule_level_async
+✔️ Validation_continues_on_failure_when_set_to_StopOnFirstFailure_at_validator_level_and_overriden_at_rule_level_async_legacy
+✔️ Validation_continues_on_failure_when_set_to_StopOnFirstFailure_at_validator_level_and_overriden_at_rule_level_legacy
+✔️ Validation_continues_to_second_validator_when_first_validator_succeeds_and_cascade_set_to_stop
+✔️ Validation_continues_to_second_validator_when_first_validator_succeeds_and_cascade_set_to_stop_async
+✔️ Validation_continues_to_second_validator_when_first_validator_succeeds_and_cascade_set_to_stop_async_legacy
+✔️ Validation_continues_to_second_validator_when_first_validator_succeeds_and_cascade_set_to_stop_legacy
+✔️ Validation_continues_when_set_to_Continue_at_validator_level
+✔️ Validation_continues_when_set_to_Continue_at_validator_level_async
+✔️ Validation_stops_on_failure_when_set_to_Continue_and_overriden_at_rule_level
+✔️ Validation_stops_on_failure_when_set_to_Continue_and_overriden_at_rule_level_async
+✔️ Validation_stops_on_failure_when_set_to_Continue_and_overriden_at_rule_level_async_legacy
+✔️ Validation_stops_on_failure_when_set_to_Continue_and_overriden_at_rule_level_legacy
+✔️ Validation_stops_on_first_failure
+✔️ Validation_stops_on_first_failure_async
+✔️ Validation_stops_on_first_failure_async_legacy
+✔️ Validation_stops_on_first_failure_legacy
+✔️ Validation_stops_on_first_Failure_when_set_to_Continue_globally_and_overriden_at_rule_level
+✔️ Validation_stops_on_first_Failure_when_set_to_Continue_globally_and_overriden_at_rule_level_and_async_validator_is_invoked_synchronously
+✔️ Validation_stops_on_first_Failure_when_set_to_Continue_globally_and_overriden_at_rule_level_and_async_validator_is_invoked_synchronously_legacy
+✔️ Validation_stops_on_first_Failure_when_set_to_Continue_globally_and_overriden_at_rule_level_async
+✔️ Validation_stops_on_first_Failure_when_set_to_Continue_globally_and_overriden_at_rule_level_async_legacy
+✔️ Validation_stops_on_first_Failure_when_set_to_Continue_globally_and_overriden_at_rule_level_legacy
+✔️ Validation_stops_on_first_failure_when_set_to_StopOnFirstFailure_at_validator_level
+✔️ Validation_stops_on_first_failure_when_set_to_StopOnFirstFailure_at_validator_level_async
+✔️ 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
+```
+### ✔️ <a id="user-content-r0s4" href="#r0s4">FluentValidation.Tests.ChainedValidationTester</a>
+```
+✔️ Can_validate_using_validator_for_base_type
+✔️ Chained_property_should_be_excluded
+✔️ Chained_validator_descriptor
+✔️ Chained_validator_should_not_be_invoked_on_null_property
+✔️ Condition_should_work_with_chained_property
+✔️ Explicitly_included_properties_should_be_propagated_to_nested_validators
+✔️ Explicitly_included_properties_should_be_propagated_to_nested_validators_using_strings
+✔️ Separate_validation_on_chained_property
+✔️ Separate_validation_on_chained_property_conditional
+✔️ Separate_validation_on_chained_property_valid
+✔️ Should_allow_normal_rules_and_chained_property_on_same_property
+✔️ Uses_explicit_ruleset
+✔️ Validates_chained_property
+```
+### ✔️ <a id="user-content-r0s5" href="#r0s5">FluentValidation.Tests.ChainingValidatorsTester</a>
+```
+✔️ Options_should_only_apply_to_current_validator
+✔️ Should_create_multiple_validators
+✔️ Should_execute_multiple_validators
+```
+### ✔️ <a id="user-content-r0s6" href="#r0s6">FluentValidation.Tests.ChildRulesTests</a>
+```
+✔️ Can_define_nested_rules_for_collection
+✔️ ChildRules_works_with_RuleSet
+```
+### ✔️ <a id="user-content-r0s7" href="#r0s7">FluentValidation.Tests.CollectionValidatorWithParentTests</a>
+```
+✔️ Async_condition_should_work_with_child_collection
+✔️ Can_specify_condition_for_individual_collection_elements
+✔️ Can_validate_collection_using_validator_for_base_type
+✔️ Collection_should_be_excluded
+✔️ Collection_should_be_explicitly_included_with_expression
+✔️ Collection_should_be_explicitly_included_with_string
+✔️ Condition_should_work_with_child_collection
+✔️ Creates_validator_using_context_from_property_value
+✔️ Should_override_property_name
+✔️ Should_work_with_top_level_collection_validator
+✔️ Should_work_with_top_level_collection_validator_and_overriden_name
+✔️ Skips_null_items
+✔️ Validates_collection
+✔️ Validates_collection_asynchronously
+✔️ Validates_collection_several_levels_deep
+✔️ Validates_collection_several_levels_deep_async
+```
+### ✔️ <a id="user-content-r0s8" href="#r0s8">FluentValidation.Tests.ComplexValidationTester</a>
+```
+✔️ Async_condition_should_work_with_complex_property
+✔️ Async_condition_should_work_with_complex_property_when_validator_invoked_synchronously
+✔️ Can_directly_validate_multiple_fields_of_same_type
+✔️ Can_validate_using_validator_for_base_type
+✔️ Complex_property_should_be_excluded
+✔️ Complex_validator_should_not_be_invoked_on_null_property
+✔️ Condition_should_work_with_complex_property
+✔️ Condition_should_work_with_complex_property_when_invoked_async
+✔️ Explicitly_included_properties_should_be_propagated_to_nested_validators
+✔️ Explicitly_included_properties_should_be_propagated_to_nested_validators_using_strings
+✔️ Multiple_rules_in_chain_with_childvalidator_shouldnt_reuse_accessor
+✔️ Multiple_rules_in_chain_with_childvalidator_shouldnt_reuse_accessor_async
+✔️ Should_allow_normal_rules_and_complex_property_on_same_property
+✔️ Should_override_propertyName
+✔️ Validates_child_validator_asynchronously
+✔️ Validates_child_validator_synchronously
+✔️ Validates_complex_property
+```
+### ✔️ <a id="user-content-r0s9" href="#r0s9">FluentValidation.Tests.ConditionTests</a>
+```
+✔️ Async_condition_executed_synchronosuly_with_asynchronous_collection_rule
+✔️ Async_condition_executed_synchronosuly_with_asynchronous_rule
+✔️ Async_condition_executed_synchronosuly_with_synchronous_collection_role
+✔️ Async_condition_executed_synchronosuly_with_synchronous_role
+✔️ Async_condition_is_applied_to_all_validators_in_the_chain
+✔️ Async_condition_is_applied_to_all_validators_in_the_chain_when_executed_synchronously
+✔️ Async_condition_is_applied_to_single_validator_in_the_chain_when_ApplyConditionTo_set_to_CurrentValidator
+✔️ Condition_is_applied_to_all_validators_in_the_chain
+✔️ Condition_is_applied_to_single_validator_in_the_chain_when_ApplyConditionTo_set_to_CurrentValidator
+✔️ Sync_condition_is_applied_to_async_validators
+✔️ Validation_should_fail_when_async_condition_does_not_match
+✔️ Validation_should_fail_when_async_condition_matches
+✔️ Validation_should_fail_when_condition_does_not_match
+✔️ Validation_should_fail_when_condition_matches
+✔️ Validation_should_succeed_when_async_condition_does_not_match
+✔️ Validation_should_succeed_when_async_condition_matches
+✔️ Validation_should_succeed_when_condition_does_not_match
+✔️ Validation_should_succeed_when_condition_matches
+```
+### ✔️ <a id="user-content-r0s10" href="#r0s10">FluentValidation.Tests.CreditCardValidatorTests</a>
+```
+✔️ IsValidTests
+✔️ When_validation_fails_the_default_error_should_be_set
+```
+### ✔️ <a id="user-content-r0s11" href="#r0s11">FluentValidation.Tests.CustomFailureActionTester</a>
+```
+✔️ Does_not_invoke_action_if_validation_success
+✔️ Invokes_custom_action_on_failure
+✔️ Passes_object_being_validated_to_action
+```
+### ✔️ <a id="user-content-r0s12" href="#r0s12">FluentValidation.Tests.CustomMessageFormatTester</a>
+```
+✔️ Replaces_propertyvalue_placeholder
+✔️ Replaces_propertyvalue_with_empty_string_when_null
+✔️ Should_format_custom_message
+✔️ Uses_custom_delegate_for_building_message
+✔️ Uses_custom_delegate_for_building_message_only_for_specific_validator
+✔️ Uses_property_value_in_message
+```
+### ✔️ <a id="user-content-r0s13" href="#r0s13">FluentValidation.Tests.CustomValidatorTester</a>
+```
+✔️ New_Custom_Returns_single_failure
+✔️ New_Custom_Returns_single_failure_async
+✔️ New_custom_uses_empty_property_name_for_model_level_rule
+✔️ New_Custom_When_property_name_omitted_infers_property_name
+✔️ New_Custom_When_property_name_omitted_infers_property_name_nested
+✔️ New_Custom_within_ruleset
+✔️ New_CustomAsync_within_ruleset
+✔️ Perserves_property_chain_using_custom
+✔️ Runs_async_rule_synchronously_when_validator_invoked_synchronously
+✔️ Runs_sync_rule_asynchronously_when_validator_invoked_asynchronously
+```
+### ✔️ <a id="user-content-r0s14" href="#r0s14">FluentValidation.Tests.DefaultValidatorExtensionTester</a>
+```
+✔️ Empty_should_create_EmptyValidator
+✔️ Equal_should_create_EqualValidator_with_explicit_value
+✔️ Equal_should_create_EqualValidator_with_lambda
+✔️ GreaterThan_should_create_GreaterThanValidator_with_explicit_value
+✔️ GreaterThan_should_create_GreaterThanValidator_with_lambda
+✔️ GreaterThanOrEqual_should_create_GreaterThanOrEqualValidator_with_explicit_value
+✔️ GreaterThanOrEqual_should_create_GreaterThanOrEqualValidator_with_lambda
+✔️ GreaterThanOrEqual_should_create_GreaterThanOrEqualValidator_with_lambda_with_other_Nullable
+✔️ Length_should_create_ExactLengthValidator
+✔️ Length_should_create_LengthValidator
+✔️ Length_should_create_MaximumLengthValidator
+✔️ Length_should_create_MinimumLengthValidator
+✔️ LessThan_should_create_LessThanValidator_with_explicit_value
+✔️ LessThan_should_create_LessThanValidator_with_lambda
+✔️ LessThanOrEqual_should_create_LessThanOrEqualValidator_with_explicit_value
+✔️ LessThanOrEqual_should_create_LessThanOrEqualValidator_with_lambda
+✔️ LessThanOrEqual_should_create_LessThanOrEqualValidator_with_lambda_with_other_Nullable
+✔️ Must_should_create_PredicateValidator_with_context
+✔️ Must_should_create_PredicateValidator_with_PropertyValidatorContext
+✔️ Must_should_create_PredicteValidator
+✔️ MustAsync_should_create_AsyncPredicateValidator_with_context
+✔️ MustAsync_should_create_AsyncPredicateValidator_with_PropertyValidatorContext
+✔️ MustAsync_should_create_AsyncPredicteValidator
+✔️ MustAsync_should_not_throw_InvalidCastException
+✔️ NotEmpty_should_create_NotEmptyValidator
+✔️ NotEqual_should_create_NotEqualValidator_with_explicit_value
+✔️ NotEqual_should_create_NotEqualValidator_with_lambda
+✔️ NotNull_should_create_NotNullValidator
+✔️ ScalePrecision_should_create_ScalePrecisionValidator
+✔️ ScalePrecision_should_create_ScalePrecisionValidator_with_ignore_trailing_zeros
+```
+### ✔️ <a id="user-content-r0s15" href="#r0s15">FluentValidation.Tests.EmailValidatorTests</a>
+```
+✔️ Fails_email_validation_aspnetcore_compatible(email: " \r \t \n")
+✔️ Fails_email_validation_aspnetcore_compatible(email: "")
+✔️ Fails_email_validation_aspnetcore_compatible(email: "@someDomain.com")
+✔️ Fails_email_validation_aspnetcore_compatible(email: "@someDomain@abc.com")
+✔️ Fails_email_validation_aspnetcore_compatible(email: "0")
+✔️ Fails_email_validation_aspnetcore_compatible(email: "someName")
+✔️ Fails_email_validation_aspnetcore_compatible(email: "someName@")
+✔️ Fails_email_validation_aspnetcore_compatible(email: "someName@a@b.com")
+✔️ Invalid_email_addressex_regex(email: "")
+✔️ Invalid_email_addressex_regex(email: "first.last@test..co.uk")
+✔️ Invalid_email_addressex_regex(email: "testperso")
+✔️ Invalid_email_addressex_regex(email: "thisisaverylongstringcodeplex.com")
+✔️ Valid_email_addresses_aspnetcore_compatible(email: " @someDomain.com")
+✔️ Valid_email_addresses_aspnetcore_compatible(email: "!#$%&'*+-/=?^_`|~@someDomain.com")
+✔️ Valid_email_addresses_aspnetcore_compatible(email: "\"firstName.lastName\"@someDomain.com")
+✔️ Valid_email_addresses_aspnetcore_compatible(email: "1234@someDomain.com")
+✔️ Valid_email_addresses_aspnetcore_compatible(email: "firstName.lastName@someDomain.com")
+✔️ Valid_email_addresses_aspnetcore_compatible(email: "someName@1234.com")
+✔️ Valid_email_addresses_aspnetcore_compatible(email: "someName@some_domain.com")
+✔️ Valid_email_addresses_aspnetcore_compatible(email: "someName@some~domain.com")
+✔️ Valid_email_addresses_aspnetcore_compatible(email: "someName@someDomain.com")
+✔️ Valid_email_addresses_aspnetcore_compatible(email: "someName@someDomain￯.com")
+✔️ Valid_email_addresses_aspnetcore_compatible(email: null)
+✔️ Valid_email_addresses_regex(email: "__somename@example.com")
+✔️ Valid_email_addresses_regex(email: "!def!xyz%abc@example.com")
+✔️ Valid_email_addresses_regex(email: "\"Abc@def\"@example.com")
+✔️ Valid_email_addresses_regex(email: "\"Abc\\@def\"@example.com")
+✔️ Valid_email_addresses_regex(email: "\"Fred Bloggs\"@example.com")
+✔️ Valid_email_addresses_regex(email: "\"Joe\\Blow\"@example.com")
+✔️ Valid_email_addresses_regex(email: "$A12345@example.com")
+✔️ Valid_email_addresses_regex(email: "customer/department=shipping@example.com")
+✔️ Valid_email_addresses_regex(email: "first.last@test.co.uk")
+✔️ Valid_email_addresses_regex(email: "testperson@gmail.com")
+✔️ Valid_email_addresses_regex(email: "TestPerson@gmail.com")
+✔️ Valid_email_addresses_regex(email: "testperson+label@gmail.com")
+✔️ Valid_email_addresses_regex(email: null)
+```
+### ✔️ <a id="user-content-r0s16" href="#r0s16">FluentValidation.Tests.EmptyTester</a>
+```
+✔️ Passes_for_ienumerable_that_doesnt_implement_ICollection
+✔️ Passes_when_collection_empty
+✔️ When_there_is_a_value_then_the_validator_should_fail
+✔️ When_validation_fails_error_should_be_set
+✔️ When_value_is_Default_for_type_validator_should_pass_datetime
+✔️ When_value_is_Default_for_type_validator_should_pass_int
+✔️ When_value_is_empty_string_validator_should_pass
+✔️ When_value_is_null_validator_should_pass
+✔️ When_value_is_whitespace_validation_should_pass
+```
+### ✔️ <a id="user-content-r0s17" href="#r0s17">FluentValidation.Tests.EnumValidatorTests</a>
+```
+✔️ Flags_enum_invalid_when_using_outofrange_negative_value
+✔️ Flags_enum_invalid_when_using_outofrange_positive_value
+✔️ Flags_enum_valid_when_using_bitwise_value
+✔️ Flags_enum_validates_correctly_when_using_zero_value
+✔️ Flags_enum_with_overlapping_flags_valid_when_using_bitwise_value
+✔️ IsValidTests
+✔️ Nullable_enum_invalid_when_bad_value_specified
+✔️ Nullable_enum_valid_when_property_value_is_null
+✔️ Nullable_enum_valid_when_value_specified
+✔️ When_the_enum_is_initialized_with_invalid_value_then_the_validator_should_fail
+✔️ When_the_enum_is_not_initialized_with_valid_value_then_the_validator_should_fail
+✔️ When_validation_fails_the_default_error_should_be_set
+```
+### ✔️ <a id="user-content-r0s18" href="#r0s18">FluentValidation.Tests.EqualValidatorTests</a>
+```
+✔️ Comparison_property_uses_custom_resolver
+✔️ Should_store_comparison_type
+✔️ Should_store_property_to_compare
+✔️ Should_succeed_on_case_insensitive_comparison
+✔️ Should_succeed_on_case_insensitive_comparison_using_expression
+✔️ Should_use_ordinal_comparison_by_default
+✔️ Validates_against_property
+✔️ When_the_objects_are_equal_validation_should_succeed
+✔️ When_the_objects_are_not_equal_validation_should_fail
+✔️ When_validation_fails_the_error_should_be_set
+```
+### ✔️ <a id="user-content-r0s19" href="#r0s19">FluentValidation.Tests.ExactLengthValidatorTester</a>
+```
+✔️ Min_and_max_properties_should_be_set
+✔️ When_exact_length_rule_failes_error_should_have_exact_length_error_errorcode
+✔️ When_the_text_is_an_exact_length_the_validator_should_pass
+✔️ When_the_text_length_is_larger_the_validator_should_fail
+✔️ When_the_text_length_is_smaller_the_validator_should_fail
+✔️ When_the_validator_fails_the_error_message_should_be_set
+```
+### ✔️ <a id="user-content-r0s20" href="#r0s20">FluentValidation.Tests.ExclusiveBetweenValidatorTests</a>
+```
+✔️ To_and_from_properties_should_be_set
+✔️ To_and_from_properties_should_be_set_for_dates
+✔️ To_and_from_properties_should_be_set_for_strings
+✔️ Validates_with_nullable_when_property_is_null
+✔️ Validates_with_nullable_when_property_not_null
+✔️ When_the_text_is_larger_than_the_range_then_the_validator_should_fail
+✔️ When_the_text_is_larger_than_the_range_then_the_validator_should_fail_for_strings
+✔️ When_the_to_is_smaller_than_the_from_then_the_validator_should_throw
+✔️ When_the_to_is_smaller_than_the_from_then_the_validator_should_throw_for_strings
+✔️ When_the_validator_fails_the_error_message_should_be_set
+✔️ When_the_validator_fails_the_error_message_should_be_set_for_strings
+✔️ When_the_value_is_between_the_range_specified_then_the_validator_should_pass
+✔️ When_the_value_is_between_the_range_specified_then_the_validator_should_pass_for_strings
+✔️ When_the_value_is_exactly_the_size_of_the_lower_bound_then_the_validator_should_fail
+✔️ When_the_value_is_exactly_the_size_of_the_lower_bound_then_the_validator_should_fail_for_strings
+✔️ When_the_value_is_exactly_the_size_of_the_upper_bound_then_the_validator_should_fail
+✔️ When_the_value_is_exactly_the_size_of_the_upper_bound_then_the_validator_should_fail_for_strings
+✔️ 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
+```
+### ✔️ <a id="user-content-r0s21" href="#r0s21">FluentValidation.Tests.ExtensionTester</a>
+```
+✔️ 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
+```
+### ✔️ <a id="user-content-r0s22" href="#r0s22">FluentValidation.Tests.ForEachRuleTests</a>
+```
+✔️ Async_condition_should_work_with_child_collection
+✔️ Can_access_colletion_index
+✔️ Can_access_colletion_index_async
+✔️ Can_access_parent_index
+✔️ Can_access_parent_index_async
+✔️ Can_specify_condition_for_individual_collection_elements
+✔️ Can_use_cascade_with_RuleForEach
+✔️ Can_validate_collection_using_validator_for_base_type
+✔️ Collection_should_be_excluded
+✔️ Collection_should_be_explicitly_included_with_expression
+✔️ Collection_should_be_explicitly_included_with_string
+✔️ Condition_should_work_with_child_collection
+✔️ Correctly_gets_collection_indices
+✔️ Correctly_gets_collection_indices_async
+✔️ Executes_rule_for_each_item_in_collection
+✔️ Executes_rule_for_each_item_in_collection_async
+✔️ Nested_collection_for_null_property_should_not_throw_null_reference
+✔️ Nested_conditions_Rule_For
+✔️ Nested_conditions_Rule_For_Each
+✔️ Overrides_indexer
+✔️ Overrides_indexer_async
+✔️ Regular_rules_can_drop_into_RuleForEach
+✔️ RuleForEach_async_RunsTasksSynchronously
+✔️ Should_not_scramble_property_name_when_using_collection_validators_several_levels_deep
+✔️ Should_not_scramble_property_name_when_using_collection_validators_several_levels_deep_with_ValidateAsync
+✔️ Should_override_property_name
+✔️ Skips_null_items
+✔️ Top_level_collection
+✔️ Uses_useful_error_message_when_used_on_non_property
+✔️ Validates_child_validator_asynchronously
+✔️ Validates_child_validator_synchronously
+✔️ Validates_collection
+✔️ When_runs_outside_RuleForEach_loop
+✔️ When_runs_outside_RuleForEach_loop_async
+```
+### ✔️ <a id="user-content-r0s23" href="#r0s23">FluentValidation.Tests.GreaterThanOrEqualToValidatorTester</a>
+```
+✔️ Comparison_property_uses_custom_resolver
+✔️ Comparison_type
+✔️ Should_fail_when_less_than_input
+✔️ Should_localize_value
+✔️ Should_set_default_error_when_validation_fails
+✔️ Should_succeed_when_equal_to_input
+✔️ Should_succeed_when_greater_than_input
+✔️ Validates_nullable_with_nullable_property
+✔️ Validates_with_nullable_property
+✔️ Validates_with_nullable_when_property_is_null
+✔️ Validates_with_nullable_when_property_is_null_cross_property
+✔️ Validates_with_nullable_when_property_not_null
+✔️ Validates_with_nullable_when_property_not_null_cross_property
+✔️ Validates_with_property
+```
+### ✔️ <a id="user-content-r0s24" href="#r0s24">FluentValidation.Tests.GreaterThanValidatorTester</a>
+```
+✔️ Comparison_property_uses_custom_resolver
+✔️ Comparison_Type
+✔️ Should_fail_when_equal_to_input
+✔️ Should_fail_when_less_than_input
+✔️ Should_set_default_error_when_validation_fails
+✔️ Should_succeed_when_greater_than_input
+✔️ Validates_nullable_with_nullable_property
+✔️ Validates_with_nullable_property
+✔️ Validates_with_nullable_when_property_is_null
+✔️ Validates_with_nullable_when_property_is_null_cross_property
+✔️ Validates_with_nullable_when_property_not_null
+✔️ Validates_with_nullable_when_property_not_null_cross_property
+✔️ Validates_with_property
+```
+### ✔️ <a id="user-content-r0s25" href="#r0s25">FluentValidation.Tests.InclusiveBetweenValidatorTests</a>
+```
+✔️ To_and_from_properties_should_be_set
+✔️ To_and_from_properties_should_be_set_for_strings
+✔️ Validates_with_nullable_when_property_is_null
+✔️ Validates_with_nullable_when_property_not_null
+✔️ When_the_text_is_larger_than_the_range_then_the_validator_should_fail
+✔️ When_the_text_is_larger_than_the_range_then_the_validator_should_fail_for_strings
+✔️ When_the_to_is_smaller_than_the_from_then_the_validator_should_throw
+✔️ When_the_to_is_smaller_than_the_from_then_the_validator_should_throw_for_strings
+✔️ When_the_validator_fails_the_error_message_should_be_set
+✔️ When_the_validator_fails_the_error_message_should_be_set_for_strings
+✔️ When_the_value_is_between_the_range_specified_then_the_validator_should_pass
+✔️ When_the_value_is_between_the_range_specified_then_the_validator_should_pass_for_strings
+✔️ When_the_value_is_exactly_the_size_of_the_lower_bound_then_the_validator_should_pass
+✔️ When_the_value_is_exactly_the_size_of_the_lower_bound_then_the_validator_should_pass_for_strings
+✔️ When_the_value_is_exactly_the_size_of_the_upper_bound_then_the_validator_should_pass
+✔️ When_the_value_is_exactly_the_size_of_the_upper_bound_then_the_validator_should_pass_for_strings
+✔️ 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
+```
+### ✔️ <a id="user-content-r0s26" href="#r0s26">FluentValidation.Tests.InheritanceValidatorTest</a>
+```
+✔️ Can_use_custom_subclass_with_nongeneric_overload
+✔️ Validates_collection
+✔️ Validates_collection_async
+✔️ Validates_inheritance_async
+✔️ Validates_inheritance_hierarchy
+✔️ Validates_ruleset
+✔️ Validates_ruleset_async
+✔️ Validates_with_callback
+✔️ Validates_with_callback_accepting_derived
+✔️ Validates_with_callback_accepting_derived_async
+✔️ Validates_with_callback_async
+```
+### ✔️ <a id="user-content-r0s27" href="#r0s27">FluentValidation.Tests.InlineValidatorTester</a>
+```
+✔️ Uses_inline_validator_to_build_rules
+```
+### ✔️ <a id="user-content-r0s28" href="#r0s28">FluentValidation.Tests.LanguageManagerTests</a>
+```
+✔️ All_languages_should_be_loaded
+✔️ All_localizations_have_same_parameters_as_English
+✔️ Always_use_specific_language
+✔️ Always_use_specific_language_with_string_source
+✔️ Can_replace_message
+✔️ Can_replace_message_without_overriding_all_languages
+✔️ Disables_localization
+✔️ Falls_back_to_default_localization_key_when_error_code_key_not_found
+✔️ Falls_back_to_english_when_culture_not_registered
+✔️ Falls_back_to_english_when_translation_missing
+✔️ Falls_back_to_parent_culture
+✔️ Gets_translation_for_bosnian_latin_culture(cultureName: "bs-Latn-BA")
+✔️ Gets_translation_for_bosnian_latin_culture(cultureName: "bs-Latn")
+✔️ Gets_translation_for_bosnian_latin_culture(cultureName: "bs")
+✔️ Gets_translation_for_croatian_culture
+✔️ Gets_translation_for_culture
+✔️ Gets_translation_for_serbian_culture(cultureName: "sr-Latn-RS")
+✔️ Gets_translation_for_serbian_culture(cultureName: "sr-Latn")
+✔️ Gets_translation_for_serbian_culture(cultureName: "sr")
+✔️ Gets_translation_for_specific_culture
+✔️ Uses_error_code_as_localization_key
+```
+### ✔️ <a id="user-content-r0s29" href="#r0s29">FluentValidation.Tests.LengthValidatorTests</a>
+```
+✔️ Min_and_max_properties_should_be_set
+✔️ When_input_is_null_then_the_validator_should_pass
+✔️ When_the_max_is_smaller_than_the_min_then_the_validator_should_throw
+✔️ When_the_maxlength_validator_fails_the_error_message_should_be_set
+✔️ When_the_minlength_validator_fails_the_error_message_should_be_set
+✔️ When_the_text_is_between_the_lambda_range_specified_then_the_validator_should_pass
+✔️ When_the_text_is_between_the_range_specified_then_the_validator_should_pass
+✔️ When_the_text_is_exactly_the_size_of_the_lambda_lower_bound_then_the_validator_should_pass
+✔️ When_the_text_is_exactly_the_size_of_the_lambda_upper_bound_then_the_validator_should_pass
+✔️ When_the_text_is_exactly_the_size_of_the_lower_bound_then_the_validator_should_pass
+✔️ When_the_text_is_exactly_the_size_of_the_upper_bound_then_the_validator_should_pass
+✔️ When_the_text_is_larger_than_the_lambda_range_then_the_validator_should_fail
+✔️ When_the_text_is_larger_than_the_range_then_the_validator_should_fail
+✔️ When_the_text_is_smaller_than_the_lambda_range_then_the_validator_should_fail
+✔️ When_the_text_is_smaller_than_the_range_then_the_validator_should_fail
+✔️ When_the_validator_fails_the_error_message_should_be_set
+```
+### ✔️ <a id="user-content-r0s30" href="#r0s30">FluentValidation.Tests.LessThanOrEqualToValidatorTester</a>
+```
+✔️ Comparison_property_uses_custom_resolver
+✔️ Comparison_type
+✔️ Should_fail_when_greater_than_input
+✔️ Should_set_default_error_when_validation_fails
+✔️ Should_succeed_when_equal_to_input
+✔️ Should_succeed_when_less_than_input
+✔️ Validates_nullable_with_nullable_property
+✔️ Validates_with_nullable_property
+✔️ Validates_with_nullable_when_property_is_null
+✔️ Validates_with_nullable_when_property_is_null_cross_property
+✔️ Validates_with_nullable_when_property_not_null
+✔️ Validates_with_nullable_when_property_not_null_cross_property
+✔️ Validates_with_property
+```
+### ✔️ <a id="user-content-r0s31" href="#r0s31">FluentValidation.Tests.LessThanValidatorTester</a>
+```
+✔️ Comparison_property_uses_custom_resolver
+✔️ Comparison_type
+✔️ Extracts_property_from_constant_using_expression
+✔️ Extracts_property_from_expression
+✔️ Should_fail_when_equal_to_input
+✔️ Should_fail_when_greater_than_input
+✔️ Should_set_default_validation_message_when_validation_fails
+✔️ Should_succeed_when_less_than_input
+✔️ Should_throw_when_value_to_compare_is_null
+✔️ Validates_against_property
+✔️ Validates_nullable_with_nullable_property
+✔️ Validates_with_nullable_property
+✔️ Validates_with_nullable_when_property_is_null
+✔️ Validates_with_nullable_when_property_not_null
+✔️ Validates_with_nullable_when_property_not_null_cross_property
+✔️ Validates_with_nullable_when_property_null_cross_property
+```
+### ✔️ <a id="user-content-r0s32" href="#r0s32">FluentValidation.Tests.LocalisedMessagesTester</a>
+```
+✔️ Correctly_assigns_default_localized_error_message
+✔️ Does_not_throw_InvalidCastException_when_using_RuleForEach
+✔️ Formats_string_with_placeholders
+✔️ Formats_string_with_placeholders_when_you_cant_edit_the_string
+✔️ Uses_func_to_get_message
+✔️ Uses_string_format_with_property_value
+```
+### ✔️ <a id="user-content-r0s33" href="#r0s33">FluentValidation.Tests.LocalisedNameTester</a>
+```
+✔️ Uses_localized_name
+✔️ Uses_localized_name_expression
+```
+### ✔️ <a id="user-content-r0s34" href="#r0s34">FluentValidation.Tests.MemberAccessorTests</a>
+```
+✔️ ComplexPropertyGet
+✔️ ComplexPropertySet
+✔️ Equality
+✔️ ImplicitCast
+✔️ Name
+✔️ SimpleFieldGet
+✔️ SimpleFieldSet
+✔️ SimplePropertyGet
+✔️ SimplePropertySet
+```
+### ✔️ <a id="user-content-r0s35" href="#r0s35">FluentValidation.Tests.MessageFormatterTests</a>
+```
+✔️ Adds_argument_and_custom_arguments
+✔️ Adds_formatted_argument_and_custom_arguments
+✔️ Adds_formatted_argument_and_formatted_custom_arguments
+✔️ Adds_PropertyName_to_message
+✔️ Adds_value_to_message
+✔️ Format_property_value
+✔️ Should_ignore_unknown_numbered_parameters
+✔️ Should_ignore_unknown_parameters
+✔️ Understands_date_formats
+✔️ Understands_numeric_formats
+```
+### ✔️ <a id="user-content-r0s36" href="#r0s36">FluentValidation.Tests.ModelLevelValidatorTests</a>
+```
+✔️ Can_use_child_validator_at_model_level
+✔️ Validates_at_model_level
+```
+### ✔️ <a id="user-content-r0s37" href="#r0s37">FluentValidation.Tests.NameResolutionPluggabilityTester</a>
+```
+✔️ Resolves_nested_properties
+✔️ ShouldHaveValidationError_Should_support_custom_propertynameresolver
+✔️ Uses_custom_property_name
+```
+### ✔️ <a id="user-content-r0s38" href="#r0s38">FluentValidation.Tests.NotEmptyTester</a>
+```
+✔️ Fails_for_array
+✔️ Fails_for_ienumerable_that_doesnt_implement_ICollection
+✔️ Fails_when_collection_empty
+✔️ When_there_is_a_value_then_the_validator_should_pass
+✔️ When_validation_fails_error_should_be_set
+✔️ When_value_is_Default_for_type_validator_should_fail_datetime
+✔️ When_value_is_Default_for_type_validator_should_fail_int
+✔️ When_value_is_empty_string_validator_should_fail
+✔️ When_value_is_null_validator_should_fail
+✔️ When_value_is_whitespace_validation_should_fail
+```
+### ✔️ <a id="user-content-r0s39" href="#r0s39">FluentValidation.Tests.NotEqualValidatorTests</a>
+```
+✔️ Comparison_property_uses_custom_resolver
+✔️ Should_handle_custom_value_types_correctly
+✔️ Should_not_be_valid_for_case_insensitve_comparison
+✔️ Should_not_be_valid_for_case_insensitve_comparison_with_expression
+✔️ Should_store_comparison_type
+✔️ Should_store_property_to_compare
+✔️ Should_use_ordinal_comparison_by_default
+✔️ Validates_across_properties
+✔️ When_the_objects_are_equal_then_the_validator_should_fail
+✔️ When_the_objects_are_not_equal_then_the_validator_should_pass
+✔️ When_the_validator_fails_the_error_message_should_be_set
+```
+### ✔️ <a id="user-content-r0s40" href="#r0s40">FluentValidation.Tests.NotNullTester</a>
+```
+✔️ Fails_when_nullable_value_type_is_null
+✔️ Not_null_validator_should_not_crash_with_non_nullable_value_type
+✔️ NotNullValidator_should_fail_if_value_is_null
+✔️ NotNullValidator_should_pass_if_value_has_value
+✔️ When_the_validator_fails_the_error_message_should_be_set
+```
+### ✔️ <a id="user-content-r0s41" href="#r0s41">FluentValidation.Tests.NullTester</a>
+```
+✔️ Not_null_validator_should_not_crash_with_non_nullable_value_type
+✔️ NullValidator_should_fail_if_value_has_value
+✔️ NullValidator_should_pass_if_value_is_null
+✔️ Passes_when_nullable_value_type_is_null
+✔️ When_the_validator_passes_the_error_message_should_be_set
+```
+### ✔️ <a id="user-content-r0s42" href="#r0s42">FluentValidation.Tests.OnFailureTests</a>
+```
+✔️ OnFailure_called_for_each_failed_rule
+✔️ OnFailure_called_for_each_failed_rule_asyncAsync
+✔️ Should_be_able_to_access_error_message_in_OnFailure
+✔️ ShouldHaveChildValidator_should_be_true
+✔️ ShouldHaveChildValidator_works_with_Include
+✔️ WhenAsyncWithOnFailure_should_invoke_condition_on_async_inner_validator
+✔️ WhenAsyncWithOnFailure_should_invoke_condition_on_inner_validator
+✔️ WhenAsyncWithOnFailure_should_invoke_condition_on_inner_validator_invoked_synchronously
+✔️ WhenWithOnFailure_should_invoke_condition_on_async_inner_validator
+✔️ WhenWithOnFailure_should_invoke_condition_on_inner_validator
+```
+### ✔️ <a id="user-content-r0s43" href="#r0s43">FluentValidation.Tests.PredicateValidatorTester</a>
+```
+✔️ Should_fail_when_predicate_returns_false
+✔️ Should_succeed_when_predicate_returns_true
+✔️ Should_throw_when_predicate_is_null
+✔️ When_validation_fails_metadata_should_be_set_on_failure
+✔️ When_validation_fails_the_default_error_should_be_set
+```
+### ✔️ <a id="user-content-r0s44" href="#r0s44">FluentValidation.Tests.PropertyChainTests</a>
+```
+✔️ AddIndexer_throws_when_nothing_added
+✔️ Calling_ToString_should_construct_string_representation_of_chain
+✔️ Calling_ToString_should_construct_string_representation_of_chain_with_indexers
+✔️ Creates_from_expression
+✔️ Should_be_subchain
+✔️ Should_ignore_blanks
+✔️ Should_not_be_subchain
+```
+### ✔️ <a id="user-content-r0s45" href="#r0s45">FluentValidation.Tests.RegularExpressionValidatorTests</a>
+```
+✔️ Can_access_expression_in_message
+✔️ Can_access_expression_in_message_lambda
+✔️ Can_access_expression_in_message_lambda_regex
+✔️ Uses_lazily_loaded_expression
+✔️ Uses_lazily_loaded_expression_with_options
+✔️ Uses_regex_object
+✔️ When_the_text_does_not_match_the_lambda_regex_regular_expression_then_the_validator_should_fail
+✔️ When_the_text_does_not_match_the_lambda_regular_expression_then_the_validator_should_fail
+✔️ When_the_text_does_not_match_the_regular_expression_then_the_validator_should_fail
+✔️ When_the_text_is_empty_then_the_validator_should_fail
+✔️ When_the_text_is_null_then_the_validator_should_pass
+✔️ When_the_text_matches_the_lambda_regex_regular_expression_then_the_validator_should_pass
+✔️ When_the_text_matches_the_lambda_regular_expression_then_the_validator_should_pass
+✔️ When_the_text_matches_the_regular_expression_then_the_validator_should_pass
+✔️ When_validation_fails_the_default_error_should_be_set
+```
+### ✔️ <a id="user-content-r0s46" href="#r0s46">FluentValidation.Tests.RuleBuilderTests</a>
+```
+✔️ Adding_a_validator_should_return_builder
+✔️ Adding_a_validator_should_store_validator
+✔️ Calling_validate_should_delegate_to_underlying_validator
+✔️ Calling_ValidateAsync_should_delegate_to_underlying_async_validator
+✔️ Calling_ValidateAsync_should_delegate_to_underlying_sync_validator
+✔️ Conditional_child_validator_should_register_with_validator_type_not_property
+✔️ Nullable_object_with_async_condition_should_not_throw
+✔️ Nullable_object_with_condition_should_not_throw
+✔️ Property_should_return_null_when_it_is_not_a_property_being_validated
+✔️ Property_should_return_property_being_validated
+✔️ PropertyDescription_should_return_custom_property_name
+✔️ PropertyDescription_should_return_property_name_split
+✔️ Result_should_use_custom_property_name_when_no_property_name_can_be_determined
+✔️ Rule_for_a_non_memberexpression_should_not_generate_property_name
+✔️ Should_build_property_name
+✔️ Should_compile_expression
+✔️ Should_set_custom_error
+✔️ Should_set_custom_property_name
+✔️ Should_throw_if_message_is_null
+✔️ Should_throw_if_overriding_validator_is_null
+✔️ Should_throw_if_overriding_validator_provider_is_null
+✔️ Should_throw_if_property_name_is_null
+✔️ Should_throw_if_validator_is_null
+✔️ Should_throw_when_async_inverse_predicate_is_null
+✔️ Should_throw_when_async_predicate_is_null
+✔️ Should_throw_when_context_predicate_is_null
+✔️ Should_throw_when_inverse_context_predicate_is_null
+✔️ Should_throw_when_inverse_predicate_is_null
+✔️ Should_throw_when_predicate_is_null
+```
+### ✔️ <a id="user-content-r0s47" href="#r0s47">FluentValidation.Tests.RuleDependencyTests</a>
+```
+✔️ Async_inside_dependent_rules
+✔️ Async_inside_dependent_rules_when_parent_rule_not_async
+✔️ Dependent_rules_inside_ruleset
+✔️ Dependent_rules_inside_when
+✔️ Does_not_invoke_dependent_rule_if_parent_rule_does_not_pass
+✔️ Invokes_dependent_rule_if_parent_rule_passes
+✔️ Nested_dependent_rules
+✔️ Nested_dependent_rules_inside_ruleset
+✔️ Nested_dependent_rules_inside_ruleset_inside_method
+✔️ Nested_dependent_rules_inside_ruleset_no_result_when_second_level_fails
+✔️ Nested_dependent_rules_inside_ruleset_no_result_when_top_level_fails
+✔️ TestAsyncWithDependentRules_AsyncEntry
+✔️ TestAsyncWithDependentRules_SyncEntry
+✔️ Treats_root_level_RuleFor_call_as_dependent_rule_if_user_forgets_to_use_DependentRulesBuilder
+```
+### ✔️ <a id="user-content-r0s48" href="#r0s48">FluentValidation.Tests.RulesetTests</a>
+```
+✔️ Applies_multiple_rulesets_to_rule
+✔️ Combines_rulesets_and_explicit_properties
+✔️ Combines_rulesets_and_explicit_properties_async
+✔️ Executes_all_rules
+✔️ Executes_in_rule_in_default_and_none
+✔️ Executes_in_rule_in_ruleset_and_default
+✔️ Executes_multiple_rulesets
+✔️ Executes_rules_in_default_ruleset_and_specific_ruleset
+✔️ Executes_rules_in_specified_ruleset
+✔️ Executes_rules_not_specified_in_ruleset
+✔️ Includes_all_rulesets
+✔️ Includes_all_rulesets_async
+✔️ Includes_combination_of_rulesets
+✔️ Includes_combination_of_rulesets_async
+✔️ Ruleset_cascades_to_child_collection_validator
+✔️ Ruleset_cascades_to_child_validator
+✔️ Ruleset_selection_should_cascade_downwards_with_when_setting_child_validator_using_include_statement
+✔️ Ruleset_selection_should_cascade_downwards_with_when_setting_child_validator_using_include_statement_with_lambda
+✔️ Ruleset_selection_should_not_cascade_downwards_when_set_on_property
+✔️ Trims_spaces
+✔️ WithMessage_works_inside_rulesets
+```
+### ✔️ <a id="user-content-r0s49" href="#r0s49">FluentValidation.Tests.ScalePrecisionValidatorTests</a>
+```
+✔️ Scale_precision_should_be_valid
+✔️ Scale_precision_should_be_valid_when_ignoring_trailing_zeroes
+✔️ Scale_precision_should_be_valid_when_they_are_equal
+✔️ Scale_precision_should_not_be_valid
+✔️ Scale_precision_should_not_be_valid_when_ignoring_trailing_zeroes
+✔️ Scale_precision_should_not_be_valid_when_they_are_equal
+```
+### ✔️ <a id="user-content-r0s50" href="#r0s50">FluentValidation.Tests.SharedConditionTests</a>
+```
+✔️ Async_condition_can_be_used_inside_ruleset
+✔️ Condition_can_be_used_inside_ruleset
+✔️ Does_not_execute_custom_Rule_when_async_condition_false
+✔️ Does_not_execute_custom_Rule_when_condition_false
+✔️ Does_not_execute_customasync_Rule_when_async_condition_false
+✔️ Does_not_execute_customasync_Rule_when_condition_false
+✔️ Doesnt_throw_NullReferenceException_when_instance_not_null
+✔️ Doesnt_throw_NullReferenceException_when_instance_not_null_async
+✔️ Executes_custom_rule_when_async_condition_true
+✔️ Executes_custom_rule_when_condition_true
+✔️ Executes_customasync_rule_when_async_condition_true
+✔️ Executes_customasync_rule_when_condition_true
+✔️ Nested_async_conditions_with_Custom_rule
+✔️ Nested_async_conditions_with_CustomAsync_rule
+✔️ Nested_conditions_with_Custom_rule
+✔️ Nested_conditions_with_CustomAsync_rule
+✔️ Outer_async_Unless_clause_will_trump_an_inner_Unless_clause_when_inner_fails_but_the_outer_is_satisfied
+✔️ Outer_Unless_clause_will_trump_an_inner_Unless_clause_when_inner_fails_but_the_outer_is_satisfied
+✔️ Rules_invoke_when_inverse_shared_async_condition_matches
+✔️ Rules_invoke_when_inverse_shared_condition_matches
+✔️ Rules_not_invoked_when_inverse_shared_async_condition_does_not_match
+✔️ Rules_not_invoked_when_inverse_shared_condition_does_not_match
+✔️ RuleSet_can_be_used_inside_async_condition
+✔️ RuleSet_can_be_used_inside_condition
+✔️ Runs_otherwise_conditions_for_UnlessAsync
+✔️ Runs_otherwise_conditions_for_When
+✔️ Runs_otherwise_conditions_for_WhenAsync
+✔️ Runs_otherwise_conditons_for_Unless
+✔️ Shared_async_When_is_applied_to_groupd_rules_when_initial_predicate_is_true_and_all_individual_rules_are_satisfied
+✔️ Shared_async_When_is_applied_to_grouped_rules_when_initial_predicate_is_true
+✔️ Shared_async_When_is_not_applied_to_grouped_rules_when_initial_predicate_is_false
+✔️ Shared_async_When_respects_the_smaller_scope_of_a_inner_Unless_when_the_inner_Unless_predicate_fails
+✔️ Shared_async_When_respects_the_smaller_scope_of_an_inner_Unless_when_the_inner_Unless_predicate_is_satisfied
+✔️ Shared_When_is_applied_to_groupd_rules_when_initial_predicate_is_true_and_all_individual_rules_are_satisfied
+✔️ Shared_When_is_applied_to_grouped_rules_when_initial_predicate_is_true
+✔️ Shared_When_is_not_applied_to_grouped_rules_when_initial_predicate_is_false
+✔️ Shared_When_respects_the_smaller_scope_of_a_inner_Unless_when_the_inner_Unless_predicate_fails
+✔️ Shared_When_respects_the_smaller_scope_of_an_inner_Unless_when_the_inner_Unless_predicate_is_satisfied
+✔️ When_async_condition_executed_for_each_instance_of_RuleForEach_condition_should_not_be_cached
+✔️ When_condition_executed_for_each_instance_of_RuleForEach_condition_should_not_be_cached
+✔️ When_condition_only_executed_once
+✔️ WhenAsync_condition_only_executed_once
+```
+### ✔️ <a id="user-content-r0s51" href="#r0s51">FluentValidation.Tests.StandalonePropertyValidationTester</a>
+```
+✔️ Should_validate_property_value_without_instance
+```
+### ✔️ <a id="user-content-r0s52" href="#r0s52">FluentValidation.Tests.StringEnumValidatorTests</a>
+```
+✔️ IsValidTests_CaseInsensitive_CaseCorrect
+✔️ IsValidTests_CaseInsensitive_CaseIncorrect
+✔️ IsValidTests_CaseSensitive_CaseCorrect
+✔️ IsValidTests_CaseSensitive_CaseIncorrect
+✔️ When_enumType_is_not_an_enum_it_should_throw
+✔️ When_enumType_is_null_it_should_throw
+✔️ When_the_property_is_initialized_with_empty_string_then_the_validator_should_fail
+✔️ When_the_property_is_initialized_with_invalid_string_then_the_validator_should_fail
+✔️ When_the_property_is_initialized_with_null_then_the_validator_should_be_valid
+✔️ When_validation_fails_the_default_error_should_be_set
+```
+### ✔️ <a id="user-content-r0s53" href="#r0s53">FluentValidation.Tests.TrackingCollectionTests</a>
+```
+✔️ Add_AddsItem
+✔️ Should_not_raise_event_once_handler_detached
+✔️ When_Item_Added_Raises_ItemAdded
+```
+### ✔️ <a id="user-content-r0s54" href="#r0s54">FluentValidation.Tests.TransformTests</a>
+```
+✔️ Transforms_collection_element
+✔️ Transforms_collection_element_async
+✔️ Transforms_property_value
+✔️ Transforms_property_value_to_another_type
+```
+### ✔️ <a id="user-content-r0s55" href="#r0s55">FluentValidation.Tests.UserSeverityTester</a>
+```
+✔️ Can_Provide_conditional_severity
+✔️ Can_Provide_severity_for_item_in_collection
+✔️ Correctly_provides_object_being_validated
+✔️ Defaults_user_severity_to_error
+✔️ Should_use_last_supplied_severity
+✔️ Stores_user_severity_against_validation_failure
+✔️ Throws_when_provider_is_null
+```
+### ✔️ <a id="user-content-r0s56" href="#r0s56">FluentValidation.Tests.UserStateTester</a>
+```
+✔️ Can_Provide_state_for_item_in_collection
+✔️ Correctly_provides_object_being_validated
+✔️ Stores_user_state_against_validation_failure
+✔️ Throws_when_provider_is_null
+```
+### ✔️ <a id="user-content-r0s57" href="#r0s57">FluentValidation.Tests.ValidateAndThrowTester</a>
+```
+✔️ Does_not_throw_when_valid
+✔️ Does_not_throw_when_valid_and_a_ruleset
+✔️ Does_not_throw_when_valid_and_a_ruleset_async
+✔️ Does_not_throw_when_valid_async
+✔️ Only_root_validator_throws
+✔️ Populates_errors
+✔️ Serializes_exception
+✔️ Throws_exception
+✔️ Throws_exception_async
+✔️ Throws_exception_with_a_ruleset
+✔️ Throws_exception_with_a_ruleset_async
+✔️ ToString_provides_error_details
+✔️ ValidationException_provides_correct_message_when_appendDefaultMessage_false
+✔️ ValidationException_provides_correct_message_when_appendDefaultMessage_true
+```
+### ✔️ <a id="user-content-r0s58" href="#r0s58">FluentValidation.Tests.ValidationResultTests</a>
+```
+✔️ Can_serialize_failure
+✔️ Can_serialize_result
+✔️ Should_add_errors
+✔️ Should_be_valid_when_there_are_no_errors
+✔️ Should_not_be_valid_when_there_are_errors
+✔️ ToString_return_empty_string_when_there_is_no_error
+✔️ ToString_return_error_messages_with_given_separator
+✔️ ToString_return_error_messages_with_newline_as_separator
+```
+### ✔️ <a id="user-content-r0s59" href="#r0s59">FluentValidation.Tests.ValidatorDescriptorTester</a>
+```
+✔️ Does_not_throw_when_rule_declared_without_property
+✔️ Gets_validators_for_property
+✔️ GetValidatorsForMember_and_GetRulesForMember_can_both_retrieve_for_model_level_rule
+✔️ Returns_empty_collection_for_property_with_no_validators
+✔️ Should_retrieve_name_given_to_it_pass_property_as_string
+```
+### ✔️ <a id="user-content-r0s60" href="#r0s60">FluentValidation.Tests.ValidatorSelectorTests</a>
+```
+✔️ Can_use_property_with_include
+✔️ Does_not_validate_other_property
+✔️ Does_not_validate_other_property_using_expression
+✔️ Executes_correct_rule_when_using_property_with_include
+✔️ Executes_correct_rule_when_using_property_with_include_async
+✔️ Includes_nested_property
+✔️ Includes_nested_property_using_expression
+✔️ MemberNameValidatorSelector_returns_true_when_property_name_matches
+✔️ Validates_nullable_property_with_overriden_name_when_selected
+✔️ Validates_property_using_expression
+```
+### ✔️ <a id="user-content-r0s61" href="#r0s61">FluentValidation.Tests.ValidatorTesterTester</a>
+```
+✔️ Allows_only_one_failure_to_match
+✔️ Can_use_indexer_in_string_message
+✔️ Can_use_indexer_in_string_message_inverse
+✔️ Expected_error_code_check
+✔️ Expected_message_argument_check
+✔️ Expected_message_check
+✔️ Expected_severity_check
+✔️ Expected_state_check
+✔️ Matches_any_failure
+✔️ Matches_model_level_rule
+✔️ Model_level_check_fails_if_no_model_level_failures
+✔️ ShouldHaveChildValidator_should_not_throw_when_property_Does_have_child_validator
+✔️ ShouldHaveChildValidator_should_not_throw_when_property_Does_have_child_validator_and_expecting_a_basetype
+✔️ ShouldHaveChildValidator_should_not_throw_when_property_has_collection_validators
+✔️ ShouldHaveChildValidator_should_throw_when_property_has_a_different_child_validator
+✔️ ShouldHaveChildValidator_should_work_with_DependentRules
+✔️ ShouldHaveChildvalidator_throws_when_collection_property_Does_not_have_child_validator
+✔️ ShouldHaveChildValidator_throws_when_property_does_not_have_child_validator
+✔️ ShouldHaveChildValidator_works_on_model_level_rules
+✔️ ShouldHaveValidationError_async
+✔️ ShouldHaveValidationError_async_throws
+✔️ ShouldHaveValidationError_model_async
+✔️ ShouldHaveValidationError_model_async_throws
+✔️ ShouldHaveValidationError_preconstructed_object_does_not_throw_for_unwritable_property
+✔️ ShouldHaveValidationError_should_not_throw_when_there_are_errors_with_preconstructed_object
+✔️ ShouldHaveValidationError_should_not_throw_when_there_are_validation_errors
+✔️ ShouldHaveValidationError_should_not_throw_when_there_are_validation_errors__WhenAsyn_is_used(age: 42, cardNumber: "")
+✔️ ShouldHaveValidationError_should_not_throw_when_there_are_validation_errors__WhenAsyn_is_used(age: 42, cardNumber: null)
+✔️ ShouldHaveValidationError_should_not_throw_when_there_are_validation_errors_ruleforeach
+✔️ ShouldHaveValidationError_Should_support_nested_properties
+✔️ ShouldHaveValidationError_Should_throw_when_there_are_no_validation_errors
+✔️ ShouldHaveValidationError_should_throw_when_there_are_no_validation_errors_with_preconstructed_object
+✔️ ShouldHaveValidationError_should_throw_when_there_are_not_validation_errors__WhenAsyn_Is_Used(age: 17, cardNumber: "")
+✔️ ShouldHaveValidationError_should_throw_when_there_are_not_validation_errors__WhenAsyn_Is_Used(age: 17, cardNumber: "cardNumber")
+✔️ ShouldHaveValidationError_should_throw_when_there_are_not_validation_errors__WhenAsyn_Is_Used(age: 17, cardNumber: null)
+✔️ ShouldHaveValidationError_should_throw_when_there_are_not_validation_errors__WhenAsyn_Is_Used(age: 42, cardNumber: "cardNumber")
+✔️ ShouldHaveValidationError_should_throw_when_there_are_not_validation_errors_ruleforeach
+✔️ ShouldHaveValidationError_with_an_unmatched_rule_and_a_single_error_should_throw_an_exception
+✔️ ShouldHaveValidationError_with_an_unmatched_rule_and_multiple_errors_should_throw_an_exception
+✔️ ShouldHaveValidationErrorFor_takes_account_of_rulesets
+✔️ ShouldHaveValidationErrorFor_takes_account_of_rulesets_fluent_approach
+✔️ ShouldNotHaveValidationError_async
+✔️ ShouldNotHaveValidationError_async_model_throws
+✔️ ShouldNotHaveValidationError_async_throws
+✔️ ShouldNotHaveValidationError_model_async
+✔️ ShouldNotHaveValidationError_should_correctly_handle_explicitly_providing_object_to_validate
+✔️ ShouldNotHaveValidationError_should_correctly_handle_explicitly_providing_object_to_validate_and_other_property_fails_validation
+✔️ ShouldNotHaveValidationError_should_have_validation_error_details_when_thrown_ruleforeach
+✔️ ShouldNotHaveValidationError_should_not_throw_when_there_are_no_errors
+✔️ ShouldNotHAveValidationError_should_not_throw_When_there_are_no_errors_with_preconstructed_object
+✔️ ShouldNotHaveValidationError_should_not_throw_when_there_are_not_validation_errors_ruleforeach
+✔️ ShouldNotHaveValidationError_Should_support_nested_properties
+✔️ ShouldNotHaveValidationError_should_throw_when_there_are_errors
+✔️ ShouldNotHaveValidationError_should_throw_when_there_are_errors_with_preconstructed_object
+✔️ ShouldNotHaveValidationError_should_throw_when_there_are_not_validation_errors__WhenAsyn_is_used(age: 17, cardNumber: "")
+✔️ ShouldNotHaveValidationError_should_throw_when_there_are_not_validation_errors__WhenAsyn_is_used(age: 17, cardNumber: "cardNumber")
+✔️ ShouldNotHaveValidationError_should_throw_when_there_are_not_validation_errors__WhenAsyn_is_used(age: 17, cardNumber: null)
+✔️ ShouldNotHaveValidationError_should_throw_when_there_are_not_validation_errors__WhenAsyn_is_used(age: 42, cardNumber: "cardNumber")
+✔️ ShouldNotHaveValidationError_should_throw_when_there_are_validation_errors__WhenAsyn_is_used(age: 42, cardNumber: "")
+✔️ ShouldNotHaveValidationError_should_throw_when_there_are_validation_errors__WhenAsyn_is_used(age: 42, cardNumber: null)
+✔️ ShouldNotHaveValidationError_should_throw_when_there_are_validation_errors_ruleforeach
+✔️ Tests_nested_property
+✔️ Tests_nested_property_reverse
+✔️ Tests_nested_property_using_obsolete_method
+✔️ TestValidate_runs_async
+✔️ TestValidate_runs_async_throws
+✔️ Unexpected_error_code_check
+✔️ Unexpected_message_check(withoutErrMsg: "bar", errMessages: ["bar"])
+✔️ Unexpected_message_check(withoutErrMsg: "bar", errMessages: ["foo", "bar"])
+✔️ Unexpected_message_check(withoutErrMsg: "bar", errMessages: ["foo"])
+✔️ Unexpected_message_check(withoutErrMsg: "bar", errMessages: [])
+✔️ Unexpected_severity_check
+✔️ Unexpected_state_check
+```
\ No newline at end of file
diff --git a/test-reporter/__tests__/__outputs__/jest-junit.md b/test-reporter/__tests__/__outputs__/jest-junit.md
new file mode 100644
index 0000000..5aecf5d
--- /dev/null
+++ b/test-reporter/__tests__/__outputs__/jest-junit.md
@@ -0,0 +1,26 @@
+![Tests failed](https://img.shields.io/badge/tests-1%20passed%2C%204%20failed%2C%201%20skipped-critical)
+## ❌ <a id="user-content-r0" href="#r0">fixtures/jest-junit.xml</a>
+**6** tests were completed in **1s** with **1** passed, **4** failed and **1** skipped.
+|Test suite|Passed|Failed|Skipped|Time|
+|:---|---:|---:|---:|---:|
+|[__tests__\main.test.js](#r0s0)|1✔️|3❌||486ms|
+|[__tests__\second.test.js](#r0s1)||1❌|1✖️|82ms|
+### ❌ <a id="user-content-r0s0" href="#r0s0">__tests__\main.test.js</a>
+```
+Test 1
+  ✔️ Passing test
+Test 1 › Test 1.1
+  ❌ Failing test
+	Error: expect(received).toBeTruthy()
+  ❌ Exception in target unit
+	Error: Some error
+Test 2
+  ❌ Exception in test
+	Error: Some error
+```
+### ❌ <a id="user-content-r0s1" href="#r0s1">__tests__\second.test.js</a>
+```
+❌ Timeout test
+	: Timeout - Async callback was not invoked within the 1 ms timeout specified by jest.setTimeout.Timeout - Async callback was not invoked within the 1 ms timeout specified by jest.setTimeout.Error:
+✖️ Skipped test
+```
\ No newline at end of file
diff --git a/test-reporter/__tests__/__outputs__/jest-test-results.md b/test-reporter/__tests__/__outputs__/jest-test-results.md
new file mode 100644
index 0000000..ed545bf
--- /dev/null
+++ b/test-reporter/__tests__/__outputs__/jest-test-results.md
@@ -0,0 +1,432 @@
+![Tests failed](https://img.shields.io/badge/tests-4207%20passed%2C%202%20failed%2C%2030%20skipped-critical)
+## ❌ <a id="user-content-r0" href="#r0">fixtures/external/jest/jest-test-results.xml</a>
+**4239** tests were completed in **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|
+### ❌ <a id="user-content-r0s75" href="#r0s75">e2e/__tests__/jestChangedFiles.test.ts</a>
+```
+✔️ gets hg SCM roots and dedupes them
+✔️ gets git SCM roots and dedupes them
+✔️ gets mixed git and hg SCM roots and dedupes them
+✔️ gets changed files for git
+✔️ monitors only root paths for git
+✔️ does not find changes in files with no diff, for git
+✔️ handles a bad revision for "changedSince", for git
+❌ gets changed files for hg
+	Error: abort: empty revision range
+✔️ monitors only root paths for hg
+✔️ handles a bad revision for "changedSince", for hg
+```
+### ❌ <a id="user-content-r0s98" href="#r0s98">e2e/__tests__/onlyChanged.test.ts</a>
+```
+✔️ run for "onlyChanged" and "changedSince"
+✔️ run only changed files
+✔️ report test coverage for only changed files
+✔️ report test coverage of source on test file change under only changed files
+✔️ do not pickup non-tested files when reporting coverage on only changed files
+✔️ collect test coverage when using onlyChanged
+✔️ onlyChanged in config is overwritten by --all or testPathPattern
+❌ gets changed files for hg
+	Error: expect(received).toMatch(expected)
+✔️ path on Windows is case-insensitive
+```
\ No newline at end of file
diff --git a/test-reporter/__tests__/__outputs__/mocha-json.md b/test-reporter/__tests__/__outputs__/mocha-json.md
new file mode 100644
index 0000000..9eadcae
--- /dev/null
+++ b/test-reporter/__tests__/__outputs__/mocha-json.md
@@ -0,0 +1,29 @@
+![Tests failed](https://img.shields.io/badge/tests-1%20passed%2C%204%20failed%2C%201%20skipped-critical)
+## ❌ <a id="user-content-r0" href="#r0">fixtures/mocha-json.json</a>
+**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|
+### ❌ <a id="user-content-r0s0" href="#r0s0">test/main.test.js</a>
+```
+Test 1
+  ✔️ Passing test
+Test 1 Test 1.1
+  ❌ Exception in target unit
+	Some error
+  ❌ Failing test
+	Expected values to be strictly equal:
+	
+	false !== true
+	
+Test 2
+  ❌ Exception in test
+	Some error
+```
+### ❌ <a id="user-content-r0s1" href="#r0s1">test/second.test.js</a>
+```
+✖️ Skipped test
+❌ Timeout test
+	Timeout of 1ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves. (C:\Users\Michal\Workspace\dorny\test-reporter\reports\mocha\test\second.test.js)
+```
\ No newline at end of file
diff --git a/test-reporter/__tests__/__outputs__/mocha-test-results.md b/test-reporter/__tests__/__outputs__/mocha-test-results.md
new file mode 100644
index 0000000..fd85859
--- /dev/null
+++ b/test-reporter/__tests__/__outputs__/mocha-test-results.md
@@ -0,0 +1,41 @@
+![Tests passed successfully](https://img.shields.io/badge/tests-833%20passed%2C%206%20skipped-success)
+## ✔️ <a id="user-content-r0" href="#r0">fixtures/external/mocha/mocha-test-results.json</a>
+**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|14✔️|||8ms|
+|test/node-unit/cli/config.spec.js|10✔️|||8ms|
+|test/node-unit/cli/node-flags.spec.js|105✔️|||9ms|
+|test/node-unit/cli/options.spec.js|36✔️|||250ms|
+|test/node-unit/cli/run-helpers.spec.js|9✔️|||8ms|
+|test/node-unit/cli/run.spec.js|40✔️|||4ms|
+|test/node-unit/mocha.spec.js|24✔️|||33ms|
+|test/node-unit/parallel-buffered-runner.spec.js|19✔️|||23ms|
+|test/node-unit/reporters/parallel-buffered.spec.js|6✔️|||16ms|
+|test/node-unit/serializer.spec.js|40✔️|||31ms|
+|test/node-unit/stack-trace-filter.spec.js|2✔️||4✖️|1ms|
+|test/node-unit/utils.spec.js|5✔️|||1ms|
+|test/node-unit/worker.spec.js|15✔️|||92ms|
+|test/unit/context.spec.js|8✔️|||5ms|
+|test/unit/duration.spec.js|3✔️|||166ms|
+|test/unit/errors.spec.js|13✔️|||5ms|
+|test/unit/globals.spec.js|4✔️|||0ms|
+|test/unit/grep.spec.js|8✔️|||2ms|
+|test/unit/hook-async.spec.js|3✔️|||1ms|
+|test/unit/hook-sync-nested.spec.js|4✔️|||1ms|
+|test/unit/hook-sync.spec.js|3✔️|||0ms|
+|test/unit/hook-timeout.spec.js|1✔️|||0ms|
+|test/unit/hook.spec.js|4✔️|||0ms|
+|test/unit/mocha.spec.js|115✔️||1✖️|128ms|
+|test/unit/overspecified-async.spec.js|1✔️|||3ms|
+|test/unit/parse-query.spec.js|2✔️|||1ms|
+|test/unit/plugin-loader.spec.js|41✔️||1✖️|16ms|
+|test/unit/required-tokens.spec.js|1✔️|||0ms|
+|test/unit/root.spec.js|1✔️|||0ms|
+|test/unit/runnable.spec.js|55✔️|||122ms|
+|test/unit/runner.spec.js|77✔️|||43ms|
+|test/unit/suite.spec.js|57✔️|||14ms|
+|test/unit/test.spec.js|15✔️|||0ms|
+|test/unit/throw.spec.js|9✔️|||9ms|
+|test/unit/timeout.spec.js|8✔️|||109ms|
+|test/unit/utils.spec.js|75✔️|||24ms|
\ No newline at end of file
diff --git a/test-reporter/__tests__/__outputs__/provider-test-results.md b/test-reporter/__tests__/__outputs__/provider-test-results.md
new file mode 100644
index 0000000..79b13aa
--- /dev/null
+++ b/test-reporter/__tests__/__outputs__/provider-test-results.md
@@ -0,0 +1,374 @@
+![Tests failed](https://img.shields.io/badge/tests-268%20passed%2C%201%20failed-critical)
+## ❌ <a id="user-content-r0" href="#r0">fixtures/external/flutter/provider-test-results.json</a>
+**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|
+### ✔️ <a id="user-content-r0s0" href="#r0s0">test/builder_test.dart</a>
+```
+ChangeNotifierProvider
+  ✔️ default
+  ✔️ .value
+ListenableProvider
+  ✔️ default
+  ✔️ .value
+Provider
+  ✔️ default
+  ✔️ .value
+ProxyProvider
+  ✔️ 0
+  ✔️ 1
+  ✔️ 2
+  ✔️ 3
+  ✔️ 4
+  ✔️ 5
+  ✔️ 6
+MultiProvider
+  ✔️ with 1 ChangeNotifierProvider default
+  ✔️ with 2 ChangeNotifierProvider default
+  ✔️ with ListenableProvider default
+  ✔️ with Provider default
+  ✔️ with ProxyProvider0
+  ✔️ with ProxyProvider1
+  ✔️ with ProxyProvider2
+  ✔️ with ProxyProvider3
+  ✔️ with ProxyProvider4
+  ✔️ with ProxyProvider5
+  ✔️ with ProxyProvider6
+```
+### ✔️ <a id="user-content-r0s1" href="#r0s1">test/change_notifier_provider_test.dart</a>
+```
+✔️ Use builder property, not child
+ChangeNotifierProvider
+  ✔️ value
+  ✔️ builder
+  ✔️ builder1
+  ✔️ builder2
+  ✔️ builder3
+  ✔️ builder4
+  ✔️ builder5
+  ✔️ builder6
+  ✔️ builder0
+```
+### ✔️ <a id="user-content-r0s2" href="#r0s2">test/consumer_test.dart</a>
+```
+consumer
+  ✔️ obtains value from Provider<T>
+  ✔️ crashed with no builder
+  ✔️ can be used inside MultiProvider
+consumer2
+  ✔️ obtains value from Provider<T>
+  ✔️ crashed with no builder
+  ✔️ can be used inside MultiProvider
+consumer3
+  ✔️ obtains value from Provider<T>
+  ✔️ crashed with no builder
+  ✔️ can be used inside MultiProvider
+consumer4
+  ✔️ obtains value from Provider<T>
+  ✔️ crashed with no builder
+  ✔️ can be used inside MultiProvider
+consumer5
+  ✔️ obtains value from Provider<T>
+  ✔️ crashed with no builder
+  ✔️ can be used inside MultiProvider
+consumer6
+  ✔️ obtains value from Provider<T>
+  ✔️ crashed with no builder
+  ✔️ can be used inside MultiProvider
+```
+### ✔️ <a id="user-content-r0s3" href="#r0s3">test/context_test.dart</a>
+```
+✔️ watch in layoutbuilder
+✔️ select in layoutbuilder
+✔️ cannot select in listView
+✔️ watch in listView
+✔️ watch in gridView
+✔️ clears select dependencies for all dependents
+BuildContext
+  ✔️ internal selected value is updated
+  ✔️ create can use read without being lazy
+  ✔️ watch can be used inside InheritedProvider.update
+  ✔️ select doesn't fail if it loads a provider that depends on other providers
+  ✔️ don't call old selectors if the child rebuilds individually
+  ✔️ selects throws inside click handlers
+  ✔️ select throws if try to read dynamic
+  ✔️ select throws ProviderNotFoundException
+  ✔️ select throws if watch called inside the callback from build
+  ✔️ select throws if read called inside the callback from build
+  ✔️ select throws if select called inside the callback from build
+  ✔️ select throws if read called inside the callback on dependency change
+  ✔️ select throws if watch called inside the callback on dependency change
+  ✔️ select throws if select called inside the callback on dependency change
+  ✔️ can call read inside didChangeDependencies
+  ✔️ select cannot be called inside didChangeDependencies
+  ✔️ select in initState throws
+  ✔️ watch in initState throws
+  ✔️ read in initState works
+  ✔️ consumer can be removed and selector stops to be called
+  ✔️ context.select deeply compares maps
+  ✔️ context.select deeply compares lists
+  ✔️ context.select deeply compares iterables
+  ✔️ context.select deeply compares sets
+  ✔️ context.watch listens to value changes
+```
+### ✔️ <a id="user-content-r0s4" href="#r0s4">test/future_provider_test.dart</a>
+```
+✔️ works with MultiProvider
+✔️ (catchError) previous future completes after transition is no-op
+✔️ previous future completes after transition is no-op
+✔️ transition from future to future preserve state
+✔️ throws if future has error and catchError is missing
+✔️ calls catchError if present and future has error
+✔️ works with null
+✔️ create and dispose future with builder
+✔️ FutureProvider() crashes if builder is null
+FutureProvider()
+  ✔️ crashes if builder is null
+```
+### ✔️ <a id="user-content-r0s5" href="#r0s5">test/inherited_provider_test.dart</a>
+```
+✔️ regression test #377
+✔️ rebuild on dependency flags update
+✔️ properly update debug flags if a create triggers another deferred create
+✔️ properly update debug flags if a create triggers another deferred create
+✔️ properly update debug flags if an update triggers another create/update
+✔️ properly update debug flags if a create triggers another create/update
+✔️ Provider.of(listen: false) outside of build works when it loads a provider
+✔️ new value is available in didChangeDependencies
+✔️ builder receives the current value and updates independently from `update`
+✔️ builder can _not_ rebuild when provider updates
+✔️ builder rebuilds if provider is recreated
+✔️ provider.of throws if listen:true outside of the widget tree
+✔️ InheritedProvider throws if no child is provided with default constructor
+✔️ InheritedProvider throws if no child is provided with value constructor
+✔️ DeferredInheritedProvider throws if no child is provided with default constructor
+✔️ DeferredInheritedProvider throws if no child is provided with value constructor
+✔️ startListening markNeedsNotifyDependents
+✔️ InheritedProvider can be subclassed
+✔️ DeferredInheritedProvider can be subclassed
+✔️ can be used with MultiProvider
+✔️ throw if the widget ctor changes
+✔️ InheritedProvider lazy loading can be disabled
+✔️ InheritedProvider.value lazy loading can be disabled
+✔️ InheritedProvider subclass don't have to specify default lazy value
+✔️ DeferredInheritedProvider lazy loading can be disabled
+✔️ DeferredInheritedProvider.value lazy loading can be disabled
+✔️ selector
+✔️ can select multiple types from same provider
+✔️ can select same type on two different providers
+✔️ can select same type twice on same provider
+✔️ Provider.of has a proper error message if context is null
+diagnostics
+  ✔️ InheritedProvider.value
+  ✔️ InheritedProvider doesn't break lazy loading
+  ✔️ InheritedProvider show if listening
+  ✔️ DeferredInheritedProvider.value
+  ✔️ DeferredInheritedProvider
+InheritedProvider.value()
+  ✔️ markNeedsNotifyDependents during startListening is noop
+  ✔️ startListening called again when create returns new value
+  ✔️ startListening
+  ✔️ stopListening not called twice if rebuild doesn't have listeners
+  ✔️ removeListener cannot be null
+  ✔️ pass down current value
+  ✔️ default updateShouldNotify
+  ✔️ custom updateShouldNotify
+InheritedProvider()
+  ✔️ hasValue
+  ✔️ provider calls update if rebuilding only due to didChangeDependencies
+  ✔️ provider notifying dependents doesn't call update
+  ✔️ update can call Provider.of with listen:true
+  ✔️ update lazy loaded can call Provider.of with listen:true
+  ✔️ markNeedsNotifyDependents during startListening is noop
+  ✔️ update can obtain parent of the same type than self
+  ✔️ _debugCheckInvalidValueType
+  ✔️ startListening
+  ✔️ startListening called again when create returns new value
+  ✔️ stopListening not called twice if rebuild doesn't have listeners
+  ✔️ removeListener cannot be null
+  ✔️ fails if initialValueBuilder calls inheritFromElement/inheritFromWiggetOfExactType
+  ✔️ builder is called on every rebuild and after a dependency change
+  ✔️ builder with no updateShouldNotify use ==
+  ✔️ builder calls updateShouldNotify callback
+  ✔️ initialValue is transmitted to valueBuilder
+  ✔️ calls builder again if dependencies change
+  ✔️ exposes initialValue if valueBuilder is null
+  ✔️ call dispose on unmount
+  ✔️ builder unmount, dispose not called if value never read
+  ✔️ call dispose after new value
+  ✔️ valueBuilder works without initialBuilder
+  ✔️ calls initialValueBuilder lazily once
+  ✔️ throws if both builder and initialBuilder are missing
+DeferredInheritedProvider.value()
+  ✔️ hasValue
+  ✔️ startListening
+  ✔️ stopListening cannot be null
+  ✔️ startListening doesn't need setState if already initialized
+  ✔️ setState without updateShouldNotify
+  ✔️ setState with updateShouldNotify
+  ✔️ startListening never leave the widget uninitialized
+  ✔️ startListening called again on controller change
+DeferredInheritedProvider()
+  ✔️ create can't call inherited widgets
+  ✔️ creates the value lazily
+  ✔️ dispose
+  ✔️ dispose no-op if never built
+```
+### ✔️ <a id="user-content-r0s6" href="#r0s6">test/listenable_provider_test.dart</a>
+```
+ListenableProvider
+  ✔️ works with MultiProvider
+  ✔️ asserts that the created notifier can have listeners
+  ✔️ don't listen again if listenable instance doesn't change
+  ✔️ works with null (default)
+  ✔️ works with null (create)
+  ✔️ stateful create called once
+  ✔️ dispose called on unmount
+  ✔️ dispose can be null
+  ✔️ changing listenable rebuilds descendants
+  ✔️ rebuilding with the same provider don't rebuilds descendants
+  ✔️ notifylistener rebuilds descendants
+ListenableProvider value constructor
+  ✔️ pass down key
+  ✔️ changing the Listenable instance rebuilds dependents
+ListenableProvider stateful constructor
+  ✔️ called with context
+  ✔️ pass down key
+  ✔️ throws if create is null
+```
+### ✔️ <a id="user-content-r0s7" href="#r0s7">test/listenable_proxy_provider_test.dart</a>
+```
+ListenableProxyProvider
+  ✔️ throws if update is missing
+  ✔️ asserts that the created notifier has no listener
+  ✔️ asserts that the created notifier has no listener after rebuild
+  ✔️ rebuilds dependendents when listeners are called
+  ✔️ update returning a new Listenable disposes the previously created value and update dependents
+  ✔️ disposes of created value
+ListenableProxyProvider variants
+  ✔️ ListenableProxyProvider
+  ✔️ ListenableProxyProvider2
+  ✔️ ListenableProxyProvider3
+  ✔️ ListenableProxyProvider4
+  ✔️ ListenableProxyProvider5
+  ✔️ ListenableProxyProvider6
+```
+### ✔️ <a id="user-content-r0s8" href="#r0s8">test/multi_provider_test.dart</a>
+```
+MultiProvider
+  ✔️ throw if providers is null
+  ✔️ MultiProvider children can only access parent providers
+  ✔️ MultiProvider.providers with ignored child
+```
+### ✔️ <a id="user-content-r0s9" href="#r0s9">test/provider_test.dart</a>
+```
+✔️ works with MultiProvider
+Provider.of
+  ✔️ throws if T is dynamic
+  ✔️ listen defaults to true when building widgets
+  ✔️ listen defaults to false outside of the widget tree
+  ✔️ listen:false doesn't trigger rebuild
+  ✔️ listen:true outside of the widget tree throws
+Provider
+  ✔️ throws if the provided value is a Listenable/Stream
+  ✔️ debugCheckInvalidValueType can be disabled
+  ✔️ simple usage
+  ✔️ throws an error if no provider found
+  ✔️ update should notify
+```
+### ✔️ <a id="user-content-r0s10" href="#r0s10">test/proxy_provider_test.dart</a>
+```
+ProxyProvider
+  ✔️ throws if the provided value is a Listenable/Stream
+  ✔️ debugCheckInvalidValueType can be disabled
+  ✔️ create creates initial value
+  ✔️ consume another providers
+  ✔️ rebuild descendants if value change
+  ✔️ call dispose when unmounted with the latest result
+  ✔️ don't rebuild descendants if value doesn't change
+  ✔️ pass down updateShouldNotify
+  ✔️ works with MultiProvider
+  ✔️ update callback can trigger descendants setState synchronously
+  ✔️ throws if update is null
+ProxyProvider variants
+  ✔️ ProxyProvider2
+  ✔️ ProxyProvider3
+  ✔️ ProxyProvider4
+  ✔️ ProxyProvider5
+  ✔️ ProxyProvider6
+```
+### ✔️ <a id="user-content-r0s11" href="#r0s11">test/reassemble_test.dart</a>
+```
+✔️ ReassembleHandler
+✔️ unevaluated create
+✔️ unevaluated create
+```
+### ✔️ <a id="user-content-r0s12" href="#r0s12">test/selector_test.dart</a>
+```
+✔️ asserts that builder/selector are not null
+✔️ Deep compare maps by default
+✔️ Deep compare iterables by default
+✔️ Deep compare sets by default
+✔️ Deep compare lists by default
+✔️ custom shouldRebuid
+✔️ passes `child` and `key`
+✔️ calls builder if the callback changes
+✔️ works with MultiProvider
+✔️ don't call builder again if it rebuilds but selector returns the same thing
+✔️ call builder again if it rebuilds abd selector returns the a different variable
+✔️ Selector
+✔️ Selector2
+✔️ Selector3
+✔️ Selector4
+✔️ Selector5
+✔️ Selector6
+```
+### ✔️ <a id="user-content-r0s13" href="#r0s13">test/stateful_provider_test.dart</a>
+```
+✔️ asserts
+✔️ works with MultiProvider
+✔️ calls create only once
+✔️ dispose
+```
+### ✔️ <a id="user-content-r0s14" href="#r0s14">test/stream_provider_test.dart</a>
+```
+✔️ works with MultiProvider
+✔️ transition from stream to stream preserve state
+✔️ throws if stream has error and catchError is missing
+✔️ calls catchError if present and stream has error
+✔️ works with null
+✔️ StreamProvider() crashes if builder is null
+StreamProvider()
+  ✔️ create and dispose stream with builder
+  ✔️ crashes if builder is null
+```
+### ❌ <a id="user-content-r0s15" href="#r0s15">test/value_listenable_provider_test.dart</a>
+```
+valueListenableProvider
+  ✔️ rebuilds when value change
+  ✔️ don't rebuild dependents by default
+  ✔️ pass keys
+  ✔️ don't listen again if stream instance doesn't change
+  ❌ pass updateShouldNotify
+	The following TestFailure object was thrown running a test:
+	  Expected: <2>
+	  Actual: <1>
+	Unexpected number of calls
+	
+```
\ No newline at end of file
diff --git a/test-reporter/__tests__/__outputs__/pulsar-test-results-no-merge.md b/test-reporter/__tests__/__outputs__/pulsar-test-results-no-merge.md
new file mode 100644
index 0000000..dbf7601
--- /dev/null
+++ b/test-reporter/__tests__/__outputs__/pulsar-test-results-no-merge.md
@@ -0,0 +1,12 @@
+![Tests failed](https://img.shields.io/badge/tests-1%20failed%2C%201%20skipped-critical)
+## ❌ <a id="user-content-r0" href="#r0">fixtures/external/java/TEST-org.apache.pulsar.AddMissingPatchVersionTest.xml</a>
+**2** tests were completed in **116ms** with **0** passed, **1** failed and **1** skipped.
+|Test suite|Passed|Failed|Skipped|Time|
+|:---|---:|---:|---:|---:|
+|[org.apache.pulsar.AddMissingPatchVersionTest](#r0s0)||1❌|1✖️|116ms|
+### ❌ <a id="user-content-r0s0" href="#r0s0">org.apache.pulsar.AddMissingPatchVersionTest</a>
+```
+✖️ testVersionStrings
+❌ testVersionStrings
+	java.lang.AssertionError: expected [1.2.1] but found [1.2.0]
+```
\ No newline at end of file
diff --git a/test-reporter/__tests__/__outputs__/pulsar-test-results.md b/test-reporter/__tests__/__outputs__/pulsar-test-results.md
new file mode 100644
index 0000000..88e8bea
--- /dev/null
+++ b/test-reporter/__tests__/__outputs__/pulsar-test-results.md
@@ -0,0 +1,1518 @@
+![Tests failed](https://img.shields.io/badge/tests-793%20passed%2C%201%20failed%2C%2014%20skipped-critical)
+## ❌ <a id="user-content-r0" href="#r0">fixtures/external/java/pulsar-test-report.xml</a>
+**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|
+### ❌ <a id="user-content-r0s0" href="#r0s0">org.apache.pulsar.AddMissingPatchVersionTest</a>
+```
+✖️ testVersionStrings
+❌ testVersionStrings
+	java.lang.AssertionError: expected [1.2.1] but found [1.2.0]
+```
+### ✔️ <a id="user-content-r0s1" href="#r0s1">org.apache.pulsar.broker.admin.AdminApiOffloadTest</a>
+```
+✔️ testOffloadPoliciesAppliedApi
+✔️ testOffloadV2
+✔️ testTopicLevelOffloadNonPartitioned
+✔️ testTopicLevelOffloadPartitioned
+✔️ testOffloadV1
+✔️ testOffloadPolicies
+✔️ testOffloadPoliciesApi
+```
+### ✔️ <a id="user-content-r0s2" href="#r0s2">org.apache.pulsar.broker.auth.AuthenticationServiceTest</a>
+```
+✔️ testAuthentication
+✔️ testAuthenticationHttp
+```
+### ✔️ <a id="user-content-r0s3" href="#r0s3">org.apache.pulsar.broker.auth.AuthLogsTest</a>
+```
+✔️ httpEndpoint
+✔️ binaryEndpoint
+```
+### ✔️ <a id="user-content-r0s4" href="#r0s4">org.apache.pulsar.broker.auth.AuthorizationTest</a>
+```
+✔️ simple
+```
+### ✔️ <a id="user-content-r0s5" href="#r0s5">org.apache.pulsar.broker.lookup.http.HttpTopicLookupv2Test</a>
+```
+✔️ crossColoLookup
+✔️ testNotEnoughLookupPermits
+✔️ testValidateReplicationSettingsOnNamespace
+✔️ testDataPojo
+```
+### ✔️ <a id="user-content-r0s6" href="#r0s6">org.apache.pulsar.broker.namespace.NamespaceCreateBundlesTest</a>
+```
+✔️ testCreateNamespaceWithDefaultBundles
+✔️ testSplitBundleUpdatesLocalPoliciesWithoutOverwriting
+```
+### ✔️ <a id="user-content-r0s7" href="#r0s7">org.apache.pulsar.broker.namespace.NamespaceOwnershipListenerTests</a>
+```
+✔️ testGetAllPartitions
+✔️ testNamespaceBundleOwnershipListener
+```
+### ✔️ <a id="user-content-r0s8" href="#r0s8">org.apache.pulsar.broker.namespace.NamespaceServiceTest</a>
+```
+✔️ testSplitMapWithRefreshedStatMap
+✔️ testRemoveOwnershipNamespaceBundle
+✔️ testIsServiceUnitDisabled
+✔️ testLoadReportDeserialize
+✔️ testCreateLookupResult
+✔️ testUnloadNamespaceBundleWithStuckTopic
+✔️ testUnloadNamespaceBundleFailure
+✔️ testSplitAndOwnBundles
+✔️ testCreateNamespaceWithDefaultNumberOfBundles
+✔️ testRemoveOwnershipAndSplitBundle
+```
+### ✔️ <a id="user-content-r0s9" href="#r0s9">org.apache.pulsar.broker.namespace.NamespaceUnloadingTest</a>
+```
+✔️ testUnloadNotLoadedNamespace
+✔️ testUnloadPartiallyLoadedNamespace
+```
+### ✔️ <a id="user-content-r0s10" href="#r0s10">org.apache.pulsar.broker.namespace.OwnerShipCacheForCurrentServerTest</a>
+```
+✔️ testOwnershipForCurrentServer
+```
+### ✔️ <a id="user-content-r0s11" href="#r0s11">org.apache.pulsar.broker.namespace.OwnershipCacheTest</a>
+```
+✔️ testGetOwnedServiceUnits
+✔️ testRemoveOwnership
+✔️ testGetOwnedServiceUnit
+✔️ testGetOrSetOwner
+✔️ testConstructor
+✔️ testGetOwner
+✔️ testDisableOwnership
+✔️ testReestablishOwnership
+```
+### ✔️ <a id="user-content-r0s12" href="#r0s12">org.apache.pulsar.broker.protocol.ProtocolHandlersTest</a>
+```
+✔️ testStart
+✔️ testGetProtocol
+✔️ testNewChannelInitializersSuccess
+✔️ testInitialize
+✔️ testNewChannelInitializersOverlapped
+✔️ testGetProtocolDataToAdvertise
+```
+### ✔️ <a id="user-content-r0s13" href="#r0s13">org.apache.pulsar.broker.protocol.ProtocolHandlerUtilsTest</a>
+```
+✔️ testLoadProtocolHandler
+✔️ testLoadProtocolHandlerBlankHandlerClass
+✔️ testLoadProtocolHandlerWrongHandlerClass
+```
+### ✔️ <a id="user-content-r0s14" href="#r0s14">org.apache.pulsar.broker.protocol.ProtocolHandlerWithClassLoaderTest</a>
+```
+✔️ testWrapper
+```
+### ✔️ <a id="user-content-r0s15" href="#r0s15">org.apache.pulsar.broker.PulsarServiceTest</a>
+```
+✔️ testGetWorkerService
+✔️ testGetWorkerServiceException
+```
+### ✔️ <a id="user-content-r0s16" href="#r0s16">org.apache.pulsar.broker.service.MessagePublishBufferThrottleTest</a>
+```
+✔️ testMessagePublishBufferThrottleEnable
+✔️ testBlockByPublishRateLimiting
+✔️ testMessagePublishBufferThrottleDisabled
+```
+### ✔️ <a id="user-content-r0s17" href="#r0s17">org.apache.pulsar.broker.service.ReplicatorTest</a>
+```
+✔️ testResumptionAfterBacklogRelaxed
+✔️ testReplicationOverrides
+✔️ testResetCursorNotFail
+✔️ testUpdateGlobalTopicPartition
+✔️ testReplication
+✔️ testReplicatorOnPartitionedTopic
+✔️ testConcurrentReplicator
+✔️ testTopicReplicatedAndProducerCreate
+✔️ testDeleteReplicatorFailure
+✔️ testReplicatorOnPartitionedTopic
+✔️ testReplicationForBatchMessages
+✔️ testReplicatorClearBacklog
+✔️ verifyChecksumAfterReplication
+✔️ testCloseReplicatorStartProducer
+✔️ activeBrokerParse
+✔️ testReplicatePeekAndSkip
+✔️ testReplication
+✔️ testReplicatedCluster
+✔️ testTopicReplicatedAndProducerCreate
+✔️ testConfigChange
+✔️ testFailures
+✔️ testReplicatorProducerClosing
+```
+### ✔️ <a id="user-content-r0s18" href="#r0s18">org.apache.pulsar.broker.service.TopicOwnerTest</a>
+```
+✔️ testReleaseOwnershipWithZookeeperDisconnectedBeforeOwnershipNodeDeleted
+✔️ testAcquireOwnershipWithZookeeperDisconnectedAfterOwnershipNodeCreated
+✔️ testConnectToInvalidateBundleCacheBroker
+✔️ testAcquireOwnershipWithZookeeperDisconnectedBeforeOwnershipNodeCreated
+✔️ testLookupPartitionedTopic
+✔️ testListNonPersistentTopic
+✔️ testReleaseOwnershipWithZookeeperDisconnectedAfterOwnershipNodeDeleted
+✔️ testReestablishOwnershipAfterInvalidateCache
+```
+### ✔️ <a id="user-content-r0s19" href="#r0s19">org.apache.pulsar.broker.SLAMonitoringTest</a>
+```
+✔️ testOwnedNamespaces
+✔️ testOwnershipAfterSetup
+✔️ testUnloadIfBrokerCrashes
+✔️ testOwnershipViaAdminAfterSetup
+```
+### ✔️ <a id="user-content-r0s20" href="#r0s20">org.apache.pulsar.broker.stats.BookieClientsStatsGeneratorTest</a>
+```
+✔️ testJvmDirectMemoryUsedMetric
+✔️ testBookieClientStatsGenerator
+```
+### ✔️ <a id="user-content-r0s21" href="#r0s21">org.apache.pulsar.broker.stats.ConsumerStatsTest</a>
+```
+✔️ testAckStatsOnPartitionedTopicForExclusiveSubscription
+✔️ testConsumerStatsOnZeroMaxUnackedMessagesPerConsumer
+✔️ testUpdateStatsForActiveConsumerAndSubscription
+```
+### ✔️ <a id="user-content-r0s22" href="#r0s22">org.apache.pulsar.broker.stats.ManagedCursorMetricsTest</a>
+```
+✔️ testManagedCursorMetrics
+```
+### ✔️ <a id="user-content-r0s23" href="#r0s23">org.apache.pulsar.broker.stats.ManagedLedgerMetricsTest</a>
+```
+✔️ testManagedLedgerMetrics
+```
+### ✔️ <a id="user-content-r0s24" href="#r0s24">org.apache.pulsar.broker.stats.prometheus.AggregatedNamespaceStatsTest</a>
+```
+✔️ testSimpleAggregation
+```
+### ✔️ <a id="user-content-r0s25" href="#r0s25">org.apache.pulsar.broker.stats.PrometheusMetricsTest</a>
+```
+✔️ testPerTopicStats
+✔️ testAuthMetrics
+✔️ testPerTopicExpiredStat
+✔️ testPerProducerStats
+✔️ testMetricsTopicCount
+✔️ testManagedLedgerBookieClientStats
+✔️ testDuplicateMetricTypeDefinitions
+✔️ testExpiringTokenMetrics
+✔️ testPerConsumerStats
+✔️ testPerNamespaceStats
+✔️ testManagedCursorPersistStats
+✔️ testDuplicateMetricTypeDefinitions
+✔️ testExpiredTokenMetrics
+✔️ testManagedLedgerCacheStats
+✔️ testManagedLedgerStats
+```
+### ✔️ <a id="user-content-r0s26" href="#r0s26">org.apache.pulsar.broker.stats.SubscriptionStatsTest</a>
+```
+✔️ testConsumersAfterMarkDelete
+✔️ testNonContiguousDeletedMessagesRanges
+```
+### ✔️ <a id="user-content-r0s27" href="#r0s27">org.apache.pulsar.broker.systopic.NamespaceEventsSystemTopicServiceTest</a>
+```
+✔️ testSendAndReceiveNamespaceEvents
+```
+### ✔️ <a id="user-content-r0s28" href="#r0s28">org.apache.pulsar.broker.transaction.buffer.InMemTransactionBufferReaderTest</a>
+```
+✔️ testCloseReleaseAllEntries
+✔️ testInvalidNumEntriesArgument
+✔️ testEndOfTransactionException
+```
+### ✔️ <a id="user-content-r0s29" href="#r0s29">org.apache.pulsar.broker.transaction.buffer.TransactionBufferClientTest</a>
+```
+✔️ testAbortOnTopic
+✔️ testAbortOnSubscription
+✔️ testCommitOnTopic
+✔️ testCommitOnSubscription
+```
+### ✔️ <a id="user-content-r0s30" href="#r0s30">org.apache.pulsar.broker.transaction.buffer.TransactionBufferTest</a>
+```
+✔️ testOpenReaderOnNonExistentTxn
+✔️ testAbortCommittedTxn
+✔️ testAbortTxn
+✔️ testAbortNonExistentTxn
+✔️ testCommitNonExistentTxn
+✔️ testCommitTxn
+✔️ testOpenReaderOnAnOpenTxn
+```
+### ✔️ <a id="user-content-r0s31" href="#r0s31">org.apache.pulsar.broker.transaction.buffer.TransactionEntryImplTest</a>
+```
+✔️ testCloseShouldReleaseBuffer
+```
+### ✔️ <a id="user-content-r0s32" href="#r0s32">org.apache.pulsar.broker.transaction.buffer.TransactionLowWaterMarkTest</a>
+```
+✔️ testTransactionBufferLowWaterMark
+✔️ testPendingAckLowWaterMark
+```
+### ✔️ <a id="user-content-r0s33" href="#r0s33">org.apache.pulsar.broker.transaction.buffer.TransactionStablePositionTest</a>
+```
+✔️ commitTxnTest
+✔️ abortTxnTest
+✖️ commitTxnTest
+```
+### ✔️ <a id="user-content-r0s34" href="#r0s34">org.apache.pulsar.broker.transaction.coordinator.TransactionCoordinatorClientTest</a>
+```
+✔️ testClientStart
+✔️ testCommitAndAbort
+✔️ testNewTxn
+```
+### ✔️ <a id="user-content-r0s35" href="#r0s35">org.apache.pulsar.broker.transaction.coordinator.TransactionMetaStoreAssignmentTest</a>
+```
+✔️ testTransactionMetaStoreAssignAndFailover
+```
+### ✔️ <a id="user-content-r0s36" href="#r0s36">org.apache.pulsar.broker.transaction.pendingack.PendingAckInMemoryDeleteTest</a>
+```
+✖️ txnAckTestNoBatchAndSharedSubMemoryDeleteTest
+✔️ txnAckTestNoBatchAndSharedSubMemoryDeleteTest
+✔️ txnAckTestBatchAndSharedSubMemoryDeleteTest
+```
+### ✔️ <a id="user-content-r0s37" href="#r0s37">org.apache.pulsar.broker.transaction.TransactionConsumeTest</a>
+```
+✔️ noSortedTest
+✔️ sortedTest
+```
+### ✔️ <a id="user-content-r0s38" href="#r0s38">org.apache.pulsar.broker.web.RestExceptionTest</a>
+```
+✔️ testRestException
+✔️ testWebApplicationException
+✔️ testOtherException
+```
+### ✔️ <a id="user-content-r0s39" href="#r0s39">org.apache.pulsar.broker.web.WebServiceTest</a>
+```
+✔️ testTlsAuthDisallowInsecure
+✔️ testBrokerReady
+✔️ testDefaultClientVersion
+✔️ testTlsEnabled
+✔️ testTlsAuthAllowInsecure
+✔️ testSplitPath
+✔️ testMaxRequestSize
+✔️ testTlsDisabled
+✔️ testRateLimiting
+```
+### ✔️ <a id="user-content-r0s40" href="#r0s40">org.apache.pulsar.client.impl.AdminApiKeyStoreTlsAuthTest</a>
+```
+✔️ testAuthorizedUserAsOriginalPrincipal
+✔️ testSuperUserCantListNamespaces
+✔️ testPersistentList
+✔️ testSuperUserCanListTenants
+```
+### ✔️ <a id="user-content-r0s41" href="#r0s41">org.apache.pulsar.client.impl.BatchMessageIdImplSerializationTest</a>
+```
+✔️ testSerializationEmpty
+✔️ testSerialization1
+✔️ testSerializationNull
+✔️ testSerialization2
+```
+### ✔️ <a id="user-content-r0s42" href="#r0s42">org.apache.pulsar.client.impl.BatchMessageIndexAckDisableTest</a>
+```
+✔️ testBatchMessageIndexAckForExclusiveSubscription
+✔️ testBatchMessageIndexAckForSharedSubscription
+✔️ testBatchMessageIndexAckForExclusiveSubscription
+✔️ testBatchMessageIndexAckForSharedSubscription
+```
+### ✔️ <a id="user-content-r0s43" href="#r0s43">org.apache.pulsar.client.impl.BatchMessageIndexAckTest</a>
+```
+✔️ testBatchMessageIndexAckForSharedSubscription
+✔️ testBatchMessageIndexAckForSharedSubscription
+✔️ testDoNotRecycleAckSetMultipleTimes
+✔️ testBatchMessageIndexAckForExclusiveSubscription
+✔️ testBatchMessageIndexAckForExclusiveSubscription
+```
+### ✔️ <a id="user-content-r0s44" href="#r0s44">org.apache.pulsar.client.impl.BrokerClientIntegrationTest</a>
+```
+✔️ testDisconnectClientWithoutClosingConnection
+✔️ testResetCursor
+✔️ testResetCursor
+✔️ testCloseBrokerService
+✔️ testUnsupportedBatchMessageConsumer
+✔️ testAvroSchemaProducerConsumerWithSpecifiedReaderAndWriter
+✔️ testJsonSchemaProducerConsumerWithSpecifiedReaderAndWriter
+✔️ testOperationTimeout
+✔️ testCleanProducer
+✔️ testUnsupportedBatchMessageConsumer
+✔️ testCloseConnectionOnBrokerRejectedRequest
+✔️ testAddEntryOperationTimeout
+✔️ testInvalidDynamicConfiguration
+✔️ testMaxConcurrentTopicLoading
+✔️ testCloseConnectionOnInternalServerError
+```
+### ✔️ <a id="user-content-r0s45" href="#r0s45">org.apache.pulsar.client.impl.CompactedOutBatchMessageTest</a>
+```
+✔️ testCompactedOutMessages
+```
+### ✔️ <a id="user-content-r0s46" href="#r0s46">org.apache.pulsar.client.impl.ConsumerAckResponseTest</a>
+```
+✔️ testAckResponse
+```
+### ✔️ <a id="user-content-r0s47" href="#r0s47">org.apache.pulsar.client.impl.ConsumerConfigurationTest</a>
+```
+✔️ testReadCompactNonPersistentExclusive
+✔️ testReadCompactPersistentExclusive
+✔️ testReadCompactPersistentFailover
+✔️ testReadCompactPersistentShared
+```
+### ✔️ <a id="user-content-r0s48" href="#r0s48">org.apache.pulsar.client.impl.ConsumerDedupPermitsUpdate</a>
+```
+✔️ testConsumerDedup
+✔️ testConsumerDedup
+✔️ testConsumerDedup
+✔️ testConsumerDedup
+✔️ testConsumerDedup
+✔️ testConsumerDedup
+✔️ testConsumerDedup
+```
+### ✔️ <a id="user-content-r0s49" href="#r0s49">org.apache.pulsar.client.impl.ConsumerUnsubscribeTest</a>
+```
+✔️ testConsumerUnsubscribeReference
+```
+### ✔️ <a id="user-content-r0s50" href="#r0s50">org.apache.pulsar.client.impl.KeyStoreTlsProducerConsumerTestWithAuth</a>
+```
+✔️ testTlsClientAuthOverHTTPProtocol
+✔️ testTlsClientAuthOverBinaryProtocol
+✔️ testTlsLargeSizeMessage
+```
+### ✔️ <a id="user-content-r0s51" href="#r0s51">org.apache.pulsar.client.impl.KeyStoreTlsProducerConsumerTestWithoutAuth</a>
+```
+✔️ testTlsClientAuthOverHTTPProtocol
+✔️ testTlsClientAuthOverBinaryProtocol
+✔️ testTlsLargeSizeMessage
+```
+### ✔️ <a id="user-content-r0s52" href="#r0s52">org.apache.pulsar.client.impl.KeyStoreTlsTest</a>
+```
+✔️ testValidate
+```
+### ✔️ <a id="user-content-r0s53" href="#r0s53">org.apache.pulsar.client.impl.MessageChecksumTest</a>
+```
+✔️ testChecksumCompatibilityInMixedVersionBrokerCluster
+✔️ testTamperingMessageIsDetected
+✔️ testChecksumCompatibilityInMixedVersionBrokerCluster
+```
+### ✔️ <a id="user-content-r0s54" href="#r0s54">org.apache.pulsar.client.impl.MessageChunkingTest</a>
+```
+✔️ testPublishWithFailure
+✔️ testInvalidUseCaseForChunking
+✔️ testLargeMessage
+✔️ testExpireIncompleteChunkMessage
+✔️ testInvalidConfig
+✔️ testLargeMessageAckTimeOut
+✔️ testLargeMessageAckTimeOut
+✔️ testLargeMessage
+✖️ testMaxPendingChunkMessages
+```
+### ✔️ <a id="user-content-r0s55" href="#r0s55">org.apache.pulsar.client.impl.MessageParserTest</a>
+```
+✔️ testWithoutBatches
+✔️ testWithBatches
+```
+### ✔️ <a id="user-content-r0s56" href="#r0s56">org.apache.pulsar.client.impl.MultiTopicsReaderTest</a>
+```
+✔️ testReadMessageWithBatchingWithMessageInclusive
+✔️ testKeyHashRangeReader
+✔️ testRemoveSubscriptionForReaderNeedRemoveCursor
+✔️ testReadMessageWithBatching
+✔️ testReadMessageWithoutBatchingWithMessageInclusive
+✔️ testMultiReaderSeek
+✔️ testReadMessageWithoutBatching
+✔️ testReaderWithTimeLong
+```
+### ✔️ <a id="user-content-r0s57" href="#r0s57">org.apache.pulsar.client.impl.NegativeAcksTest</a>
+```
+✔️ testNegativeAcks
+✔️ testNegativeAcks
+✔️ testNegativeAcks
+✔️ testNegativeAcks
+✔️ testNegativeAcks
+✔️ testNegativeAcks
+✔️ testNegativeAcks
+✔️ testNegativeAcks
+✔️ testNegativeAcks
+✔️ testNegativeAcks
+✔️ testNegativeAcks
+✔️ testNegativeAcks
+✔️ testNegativeAcks
+✔️ testNegativeAcks
+✔️ testNegativeAcks
+✔️ testNegativeAcks
+✔️ testNegativeAcks
+✔️ testNegativeAcks
+✔️ testNegativeAcks
+✔️ testNegativeAcks
+✔️ testNegativeAcks
+✔️ testNegativeAcks
+✔️ testNegativeAcks
+✔️ testNegativeAcks
+✔️ testNegativeAcks
+✔️ testNegativeAcks
+✔️ testNegativeAcks
+✔️ testNegativeAcks
+✔️ testNegativeAcks
+✔️ testNegativeAcks
+✔️ testNegativeAcks
+✔️ testNegativeAcks
+```
+### ✔️ <a id="user-content-r0s58" href="#r0s58">org.apache.pulsar.client.impl.PatternTopicsConsumerImplTest</a>
+```
+✔️ testStartEmptyPatternConsumer
+✔️ testBinaryProtoToGetTopicsOfNamespaceAll
+✔️ testPatternTopicsSubscribeWithBuilderFail
+✔️ testPubRateOnNonPersistent
+✔️ testTopicDeletion
+✔️ testAutoUnbubscribePatternConsumer
+✔️ testTopicsPatternFilter
+✔️ testBinaryProtoToGetTopicsOfNamespaceNonPersistent
+✔️ testBinaryProtoToGetTopicsOfNamespacePersistent
+✔️ testTopicsListMinus
+✔️ testAutoSubscribePatternConsumer
+```
+### ✔️ <a id="user-content-r0s59" href="#r0s59">org.apache.pulsar.client.impl.PerMessageUnAcknowledgedRedeliveryTest</a>
+```
+✔️ testSharedAckedNormalTopic
+✔️ testUnAckedMessageTrackerSize
+✔️ testSharedAckedPartitionedTopic
+✔️ testExclusiveAckedNormalTopic
+✔️ testFailoverAckedNormalTopic
+```
+### ✔️ <a id="user-content-r0s60" href="#r0s60">org.apache.pulsar.client.impl.PulsarMultiHostClientTest</a>
+```
+✔️ testMultiHostUrlRetrySuccess
+✔️ testGetPartitionedTopicDataTimeout
+✔️ testGetPartitionedTopicMetaData
+```
+### ✔️ <a id="user-content-r0s61" href="#r0s61">org.apache.pulsar.client.impl.RawMessageSerDeserTest</a>
+```
+✔️ testSerializationAndDeserialization
+```
+### ✔️ <a id="user-content-r0s62" href="#r0s62">org.apache.pulsar.client.impl.SchemaDeleteTest</a>
+```
+✔️ createTopicDeleteTopicCreateTopic
+```
+### ✔️ <a id="user-content-r0s63" href="#r0s63">org.apache.pulsar.client.impl.SequenceIdWithErrorTest</a>
+```
+✔️ testCheckSequenceId
+✔️ testDeleteTopicWithMissingData
+✔️ testTopicWithWildCardChar
+✖️ testCrashBrokerWithoutCursorLedgerLeak
+✖️ testSkipCorruptDataLedger
+```
+### ✔️ <a id="user-content-r0s64" href="#r0s64">org.apache.pulsar.client.impl.TopicDoesNotExistsTest</a>
+```
+✔️ testCreateConsumerOnNotExistsTopic
+✔️ testCreateProducerOnNotExistsTopic
+```
+### ✔️ <a id="user-content-r0s65" href="#r0s65">org.apache.pulsar.client.impl.TopicFromMessageTest</a>
+```
+✔️ testSingleTopicConsumerNoBatchFullName
+✔️ testMultiTopicConsumerBatchShortName
+✔️ testSingleTopicConsumerNoBatchShortName
+✔️ testMultiTopicConsumerNoBatchShortName
+✔️ testSingleTopicConsumerBatchShortName
+```
+### ✔️ <a id="user-content-r0s66" href="#r0s66">org.apache.pulsar.client.impl.TopicsConsumerImplTest</a>
+```
+✔️ testTopicAutoUpdatePartitions
+✔️ testDifferentTopicsNameSubscribe
+✔️ testGetLastMessageId
+✔️ testConsumerUnackedRedelivery
+✔️ testSubscriptionMustCompleteWhenOperationTimeoutOnMultipleTopics
+✔️ testConsumerDistributionInFailoverSubscriptionWhenUpdatePartitions
+✔️ multiTopicsInDifferentNameSpace
+✔️ testDefaultBacklogTTL
+✔️ testGetConsumersAndGetTopics
+✔️ testSubscribeUnsubscribeSingleTopic
+✔️ testResubscribeSameTopic
+✔️ testSyncProducerAndConsumer
+✔️ testPartitionsUpdatesForMultipleTopics
+✔️ testTopicsNameSubscribeWithBuilderFail
+✔️ testMultiTopicsMessageListener
+✔️ testTopicNameValid
+✔️ testAsyncConsumer
+```
+### ✔️ <a id="user-content-r0s67" href="#r0s67">org.apache.pulsar.client.impl.UnAcknowledgedMessagesTimeoutTest</a>
+```
+✔️ testCheckUnAcknowledgedMessageTimer
+✔️ testExclusiveSingleAckedNormalTopic
+✔️ testFailoverSingleAckedPartitionedTopic
+✔️ testSharedSingleAckedPartitionedTopic
+✔️ testAckTimeoutMinValue
+✔️ testExclusiveCumulativeAckedNormalTopic
+✔️ testSingleMessageBatch
+```
+### ✔️ <a id="user-content-r0s68" href="#r0s68">org.apache.pulsar.client.impl.ZeroQueueSizeTest</a>
+```
+✔️ zeroQueueSizeSharedSubscription
+✔️ testPauseAndResume
+✔️ testZeroQueueSizeMessageRedeliveryForAsyncReceive
+✔️ zeroQueueSizeConsumerListener
+✔️ zeroQueueSizeFailoverSubscription
+✔️ validQueueSizeConfig
+✔️ zeroQueueSizeNormalConsumer
+✔️ zeroQueueSizeReceieveAsyncInCompatibility
+✔️ InvalidQueueSizeConfig
+✔️ testZeroQueueSizeMessageRedeliveryForListener
+✔️ testZeroQueueSizeMessageRedelivery
+✔️ zeroQueueSizePartitionedTopicInCompatibility
+✔️ testFailedZeroQueueSizeBatchMessage
+✔️ testPauseAndResumeWithUnloading
+```
+### ✔️ <a id="user-content-r0s69" href="#r0s69">org.apache.pulsar.common.api.raw.RawMessageImplTest</a>
+```
+✔️ testGetProperties
+```
+### ✔️ <a id="user-content-r0s70" href="#r0s70">org.apache.pulsar.common.compression.CommandsTest</a>
+```
+✔️ testChecksumSendCommand
+```
+### ✔️ <a id="user-content-r0s71" href="#r0s71">org.apache.pulsar.common.compression.CompressorCodecBackwardCompatTest</a>
+```
+✔️ testCompressDecompress
+✔️ testCompressDecompress
+✔️ testCompressDecompress
+✔️ testCompressDecompress
+✔️ testCompressDecompress
+✔️ testCompressDecompress
+```
+### ✔️ <a id="user-content-r0s72" href="#r0s72">org.apache.pulsar.common.compression.CompressorCodecTest</a>
+```
+✔️ testCompressDecompress
+✔️ testMultpileUsages
+✔️ testMultpileUsages
+✔️ testCompressDecompress
+✔️ testMultpileUsages
+✔️ testCompressDecompress
+✔️ testMultpileUsages
+✔️ testCompressDecompress
+✔️ testDecompressFromSampleBuffer
+✔️ testDecompressReadonlyByteBuf
+✔️ testDecompressReadonlyByteBuf
+✔️ testCodecProvider
+✔️ testEmptyInput
+✔️ testEmptyInput
+✔️ testCompressDecompress
+✔️ testCodecProvider
+✔️ testDecompressFromSampleBuffer
+✔️ testMultpileUsages
+✔️ testCodecProvider
+✔️ testEmptyInput
+✔️ testDecompressReadonlyByteBuf
+✔️ testCompressDecompress
+✔️ testDecompressReadonlyByteBuf
+✔️ testCompressDecompress
+✔️ testCompressDecompress
+✔️ testMultpileUsages
+✔️ testEmptyInput
+✔️ testDecompressReadonlyByteBuf
+✔️ testDecompressFromSampleBuffer
+✔️ testDecompressFromSampleBuffer
+✔️ testDecompressFromSampleBuffer
+✔️ testDecompressReadonlyByteBuf
+✔️ testDecompressReadonlyByteBuf
+✔️ testMultpileUsages
+✔️ testCompressDecompress
+✔️ testCodecProvider
+✔️ testMultpileUsages
+✔️ testCompressDecompress
+✔️ testMultpileUsages
+✔️ testDecompressReadonlyByteBuf
+✔️ testEmptyInput
+✔️ testCodecProvider
+✔️ testDecompressReadonlyByteBuf
+✔️ testDecompressReadonlyByteBuf
+✔️ testMultpileUsages
+```
+### ✔️ <a id="user-content-r0s73" href="#r0s73">org.apache.pulsar.common.compression.Crc32cChecksumTest</a>
+```
+✔️ testCrc32cHardware
+✔️ testCrc32cDirectMemoryHardware
+✔️ testCrc32c
+✔️ testCrc32cSoftware
+✔️ testCrc32cIncremental
+✔️ testCrc32cIncrementalUsingProvider
+```
+### ✔️ <a id="user-content-r0s74" href="#r0s74">org.apache.pulsar.common.lookup.data.LookupDataTest</a>
+```
+✔️ testLoadReportSerialization
+✔️ testUrlEncoder
+✔️ serializeToJsonTest
+✔️ withConstructor
+```
+### ✔️ <a id="user-content-r0s75" href="#r0s75">org.apache.pulsar.common.naming.MetadataTests</a>
+```
+✔️ testInvalidMetadata
+✔️ testValidMetadata
+```
+### ✔️ <a id="user-content-r0s76" href="#r0s76">org.apache.pulsar.common.naming.NamespaceBundlesTest</a>
+```
+✔️ testConstructor
+✔️ testSplitBundleInTwo
+✔️ testsplitBundles
+✔️ testFindBundle
+✔️ testSplitBundleByFixBoundary
+```
+### ✔️ <a id="user-content-r0s77" href="#r0s77">org.apache.pulsar.common.naming.NamespaceBundleTest</a>
+```
+✔️ testIncludes
+✔️ testGetBundle
+✔️ testCompareTo
+✔️ testConstructor
+✔️ testToString
+✔️ testEquals
+```
+### ✔️ <a id="user-content-r0s78" href="#r0s78">org.apache.pulsar.common.naming.NamespaceNameTest</a>
+```
+✔️ namespace
+✔️ testNewScheme
+```
+### ✔️ <a id="user-content-r0s79" href="#r0s79">org.apache.pulsar.common.naming.ServiceConfigurationTest</a>
+```
+✔️ testOptionalSettingPresent
+✔️ testOptionalSettingEmpty
+✔️ testInit
+✔️ testInitFailure
+```
+### ✔️ <a id="user-content-r0s80" href="#r0s80">org.apache.pulsar.common.naming.TopicNameTest</a>
+```
+✔️ testShortTopicName
+✔️ topic
+✔️ testTopicNameWithoutCluster
+✔️ testDecodeEncode
+```
+### ✔️ <a id="user-content-r0s81" href="#r0s81">org.apache.pulsar.common.net.ServiceURITest</a>
+```
+✔️ testEmptyServiceUriString
+✔️ testMultipleHostsSemiColon
+✔️ testInvalidServiceUris
+✔️ testMultipleHostsWithoutHttpPorts
+✔️ testRootPath
+✔️ testMultipleHostsMixedPorts
+✔️ testMultipleHostsWithoutPulsarTlsPorts
+✔️ testUserInfoWithMultipleHosts
+✔️ testMultipleHostsComma
+✔️ testMultipleHostsMixed
+✔️ testUserInfo
+✔️ testIpv6UriWithoutPulsarPort
+✔️ testMultiIpv6Uri
+✔️ testMultiIpv6UriWithoutPulsarPort
+✔️ testEmptyPath
+✔️ testNullServiceUriString
+✔️ testNullServiceUriInstance
+✔️ testMissingServiceName
+✔️ testMultipleHostsWithoutHttpsPorts
+✔️ testMultipleHostsWithoutPulsarPorts
+✔️ testIpv6Uri
+```
+### ✔️ <a id="user-content-r0s82" href="#r0s82">org.apache.pulsar.common.policies.data.AutoFailoverPolicyDataTest</a>
+```
+✔️ testAutoFailoverPolicyData
+```
+### ✔️ <a id="user-content-r0s83" href="#r0s83">org.apache.pulsar.common.policies.data.AutoFailoverPolicyTypeTest</a>
+```
+✔️ testAutoFailoverPolicyType
+```
+### ✔️ <a id="user-content-r0s84" href="#r0s84">org.apache.pulsar.common.policies.data.AutoTopicCreationOverrideTest</a>
+```
+✔️ testInvalidTopicType
+✔️ testNumPartitionsTooLow
+✔️ testNumPartitionsNotSet
+✔️ testValidOverrideNonPartitioned
+✔️ testNumPartitionsOnNonPartitioned
+✔️ testValidOverridePartitioned
+```
+### ✔️ <a id="user-content-r0s85" href="#r0s85">org.apache.pulsar.common.policies.data.BacklogQuotaTest</a>
+```
+✔️ testBacklogQuotaIdentity
+```
+### ✔️ <a id="user-content-r0s86" href="#r0s86">org.apache.pulsar.common.policies.data.ClusterDataTest</a>
+```
+✔️ simple
+```
+### ✔️ <a id="user-content-r0s87" href="#r0s87">org.apache.pulsar.common.policies.data.ConsumerStatsTest</a>
+```
+✔️ testConsumerStats
+```
+### ✔️ <a id="user-content-r0s88" href="#r0s88">org.apache.pulsar.common.policies.data.EnsemblePlacementPolicyConfigTest</a>
+```
+✔️ testDecodeFailed
+✔️ testEncodeDecodeSuccessfully
+```
+### ✔️ <a id="user-content-r0s89" href="#r0s89">org.apache.pulsar.common.policies.data.LocalPolicesTest</a>
+```
+✔️ testLocalPolices
+```
+### ✔️ <a id="user-content-r0s90" href="#r0s90">org.apache.pulsar.common.policies.data.NamespaceIsolationDataTest</a>
+```
+✔️ testNamespaceIsolationData
+```
+### ✔️ <a id="user-content-r0s91" href="#r0s91">org.apache.pulsar.common.policies.data.NamespaceOwnershipStatusTest</a>
+```
+✔️ testSerialization
+```
+### ✔️ <a id="user-content-r0s92" href="#r0s92">org.apache.pulsar.common.policies.data.OffloadPoliciesTest</a>
+```
+✔️ testGcsConfiguration
+✔️ mergeTest
+✔️ compatibleWithConfigFileTest
+✔️ testCreateByProperties
+✔️ testS3Configuration
+✔️ oldPoliciesCompatibleTest
+```
+### ✔️ <a id="user-content-r0s93" href="#r0s93">org.apache.pulsar.common.policies.data.PartitionedTopicStatsTest</a>
+```
+✔️ testPartitionedTopicStats
+```
+### ✔️ <a id="user-content-r0s94" href="#r0s94">org.apache.pulsar.common.policies.data.PersistencePoliciesTest</a>
+```
+✔️ testPersistencePolicies
+```
+### ✔️ <a id="user-content-r0s95" href="#r0s95">org.apache.pulsar.common.policies.data.PersistentOfflineTopicStatsTest</a>
+```
+✔️ testPersistentOfflineTopicStats
+```
+### ✔️ <a id="user-content-r0s96" href="#r0s96">org.apache.pulsar.common.policies.data.PersistentTopicStatsTest</a>
+```
+✔️ testPersistentTopicStatsAggregation
+✔️ testPersistentTopicStats
+```
+### ✔️ <a id="user-content-r0s97" href="#r0s97">org.apache.pulsar.common.policies.data.PoliciesDataTest</a>
+```
+✔️ propertyAdmin
+✔️ policies
+✔️ bundlesData
+✔️ bundlesPolicies
+```
+### ✔️ <a id="user-content-r0s98" href="#r0s98">org.apache.pulsar.common.policies.data.PublisherStatsTest</a>
+```
+✔️ testPublisherStats
+✔️ testPublisherStatsAggregation
+```
+### ✔️ <a id="user-content-r0s99" href="#r0s99">org.apache.pulsar.common.policies.data.ReplicatorStatsTest</a>
+```
+✔️ testReplicatorStatsAdd
+✔️ testReplicatorStatsNull
+```
+### ✔️ <a id="user-content-r0s100" href="#r0s100">org.apache.pulsar.common.policies.data.ResourceQuotaTest</a>
+```
+✔️ testResourceQuotaDefault
+✔️ testResourceQuotaEqual
+```
+### ✔️ <a id="user-content-r0s101" href="#r0s101">org.apache.pulsar.common.policies.data.RetentionPolicesTest</a>
+```
+✔️ testRetentionPolices
+```
+### ✔️ <a id="user-content-r0s102" href="#r0s102">org.apache.pulsar.common.policies.impl.AutoFailoverPolicyFactoryTest</a>
+```
+✔️ testAutoFailoverPolicyFactory
+```
+### ✔️ <a id="user-content-r0s103" href="#r0s103">org.apache.pulsar.common.policies.impl.MinAvailablePolicyTest</a>
+```
+✔️ testMinAvailablePolicty
+```
+### ✔️ <a id="user-content-r0s104" href="#r0s104">org.apache.pulsar.common.policies.impl.NamespaceIsolationPoliciesTest</a>
+```
+✔️ testBrokerAssignment
+✔️ testGetNamespaceIsolationPolicyByName
+✔️ testDeletePolicy
+✔️ testSetPolicy
+✔️ testJsonSerialization
+✔️ testDefaultConstructor
+✔️ testGetNamespaceIsolationPolicyByNamespace
+```
+### ✔️ <a id="user-content-r0s105" href="#r0s105">org.apache.pulsar.common.policies.impl.NamespaceIsolationPolicyImplTest</a>
+```
+✔️ testFindBrokers
+✔️ testGetSecondaryBrokers
+✔️ testShouldFailover
+✔️ testGetPrimaryBrokers
+✔️ testGetAvailablePrimaryBrokers
+✔️ testConstructor
+✔️ testIsPrimaryOrSecondaryBroker
+```
+### ✔️ <a id="user-content-r0s106" href="#r0s106">org.apache.pulsar.common.protocol.ByteBufPairTest</a>
+```
+✔️ testEncoder
+✔️ testDoubleByteBuf
+```
+### ✔️ <a id="user-content-r0s107" href="#r0s107">org.apache.pulsar.common.protocol.CommandUtilsTests</a>
+```
+✔️ testSkipBrokerEntryMetadata
+✔️ testPeekBrokerEntryMetadata
+✔️ testParseBrokerEntryMetadata
+✔️ testMetadataFromCommandSubscribe
+✔️ testMetadataFromCommandProducer
+✔️ testAddBrokerEntryMetadata
+✔️ testByteBufComposite
+```
+### ✔️ <a id="user-content-r0s108" href="#r0s108">org.apache.pulsar.common.protocol.MarkersTest</a>
+```
+✔️ testSnapshot
+✔️ testTxnAbortMarker
+✔️ testUpdate
+✔️ testTxnCommitMarker
+✔️ testSnapshotRequest
+✔️ testSnapshotResponse
+```
+### ✔️ <a id="user-content-r0s109" href="#r0s109">org.apache.pulsar.common.protocol.PulsarDecoderTest</a>
+```
+✔️ testChannelRead
+```
+### ✔️ <a id="user-content-r0s110" href="#r0s110">org.apache.pulsar.common.stats.JvmDefaultGCMetricsLoggerTest</a>
+```
+✔️ testInvokeJVMInternals
+```
+### ✔️ <a id="user-content-r0s111" href="#r0s111">org.apache.pulsar.common.util.collections.BitSetRecyclableRecyclableTest</a>
+```
+✔️ testResetWords
+✔️ testRecycle
+```
+### ✔️ <a id="user-content-r0s112" href="#r0s112">org.apache.pulsar.common.util.collections.ConcurrentBitSetRecyclableTest</a>
+```
+✔️ testRecycle
+✔️ testGenerateByBitSet
+```
+### ✔️ <a id="user-content-r0s113" href="#r0s113">org.apache.pulsar.common.util.collections.ConcurrentLongHashMapTest</a>
+```
+✔️ testRehashingWithDeletes
+✔️ concurrentInsertionsAndReads
+✔️ testRemove
+✔️ testRehashing
+✔️ simpleInsertions
+✔️ testComputeIfAbsent
+✔️ testConstructor
+✔️ testPutIfAbsent
+✔️ testIteration
+✔️ testHashConflictWithDeletion
+✔️ concurrentInsertions
+✔️ stressConcurrentInsertionsAndReads
+✔️ testNegativeUsedBucketCount
+```
+### ✔️ <a id="user-content-r0s114" href="#r0s114">org.apache.pulsar.common.util.collections.ConcurrentLongPairSetTest</a>
+```
+✔️ concurrentInsertionsAndReads
+✔️ testEqualsObjects
+✔️ testIfRemoval
+✔️ testRehashing
+✔️ testToString
+✔️ testRemove
+✔️ testItems
+✔️ testRehashingWithDeletes
+✔️ testHashConflictWithDeletion
+✔️ testIteration
+✔️ simpleInsertions
+✔️ testRehashingRemoval
+✔️ testRemoval
+✔️ testConstructor
+✔️ concurrentInsertions
+```
+### ✔️ <a id="user-content-r0s115" href="#r0s115">org.apache.pulsar.common.util.collections.ConcurrentOpenHashMapTest</a>
+```
+✔️ testRemove
+✔️ simpleInsertions
+✔️ testPutIfAbsent
+✔️ concurrentInsertions
+✔️ testHashConflictWithDeletion
+✔️ testRehashingWithDeletes
+✔️ testComputeIfAbsent
+✔️ testRehashing
+✔️ testIteration
+✔️ testEqualsKeys
+✔️ concurrentInsertionsAndReads
+✔️ testConstructor
+```
+### ✔️ <a id="user-content-r0s116" href="#r0s116">org.apache.pulsar.common.util.collections.ConcurrentOpenHashSetTest</a>
+```
+✔️ concurrentInsertions
+✔️ testRehashing
+✔️ testRemoval
+✔️ testEqualsObjects
+✔️ testHashConflictWithDeletion
+✔️ testConstructor
+✔️ concurrentInsertionsAndReads
+✔️ testIteration
+✔️ simpleInsertions
+✔️ testRehashingWithDeletes
+✔️ testRemove
+```
+### ✔️ <a id="user-content-r0s117" href="#r0s117">org.apache.pulsar.common.util.collections.ConcurrentOpenLongPairRangeSetTest</a>
+```
+✔️ testAddForDifferentKey
+✔️ testToString
+✔️ testCacheFlagConflict
+✔️ testDeleteWithLeastMost
+✔️ testDeleteForDifferentKey
+✔️ testLastRange
+✔️ testAddCompareCompareWithGuava
+✔️ testSpanWithGuava
+✔️ testDeleteCompareWithGuava
+✔️ testFirstRange
+✔️ testAddForSameKey
+✔️ testDeleteWithAtMost
+✔️ testRangeContaining
+```
+### ✔️ <a id="user-content-r0s118" href="#r0s118">org.apache.pulsar.common.util.collections.ConcurrentSortedLongPairSetTest</a>
+```
+✔️ concurrentInsertions
+✔️ testIfRemoval
+✔️ testRemoval
+✔️ testRemove
+✔️ testItems
+✔️ testEqualsObjects
+✔️ simpleInsertions
+✔️ testIteration
+✔️ testToString
+```
+### ✔️ <a id="user-content-r0s119" href="#r0s119">org.apache.pulsar.common.util.collections.FieldParserTest</a>
+```
+✔️ testUpdateObject
+✔️ testConversion
+```
+### ✔️ <a id="user-content-r0s120" href="#r0s120">org.apache.pulsar.common.util.collections.GrowableArrayBlockingQueueTest</a>
+```
+✔️ removeTest
+✔️ growArray
+✔️ pollTimeout
+✔️ simple
+✔️ pollTimeout2
+✔️ blockingTake
+```
+### ✔️ <a id="user-content-r0s121" href="#r0s121">org.apache.pulsar.common.util.collections.GrowablePriorityLongPairQueueTest</a>
+```
+✔️ testItems
+✔️ testRemove
+✔️ testExpandQueue
+✔️ testInsertAndRemove
+✔️ testEqualsObjects
+✔️ testExpandRemoval
+✔️ testIteration
+✔️ simpleInsertions
+✔️ concurrentInsertions
+✔️ testConstructor
+✔️ testSetWithDuplicateInsert
+✔️ testExpandWithDeletes
+✔️ concurrentInsertionsAndReads
+✔️ testRemoval
+✔️ testIfRemoval
+```
+### ✔️ <a id="user-content-r0s122" href="#r0s122">org.apache.pulsar.common.util.collections.TripleLongPriorityQueueTest</a>
+```
+✔️ testQueue
+✔️ testCheckForEmpty
+✔️ testCompareWithSamePrefix
+```
+### ✔️ <a id="user-content-r0s123" href="#r0s123">org.apache.pulsar.common.util.FieldParserTest</a>
+```
+✔️ testMap
+```
+### ✔️ <a id="user-content-r0s124" href="#r0s124">org.apache.pulsar.common.util.FileModifiedTimeUpdaterTest</a>
+```
+✔️ testFileNotModified
+✔️ testFileModified
+✔️ testFileModified
+✔️ testFileNotModified
+✔️ testFileModified
+✔️ testFileNotModified
+```
+### ✔️ <a id="user-content-r0s125" href="#r0s125">org.apache.pulsar.common.util.netty.ChannelFuturesTest</a>
+```
+✔️ toCompletableFuture_shouldCompleteExceptionally_channelFutureCompletedAfter
+✔️ toCompletableFuture_shouldCompleteSuccessfully_channelFutureCompletedAfter
+✔️ toCompletableFuture_shouldCompleteSuccessfully_channelFutureCompletedBefore
+✔️ toCompletableFuture_shouldCompleteExceptionally_channelFutureCompletedBefore
+✔️ toCompletableFuture_shouldRequireNonNullArgument
+```
+### ✔️ <a id="user-content-r0s126" href="#r0s126">org.apache.pulsar.common.util.RateLimiterTest</a>
+```
+✔️ testMultipleTryAcquire
+✔️ testRateLimiterWithPermitUpdater
+✔️ testTryAcquire
+✔️ testTryAcquireNoPermits
+✔️ testClose
+✔️ testResetRate
+✔️ testMultipleAcquire
+✔️ testAcquire
+✔️ testInvalidRenewTime
+✔️ testRateLimiterWithFunction
+✔️ testAcquireBlock
+```
+### ✔️ <a id="user-content-r0s127" href="#r0s127">org.apache.pulsar.common.util.ReflectionsTest</a>
+```
+✔️ testCreateInstanceNoNoArgConstructor
+✔️ testCreateInstanceConstructorThrowsException
+✔️ testCreateInstanceAbstractClass
+✔️ testCreateTypedInstanceUnassignableClass
+✔️ testCreateInstanceClassNotFound
+✔️ testCreateTypedInstanceConstructorThrowsException
+✔️ testClassExists
+✔️ testCreateTypedInstanceAbstractClass
+✔️ testCreateTypedInstanceClassNotFound
+✔️ testCreateTypedInstanceNoNoArgConstructor
+✔️ testLoadClass
+✔️ testClassInJarImplementsIface
+```
+### ✔️ <a id="user-content-r0s128" href="#r0s128">org.apache.pulsar.common.util.RelativeTimeUtilTest</a>
+```
+✔️ testParseRelativeTime
+```
+### ✔️ <a id="user-content-r0s129" href="#r0s129">org.apache.pulsar.discovery.service.web.DiscoveryServiceWebTest</a>
+```
+✔️ testRedirectUrlWithServerStarted
+```
+### ✔️ <a id="user-content-r0s130" href="#r0s130">org.apache.pulsar.functions.worker.PulsarFunctionE2ESecurityTest</a>
+```
+✔️ testAuthorizationWithAnonymousUser
+✔️ testAuthorization
+```
+### ✔️ <a id="user-content-r0s131" href="#r0s131">org.apache.pulsar.functions.worker.PulsarFunctionPublishTest</a>
+```
+✔️ testPulsarFunctionState
+✔️ testMultipleAddress
+✔️ testPulsarFunctionBKCleanup
+```
+### ✔️ <a id="user-content-r0s132" href="#r0s132">org.apache.pulsar.functions.worker.PulsarFunctionTlsTest</a>
+```
+✔️ testFunctionsCreation
+```
+### ✔️ <a id="user-content-r0s133" href="#r0s133">org.apache.pulsar.io.PulsarFunctionTlsTest</a>
+```
+✔️ testAuthorization
+```
+### ✔️ <a id="user-content-r0s134" href="#r0s134">org.apache.pulsar.proxy.server.AdminProxyHandlerTest</a>
+```
+✔️ replayableProxyContentProviderTest
+```
+### ✔️ <a id="user-content-r0s135" href="#r0s135">org.apache.pulsar.proxy.server.AuthedAdminProxyHandlerTest</a>
+```
+✔️ testAuthenticatedProxyAsNonAdmin
+```
+### ✔️ <a id="user-content-r0s136" href="#r0s136">org.apache.pulsar.proxy.server.FunctionWorkerRoutingTest</a>
+```
+✔️ testFunctionWorkerRedirect
+```
+### ✔️ <a id="user-content-r0s137" href="#r0s137">org.apache.pulsar.proxy.server.ProxyAdditionalServletTest</a>
+```
+✔️ test
+```
+### ✔️ <a id="user-content-r0s138" href="#r0s138">org.apache.pulsar.proxy.server.ProxyAuthenticatedProducerConsumerTest</a>
+```
+✔️ testTlsSyncProducerAndConsumer
+```
+### ✔️ <a id="user-content-r0s139" href="#r0s139">org.apache.pulsar.proxy.server.ProxyAuthenticationTest</a>
+```
+✔️ testAuthentication
+```
+### ✔️ <a id="user-content-r0s140" href="#r0s140">org.apache.pulsar.proxy.server.ProxyConnectionThrottlingTest</a>
+```
+✔️ testInboundConnection
+```
+### ✔️ <a id="user-content-r0s141" href="#r0s141">org.apache.pulsar.proxy.server.ProxyEnableHAProxyProtocolTest</a>
+```
+✔️ testSimpleProduceAndConsume
+```
+### ✔️ <a id="user-content-r0s142" href="#r0s142">org.apache.pulsar.proxy.server.ProxyForwardAuthDataTest</a>
+```
+✔️ testForwardAuthData
+```
+### ✔️ <a id="user-content-r0s143" href="#r0s143">org.apache.pulsar.proxy.server.ProxyIsAHttpProxyTest</a>
+```
+✔️ testProxyToEndsInSlash
+✔️ testStreaming
+✔️ testLongPath
+✔️ testLongPathInProxyTo
+✔️ testPathEndsInSlash
+✔️ testPathNotSpecified
+✔️ testTryingToUseExistingPath
+✔️ testMultipleRedirect
+✔️ testSingleRedirect
+✔️ testRedirectNotSpecified
+```
+### ✔️ <a id="user-content-r0s144" href="#r0s144">org.apache.pulsar.proxy.server.ProxyKeyStoreTlsTestWithAuth</a>
+```
+✔️ testProducerFailed
+✔️ testPartitions
+✔️ testProducer
+```
+### ✔️ <a id="user-content-r0s145" href="#r0s145">org.apache.pulsar.proxy.server.ProxyKeyStoreTlsTestWithoutAuth</a>
+```
+✔️ testPartitions
+✔️ testProducerFailed
+✔️ testProducer
+```
+### ✔️ <a id="user-content-r0s146" href="#r0s146">org.apache.pulsar.proxy.server.ProxyLookupThrottlingTest</a>
+```
+✔️ testLookup
+```
+### ✔️ <a id="user-content-r0s147" href="#r0s147">org.apache.pulsar.proxy.server.ProxyParserTest</a>
+```
+✔️ testRegexSubscription
+✔️ testProducerConsumer
+✔️ testProducer
+✔️ testPartitions
+✔️ testProtocolVersionAdvertisement
+```
+### ✔️ <a id="user-content-r0s148" href="#r0s148">org.apache.pulsar.proxy.server.ProxyRolesEnforcementTest</a>
+```
+✔️ testIncorrectRoles
+```
+### ✔️ <a id="user-content-r0s149" href="#r0s149">org.apache.pulsar.proxy.server.ProxyStatsTest</a>
+```
+✔️ testChangeLogLevel
+✔️ testConnectionsStats
+✔️ testTopicStats
+```
+### ✔️ <a id="user-content-r0s150" href="#r0s150">org.apache.pulsar.proxy.server.ProxyTest</a>
+```
+✔️ testPartitions
+✔️ testRegexSubscription
+✔️ testProtocolVersionAdvertisement
+✔️ testGetSchema
+✔️ testProducer
+✔️ testProducerConsumer
+```
+### ✔️ <a id="user-content-r0s151" href="#r0s151">org.apache.pulsar.proxy.server.ProxyTlsTest</a>
+```
+✔️ testProducer
+✔️ testPartitions
+```
+### ✔️ <a id="user-content-r0s152" href="#r0s152">org.apache.pulsar.proxy.server.ProxyTlsTestWithAuth</a>
+```
+✔️ testServiceStartup
+```
+### ✔️ <a id="user-content-r0s153" href="#r0s153">org.apache.pulsar.proxy.server.ProxyWithAuthorizationNegTest</a>
+```
+✔️ testProxyAuthorization
+```
+### ✔️ <a id="user-content-r0s154" href="#r0s154">org.apache.pulsar.proxy.server.ProxyWithAuthorizationTest</a>
+```
+✔️ tlsCiphersAndProtocols
+✔️ testTlsHostVerificationProxyToClient
+✔️ tlsCiphersAndProtocols
+✔️ testProxyAuthorization
+✔️ tlsCiphersAndProtocols
+✔️ testTlsHostVerificationProxyToBroker
+✔️ tlsCiphersAndProtocols
+✔️ tlsCiphersAndProtocols
+✔️ tlsCiphersAndProtocols
+✔️ testTlsHostVerificationProxyToBroker
+✔️ tlsCiphersAndProtocols
+✔️ testTlsHostVerificationProxyToClient
+✔️ tlsCiphersAndProtocols
+```
+### ✔️ <a id="user-content-r0s155" href="#r0s155">org.apache.pulsar.proxy.server.ProxyWithoutServiceDiscoveryTest</a>
+```
+✔️ testDiscoveryService
+```
+### ✔️ <a id="user-content-r0s156" href="#r0s156">org.apache.pulsar.proxy.server.SuperUserAuthedAdminProxyHandlerTest</a>
+```
+✔️ testAuthWithRandoCert
+✔️ testAuthenticatedProxyAsAdmin
+✔️ testAuthenticatedProxyAsNonAdmin
+```
+### ✔️ <a id="user-content-r0s157" href="#r0s157">org.apache.pulsar.proxy.server.UnauthedAdminProxyHandlerTest</a>
+```
+✔️ testUnauthenticatedProxy
+✔️ testVipStatus
+```
+### ✔️ <a id="user-content-r0s158" href="#r0s158">org.apache.pulsar.PulsarBrokerStarterTest</a>
+```
+✔️ testMainRunBookieNoConfig
+✔️ testLoadConfigWithException
+✔️ testMainWithNoArgument
+✔️ testLoadBalancerConfig
+✔️ testGlobalZooKeeperConfig
+✔️ testMainRunBookieRecoveryNoConfig
+✔️ testLoadConfig
+✔️ testMainEnableRunBookieThroughBrokerConfig
+✔️ testMainRunBookieAndAutoRecoveryNoConfig
+```
+### ✔️ <a id="user-content-r0s159" href="#r0s159">org.apache.pulsar.schema.compatibility.SchemaCompatibilityCheckTest</a>
+```
+✔️ testConsumerCompatibilityCheckCanReadLastTest
+✔️ testConsumerWithNotCompatibilitySchema
+✔️ testProducerSendWithOldSchemaAndConsumerCanRead
+✔️ testConsumerCompatibilityCheckCanReadLastTest
+✔️ testProducerSendWithOldSchemaAndConsumerCanRead
+✔️ testSchemaComparison
+✔️ testConsumerCompatibilityCheckCanReadLastTest
+✔️ testConsumerCompatibilityReadAllCheckTest
+✔️ testConsumerWithNotCompatibilitySchema
+✔️ testIsAutoUpdateSchema
+✔️ testProducerSendWithOldSchemaAndConsumerCanRead
+✔️ testConsumerCompatibilityReadAllCheckTest
+✔️ testIsAutoUpdateSchema
+✔️ testProducerSendWithOldSchemaAndConsumerCanRead
+✔️ testConsumerWithNotCompatibilitySchema
+✔️ testIsAutoUpdateSchema
+✔️ testProducerSendWithOldSchemaAndConsumerCanRead
+✔️ testConsumerWithNotCompatibilitySchema
+✔️ testProducerSendWithOldSchemaAndConsumerCanRead
+✔️ testIsAutoUpdateSchema
+✔️ testIsAutoUpdateSchema
+✔️ testConsumerCompatibilityCheckCanReadLastTest
+✔️ testIsAutoUpdateSchema
+```
+### ✔️ <a id="user-content-r0s160" href="#r0s160">org.apache.pulsar.schema.PartitionedTopicSchemaTest</a>
+```
+✔️ test
+```
+### ✔️ <a id="user-content-r0s161" href="#r0s161">org.apache.pulsar.schema.SchemaTest</a>
+```
+✔️ testIsUsingAvroSchemaParser
+✔️ testBytesSchemaDeserialize
+✔️ testMultiTopicSetSchemaProvider
+```
+### ✔️ <a id="user-content-r0s162" href="#r0s162">org.apache.pulsar.stats.client.PulsarBrokerStatsClientTest</a>
+```
+✔️ testServiceException
+✔️ testTopicInternalStats
+```
+### ✔️ <a id="user-content-r0s163" href="#r0s163">org.apache.pulsar.tests.EnumValuesDataProviderTest</a>
+```
+✔️ shouldFailIfEnumParameterIsMissing
+✔️ testEnumValuesProvider
+✔️ testEnumValuesProvider
+✔️ shouldDetermineEnumValuesFromMethod
+✔️ shouldContainAllEnumValues
+✔️ testEnumValuesProvider
+```
+### ✔️ <a id="user-content-r0s164" href="#r0s164">org.apache.pulsar.tests.TestRetrySupportBeforeMethodRetryTest</a>
+```
+✔️ shouldNotDoAnythingWhenThereIsBeforeAndAfterMethod
+✖️ shouldNotDoAnythingWhenThereIsBeforeAndAfterMethod
+✖️ shouldNotDoAnythingWhenThereIsBeforeAndAfterMethod
+✖️ shouldNotDoAnythingWhenThereIsBeforeAndAfterMethod
+✖️ shouldNotDoAnythingWhenThereIsBeforeAndAfterMethod
+```
+### ✔️ <a id="user-content-r0s165" href="#r0s165">org.apache.pulsar.tests.TestRetrySupportRetryTest</a>
+```
+✖️ shouldCallSetupBeforeRetrying
+✔️ shouldCallSetupBeforeRetrying
+✖️ shouldCallSetupBeforeRetrying
+✖️ shouldCallSetupBeforeRetrying
+✖️ shouldCallSetupBeforeRetrying
+```
+### ✔️ <a id="user-content-r0s166" href="#r0s166">org.apache.pulsar.tests.TestRetrySupportSuccessTest</a>
+```
+✔️ shouldCallSetupOnce1
+✔️ shouldCallSetupOnce3
+✔️ shouldCallSetupOnce2
+```
+### ✔️ <a id="user-content-r0s167" href="#r0s167">org.apache.pulsar.tests.ThreadDumpUtilTest</a>
+```
+✔️ testHelp
+✔️ testThreadDump
+```
+### ✔️ <a id="user-content-r0s168" href="#r0s168">org.apache.pulsar.utils.SimpleTextOutputStreamTest</a>
+```
+✔️ testBooleanFormat
+✔️ testDoubleFormat
+✔️ testLongFormat
+✔️ testString
+```
+### ✔️ <a id="user-content-r0s169" href="#r0s169">org.apache.pulsar.utils.StatsOutputStreamTest</a>
+```
+✔️ testLists
+✔️ testNamedObjects
+✔️ testNestedObjects
+✔️ testNamedLists
+✔️ testPairs
+✔️ testObjects
+```
+### ✔️ <a id="user-content-r0s170" href="#r0s170">org.apache.pulsar.websocket.proxy.ProxyAuthenticationTest</a>
+```
+✔️ unauthenticatedSocketTest
+✔️ authenticatedSocketTest
+✔️ statsTest
+✔️ anonymousSocketTest
+```
+### ✔️ <a id="user-content-r0s171" href="#r0s171">org.apache.pulsar.websocket.proxy.ProxyAuthorizationTest</a>
+```
+✔️ test
+```
+### ✔️ <a id="user-content-r0s172" href="#r0s172">org.apache.pulsar.websocket.proxy.ProxyConfigurationTest</a>
+```
+✔️ configTest
+✔️ configTest
+```
+### ✔️ <a id="user-content-r0s173" href="#r0s173">org.apache.pulsar.websocket.proxy.ProxyPublishConsumeTlsTest</a>
+```
+✔️ socketTest
+```
+### ✔️ <a id="user-content-r0s174" href="#r0s174">org.apache.pulsar.websocket.proxy.ProxyPublishConsumeWithoutZKTest</a>
+```
+✔️ socketTest
+```
+### ✔️ <a id="user-content-r0s175" href="#r0s175">org.apache.pulsar.websocket.proxy.v1.V1_ProxyAuthenticationTest</a>
+```
+✔️ anonymousSocketTest
+✔️ authenticatedSocketTest
+✔️ statsTest
+✔️ unauthenticatedSocketTest
+```
\ No newline at end of file
diff --git a/test-reporter/__tests__/__outputs__/silent-notes-test-results.md b/test-reporter/__tests__/__outputs__/silent-notes-test-results.md
new file mode 100644
index 0000000..de01928
--- /dev/null
+++ b/test-reporter/__tests__/__outputs__/silent-notes-test-results.md
@@ -0,0 +1,136 @@
+![Tests passed successfully](https://img.shields.io/badge/tests-67%20passed%2C%2012%20skipped-success)
+## ✔️ <a id="user-content-r0" href="#r0">fixtures/external/SilentNotes.trx</a>
+**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|
+### ✔️ <a id="user-content-r0s0" href="#r0s0">VanillaCloudStorageClientTest.CloudStorageCredentialsTest</a>
+```
+✔️ AreEqualWorksWithDifferentPassword
+✔️ AreEqualWorksWithSameContent
+✔️ CorrectlyConvertsSecureStringToString
+✔️ CorrectlyConvertsStringToSecureString
+✔️ ValidateAcceptsValidCredentials
+✔️ ValidateRejectsInvalidCredentials
+```
+### ✔️ <a id="user-content-r0s1" href="#r0s1">VanillaCloudStorageClientTest.CloudStorageProviders.DropboxCloudStorageClientTest</a>
+```
+✔️ FileLifecycleWorks
+✖️ ReallyDoFetchToken
+✖️ ReallyDoOpenAuthorizationPageInBrowser
+✖️ ReallyDoRefreshToken
+✔️ ThrowsAccessDeniedExceptionWithInvalidToken
+```
+### ✔️ <a id="user-content-r0s2" href="#r0s2">VanillaCloudStorageClientTest.CloudStorageProviders.FtpCloudStorageClientTest</a>
+```
+✔️ FileLifecycleWorks
+✔️ SanitizeCredentials_ChangesInvalidPrefix
+✔️ SecureSslConnectionWorks
+✔️ ThrowsWithHttpInsteadOfFtp
+✖️ ThrowsWithInvalidPassword
+✖️ ThrowsWithInvalidUrl
+✖️ ThrowsWithInvalidUsername
+```
+### ✔️ <a id="user-content-r0s3" href="#r0s3">VanillaCloudStorageClientTest.CloudStorageProviders.GmxCloudStorageClientTest</a>
+```
+✔️ ChoosesCorrectUrlForGmxComEmail
+✔️ ChoosesCorrectUrlForGmxNetEmail
+```
+### ✔️ <a id="user-content-r0s4" href="#r0s4">VanillaCloudStorageClientTest.CloudStorageProviders.GoogleCloudStorageClientTest</a>
+```
+✔️ FileLifecycleWorks
+✖️ ReallyDoFetchToken
+✖️ ReallyDoOpenAuthorizationPageInBrowser
+✖️ ReallyDoRefreshToken
+```
+### ✔️ <a id="user-content-r0s5" href="#r0s5">VanillaCloudStorageClientTest.CloudStorageProviders.OnedriveCloudStorageClientTest</a>
+```
+✔️ FileLifecycleWorks
+✖️ ReallyDoFetchToken
+✖️ ReallyDoOpenAuthorizationPageInBrowser
+✖️ ReallyDoRefreshToken
+```
+### ✔️ <a id="user-content-r0s6" href="#r0s6">VanillaCloudStorageClientTest.CloudStorageProviders.WebdavCloudStorageClientTest</a>
+```
+✔️ FileLifecycleWorks
+✔️ ParseGmxWebdavResponseCorrectly
+✔️ ParseStratoWebdavResponseCorrectly
+✔️ ThrowsWithInvalidPath
+✔️ ThrowsWithInvalidUsername
+```
+### ✔️ <a id="user-content-r0s7" href="#r0s7">VanillaCloudStorageClientTest.CloudStorageTokenTest</a>
+```
+✔️ AreEqualWorksWithNullDate
+✔️ AreEqualWorksWithSameContent
+✔️ NeedsRefreshReturnsFalseForTokenFlow
+✔️ NeedsRefreshReturnsFalseIfNotExpired
+✔️ NeedsRefreshReturnsTrueIfExpired
+✔️ NeedsRefreshReturnsTrueIfNoExpirationDate
+✔️ SetExpiryDateBySecondsWorks
+✔️ SetExpiryDateBySecondsWorksWithNull
+✔️ SetExpiryDateBySecondsWorksWithVeryShortPeriod
+```
+### ✔️ <a id="user-content-r0s8" href="#r0s8">VanillaCloudStorageClientTest.OAuth2.AuthorizationResponseErrorTest</a>
+```
+✔️ ParsesAllErrorCodesCorrectly
+✔️ ParsesNullErrorCodeCorrectly
+✔️ ParsesUnknownErrorCodeCorrectly
+```
+### ✔️ <a id="user-content-r0s9" href="#r0s9">VanillaCloudStorageClientTest.OAuth2.OAuth2UtilsTest</a>
+```
+✔️ BuildAuthorizationRequestUrlEscapesParameters
+✔️ BuildAuthorizationRequestUrlLeavesOutOptionalParameters
+✔️ BuildAuthorizationRequestUrlThrowsWithMissingRedirectUrlForTokenFlow
+✔️ BuildAuthorizationRequestUrlUsesAllParameters
+✔️ BuildAuthorizationRequestUrlUsesCodeVerifier
+✔️ ParseRealWorldDropboxRejectResponse
+✔️ ParseRealWorldDropboxSuccessResponse
+✔️ ParseRealWorldGoogleRejectResponse
+✔️ ParseRealWorldGoogleSuccessResponse
+```
+### ✔️ <a id="user-content-r0s10" href="#r0s10">VanillaCloudStorageClientTest.OAuth2CloudStorageClientTest</a>
+```
+✔️ BuildOAuth2AuthorizationRequestUrlWorks
+✔️ FetchTokenCanInterpretGoogleResponse
+✔️ FetchTokenReturnsNullForDeniedAccess
+✔️ FetchTokenThrowsWithWrongState
+✔️ RefreshTokenCanInterpretGoogleResponse
+```
+### ✔️ <a id="user-content-r0s11" href="#r0s11">VanillaCloudStorageClientTest.SecureStringExtensionsTest</a>
+```
+✔️ AreEqualsWorksCorrectly
+✔️ CorrectlyConvertsSecureStringToString
+✔️ CorrectlyConvertsSecureStringToUnicodeBytes
+✔️ CorrectlyConvertsSecureStringToUtf8Bytes
+✔️ CorrectlyConvertsStringToSecureString
+✔️ CorrectlyConvertsUnicodeBytesToSecureString
+✔️ CorrectlyConvertsUtf8BytesToSecureString
+```
+### ✔️ <a id="user-content-r0s12" href="#r0s12">VanillaCloudStorageClientTest.SerializeableCloudStorageCredentialsTest</a>
+```
+✔️ DecryptAfterDesrializationCanReadAllPropertiesBack
+✔️ DecryptAfterDesrializationRespectsNullProperties
+✔️ EncryptBeforeSerializationProtectsAllNecessaryProperties
+✔️ EncryptBeforeSerializationRespectsNullProperties
+✔️ SerializedDatacontractCanBeReadBack
+✔️ SerializedDatacontractDoesNotContainNullProperties
+✔️ SerializedDatacontractDoesNotContainPlaintextData
+✔️ SerializedJsonCanBeReadBack
+✔️ SerializedJsonDoesNotContainNullProperties
+✔️ SerializedJsonDoesNotContainPlaintextData
+✔️ SerializedXmlCanBeReadBack
+✔️ SerializedXmlDoesNotContainNullProperties
+✔️ SerializedXmlDoesNotContainPlaintextData
+```
\ No newline at end of file
diff --git a/test-reporter/__tests__/__snapshots__/dart-json.test.ts.snap b/test-reporter/__tests__/__snapshots__/dart-json.test.ts.snap
new file mode 100644
index 0000000..847db6a
--- /dev/null
+++ b/test-reporter/__tests__/__snapshots__/dart-json.test.ts.snap
@@ -0,0 +1,2052 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`dart-json tests matches report snapshot 1`] = `
+TestRunResult {
+  "path": "fixtures/dart-json.json",
+  "suites": Array [
+    TestSuiteResult {
+      "groups": Array [
+        TestGroupResult {
+          "name": "Test 1",
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "Passing test",
+              "result": "success",
+              "time": 36,
+            },
+          ],
+        },
+        TestGroupResult {
+          "name": "Test 1 Test 1.1",
+          "tests": Array [
+            TestCaseResult {
+              "error": Object {
+                "details": "package:test_api          expect
+test\\\\main_test.dart 13:9  main.<fn>.<fn>.<fn>
+",
+                "line": 13,
+                "message": "Expected: <2>
+  Actual: <1>
+",
+                "path": "test/main_test.dart",
+              },
+              "name": "Failing test",
+              "result": "failed",
+              "time": 20,
+            },
+            TestCaseResult {
+              "error": Object {
+                "details": "package:darttest/main.dart 2:3  throwError
+test\\\\main_test.dart 17:9        main.<fn>.<fn>.<fn>
+",
+                "line": 17,
+                "message": "Exception: Some error",
+                "path": "test/main_test.dart",
+              },
+              "name": "Exception in target unit",
+              "result": "failed",
+              "time": 6,
+            },
+          ],
+        },
+        TestGroupResult {
+          "name": "Test 2",
+          "tests": Array [
+            TestCaseResult {
+              "error": Object {
+                "details": "test\\\\main_test.dart 24:7  main.<fn>.<fn>
+",
+                "line": 24,
+                "message": "Exception: Some error",
+                "path": "test/main_test.dart",
+              },
+              "name": "Exception in test",
+              "result": "failed",
+              "time": 12,
+            },
+          ],
+        },
+      ],
+      "name": "test/main_test.dart",
+      "totalTime": undefined,
+    },
+    TestSuiteResult {
+      "groups": Array [
+        TestGroupResult {
+          "name": null,
+          "tests": Array [
+            TestCaseResult {
+              "error": Object {
+                "details": "dart:isolate  _RawReceivePortImpl._handleMessage
+",
+                "line": 5,
+                "message": "TimeoutException after 0:00:00.000001: Test timed out after 0 seconds.",
+                "path": "test/second_test.dart",
+              },
+              "name": "Timeout test",
+              "result": "failed",
+              "time": 37,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Skipped test",
+              "result": "skipped",
+              "time": 14,
+            },
+          ],
+        },
+      ],
+      "name": "test/second_test.dart",
+      "totalTime": undefined,
+    },
+  ],
+  "totalTime": 3760,
+}
+`;
+
+exports[`dart-json tests report from rrousselGit/provider test results matches snapshot 1`] = `
+TestRunResult {
+  "path": "fixtures/external/flutter/provider-test-results.json",
+  "suites": Array [
+    TestSuiteResult {
+      "groups": Array [
+        TestGroupResult {
+          "name": "valueListenableProvider",
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "rebuilds when value change",
+              "result": "success",
+              "time": 200,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "don't rebuild dependents by default",
+              "result": "success",
+              "time": 26,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "pass keys",
+              "result": "success",
+              "time": 10,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "don't listen again if stream instance doesn't change",
+              "result": "success",
+              "time": 22,
+            },
+            TestCaseResult {
+              "error": Object {
+                "details": "══╡ EXCEPTION CAUGHT BY FLUTTER TEST FRAMEWORK ╞════════════════════════════════════════════════════
+The following TestFailure object was thrown running a test:
+  Expected: <2>
+  Actual: <1>
+Unexpected number of calls
+
+When the exception was thrown, this was the stack:
+#0      fail (package:test_api/src/frontend/expect.dart:155:31)
+#1      _expect (package:test_api/src/frontend/expect.dart:150:3)
+#2      expect (package:test_api/src/frontend/expect.dart:59:3)
+#3      VerificationResult.called (package:mockito/src/mock.dart:853:5)
+#4      main.<anonymous closure>.<anonymous closure> (file:///__w/provider/provider/test/value_listenable_provider_test.dart:112:34)
+<asynchronous suspension>
+<asynchronous suspension>
+(elided one frame from package:stack_trace)
+
+The test description was:
+  pass updateShouldNotify
+════════════════════════════════════════════════════════════════════════════════════════════════════",
+                "line": 112,
+                "message": "The following TestFailure object was thrown running a test:
+  Expected: <2>
+  Actual: <1>
+Unexpected number of calls
+",
+                "path": "test/value_listenable_provider_test.dart",
+              },
+              "name": "pass updateShouldNotify",
+              "result": "failed",
+              "time": 69,
+            },
+          ],
+        },
+      ],
+      "name": "test/value_listenable_provider_test.dart",
+      "totalTime": undefined,
+    },
+    TestSuiteResult {
+      "groups": Array [
+        TestGroupResult {
+          "name": "ListenableProvider",
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "works with MultiProvider",
+              "result": "success",
+              "time": 173,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "asserts that the created notifier can have listeners",
+              "result": "success",
+              "time": 12,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "don't listen again if listenable instance doesn't change",
+              "result": "success",
+              "time": 12,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "works with null (default)",
+              "result": "success",
+              "time": 7,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "works with null (create)",
+              "result": "success",
+              "time": 7,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "stateful create called once",
+              "result": "success",
+              "time": 11,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "dispose called on unmount",
+              "result": "success",
+              "time": 13,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "dispose can be null",
+              "result": "success",
+              "time": 8,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "changing listenable rebuilds descendants",
+              "result": "success",
+              "time": 12,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "rebuilding with the same provider don't rebuilds descendants",
+              "result": "success",
+              "time": 11,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "notifylistener rebuilds descendants",
+              "result": "success",
+              "time": 9,
+            },
+          ],
+        },
+        TestGroupResult {
+          "name": "ListenableProvider value constructor",
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "pass down key",
+              "result": "success",
+              "time": 17,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "changing the Listenable instance rebuilds dependents",
+              "result": "success",
+              "time": 29,
+            },
+          ],
+        },
+        TestGroupResult {
+          "name": "ListenableProvider stateful constructor",
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "called with context",
+              "result": "success",
+              "time": 8,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "pass down key",
+              "result": "success",
+              "time": 20,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "throws if create is null",
+              "result": "success",
+              "time": 4,
+            },
+          ],
+        },
+      ],
+      "name": "test/listenable_provider_test.dart",
+      "totalTime": undefined,
+    },
+    TestSuiteResult {
+      "groups": Array [
+        TestGroupResult {
+          "name": "consumer",
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "obtains value from Provider<T>",
+              "result": "success",
+              "time": 181,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "crashed with no builder",
+              "result": "success",
+              "time": 11,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "can be used inside MultiProvider",
+              "result": "success",
+              "time": 16,
+            },
+          ],
+        },
+        TestGroupResult {
+          "name": "consumer2",
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "obtains value from Provider<T>",
+              "result": "success",
+              "time": 22,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "crashed with no builder",
+              "result": "success",
+              "time": 8,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "can be used inside MultiProvider",
+              "result": "success",
+              "time": 9,
+            },
+          ],
+        },
+        TestGroupResult {
+          "name": "consumer3",
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "obtains value from Provider<T>",
+              "result": "success",
+              "time": 9,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "crashed with no builder",
+              "result": "success",
+              "time": 7,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "can be used inside MultiProvider",
+              "result": "success",
+              "time": 8,
+            },
+          ],
+        },
+        TestGroupResult {
+          "name": "consumer4",
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "obtains value from Provider<T>",
+              "result": "success",
+              "time": 8,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "crashed with no builder",
+              "result": "success",
+              "time": 6,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "can be used inside MultiProvider",
+              "result": "success",
+              "time": 8,
+            },
+          ],
+        },
+        TestGroupResult {
+          "name": "consumer5",
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "obtains value from Provider<T>",
+              "result": "success",
+              "time": 8,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "crashed with no builder",
+              "result": "success",
+              "time": 6,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "can be used inside MultiProvider",
+              "result": "success",
+              "time": 9,
+            },
+          ],
+        },
+        TestGroupResult {
+          "name": "consumer6",
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "obtains value from Provider<T>",
+              "result": "success",
+              "time": 8,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "crashed with no builder",
+              "result": "success",
+              "time": 8,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "can be used inside MultiProvider",
+              "result": "success",
+              "time": 8,
+            },
+          ],
+        },
+      ],
+      "name": "test/consumer_test.dart",
+      "totalTime": undefined,
+    },
+    TestSuiteResult {
+      "groups": Array [
+        TestGroupResult {
+          "name": "",
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "Use builder property, not child",
+              "result": "success",
+              "time": 10,
+            },
+          ],
+        },
+        TestGroupResult {
+          "name": "ChangeNotifierProvider",
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "value",
+              "result": "success",
+              "time": 185,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "builder",
+              "result": "success",
+              "time": 18,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "builder1",
+              "result": "success",
+              "time": 12,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "builder2",
+              "result": "success",
+              "time": 12,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "builder3",
+              "result": "success",
+              "time": 19,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "builder4",
+              "result": "success",
+              "time": 14,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "builder5",
+              "result": "success",
+              "time": 15,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "builder6",
+              "result": "success",
+              "time": 11,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "builder0",
+              "result": "success",
+              "time": 10,
+            },
+          ],
+        },
+      ],
+      "name": "test/change_notifier_provider_test.dart",
+      "totalTime": undefined,
+    },
+    TestSuiteResult {
+      "groups": Array [
+        TestGroupResult {
+          "name": "ChangeNotifierProvider",
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "default",
+              "result": "success",
+              "time": 189,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": ".value",
+              "result": "success",
+              "time": 10,
+            },
+          ],
+        },
+        TestGroupResult {
+          "name": "ListenableProvider",
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "default",
+              "result": "success",
+              "time": 9,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": ".value",
+              "result": "success",
+              "time": 16,
+            },
+          ],
+        },
+        TestGroupResult {
+          "name": "Provider",
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "default",
+              "result": "success",
+              "time": 11,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": ".value",
+              "result": "success",
+              "time": 8,
+            },
+          ],
+        },
+        TestGroupResult {
+          "name": "ProxyProvider",
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "0",
+              "result": "success",
+              "time": 11,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "1",
+              "result": "success",
+              "time": 10,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "2",
+              "result": "success",
+              "time": 8,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "3",
+              "result": "success",
+              "time": 10,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "4",
+              "result": "success",
+              "time": 9,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "5",
+              "result": "success",
+              "time": 9,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "6",
+              "result": "success",
+              "time": 9,
+            },
+          ],
+        },
+        TestGroupResult {
+          "name": "MultiProvider",
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "with 1 ChangeNotifierProvider default",
+              "result": "success",
+              "time": 9,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "with 2 ChangeNotifierProvider default",
+              "result": "success",
+              "time": 9,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "with ListenableProvider default",
+              "result": "success",
+              "time": 12,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "with Provider default",
+              "result": "success",
+              "time": 8,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "with ProxyProvider0",
+              "result": "success",
+              "time": 7,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "with ProxyProvider1",
+              "result": "success",
+              "time": 9,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "with ProxyProvider2",
+              "result": "success",
+              "time": 7,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "with ProxyProvider3",
+              "result": "success",
+              "time": 9,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "with ProxyProvider4",
+              "result": "success",
+              "time": 9,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "with ProxyProvider5",
+              "result": "success",
+              "time": 7,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "with ProxyProvider6",
+              "result": "success",
+              "time": 7,
+            },
+          ],
+        },
+      ],
+      "name": "test/builder_test.dart",
+      "totalTime": undefined,
+    },
+    TestSuiteResult {
+      "groups": Array [
+        TestGroupResult {
+          "name": "MultiProvider",
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "throw if providers is null",
+              "result": "success",
+              "time": 30,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "MultiProvider children can only access parent providers",
+              "result": "success",
+              "time": 160,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "MultiProvider.providers with ignored child",
+              "result": "success",
+              "time": 8,
+            },
+          ],
+        },
+      ],
+      "name": "test/multi_provider_test.dart",
+      "totalTime": undefined,
+    },
+    TestSuiteResult {
+      "groups": Array [
+        TestGroupResult {
+          "name": "",
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "works with MultiProvider",
+              "result": "success",
+              "time": 191,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "transition from stream to stream preserve state",
+              "result": "success",
+              "time": 16,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "throws if stream has error and catchError is missing",
+              "result": "success",
+              "time": 22,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "calls catchError if present and stream has error",
+              "result": "success",
+              "time": 20,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "works with null",
+              "result": "success",
+              "time": 13,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "StreamProvider() crashes if builder is null",
+              "result": "success",
+              "time": 5,
+            },
+          ],
+        },
+        TestGroupResult {
+          "name": "StreamProvider()",
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "create and dispose stream with builder",
+              "result": "success",
+              "time": 11,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "crashes if builder is null",
+              "result": "success",
+              "time": 4,
+            },
+          ],
+        },
+      ],
+      "name": "test/stream_provider_test.dart",
+      "totalTime": undefined,
+    },
+    TestSuiteResult {
+      "groups": Array [
+        TestGroupResult {
+          "name": "",
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "watch in layoutbuilder",
+              "result": "success",
+              "time": 179,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "select in layoutbuilder",
+              "result": "success",
+              "time": 12,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "cannot select in listView",
+              "result": "success",
+              "time": 138,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "watch in listView",
+              "result": "success",
+              "time": 33,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "watch in gridView",
+              "result": "success",
+              "time": 21,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "clears select dependencies for all dependents",
+              "result": "success",
+              "time": 19,
+            },
+          ],
+        },
+        TestGroupResult {
+          "name": "BuildContext",
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "internal selected value is updated",
+              "result": "success",
+              "time": 32,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "create can use read without being lazy",
+              "result": "success",
+              "time": 11,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "watch can be used inside InheritedProvider.update",
+              "result": "success",
+              "time": 10,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "select doesn't fail if it loads a provider that depends on other providers",
+              "result": "success",
+              "time": 9,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "don't call old selectors if the child rebuilds individually",
+              "result": "success",
+              "time": 21,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "selects throws inside click handlers",
+              "result": "success",
+              "time": 40,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "select throws if try to read dynamic",
+              "result": "success",
+              "time": 9,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "select throws ProviderNotFoundException",
+              "result": "success",
+              "time": 9,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "select throws if watch called inside the callback from build",
+              "result": "success",
+              "time": 6,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "select throws if read called inside the callback from build",
+              "result": "success",
+              "time": 9,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "select throws if select called inside the callback from build",
+              "result": "success",
+              "time": 8,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "select throws if read called inside the callback on dependency change",
+              "result": "success",
+              "time": 10,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "select throws if watch called inside the callback on dependency change",
+              "result": "success",
+              "time": 17,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "select throws if select called inside the callback on dependency change",
+              "result": "success",
+              "time": 9,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "can call read inside didChangeDependencies",
+              "result": "success",
+              "time": 9,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "select cannot be called inside didChangeDependencies",
+              "result": "success",
+              "time": 6,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "select in initState throws",
+              "result": "success",
+              "time": 6,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "watch in initState throws",
+              "result": "success",
+              "time": 10,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "read in initState works",
+              "result": "success",
+              "time": 6,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "consumer can be removed and selector stops to be called",
+              "result": "success",
+              "time": 7,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "context.select deeply compares maps",
+              "result": "success",
+              "time": 15,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "context.select deeply compares lists",
+              "result": "success",
+              "time": 8,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "context.select deeply compares iterables",
+              "result": "success",
+              "time": 8,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "context.select deeply compares sets",
+              "result": "success",
+              "time": 11,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "context.watch listens to value changes",
+              "result": "success",
+              "time": 10,
+            },
+          ],
+        },
+      ],
+      "name": "test/context_test.dart",
+      "totalTime": undefined,
+    },
+    TestSuiteResult {
+      "groups": Array [
+        TestGroupResult {
+          "name": "",
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "ReassembleHandler",
+              "result": "success",
+              "time": 194,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "unevaluated create",
+              "result": "success",
+              "time": 11,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "unevaluated create",
+              "result": "success",
+              "time": 16,
+            },
+          ],
+        },
+      ],
+      "name": "test/reassemble_test.dart",
+      "totalTime": undefined,
+    },
+    TestSuiteResult {
+      "groups": Array [
+        TestGroupResult {
+          "name": "",
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "works with MultiProvider",
+              "result": "success",
+              "time": 184,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "(catchError) previous future completes after transition is no-op",
+              "result": "success",
+              "time": 16,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "previous future completes after transition is no-op",
+              "result": "success",
+              "time": 15,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "transition from future to future preserve state",
+              "result": "success",
+              "time": 12,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "throws if future has error and catchError is missing",
+              "result": "success",
+              "time": 24,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "calls catchError if present and future has error",
+              "result": "success",
+              "time": 21,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "works with null",
+              "result": "success",
+              "time": 14,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "create and dispose future with builder",
+              "result": "success",
+              "time": 12,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "FutureProvider() crashes if builder is null",
+              "result": "success",
+              "time": 4,
+            },
+          ],
+        },
+        TestGroupResult {
+          "name": "FutureProvider()",
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "crashes if builder is null",
+              "result": "success",
+              "time": 3,
+            },
+          ],
+        },
+      ],
+      "name": "test/future_provider_test.dart",
+      "totalTime": undefined,
+    },
+    TestSuiteResult {
+      "groups": Array [
+        TestGroupResult {
+          "name": "",
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "works with MultiProvider",
+              "result": "success",
+              "time": 172,
+            },
+          ],
+        },
+        TestGroupResult {
+          "name": "Provider.of",
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "throws if T is dynamic",
+              "result": "success",
+              "time": 26,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "listen defaults to true when building widgets",
+              "result": "success",
+              "time": 13,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "listen defaults to false outside of the widget tree",
+              "result": "success",
+              "time": 9,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "listen:false doesn't trigger rebuild",
+              "result": "success",
+              "time": 10,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "listen:true outside of the widget tree throws",
+              "result": "success",
+              "time": 11,
+            },
+          ],
+        },
+        TestGroupResult {
+          "name": "Provider",
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "throws if the provided value is a Listenable/Stream",
+              "result": "success",
+              "time": 28,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "debugCheckInvalidValueType can be disabled",
+              "result": "success",
+              "time": 9,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "simple usage",
+              "result": "success",
+              "time": 9,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "throws an error if no provider found",
+              "result": "success",
+              "time": 11,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "update should notify",
+              "result": "success",
+              "time": 8,
+            },
+          ],
+        },
+      ],
+      "name": "test/provider_test.dart",
+      "totalTime": undefined,
+    },
+    TestSuiteResult {
+      "groups": Array [
+        TestGroupResult {
+          "name": "",
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "regression test #377",
+              "result": "success",
+              "time": 167,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "rebuild on dependency flags update",
+              "result": "success",
+              "time": 15,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "properly update debug flags if a create triggers another deferred create",
+              "result": "success",
+              "time": 9,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "properly update debug flags if a create triggers another deferred create",
+              "result": "success",
+              "time": 8,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "properly update debug flags if an update triggers another create/update",
+              "result": "success",
+              "time": 7,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "properly update debug flags if a create triggers another create/update",
+              "result": "success",
+              "time": 8,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Provider.of(listen: false) outside of build works when it loads a provider",
+              "result": "success",
+              "time": 22,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "new value is available in didChangeDependencies",
+              "result": "success",
+              "time": 26,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "builder receives the current value and updates independently from \`update\`",
+              "result": "success",
+              "time": 16,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "builder can _not_ rebuild when provider updates",
+              "result": "success",
+              "time": 8,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "builder rebuilds if provider is recreated",
+              "result": "success",
+              "time": 9,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "provider.of throws if listen:true outside of the widget tree",
+              "result": "success",
+              "time": 23,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "InheritedProvider throws if no child is provided with default constructor",
+              "result": "success",
+              "time": 14,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "InheritedProvider throws if no child is provided with value constructor",
+              "result": "success",
+              "time": 8,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "DeferredInheritedProvider throws if no child is provided with default constructor",
+              "result": "success",
+              "time": 15,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "DeferredInheritedProvider throws if no child is provided with value constructor",
+              "result": "success",
+              "time": 7,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "startListening markNeedsNotifyDependents",
+              "result": "success",
+              "time": 7,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "InheritedProvider can be subclassed",
+              "result": "success",
+              "time": 8,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "DeferredInheritedProvider can be subclassed",
+              "result": "success",
+              "time": 7,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "can be used with MultiProvider",
+              "result": "success",
+              "time": 8,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "throw if the widget ctor changes",
+              "result": "success",
+              "time": 8,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "InheritedProvider lazy loading can be disabled",
+              "result": "success",
+              "time": 6,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "InheritedProvider.value lazy loading can be disabled",
+              "result": "success",
+              "time": 9,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "InheritedProvider subclass don't have to specify default lazy value",
+              "result": "success",
+              "time": 7,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "DeferredInheritedProvider lazy loading can be disabled",
+              "result": "success",
+              "time": 7,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "DeferredInheritedProvider.value lazy loading can be disabled",
+              "result": "success",
+              "time": 7,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "selector",
+              "result": "success",
+              "time": 14,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "can select multiple types from same provider",
+              "result": "success",
+              "time": 9,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "can select same type on two different providers",
+              "result": "success",
+              "time": 8,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "can select same type twice on same provider",
+              "result": "success",
+              "time": 10,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Provider.of has a proper error message if context is null",
+              "result": "success",
+              "time": 6,
+            },
+          ],
+        },
+        TestGroupResult {
+          "name": "diagnostics",
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "InheritedProvider.value",
+              "result": "success",
+              "time": 11,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "InheritedProvider doesn't break lazy loading",
+              "result": "success",
+              "time": 7,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "InheritedProvider show if listening",
+              "result": "success",
+              "time": 7,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "DeferredInheritedProvider.value",
+              "result": "success",
+              "time": 6,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "DeferredInheritedProvider",
+              "result": "success",
+              "time": 16,
+            },
+          ],
+        },
+        TestGroupResult {
+          "name": "InheritedProvider.value()",
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "markNeedsNotifyDependents during startListening is noop",
+              "result": "success",
+              "time": 8,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "startListening called again when create returns new value",
+              "result": "success",
+              "time": 27,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "startListening",
+              "result": "success",
+              "time": 19,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "stopListening not called twice if rebuild doesn't have listeners",
+              "result": "success",
+              "time": 16,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "removeListener cannot be null",
+              "result": "success",
+              "time": 22,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "pass down current value",
+              "result": "success",
+              "time": 17,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "default updateShouldNotify",
+              "result": "success",
+              "time": 8,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "custom updateShouldNotify",
+              "result": "success",
+              "time": 32,
+            },
+          ],
+        },
+        TestGroupResult {
+          "name": "InheritedProvider()",
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "hasValue",
+              "result": "success",
+              "time": 16,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "provider calls update if rebuilding only due to didChangeDependencies",
+              "result": "success",
+              "time": 9,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "provider notifying dependents doesn't call update",
+              "result": "success",
+              "time": 11,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "update can call Provider.of with listen:true",
+              "result": "success",
+              "time": 7,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "update lazy loaded can call Provider.of with listen:true",
+              "result": "success",
+              "time": 10,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "markNeedsNotifyDependents during startListening is noop",
+              "result": "success",
+              "time": 22,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "update can obtain parent of the same type than self",
+              "result": "success",
+              "time": 15,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "_debugCheckInvalidValueType",
+              "result": "success",
+              "time": 22,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "startListening",
+              "result": "success",
+              "time": 18,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "startListening called again when create returns new value",
+              "result": "success",
+              "time": 20,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "stopListening not called twice if rebuild doesn't have listeners",
+              "result": "success",
+              "time": 18,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "removeListener cannot be null",
+              "result": "success",
+              "time": 16,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "fails if initialValueBuilder calls inheritFromElement/inheritFromWiggetOfExactType",
+              "result": "success",
+              "time": 17,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "builder is called on every rebuild and after a dependency change",
+              "result": "success",
+              "time": 11,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "builder with no updateShouldNotify use ==",
+              "result": "success",
+              "time": 8,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "builder calls updateShouldNotify callback",
+              "result": "success",
+              "time": 8,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "initialValue is transmitted to valueBuilder",
+              "result": "success",
+              "time": 8,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "calls builder again if dependencies change",
+              "result": "success",
+              "time": 22,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "exposes initialValue if valueBuilder is null",
+              "result": "success",
+              "time": 20,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "call dispose on unmount",
+              "result": "success",
+              "time": 22,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "builder unmount, dispose not called if value never read",
+              "result": "success",
+              "time": 11,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "call dispose after new value",
+              "result": "success",
+              "time": 9,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "valueBuilder works without initialBuilder",
+              "result": "success",
+              "time": 11,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "calls initialValueBuilder lazily once",
+              "result": "success",
+              "time": 7,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "throws if both builder and initialBuilder are missing",
+              "result": "success",
+              "time": 5,
+            },
+          ],
+        },
+        TestGroupResult {
+          "name": "DeferredInheritedProvider.value()",
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "hasValue",
+              "result": "success",
+              "time": 6,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "startListening",
+              "result": "success",
+              "time": 9,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "stopListening cannot be null",
+              "result": "success",
+              "time": 9,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "startListening doesn't need setState if already initialized",
+              "result": "success",
+              "time": 8,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "setState without updateShouldNotify",
+              "result": "success",
+              "time": 8,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "setState with updateShouldNotify",
+              "result": "success",
+              "time": 9,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "startListening never leave the widget uninitialized",
+              "result": "success",
+              "time": 8,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "startListening called again on controller change",
+              "result": "success",
+              "time": 10,
+            },
+          ],
+        },
+        TestGroupResult {
+          "name": "DeferredInheritedProvider()",
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "create can't call inherited widgets",
+              "result": "success",
+              "time": 7,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "creates the value lazily",
+              "result": "success",
+              "time": 7,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "dispose",
+              "result": "success",
+              "time": 7,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "dispose no-op if never built",
+              "result": "success",
+              "time": 7,
+            },
+          ],
+        },
+      ],
+      "name": "test/inherited_provider_test.dart",
+      "totalTime": undefined,
+    },
+    TestSuiteResult {
+      "groups": Array [
+        TestGroupResult {
+          "name": "ListenableProxyProvider",
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "throws if update is missing",
+              "result": "success",
+              "time": 43,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "asserts that the created notifier has no listener",
+              "result": "success",
+              "time": 177,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "asserts that the created notifier has no listener after rebuild",
+              "result": "success",
+              "time": 18,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "rebuilds dependendents when listeners are called",
+              "result": "success",
+              "time": 20,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "update returning a new Listenable disposes the previously created value and update dependents",
+              "result": "success",
+              "time": 25,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "disposes of created value",
+              "result": "success",
+              "time": 13,
+            },
+          ],
+        },
+        TestGroupResult {
+          "name": "ListenableProxyProvider variants",
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "ListenableProxyProvider",
+              "result": "success",
+              "time": 13,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "ListenableProxyProvider2",
+              "result": "success",
+              "time": 9,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "ListenableProxyProvider3",
+              "result": "success",
+              "time": 9,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "ListenableProxyProvider4",
+              "result": "success",
+              "time": 17,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "ListenableProxyProvider5",
+              "result": "success",
+              "time": 12,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "ListenableProxyProvider6",
+              "result": "success",
+              "time": 17,
+            },
+          ],
+        },
+      ],
+      "name": "test/listenable_proxy_provider_test.dart",
+      "totalTime": undefined,
+    },
+    TestSuiteResult {
+      "groups": Array [
+        TestGroupResult {
+          "name": "",
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "asserts that builder/selector are not null",
+              "result": "success",
+              "time": 32,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Deep compare maps by default",
+              "result": "success",
+              "time": 158,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Deep compare iterables by default",
+              "result": "success",
+              "time": 9,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Deep compare sets by default",
+              "result": "success",
+              "time": 12,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Deep compare lists by default",
+              "result": "success",
+              "time": 14,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "custom shouldRebuid",
+              "result": "success",
+              "time": 11,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "passes \`child\` and \`key\`",
+              "result": "success",
+              "time": 13,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "calls builder if the callback changes",
+              "result": "success",
+              "time": 14,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "works with MultiProvider",
+              "result": "success",
+              "time": 12,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "don't call builder again if it rebuilds but selector returns the same thing",
+              "result": "success",
+              "time": 9,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "call builder again if it rebuilds abd selector returns the a different variable",
+              "result": "success",
+              "time": 9,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Selector",
+              "result": "success",
+              "time": 15,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Selector2",
+              "result": "success",
+              "time": 9,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Selector3",
+              "result": "success",
+              "time": 8,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Selector4",
+              "result": "success",
+              "time": 9,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Selector5",
+              "result": "success",
+              "time": 19,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Selector6",
+              "result": "success",
+              "time": 11,
+            },
+          ],
+        },
+      ],
+      "name": "test/selector_test.dart",
+      "totalTime": undefined,
+    },
+    TestSuiteResult {
+      "groups": Array [
+        TestGroupResult {
+          "name": "",
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "asserts",
+              "result": "success",
+              "time": 6,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "works with MultiProvider",
+              "result": "success",
+              "time": 203,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "calls create only once",
+              "result": "success",
+              "time": 27,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "dispose",
+              "result": "success",
+              "time": 18,
+            },
+          ],
+        },
+      ],
+      "name": "test/stateful_provider_test.dart",
+      "totalTime": undefined,
+    },
+    TestSuiteResult {
+      "groups": Array [
+        TestGroupResult {
+          "name": "ProxyProvider",
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "throws if the provided value is a Listenable/Stream",
+              "result": "success",
+              "time": 209,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "debugCheckInvalidValueType can be disabled",
+              "result": "success",
+              "time": 13,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "create creates initial value",
+              "result": "success",
+              "time": 23,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "consume another providers",
+              "result": "success",
+              "time": 18,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "rebuild descendants if value change",
+              "result": "success",
+              "time": 13,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "call dispose when unmounted with the latest result",
+              "result": "success",
+              "time": 11,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "don't rebuild descendants if value doesn't change",
+              "result": "success",
+              "time": 12,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "pass down updateShouldNotify",
+              "result": "success",
+              "time": 19,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "works with MultiProvider",
+              "result": "success",
+              "time": 16,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "update callback can trigger descendants setState synchronously",
+              "result": "success",
+              "time": 24,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "throws if update is null",
+              "result": "success",
+              "time": 7,
+            },
+          ],
+        },
+        TestGroupResult {
+          "name": "ProxyProvider variants",
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "ProxyProvider2",
+              "result": "success",
+              "time": 18,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "ProxyProvider3",
+              "result": "success",
+              "time": 16,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "ProxyProvider4",
+              "result": "success",
+              "time": 9,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "ProxyProvider5",
+              "result": "success",
+              "time": 20,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "ProxyProvider6",
+              "result": "success",
+              "time": 10,
+            },
+          ],
+        },
+      ],
+      "name": "test/proxy_provider_test.dart",
+      "totalTime": undefined,
+    },
+  ],
+  "totalTime": 0,
+}
+`;
diff --git a/test-reporter/__tests__/__snapshots__/dotnet-trx.test.ts.snap b/test-reporter/__tests__/__snapshots__/dotnet-trx.test.ts.snap
new file mode 100644
index 0000000..0301a56
--- /dev/null
+++ b/test-reporter/__tests__/__snapshots__/dotnet-trx.test.ts.snap
@@ -0,0 +1,6271 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`dotnet-trx tests matches report snapshot 1`] = `
+TestRunResult {
+  "path": "fixtures/dotnet-trx.trx",
+  "suites": Array [
+    TestSuiteResult {
+      "groups": Array [
+        TestGroupResult {
+          "name": null,
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "Custom Name",
+              "result": "success",
+              "time": 0.1371,
+            },
+            TestCaseResult {
+              "error": Object {
+                "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.",
+                "path": "DotnetTests.Unit/Calculator.cs",
+              },
+              "name": "Exception_In_TargetTest",
+              "result": "failed",
+              "time": 0.8377,
+            },
+            TestCaseResult {
+              "error": Object {
+                "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",
+                "path": "DotnetTests.XUnitTests/CalculatorTests.cs",
+              },
+              "name": "Exception_In_Test",
+              "result": "failed",
+              "time": 2.5175,
+            },
+            TestCaseResult {
+              "error": Object {
+                "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",
+                "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": Object {
+                "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",
+                "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": Object {
+                "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",
+                "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 report from FluentValidation test results matches snapshot 1`] = `
+TestRunResult {
+  "path": "fixtures/external/FluentValidation.Tests.trx",
+  "suites": Array [
+    TestSuiteResult {
+      "groups": Array [
+        TestGroupResult {
+          "name": null,
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "Can_replace_default_errorcode_resolver",
+              "result": "success",
+              "time": 0.31579999999999997,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "CanValidateInstancesOfType_returns_false_when_comparing_against_some_other_type",
+              "result": "success",
+              "time": 0.0513,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "CanValidateInstancesOfType_returns_true_when_comparing_against_same_type",
+              "result": "success",
+              "time": 0.0665,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "CanValidateInstancesOfType_returns_true_when_comparing_against_subclass",
+              "result": "success",
+              "time": 0.0566,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Default_error_code_should_be_class_name",
+              "result": "success",
+              "time": 0.1555,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "OverridePropertyName_should_override_property_name",
+              "result": "success",
+              "time": 0.1676,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "OverridePropertyName_with_lambda_should_override_property_name",
+              "result": "success",
+              "time": 0.3832,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "PreValidate_bypasses_nullcheck_on_instance",
+              "result": "success",
+              "time": 0.2142,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "RuleForeach_with_null_instances",
+              "result": "success",
+              "time": 1.9478,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Should_be_valid_when_there_are_no_failures_for_single_property",
+              "result": "success",
+              "time": 0.1968,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Should_not_main_state",
+              "result": "success",
+              "time": 0.1976,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Should_throw_for_non_member_expression_when_validating_single_property",
+              "result": "success",
+              "time": 0.2162,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Should_throw_when_rule_is_null",
+              "result": "success",
+              "time": 0.1178,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Should_validate_public_Field",
+              "result": "success",
+              "time": 0.3435,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Should_validate_single_Field",
+              "result": "success",
+              "time": 0.24439999999999998,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Should_validate_single_property",
+              "result": "success",
+              "time": 0.27349999999999997,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Should_validate_single_property_where_invalid_property_as_string",
+              "result": "success",
+              "time": 0.216,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Should_validate_single_property_where_property_as_string",
+              "result": "success",
+              "time": 0.3409,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Uses_named_parameters_to_validate_ruleset",
+              "result": "success",
+              "time": 0.36160000000000003,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validates_single_property_by_path",
+              "result": "success",
+              "time": 0.4851,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validates_type_when_using_non_generic_validate_overload",
+              "result": "success",
+              "time": 0.1769,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_the_validators_fail_then_the_errors_Should_be_accessible_via_the_errors_property",
+              "result": "success",
+              "time": 0.17,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_the_validators_fail_then_validatorrunner_should_return_false",
+              "result": "success",
+              "time": 0.1522,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_the_Validators_pass_then_the_validatorRunner_should_return_true",
+              "result": "success",
+              "time": 0.1471,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "WhenPreValidationReturnsFalse_ResultReturnToUserImmediatly_Validate(preValidationResult: )",
+              "result": "success",
+              "time": 0.9423,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "WhenPreValidationReturnsFalse_ResultReturnToUserImmediatly_Validate(preValidationResult: AnotherInt Test Message)",
+              "result": "success",
+              "time": 0.0628,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "WhenPreValidationReturnsFalse_ResultReturnToUserImmediatly_ValidateAsync(preValidationResult: )",
+              "result": "success",
+              "time": 0.9155,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "WhenPreValidationReturnsFalse_ResultReturnToUserImmediatly_ValidateAsync(preValidationResult: AnotherInt Test Message)",
+              "result": "success",
+              "time": 0.057800000000000004,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "WhenPreValidationReturnsTrue_ValidatorsGetHit_Validate",
+              "result": "success",
+              "time": 0.4371,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "WhenPreValidationReturnsTrue_ValidatorsGetHit_ValidateAsync",
+              "result": "success",
+              "time": 1.5404,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "WithErrorCode_should_override_error_code",
+              "result": "success",
+              "time": 0.1849,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "WithMessage_and_WithErrorCode_should_override_error_message_and_error_code",
+              "result": "success",
+              "time": 0.1772,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "WithMessage_should_override_error_message",
+              "result": "success",
+              "time": 0.159,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "WithName_should_override_field_name",
+              "result": "success",
+              "time": 0.20320000000000002,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "WithName_should_override_field_name_with_value_from_other_property",
+              "result": "success",
+              "time": 0.2316,
+            },
+          ],
+        },
+      ],
+      "name": "FluentValidation.Tests.AbstractValidatorTester",
+      "totalTime": undefined,
+    },
+    TestSuiteResult {
+      "groups": Array [
+        TestGroupResult {
+          "name": null,
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "Benchmark",
+              "result": "skipped",
+              "time": 1,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Equality_comparison_check",
+              "result": "success",
+              "time": 2.1363,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Gets_accessor",
+              "result": "success",
+              "time": 0.3872,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Gets_member_for_nested_property",
+              "result": "success",
+              "time": 0.10840000000000001,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Identifies_if_memberexp_acts_on_model_instance",
+              "result": "success",
+              "time": 0.2977,
+            },
+          ],
+        },
+      ],
+      "name": "FluentValidation.Tests.AccessorCacheTests",
+      "totalTime": undefined,
+    },
+    TestSuiteResult {
+      "groups": Array [
+        TestGroupResult {
+          "name": null,
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "Finds_validators_for_types",
+              "result": "success",
+              "time": 0.23809999999999998,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "ForEach_iterates_over_types",
+              "result": "success",
+              "time": 1.8574,
+            },
+          ],
+        },
+      ],
+      "name": "FluentValidation.Tests.AssemblyScannerTester",
+      "totalTime": undefined,
+    },
+    TestSuiteResult {
+      "groups": Array [
+        TestGroupResult {
+          "name": null,
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "Cascade_mode_can_be_set_after_validator_instantiated",
+              "result": "success",
+              "time": 0.1778,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Cascade_mode_can_be_set_after_validator_instantiated_async",
+              "result": "success",
+              "time": 0.8338,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Cascade_mode_can_be_set_after_validator_instantiated_async_legacy",
+              "result": "success",
+              "time": 1.3079,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Cascade_mode_can_be_set_after_validator_instantiated_legacy",
+              "result": "success",
+              "time": 0.2101,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validation_continues_on_failure",
+              "result": "success",
+              "time": 0.1733,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validation_continues_on_failure_async",
+              "result": "success",
+              "time": 1.0423,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validation_continues_on_failure_when_set_to_Stop_globally_and_overriden_at_rule_level",
+              "result": "success",
+              "time": 0.223,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validation_continues_on_failure_when_set_to_Stop_globally_and_overriden_at_rule_level_async",
+              "result": "success",
+              "time": 1.1028,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validation_continues_on_failure_when_set_to_Stop_globally_and_overriden_at_rule_level_async_legacy",
+              "result": "success",
+              "time": 1.4877,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validation_continues_on_failure_when_set_to_Stop_globally_and_overriden_at_rule_level_legacy",
+              "result": "success",
+              "time": 0.5266,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validation_continues_on_failure_when_set_to_StopOnFirstFailure_at_validator_level_and_overriden_at_rule_level",
+              "result": "success",
+              "time": 0.19369999999999998,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validation_continues_on_failure_when_set_to_StopOnFirstFailure_at_validator_level_and_overriden_at_rule_level_async",
+              "result": "success",
+              "time": 1.072,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validation_continues_on_failure_when_set_to_StopOnFirstFailure_at_validator_level_and_overriden_at_rule_level_async_legacy",
+              "result": "success",
+              "time": 1.0468000000000002,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validation_continues_on_failure_when_set_to_StopOnFirstFailure_at_validator_level_and_overriden_at_rule_level_legacy",
+              "result": "success",
+              "time": 0.2332,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validation_continues_to_second_validator_when_first_validator_succeeds_and_cascade_set_to_stop",
+              "result": "success",
+              "time": 0.16670000000000001,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validation_continues_to_second_validator_when_first_validator_succeeds_and_cascade_set_to_stop_async",
+              "result": "success",
+              "time": 0.987,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validation_continues_to_second_validator_when_first_validator_succeeds_and_cascade_set_to_stop_async_legacy",
+              "result": "success",
+              "time": 1.1758,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validation_continues_to_second_validator_when_first_validator_succeeds_and_cascade_set_to_stop_legacy",
+              "result": "success",
+              "time": 0.2155,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validation_continues_when_set_to_Continue_at_validator_level",
+              "result": "success",
+              "time": 0.2021,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validation_continues_when_set_to_Continue_at_validator_level_async",
+              "result": "success",
+              "time": 1.0564,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validation_stops_on_failure_when_set_to_Continue_and_overriden_at_rule_level",
+              "result": "success",
+              "time": 0.2008,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validation_stops_on_failure_when_set_to_Continue_and_overriden_at_rule_level_async",
+              "result": "success",
+              "time": 0.8319,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validation_stops_on_failure_when_set_to_Continue_and_overriden_at_rule_level_async_legacy",
+              "result": "success",
+              "time": 0.8677,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validation_stops_on_failure_when_set_to_Continue_and_overriden_at_rule_level_legacy",
+              "result": "success",
+              "time": 0.21660000000000001,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validation_stops_on_first_failure",
+              "result": "success",
+              "time": 0.1706,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validation_stops_on_first_failure_async",
+              "result": "success",
+              "time": 0.7821,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validation_stops_on_first_failure_async_legacy",
+              "result": "success",
+              "time": 0.8751,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validation_stops_on_first_failure_legacy",
+              "result": "success",
+              "time": 0.1809,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validation_stops_on_first_Failure_when_set_to_Continue_globally_and_overriden_at_rule_level",
+              "result": "success",
+              "time": 0.188,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validation_stops_on_first_Failure_when_set_to_Continue_globally_and_overriden_at_rule_level_and_async_validator_is_invoked_synchronously",
+              "result": "success",
+              "time": 0.4818,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validation_stops_on_first_Failure_when_set_to_Continue_globally_and_overriden_at_rule_level_and_async_validator_is_invoked_synchronously_legacy",
+              "result": "success",
+              "time": 0.5077,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validation_stops_on_first_Failure_when_set_to_Continue_globally_and_overriden_at_rule_level_async",
+              "result": "success",
+              "time": 0.8130000000000001,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validation_stops_on_first_Failure_when_set_to_Continue_globally_and_overriden_at_rule_level_async_legacy",
+              "result": "success",
+              "time": 0.7979,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validation_stops_on_first_Failure_when_set_to_Continue_globally_and_overriden_at_rule_level_legacy",
+              "result": "success",
+              "time": 0.23,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validation_stops_on_first_failure_when_set_to_StopOnFirstFailure_at_validator_level",
+              "result": "success",
+              "time": 0.2738,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validation_stops_on_first_failure_when_set_to_StopOnFirstFailure_at_validator_level_async",
+              "result": "success",
+              "time": 0.909,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validation_stops_on_first_failure_when_set_to_StopOnFirstFailure_at_validator_level_async_legacy",
+              "result": "success",
+              "time": 0.8011,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validation_stops_on_first_failure_when_set_to_StopOnFirstFailure_at_validator_level_legacy",
+              "result": "success",
+              "time": 0.2253,
+            },
+          ],
+        },
+      ],
+      "name": "FluentValidation.Tests.CascadingFailuresTester",
+      "totalTime": undefined,
+    },
+    TestSuiteResult {
+      "groups": Array [
+        TestGroupResult {
+          "name": null,
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "Can_validate_using_validator_for_base_type",
+              "result": "success",
+              "time": 1.4496,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Chained_property_should_be_excluded",
+              "result": "success",
+              "time": 0.1883,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Chained_validator_descriptor",
+              "result": "success",
+              "time": 0.29710000000000003,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Chained_validator_should_not_be_invoked_on_null_property",
+              "result": "success",
+              "time": 0.121,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Condition_should_work_with_chained_property",
+              "result": "success",
+              "time": 0.2054,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Explicitly_included_properties_should_be_propagated_to_nested_validators",
+              "result": "success",
+              "time": 0.2691,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Explicitly_included_properties_should_be_propagated_to_nested_validators_using_strings",
+              "result": "success",
+              "time": 0.1753,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Separate_validation_on_chained_property",
+              "result": "success",
+              "time": 1.368,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Separate_validation_on_chained_property_conditional",
+              "result": "success",
+              "time": 0.2104,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Separate_validation_on_chained_property_valid",
+              "result": "success",
+              "time": 0.20249999999999999,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Should_allow_normal_rules_and_chained_property_on_same_property",
+              "result": "success",
+              "time": 0.2278,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Uses_explicit_ruleset",
+              "result": "success",
+              "time": 0.5128,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validates_chained_property",
+              "result": "success",
+              "time": 1.0483,
+            },
+          ],
+        },
+      ],
+      "name": "FluentValidation.Tests.ChainedValidationTester",
+      "totalTime": undefined,
+    },
+    TestSuiteResult {
+      "groups": Array [
+        TestGroupResult {
+          "name": null,
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "Options_should_only_apply_to_current_validator",
+              "result": "success",
+              "time": 0.23479999999999998,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Should_create_multiple_validators",
+              "result": "success",
+              "time": 0.3311,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Should_execute_multiple_validators",
+              "result": "success",
+              "time": 0.17809999999999998,
+            },
+          ],
+        },
+      ],
+      "name": "FluentValidation.Tests.ChainingValidatorsTester",
+      "totalTime": undefined,
+    },
+    TestSuiteResult {
+      "groups": Array [
+        TestGroupResult {
+          "name": null,
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "Can_define_nested_rules_for_collection",
+              "result": "success",
+              "time": 1.6096000000000001,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "ChildRules_works_with_RuleSet",
+              "result": "success",
+              "time": 5.8553,
+            },
+          ],
+        },
+      ],
+      "name": "FluentValidation.Tests.ChildRulesTests",
+      "totalTime": undefined,
+    },
+    TestSuiteResult {
+      "groups": Array [
+        TestGroupResult {
+          "name": null,
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "Async_condition_should_work_with_child_collection",
+              "result": "success",
+              "time": 0.7258,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Can_specify_condition_for_individual_collection_elements",
+              "result": "success",
+              "time": 0.9154,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Can_validate_collection_using_validator_for_base_type",
+              "result": "success",
+              "time": 1.0736999999999999,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Collection_should_be_excluded",
+              "result": "success",
+              "time": 0.525,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Collection_should_be_explicitly_included_with_expression",
+              "result": "success",
+              "time": 0.6578,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Collection_should_be_explicitly_included_with_string",
+              "result": "success",
+              "time": 0.5651999999999999,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Condition_should_work_with_child_collection",
+              "result": "success",
+              "time": 0.7357,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Creates_validator_using_context_from_property_value",
+              "result": "success",
+              "time": 1.1184,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Should_override_property_name",
+              "result": "success",
+              "time": 0.47550000000000003,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Should_work_with_top_level_collection_validator",
+              "result": "success",
+              "time": 0.7123999999999999,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Should_work_with_top_level_collection_validator_and_overriden_name",
+              "result": "success",
+              "time": 0.3943,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Skips_null_items",
+              "result": "success",
+              "time": 0.5809,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validates_collection",
+              "result": "success",
+              "time": 1.0225,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validates_collection_asynchronously",
+              "result": "success",
+              "time": 1.4053,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validates_collection_several_levels_deep",
+              "result": "success",
+              "time": 1.1437000000000002,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validates_collection_several_levels_deep_async",
+              "result": "success",
+              "time": 1.0832000000000002,
+            },
+          ],
+        },
+      ],
+      "name": "FluentValidation.Tests.CollectionValidatorWithParentTests",
+      "totalTime": undefined,
+    },
+    TestSuiteResult {
+      "groups": Array [
+        TestGroupResult {
+          "name": null,
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "Async_condition_should_work_with_complex_property",
+              "result": "success",
+              "time": 2.3119,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Async_condition_should_work_with_complex_property_when_validator_invoked_synchronously",
+              "result": "success",
+              "time": 0.7052,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Can_directly_validate_multiple_fields_of_same_type",
+              "result": "success",
+              "time": 3.4497,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Can_validate_using_validator_for_base_type",
+              "result": "success",
+              "time": 1.2612,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Complex_property_should_be_excluded",
+              "result": "success",
+              "time": 0.3153,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Complex_validator_should_not_be_invoked_on_null_property",
+              "result": "success",
+              "time": 0.16770000000000002,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Condition_should_work_with_complex_property",
+              "result": "success",
+              "time": 0.4359,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Condition_should_work_with_complex_property_when_invoked_async",
+              "result": "success",
+              "time": 0.8233,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Explicitly_included_properties_should_be_propagated_to_nested_validators",
+              "result": "success",
+              "time": 2.3437,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Explicitly_included_properties_should_be_propagated_to_nested_validators_using_strings",
+              "result": "success",
+              "time": 0.8307,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Multiple_rules_in_chain_with_childvalidator_shouldnt_reuse_accessor",
+              "result": "success",
+              "time": 0.7222,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Multiple_rules_in_chain_with_childvalidator_shouldnt_reuse_accessor_async",
+              "result": "success",
+              "time": 5.7314,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Should_allow_normal_rules_and_complex_property_on_same_property",
+              "result": "success",
+              "time": 0.7508,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Should_override_propertyName",
+              "result": "success",
+              "time": 0.7523,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validates_child_validator_asynchronously",
+              "result": "success",
+              "time": 3.7361999999999997,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validates_child_validator_synchronously",
+              "result": "success",
+              "time": 0.4716,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validates_complex_property",
+              "result": "success",
+              "time": 0.9825999999999999,
+            },
+          ],
+        },
+      ],
+      "name": "FluentValidation.Tests.ComplexValidationTester",
+      "totalTime": undefined,
+    },
+    TestSuiteResult {
+      "groups": Array [
+        TestGroupResult {
+          "name": null,
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "Async_condition_executed_synchronosuly_with_asynchronous_collection_rule",
+              "result": "success",
+              "time": 0.3309,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Async_condition_executed_synchronosuly_with_asynchronous_rule",
+              "result": "success",
+              "time": 0.2385,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Async_condition_executed_synchronosuly_with_synchronous_collection_role",
+              "result": "success",
+              "time": 0.3216,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Async_condition_executed_synchronosuly_with_synchronous_role",
+              "result": "success",
+              "time": 0.3076,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Async_condition_is_applied_to_all_validators_in_the_chain",
+              "result": "success",
+              "time": 0.8143999999999999,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Async_condition_is_applied_to_all_validators_in_the_chain_when_executed_synchronously",
+              "result": "success",
+              "time": 0.5363,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Async_condition_is_applied_to_single_validator_in_the_chain_when_ApplyConditionTo_set_to_CurrentValidator",
+              "result": "success",
+              "time": 0.8180000000000001,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Condition_is_applied_to_all_validators_in_the_chain",
+              "result": "success",
+              "time": 0.3098,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Condition_is_applied_to_single_validator_in_the_chain_when_ApplyConditionTo_set_to_CurrentValidator",
+              "result": "success",
+              "time": 0.3365,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Sync_condition_is_applied_to_async_validators",
+              "result": "success",
+              "time": 0.6349,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validation_should_fail_when_async_condition_does_not_match",
+              "result": "success",
+              "time": 0.4177,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validation_should_fail_when_async_condition_matches",
+              "result": "success",
+              "time": 0.7917,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validation_should_fail_when_condition_does_not_match",
+              "result": "success",
+              "time": 0.0888,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validation_should_fail_when_condition_matches",
+              "result": "success",
+              "time": 0.07550000000000001,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validation_should_succeed_when_async_condition_does_not_match",
+              "result": "success",
+              "time": 0.355,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validation_should_succeed_when_async_condition_matches",
+              "result": "success",
+              "time": 1.5482,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validation_should_succeed_when_condition_does_not_match",
+              "result": "success",
+              "time": 0.2873,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validation_should_succeed_when_condition_matches",
+              "result": "success",
+              "time": 0.4142,
+            },
+          ],
+        },
+      ],
+      "name": "FluentValidation.Tests.ConditionTests",
+      "totalTime": undefined,
+    },
+    TestSuiteResult {
+      "groups": Array [
+        TestGroupResult {
+          "name": null,
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "IsValidTests",
+              "result": "success",
+              "time": 0.2171,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_validation_fails_the_default_error_should_be_set",
+              "result": "success",
+              "time": 1.7932,
+            },
+          ],
+        },
+      ],
+      "name": "FluentValidation.Tests.CreditCardValidatorTests",
+      "totalTime": undefined,
+    },
+    TestSuiteResult {
+      "groups": Array [
+        TestGroupResult {
+          "name": null,
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "Does_not_invoke_action_if_validation_success",
+              "result": "success",
+              "time": 0.2528,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Invokes_custom_action_on_failure",
+              "result": "success",
+              "time": 0.2284,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Passes_object_being_validated_to_action",
+              "result": "success",
+              "time": 0.852,
+            },
+          ],
+        },
+      ],
+      "name": "FluentValidation.Tests.CustomFailureActionTester",
+      "totalTime": undefined,
+    },
+    TestSuiteResult {
+      "groups": Array [
+        TestGroupResult {
+          "name": null,
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "Replaces_propertyvalue_placeholder",
+              "result": "success",
+              "time": 0.9778,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Replaces_propertyvalue_with_empty_string_when_null",
+              "result": "success",
+              "time": 0.2456,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Should_format_custom_message",
+              "result": "success",
+              "time": 0.22440000000000002,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Uses_custom_delegate_for_building_message",
+              "result": "success",
+              "time": 0.5952999999999999,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Uses_custom_delegate_for_building_message_only_for_specific_validator",
+              "result": "success",
+              "time": 0.3785,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Uses_property_value_in_message",
+              "result": "success",
+              "time": 0.8185,
+            },
+          ],
+        },
+      ],
+      "name": "FluentValidation.Tests.CustomMessageFormatTester",
+      "totalTime": undefined,
+    },
+    TestSuiteResult {
+      "groups": Array [
+        TestGroupResult {
+          "name": null,
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "New_Custom_Returns_single_failure",
+              "result": "success",
+              "time": 0.335,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "New_Custom_Returns_single_failure_async",
+              "result": "success",
+              "time": 0.5860000000000001,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "New_custom_uses_empty_property_name_for_model_level_rule",
+              "result": "success",
+              "time": 0.2515,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "New_Custom_When_property_name_omitted_infers_property_name",
+              "result": "success",
+              "time": 0.23379999999999998,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "New_Custom_When_property_name_omitted_infers_property_name_nested",
+              "result": "success",
+              "time": 0.6317999999999999,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "New_Custom_within_ruleset",
+              "result": "success",
+              "time": 0.5423,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "New_CustomAsync_within_ruleset",
+              "result": "success",
+              "time": 0.8872,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Perserves_property_chain_using_custom",
+              "result": "success",
+              "time": 0.8351,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Runs_async_rule_synchronously_when_validator_invoked_synchronously",
+              "result": "success",
+              "time": 0.6956,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Runs_sync_rule_asynchronously_when_validator_invoked_asynchronously",
+              "result": "success",
+              "time": 0.5199,
+            },
+          ],
+        },
+      ],
+      "name": "FluentValidation.Tests.CustomValidatorTester",
+      "totalTime": undefined,
+    },
+    TestSuiteResult {
+      "groups": Array [
+        TestGroupResult {
+          "name": null,
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "Empty_should_create_EmptyValidator",
+              "result": "success",
+              "time": 0.2993,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Equal_should_create_EqualValidator_with_explicit_value",
+              "result": "success",
+              "time": 0.3343,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Equal_should_create_EqualValidator_with_lambda",
+              "result": "success",
+              "time": 0.6079,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "GreaterThan_should_create_GreaterThanValidator_with_explicit_value",
+              "result": "success",
+              "time": 0.2587,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "GreaterThan_should_create_GreaterThanValidator_with_lambda",
+              "result": "success",
+              "time": 0.4794,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "GreaterThanOrEqual_should_create_GreaterThanOrEqualValidator_with_explicit_value",
+              "result": "success",
+              "time": 0.2869,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "GreaterThanOrEqual_should_create_GreaterThanOrEqualValidator_with_lambda",
+              "result": "success",
+              "time": 7.8787,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "GreaterThanOrEqual_should_create_GreaterThanOrEqualValidator_with_lambda_with_other_Nullable",
+              "result": "success",
+              "time": 1.9588999999999999,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Length_should_create_ExactLengthValidator",
+              "result": "success",
+              "time": 0.3392,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Length_should_create_LengthValidator",
+              "result": "success",
+              "time": 0.2207,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Length_should_create_MaximumLengthValidator",
+              "result": "success",
+              "time": 0.2942,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Length_should_create_MinimumLengthValidator",
+              "result": "success",
+              "time": 0.26449999999999996,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "LessThan_should_create_LessThanValidator_with_explicit_value",
+              "result": "success",
+              "time": 0.2742,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "LessThan_should_create_LessThanValidator_with_lambda",
+              "result": "success",
+              "time": 0.5323,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "LessThanOrEqual_should_create_LessThanOrEqualValidator_with_explicit_value",
+              "result": "success",
+              "time": 0.6133,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "LessThanOrEqual_should_create_LessThanOrEqualValidator_with_lambda",
+              "result": "success",
+              "time": 0.5095,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "LessThanOrEqual_should_create_LessThanOrEqualValidator_with_lambda_with_other_Nullable",
+              "result": "success",
+              "time": 0.4351,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Must_should_create_PredicateValidator_with_context",
+              "result": "success",
+              "time": 0.8328,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Must_should_create_PredicateValidator_with_PropertyValidatorContext",
+              "result": "success",
+              "time": 4.2745,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Must_should_create_PredicteValidator",
+              "result": "success",
+              "time": 0.49379999999999996,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "MustAsync_should_create_AsyncPredicateValidator_with_context",
+              "result": "success",
+              "time": 0.1972,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "MustAsync_should_create_AsyncPredicateValidator_with_PropertyValidatorContext",
+              "result": "success",
+              "time": 1.6184999999999998,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "MustAsync_should_create_AsyncPredicteValidator",
+              "result": "success",
+              "time": 0.5833,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "MustAsync_should_not_throw_InvalidCastException",
+              "result": "success",
+              "time": 10.451600000000001,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "NotEmpty_should_create_NotEmptyValidator",
+              "result": "success",
+              "time": 0.2803,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "NotEqual_should_create_NotEqualValidator_with_explicit_value",
+              "result": "success",
+              "time": 0.3685,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "NotEqual_should_create_NotEqualValidator_with_lambda",
+              "result": "success",
+              "time": 0.5555,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "NotNull_should_create_NotNullValidator",
+              "result": "success",
+              "time": 0.2713,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "ScalePrecision_should_create_ScalePrecisionValidator",
+              "result": "success",
+              "time": 2.0008999999999997,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "ScalePrecision_should_create_ScalePrecisionValidator_with_ignore_trailing_zeros",
+              "result": "success",
+              "time": 0.2146,
+            },
+          ],
+        },
+      ],
+      "name": "FluentValidation.Tests.DefaultValidatorExtensionTester",
+      "totalTime": undefined,
+    },
+    TestSuiteResult {
+      "groups": Array [
+        TestGroupResult {
+          "name": null,
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "Fails_email_validation_aspnetcore_compatible(email: \\" \\\\r \\\\t \\\\n\\")",
+              "result": "success",
+              "time": 0.0247,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Fails_email_validation_aspnetcore_compatible(email: \\"\\")",
+              "result": "success",
+              "time": 0.0314,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Fails_email_validation_aspnetcore_compatible(email: \\"@someDomain.com\\")",
+              "result": "success",
+              "time": 0.0248,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Fails_email_validation_aspnetcore_compatible(email: \\"@someDomain@abc.com\\")",
+              "result": "success",
+              "time": 0.0234,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Fails_email_validation_aspnetcore_compatible(email: \\"0\\")",
+              "result": "success",
+              "time": 0.2222,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Fails_email_validation_aspnetcore_compatible(email: \\"someName\\")",
+              "result": "success",
+              "time": 0.023,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Fails_email_validation_aspnetcore_compatible(email: \\"someName@\\")",
+              "result": "success",
+              "time": 0.022699999999999998,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Fails_email_validation_aspnetcore_compatible(email: \\"someName@a@b.com\\")",
+              "result": "success",
+              "time": 0.022699999999999998,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Invalid_email_addressex_regex(email: \\"\\")",
+              "result": "success",
+              "time": 0.3859,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Invalid_email_addressex_regex(email: \\"first.last@test..co.uk\\")",
+              "result": "success",
+              "time": 0.0334,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Invalid_email_addressex_regex(email: \\"testperso\\")",
+              "result": "success",
+              "time": 0.0395,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Invalid_email_addressex_regex(email: \\"thisisaverylongstringcodeplex.com\\")",
+              "result": "success",
+              "time": 0.0316,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Valid_email_addresses_aspnetcore_compatible(email: \\" @someDomain.com\\")",
+              "result": "success",
+              "time": 0.0173,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Valid_email_addresses_aspnetcore_compatible(email: \\"!#$%&'*+-/=?^_\`|~@someDomain.com\\")",
+              "result": "success",
+              "time": 0.0174,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Valid_email_addresses_aspnetcore_compatible(email: \\"\\\\\\"firstName.lastName\\\\\\"@someDomain.com\\")",
+              "result": "success",
+              "time": 0.0167,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Valid_email_addresses_aspnetcore_compatible(email: \\"1234@someDomain.com\\")",
+              "result": "success",
+              "time": 0.0307,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Valid_email_addresses_aspnetcore_compatible(email: \\"firstName.lastName@someDomain.com\\")",
+              "result": "success",
+              "time": 0.0191,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Valid_email_addresses_aspnetcore_compatible(email: \\"someName@1234.com\\")",
+              "result": "success",
+              "time": 0.0158,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Valid_email_addresses_aspnetcore_compatible(email: \\"someName@some_domain.com\\")",
+              "result": "success",
+              "time": 0.0162,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Valid_email_addresses_aspnetcore_compatible(email: \\"someName@some~domain.com\\")",
+              "result": "success",
+              "time": 0.0166,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Valid_email_addresses_aspnetcore_compatible(email: \\"someName@someDomain.com\\")",
+              "result": "success",
+              "time": 0.0167,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Valid_email_addresses_aspnetcore_compatible(email: \\"someName@someDomain￯.com\\")",
+              "result": "success",
+              "time": 0.0157,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Valid_email_addresses_aspnetcore_compatible(email: null)",
+              "result": "success",
+              "time": 0.2029,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Valid_email_addresses_regex(email: \\"__somename@example.com\\")",
+              "result": "success",
+              "time": 0.0219,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Valid_email_addresses_regex(email: \\"!def!xyz%abc@example.com\\")",
+              "result": "success",
+              "time": 0.022,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Valid_email_addresses_regex(email: \\"\\\\\\"Abc@def\\\\\\"@example.com\\")",
+              "result": "success",
+              "time": 0.0245,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Valid_email_addresses_regex(email: \\"\\\\\\"Abc\\\\\\\\@def\\\\\\"@example.com\\")",
+              "result": "success",
+              "time": 0.026,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Valid_email_addresses_regex(email: \\"\\\\\\"Fred Bloggs\\\\\\"@example.com\\")",
+              "result": "success",
+              "time": 0.0258,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Valid_email_addresses_regex(email: \\"\\\\\\"Joe\\\\\\\\Blow\\\\\\"@example.com\\")",
+              "result": "success",
+              "time": 0.0244,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Valid_email_addresses_regex(email: \\"$A12345@example.com\\")",
+              "result": "success",
+              "time": 0.022600000000000002,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Valid_email_addresses_regex(email: \\"customer/department=shipping@example.com\\")",
+              "result": "success",
+              "time": 0.0234,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Valid_email_addresses_regex(email: \\"first.last@test.co.uk\\")",
+              "result": "success",
+              "time": 0.022600000000000002,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Valid_email_addresses_regex(email: \\"testperson@gmail.com\\")",
+              "result": "success",
+              "time": 16.3384,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Valid_email_addresses_regex(email: \\"TestPerson@gmail.com\\")",
+              "result": "success",
+              "time": 0.0805,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Valid_email_addresses_regex(email: \\"testperson+label@gmail.com\\")",
+              "result": "success",
+              "time": 0.0275,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Valid_email_addresses_regex(email: null)",
+              "result": "success",
+              "time": 0.4724,
+            },
+          ],
+        },
+      ],
+      "name": "FluentValidation.Tests.EmailValidatorTests",
+      "totalTime": undefined,
+    },
+    TestSuiteResult {
+      "groups": Array [
+        TestGroupResult {
+          "name": null,
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "Passes_for_ienumerable_that_doesnt_implement_ICollection",
+              "result": "success",
+              "time": 3.0376000000000003,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Passes_when_collection_empty",
+              "result": "success",
+              "time": 0.27,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_there_is_a_value_then_the_validator_should_fail",
+              "result": "success",
+              "time": 0.19890000000000002,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_validation_fails_error_should_be_set",
+              "result": "success",
+              "time": 0.2342,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_value_is_Default_for_type_validator_should_pass_datetime",
+              "result": "success",
+              "time": 0.3325,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_value_is_Default_for_type_validator_should_pass_int",
+              "result": "success",
+              "time": 0.3963,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_value_is_empty_string_validator_should_pass",
+              "result": "success",
+              "time": 0.2019,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_value_is_null_validator_should_pass",
+              "result": "success",
+              "time": 0.2377,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_value_is_whitespace_validation_should_pass",
+              "result": "success",
+              "time": 0.1968,
+            },
+          ],
+        },
+      ],
+      "name": "FluentValidation.Tests.EmptyTester",
+      "totalTime": undefined,
+    },
+    TestSuiteResult {
+      "groups": Array [
+        TestGroupResult {
+          "name": null,
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "Flags_enum_invalid_when_using_outofrange_negative_value",
+              "result": "success",
+              "time": 0.756,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Flags_enum_invalid_when_using_outofrange_positive_value",
+              "result": "success",
+              "time": 0.7806,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Flags_enum_valid_when_using_bitwise_value",
+              "result": "success",
+              "time": 19.2413,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Flags_enum_validates_correctly_when_using_zero_value",
+              "result": "success",
+              "time": 0.38539999999999996,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Flags_enum_with_overlapping_flags_valid_when_using_bitwise_value",
+              "result": "success",
+              "time": 0.299,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "IsValidTests",
+              "result": "success",
+              "time": 0.1215,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Nullable_enum_invalid_when_bad_value_specified",
+              "result": "success",
+              "time": 0.38470000000000004,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Nullable_enum_valid_when_property_value_is_null",
+              "result": "success",
+              "time": 0.1594,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Nullable_enum_valid_when_value_specified",
+              "result": "success",
+              "time": 1.8848,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_the_enum_is_initialized_with_invalid_value_then_the_validator_should_fail",
+              "result": "success",
+              "time": 0.2553,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_the_enum_is_not_initialized_with_valid_value_then_the_validator_should_fail",
+              "result": "success",
+              "time": 0.0819,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_validation_fails_the_default_error_should_be_set",
+              "result": "success",
+              "time": 0.1061,
+            },
+          ],
+        },
+      ],
+      "name": "FluentValidation.Tests.EnumValidatorTests",
+      "totalTime": undefined,
+    },
+    TestSuiteResult {
+      "groups": Array [
+        TestGroupResult {
+          "name": null,
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "Comparison_property_uses_custom_resolver",
+              "result": "success",
+              "time": 0.38289999999999996,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Should_store_comparison_type",
+              "result": "success",
+              "time": 0.3359,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Should_store_property_to_compare",
+              "result": "success",
+              "time": 0.32830000000000004,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Should_succeed_on_case_insensitive_comparison",
+              "result": "success",
+              "time": 0.2418,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Should_succeed_on_case_insensitive_comparison_using_expression",
+              "result": "success",
+              "time": 0.25379999999999997,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Should_use_ordinal_comparison_by_default",
+              "result": "success",
+              "time": 0.1642,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validates_against_property",
+              "result": "success",
+              "time": 0.29329999999999995,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_the_objects_are_equal_validation_should_succeed",
+              "result": "success",
+              "time": 0.3395,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_the_objects_are_not_equal_validation_should_fail",
+              "result": "success",
+              "time": 0.21919999999999998,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_validation_fails_the_error_should_be_set",
+              "result": "success",
+              "time": 0.23,
+            },
+          ],
+        },
+      ],
+      "name": "FluentValidation.Tests.EqualValidatorTests",
+      "totalTime": undefined,
+    },
+    TestSuiteResult {
+      "groups": Array [
+        TestGroupResult {
+          "name": null,
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "Min_and_max_properties_should_be_set",
+              "result": "success",
+              "time": 0.0707,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_exact_length_rule_failes_error_should_have_exact_length_error_errorcode",
+              "result": "success",
+              "time": 0.6217,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_the_text_is_an_exact_length_the_validator_should_pass",
+              "result": "success",
+              "time": 0.2146,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_the_text_length_is_larger_the_validator_should_fail",
+              "result": "success",
+              "time": 0.2571,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_the_text_length_is_smaller_the_validator_should_fail",
+              "result": "success",
+              "time": 0.46890000000000004,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_the_validator_fails_the_error_message_should_be_set",
+              "result": "success",
+              "time": 0.2836,
+            },
+          ],
+        },
+      ],
+      "name": "FluentValidation.Tests.ExactLengthValidatorTester",
+      "totalTime": undefined,
+    },
+    TestSuiteResult {
+      "groups": Array [
+        TestGroupResult {
+          "name": null,
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "To_and_from_properties_should_be_set",
+              "result": "success",
+              "time": 0.0668,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "To_and_from_properties_should_be_set_for_dates",
+              "result": "success",
+              "time": 0.09179999999999999,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "To_and_from_properties_should_be_set_for_strings",
+              "result": "success",
+              "time": 0.067,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validates_with_nullable_when_property_is_null",
+              "result": "success",
+              "time": 0.2242,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validates_with_nullable_when_property_not_null",
+              "result": "success",
+              "time": 0.6361,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_the_text_is_larger_than_the_range_then_the_validator_should_fail",
+              "result": "success",
+              "time": 0.5079,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_the_text_is_larger_than_the_range_then_the_validator_should_fail_for_strings",
+              "result": "success",
+              "time": 0.2392,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_the_to_is_smaller_than_the_from_then_the_validator_should_throw",
+              "result": "success",
+              "time": 0.3029,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_the_to_is_smaller_than_the_from_then_the_validator_should_throw_for_strings",
+              "result": "success",
+              "time": 0.1562,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_the_validator_fails_the_error_message_should_be_set",
+              "result": "success",
+              "time": 0.2535,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_the_validator_fails_the_error_message_should_be_set_for_strings",
+              "result": "success",
+              "time": 0.2668,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_the_value_is_between_the_range_specified_then_the_validator_should_pass",
+              "result": "success",
+              "time": 1.1727,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_the_value_is_between_the_range_specified_then_the_validator_should_pass_for_strings",
+              "result": "success",
+              "time": 0.2261,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_the_value_is_exactly_the_size_of_the_lower_bound_then_the_validator_should_fail",
+              "result": "success",
+              "time": 0.28390000000000004,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_the_value_is_exactly_the_size_of_the_lower_bound_then_the_validator_should_fail_for_strings",
+              "result": "success",
+              "time": 0.9095000000000001,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_the_value_is_exactly_the_size_of_the_upper_bound_then_the_validator_should_fail",
+              "result": "success",
+              "time": 0.2263,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_the_value_is_exactly_the_size_of_the_upper_bound_then_the_validator_should_fail_for_strings",
+              "result": "success",
+              "time": 0.23399999999999999,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_the_value_is_smaller_than_the_range_then_the_validator_should_fail",
+              "result": "success",
+              "time": 0.24689999999999998,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_the_value_is_smaller_than_the_range_then_the_validator_should_fail_for_strings",
+              "result": "success",
+              "time": 0.2367,
+            },
+          ],
+        },
+      ],
+      "name": "FluentValidation.Tests.ExclusiveBetweenValidatorTests",
+      "totalTime": undefined,
+    },
+    TestSuiteResult {
+      "groups": Array [
+        TestGroupResult {
+          "name": null,
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "Should_extract_member_from_member_expression",
+              "result": "success",
+              "time": 0.11299999999999999,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Should_return_null_for_non_member_expressions",
+              "result": "success",
+              "time": 0.1368,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Should_split_pascal_cased_member_name",
+              "result": "success",
+              "time": 0.6315000000000001,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "SplitPascalCase_should_return_null_when_input_is_null",
+              "result": "success",
+              "time": 0.0314,
+            },
+          ],
+        },
+      ],
+      "name": "FluentValidation.Tests.ExtensionTester",
+      "totalTime": undefined,
+    },
+    TestSuiteResult {
+      "groups": Array [
+        TestGroupResult {
+          "name": null,
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "Async_condition_should_work_with_child_collection",
+              "result": "success",
+              "time": 0.7127,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Can_access_colletion_index",
+              "result": "success",
+              "time": 0.28659999999999997,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Can_access_colletion_index_async",
+              "result": "success",
+              "time": 0.7781,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Can_access_parent_index",
+              "result": "success",
+              "time": 1.6135,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Can_access_parent_index_async",
+              "result": "success",
+              "time": 1.1019,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Can_specify_condition_for_individual_collection_elements",
+              "result": "success",
+              "time": 0.4461,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Can_use_cascade_with_RuleForEach",
+              "result": "success",
+              "time": 0.6943,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Can_validate_collection_using_validator_for_base_type",
+              "result": "success",
+              "time": 0.4768,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Collection_should_be_excluded",
+              "result": "success",
+              "time": 0.544,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Collection_should_be_explicitly_included_with_expression",
+              "result": "success",
+              "time": 0.7823,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Collection_should_be_explicitly_included_with_string",
+              "result": "success",
+              "time": 0.5339,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Condition_should_work_with_child_collection",
+              "result": "success",
+              "time": 0.3728,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Correctly_gets_collection_indices",
+              "result": "success",
+              "time": 0.3199,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Correctly_gets_collection_indices_async",
+              "result": "success",
+              "time": 0.699,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Executes_rule_for_each_item_in_collection",
+              "result": "success",
+              "time": 0.3186,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Executes_rule_for_each_item_in_collection_async",
+              "result": "success",
+              "time": 0.7972,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Nested_collection_for_null_property_should_not_throw_null_reference",
+              "result": "success",
+              "time": 0.4414,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Nested_conditions_Rule_For",
+              "result": "success",
+              "time": 0.9052,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Nested_conditions_Rule_For_Each",
+              "result": "success",
+              "time": 0.9411,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Overrides_indexer",
+              "result": "success",
+              "time": 1.2315,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Overrides_indexer_async",
+              "result": "success",
+              "time": 1.1100999999999999,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Regular_rules_can_drop_into_RuleForEach",
+              "result": "success",
+              "time": 0.8814,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "RuleForEach_async_RunsTasksSynchronously",
+              "result": "success",
+              "time": 23.6497,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Should_not_scramble_property_name_when_using_collection_validators_several_levels_deep",
+              "result": "success",
+              "time": 0.3437,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Should_not_scramble_property_name_when_using_collection_validators_several_levels_deep_with_ValidateAsync",
+              "result": "success",
+              "time": 2.1348000000000003,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Should_override_property_name",
+              "result": "success",
+              "time": 0.3821,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Skips_null_items",
+              "result": "success",
+              "time": 0.47859999999999997,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Top_level_collection",
+              "result": "success",
+              "time": 0.3379,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Uses_useful_error_message_when_used_on_non_property",
+              "result": "success",
+              "time": 0.43560000000000004,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validates_child_validator_asynchronously",
+              "result": "success",
+              "time": 0.7232000000000001,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validates_child_validator_synchronously",
+              "result": "success",
+              "time": 0.356,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validates_collection",
+              "result": "success",
+              "time": 0.5174,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_runs_outside_RuleForEach_loop",
+              "result": "success",
+              "time": 0.4935,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_runs_outside_RuleForEach_loop_async",
+              "result": "success",
+              "time": 1.2558,
+            },
+          ],
+        },
+      ],
+      "name": "FluentValidation.Tests.ForEachRuleTests",
+      "totalTime": undefined,
+    },
+    TestSuiteResult {
+      "groups": Array [
+        TestGroupResult {
+          "name": null,
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "Comparison_property_uses_custom_resolver",
+              "result": "success",
+              "time": 0.5497,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Comparison_type",
+              "result": "success",
+              "time": 0.20120000000000002,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Should_fail_when_less_than_input",
+              "result": "success",
+              "time": 0.3948,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Should_localize_value",
+              "result": "success",
+              "time": 0.8092,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Should_set_default_error_when_validation_fails",
+              "result": "success",
+              "time": 0.1125,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Should_succeed_when_equal_to_input",
+              "result": "success",
+              "time": 0.078,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Should_succeed_when_greater_than_input",
+              "result": "success",
+              "time": 0.08,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validates_nullable_with_nullable_property",
+              "result": "success",
+              "time": 0.38539999999999996,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validates_with_nullable_property",
+              "result": "success",
+              "time": 0.5735,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validates_with_nullable_when_property_is_null",
+              "result": "success",
+              "time": 0.2299,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validates_with_nullable_when_property_is_null_cross_property",
+              "result": "success",
+              "time": 0.46599999999999997,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validates_with_nullable_when_property_not_null",
+              "result": "success",
+              "time": 0.24649999999999997,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validates_with_nullable_when_property_not_null_cross_property",
+              "result": "success",
+              "time": 0.2763,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validates_with_property",
+              "result": "success",
+              "time": 0.2879,
+            },
+          ],
+        },
+      ],
+      "name": "FluentValidation.Tests.GreaterThanOrEqualToValidatorTester",
+      "totalTime": undefined,
+    },
+    TestSuiteResult {
+      "groups": Array [
+        TestGroupResult {
+          "name": null,
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "Comparison_property_uses_custom_resolver",
+              "result": "success",
+              "time": 0.4008,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Comparison_Type",
+              "result": "success",
+              "time": 0.2061,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Should_fail_when_equal_to_input",
+              "result": "success",
+              "time": 0.07289999999999999,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Should_fail_when_less_than_input",
+              "result": "success",
+              "time": 0.0764,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Should_set_default_error_when_validation_fails",
+              "result": "success",
+              "time": 0.1047,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Should_succeed_when_greater_than_input",
+              "result": "success",
+              "time": 0.08600000000000001,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validates_nullable_with_nullable_property",
+              "result": "success",
+              "time": 0.6029,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validates_with_nullable_property",
+              "result": "success",
+              "time": 0.5936,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validates_with_nullable_when_property_is_null",
+              "result": "success",
+              "time": 0.5006999999999999,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validates_with_nullable_when_property_is_null_cross_property",
+              "result": "success",
+              "time": 0.26689999999999997,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validates_with_nullable_when_property_not_null",
+              "result": "success",
+              "time": 0.2583,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validates_with_nullable_when_property_not_null_cross_property",
+              "result": "success",
+              "time": 0.5453,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validates_with_property",
+              "result": "success",
+              "time": 0.4626,
+            },
+          ],
+        },
+      ],
+      "name": "FluentValidation.Tests.GreaterThanValidatorTester",
+      "totalTime": undefined,
+    },
+    TestSuiteResult {
+      "groups": Array [
+        TestGroupResult {
+          "name": null,
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "To_and_from_properties_should_be_set",
+              "result": "success",
+              "time": 0.131,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "To_and_from_properties_should_be_set_for_strings",
+              "result": "success",
+              "time": 0.0602,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validates_with_nullable_when_property_is_null",
+              "result": "success",
+              "time": 0.2167,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validates_with_nullable_when_property_not_null",
+              "result": "success",
+              "time": 0.4472,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_the_text_is_larger_than_the_range_then_the_validator_should_fail",
+              "result": "success",
+              "time": 0.2468,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_the_text_is_larger_than_the_range_then_the_validator_should_fail_for_strings",
+              "result": "success",
+              "time": 0.2377,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_the_to_is_smaller_than_the_from_then_the_validator_should_throw",
+              "result": "success",
+              "time": 0.6235999999999999,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_the_to_is_smaller_than_the_from_then_the_validator_should_throw_for_strings",
+              "result": "success",
+              "time": 0.13290000000000002,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_the_validator_fails_the_error_message_should_be_set",
+              "result": "success",
+              "time": 0.2354,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_the_validator_fails_the_error_message_should_be_set_for_strings",
+              "result": "success",
+              "time": 0.2385,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_the_value_is_between_the_range_specified_then_the_validator_should_pass",
+              "result": "success",
+              "time": 0.3572,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_the_value_is_between_the_range_specified_then_the_validator_should_pass_for_strings",
+              "result": "success",
+              "time": 0.22,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_the_value_is_exactly_the_size_of_the_lower_bound_then_the_validator_should_pass",
+              "result": "success",
+              "time": 0.1963,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_the_value_is_exactly_the_size_of_the_lower_bound_then_the_validator_should_pass_for_strings",
+              "result": "success",
+              "time": 0.3005,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_the_value_is_exactly_the_size_of_the_upper_bound_then_the_validator_should_pass",
+              "result": "success",
+              "time": 0.2097,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_the_value_is_exactly_the_size_of_the_upper_bound_then_the_validator_should_pass_for_strings",
+              "result": "success",
+              "time": 0.19560000000000002,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_the_value_is_smaller_than_the_range_then_the_validator_should_fail",
+              "result": "success",
+              "time": 0.2294,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_the_value_is_smaller_than_the_range_then_the_validator_should_fail_for_strings",
+              "result": "success",
+              "time": 0.2161,
+            },
+          ],
+        },
+      ],
+      "name": "FluentValidation.Tests.InclusiveBetweenValidatorTests",
+      "totalTime": undefined,
+    },
+    TestSuiteResult {
+      "groups": Array [
+        TestGroupResult {
+          "name": null,
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "Can_use_custom_subclass_with_nongeneric_overload",
+              "result": "success",
+              "time": 0.6978000000000001,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validates_collection",
+              "result": "success",
+              "time": 0.6633,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validates_collection_async",
+              "result": "success",
+              "time": 4.0405,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validates_inheritance_async",
+              "result": "success",
+              "time": 1.2651999999999999,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validates_inheritance_hierarchy",
+              "result": "success",
+              "time": 0.5062000000000001,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validates_ruleset",
+              "result": "success",
+              "time": 0.9577,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validates_ruleset_async",
+              "result": "success",
+              "time": 1.6248,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validates_with_callback",
+              "result": "success",
+              "time": 1.2889,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validates_with_callback_accepting_derived",
+              "result": "success",
+              "time": 0.6007,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validates_with_callback_accepting_derived_async",
+              "result": "success",
+              "time": 4.8985,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validates_with_callback_async",
+              "result": "success",
+              "time": 1.1747999999999998,
+            },
+          ],
+        },
+      ],
+      "name": "FluentValidation.Tests.InheritanceValidatorTest",
+      "totalTime": undefined,
+    },
+    TestSuiteResult {
+      "groups": Array [
+        TestGroupResult {
+          "name": null,
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "Uses_inline_validator_to_build_rules",
+              "result": "success",
+              "time": 1.6789999999999998,
+            },
+          ],
+        },
+      ],
+      "name": "FluentValidation.Tests.InlineValidatorTester",
+      "totalTime": undefined,
+    },
+    TestSuiteResult {
+      "groups": Array [
+        TestGroupResult {
+          "name": null,
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "All_languages_should_be_loaded",
+              "result": "success",
+              "time": 1.3878,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "All_localizations_have_same_parameters_as_English",
+              "result": "success",
+              "time": 21.761,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Always_use_specific_language",
+              "result": "success",
+              "time": 0.0666,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Always_use_specific_language_with_string_source",
+              "result": "success",
+              "time": 0.3219,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Can_replace_message",
+              "result": "success",
+              "time": 0.24509999999999998,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Can_replace_message_without_overriding_all_languages",
+              "result": "success",
+              "time": 0.1258,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Disables_localization",
+              "result": "success",
+              "time": 0.16369999999999998,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Falls_back_to_default_localization_key_when_error_code_key_not_found",
+              "result": "success",
+              "time": 0.28150000000000003,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Falls_back_to_english_when_culture_not_registered",
+              "result": "success",
+              "time": 0.2145,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Falls_back_to_english_when_translation_missing",
+              "result": "success",
+              "time": 0.523,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Falls_back_to_parent_culture",
+              "result": "success",
+              "time": 0.4487,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Gets_translation_for_bosnian_latin_culture(cultureName: \\"bs-Latn-BA\\")",
+              "result": "success",
+              "time": 0.011,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Gets_translation_for_bosnian_latin_culture(cultureName: \\"bs-Latn\\")",
+              "result": "success",
+              "time": 0.0627,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Gets_translation_for_bosnian_latin_culture(cultureName: \\"bs\\")",
+              "result": "success",
+              "time": 0.661,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Gets_translation_for_croatian_culture",
+              "result": "success",
+              "time": 0.45990000000000003,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Gets_translation_for_culture",
+              "result": "success",
+              "time": 0.0741,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Gets_translation_for_serbian_culture(cultureName: \\"sr-Latn-RS\\")",
+              "result": "success",
+              "time": 0.01,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Gets_translation_for_serbian_culture(cultureName: \\"sr-Latn\\")",
+              "result": "success",
+              "time": 0.0484,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Gets_translation_for_serbian_culture(cultureName: \\"sr\\")",
+              "result": "success",
+              "time": 0.4456,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Gets_translation_for_specific_culture",
+              "result": "success",
+              "time": 0.0989,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Uses_error_code_as_localization_key",
+              "result": "success",
+              "time": 0.3393,
+            },
+          ],
+        },
+      ],
+      "name": "FluentValidation.Tests.LanguageManagerTests",
+      "totalTime": undefined,
+    },
+    TestSuiteResult {
+      "groups": Array [
+        TestGroupResult {
+          "name": null,
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "Min_and_max_properties_should_be_set",
+              "result": "success",
+              "time": 0.1047,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_input_is_null_then_the_validator_should_pass",
+              "result": "success",
+              "time": 0.352,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_the_max_is_smaller_than_the_min_then_the_validator_should_throw",
+              "result": "success",
+              "time": 0.4785,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_the_maxlength_validator_fails_the_error_message_should_be_set",
+              "result": "success",
+              "time": 0.356,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_the_minlength_validator_fails_the_error_message_should_be_set",
+              "result": "success",
+              "time": 0.3529,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_the_text_is_between_the_lambda_range_specified_then_the_validator_should_pass",
+              "result": "success",
+              "time": 0.92,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_the_text_is_between_the_range_specified_then_the_validator_should_pass",
+              "result": "success",
+              "time": 0.2179,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_the_text_is_exactly_the_size_of_the_lambda_lower_bound_then_the_validator_should_pass",
+              "result": "success",
+              "time": 0.3377,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_the_text_is_exactly_the_size_of_the_lambda_upper_bound_then_the_validator_should_pass",
+              "result": "success",
+              "time": 0.3149,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_the_text_is_exactly_the_size_of_the_lower_bound_then_the_validator_should_pass",
+              "result": "success",
+              "time": 0.21910000000000002,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_the_text_is_exactly_the_size_of_the_upper_bound_then_the_validator_should_pass",
+              "result": "success",
+              "time": 0.32899999999999996,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_the_text_is_larger_than_the_lambda_range_then_the_validator_should_fail",
+              "result": "success",
+              "time": 0.3557,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_the_text_is_larger_than_the_range_then_the_validator_should_fail",
+              "result": "success",
+              "time": 0.2796,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_the_text_is_smaller_than_the_lambda_range_then_the_validator_should_fail",
+              "result": "success",
+              "time": 0.3612,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_the_text_is_smaller_than_the_range_then_the_validator_should_fail",
+              "result": "success",
+              "time": 0.4057,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "When_the_validator_fails_the_error_message_should_be_set",
+              "result": "success",
+              "time": 11.340599999999998,
+            },
+          ],
+        },
+      ],
+      "name": "FluentValidation.Tests.LengthValidatorTests",
+      "totalTime": undefined,
+    },
+    TestSuiteResult {
+      "groups": Array [
+        TestGroupResult {
+          "name": null,
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "Comparison_property_uses_custom_resolver",
+              "result": "success",
+              "time": 1.0333,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Comparison_type",
+              "result": "success",
+              "time": 0.1094,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Should_fail_when_greater_than_input",
+              "result": "success",
+              "time": 0.0853,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Should_set_default_error_when_validation_fails",
+              "result": "success",
+              "time": 0.1044,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Should_succeed_when_equal_to_input",
+              "result": "success",
+              "time": 0.0726,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Should_succeed_when_less_than_input",
+              "result": "success",
+              "time": 0.082,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validates_nullable_with_nullable_property",
+              "result": "success",
+              "time": 0.4362,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validates_with_nullable_property",
+              "result": "success",
+              "time": 0.5804,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validates_with_nullable_when_property_is_null",
+              "result": "success",
+              "time": 0.36719999999999997,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validates_with_nullable_when_property_is_null_cross_property",
+              "result": "success",
+              "time": 0.4822,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validates_with_nullable_when_property_not_null",
+              "result": "success",
+              "time": 0.2607,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validates_with_nullable_when_property_not_null_cross_property",
+              "result": "success",
+              "time": 0.283,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validates_with_property",
+              "result": "success",
+              "time": 0.321,
+            },
+          ],
+        },
+      ],
+      "name": "FluentValidation.Tests.LessThanOrEqualToValidatorTester",
+      "totalTime": undefined,
+    },
+    TestSuiteResult {
+      "groups": Array [
+        TestGroupResult {
+          "name": null,
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "Comparison_property_uses_custom_resolver",
+              "result": "success",
+              "time": 0.3967,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Comparison_type",
+              "result": "success",
+              "time": 0.08940000000000001,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Extracts_property_from_constant_using_expression",
+              "result": "success",
+              "time": 0.0678,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Extracts_property_from_expression",
+              "result": "success",
+              "time": 0.5257000000000001,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Should_fail_when_equal_to_input",
+              "result": "success",
+              "time": 0.2,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Should_fail_when_greater_than_input",
+              "result": "success",
+              "time": 0.19249999999999998,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Should_set_default_validation_message_when_validation_fails",
+              "result": "success",
+              "time": 0.352,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Should_succeed_when_less_than_input",
+              "result": "success",
+              "time": 0.1783,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Should_throw_when_value_to_compare_is_null",
+              "result": "success",
+              "time": 0.28909999999999997,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validates_against_property",
+              "result": "success",
+              "time": 1.2022000000000002,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validates_nullable_with_nullable_property",
+              "result": "success",
+              "time": 0.773,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validates_with_nullable_property",
+              "result": "success",
+              "time": 0.5793,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validates_with_nullable_when_property_is_null",
+              "result": "success",
+              "time": 0.34259999999999996,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validates_with_nullable_when_property_not_null",
+              "result": "success",
+              "time": 0.2586,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validates_with_nullable_when_property_not_null_cross_property",
+              "result": "success",
+              "time": 0.27080000000000004,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Validates_with_nullable_when_property_null_cross_property",
+              "result": "success",
+              "time": 0.46349999999999997,
+            },
+          ],
+        },
+      ],
+      "name": "FluentValidation.Tests.LessThanValidatorTester",
+      "totalTime": undefined,
+    },
+    TestSuiteResult {
+      "groups": Array [
+        TestGroupResult {
+          "name": null,
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "Correctly_assigns_default_localized_error_message",
+              "result": "success",
+              "time": 1.1647,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Does_not_throw_InvalidCastException_when_using_RuleForEach",
+              "result": "success",
+              "time": 0.4547,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Formats_string_with_placeholders",
+              "result": "success",
+              "time": 0.2342,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Formats_string_with_placeholders_when_you_cant_edit_the_string",
+              "result": "success",
+              "time": 0.2285,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Uses_func_to_get_message",
+              "result": "success",
+              "time": 0.23829999999999998,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Uses_string_format_with_property_value",
+              "result": "success",
+              "time": 0.7191,
+            },
+          ],
+        },
+      ],
+      "name": "FluentValidation.Tests.LocalisedMessagesTester",
+      "totalTime": undefined,
+    },
+    TestSuiteResult {
+      "groups": Array [
+        TestGroupResult {
+          "name": null,
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "Uses_localized_name",
+              "result": "success",
+              "time": 0.3024,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Uses_localized_name_expression",
+              "result": "success",
+              "time": 0.8903,
+            },
+          ],
+        },
+      ],
+      "name": "FluentValidation.Tests.LocalisedNameTester",
+      "totalTime": undefined,
+    },
+    TestSuiteResult {
+      "groups": Array [
+        TestGroupResult {
+          "name": null,
+          "tests": Array [
+            TestCaseResult {
+              "error": undefined,
+              "name": "ComplexPropertyGet",
+              "result": "success",
+              "time": 0.9033,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "ComplexPropertySet",
+              "result": "success",
+              "time": 0.44129999999999997,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "Equality",
+              "result": "success",
+              "time": 1.0753,
+            },
+            TestCaseResult {
+              "error": undefined,
+              "name": "ImplicitCast",
+              "result": "success",
... 145529 lines suppressed ...