{"id":19873986,"url":"https://github.com/metarhia/metatests","last_synced_at":"2026-06-18T20:41:54.688Z","repository":{"id":13964831,"uuid":"75518889","full_name":"metarhia/metatests","owner":"metarhia","description":"Extremely simple to use test framework and runner for Metarhia technology stack 🧪","archived":false,"fork":false,"pushed_at":"2026-03-02T18:02:46.000Z","size":1201,"stargazers_count":19,"open_issues_count":14,"forks_count":4,"subscribers_count":15,"default_branch":"master","last_synced_at":"2026-03-02T21:48:22.457Z","etag":null,"topics":["assert","assertion","assertions","case","cases","ci","continuous-integration","declarative","impress","javascript","js","maojian","metarhia","mock","node","node-tap","nodejs","runner","tap","test"],"latest_commit_sha":null,"homepage":"https://metarhia.com","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/metarhia.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":"AUTHORS","dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"patreon":"tshemsedinov"}},"created_at":"2016-12-04T05:15:08.000Z","updated_at":"2026-03-02T18:02:44.000Z","dependencies_parsed_at":"2024-06-18T19:49:19.678Z","dependency_job_id":"0a16f4ae-5793-4569-bd98-476ca1f91ef6","html_url":"https://github.com/metarhia/metatests","commit_stats":{"total_commits":317,"total_committers":12,"mean_commits":"26.416666666666668","dds":"0.35015772870662465","last_synced_commit":"549662cd30906dccb357af9c43985e29224525b3"},"previous_names":["metarhia/maojian","aqrln/maojian"],"tags_count":38,"template":false,"template_full_name":null,"purl":"pkg:github/metarhia/metatests","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/metarhia%2Fmetatests","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/metarhia%2Fmetatests/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/metarhia%2Fmetatests/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/metarhia%2Fmetatests/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/metarhia","download_url":"https://codeload.github.com/metarhia/metatests/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/metarhia%2Fmetatests/sbom","scorecard":{"id":206010,"data":{"date":"2025-08-11","repo":{"name":"github.com/metarhia/metatests","commit":"265afe9430c7da535b25253f0e2c10cc028cf7be"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4,"checks":[{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/test.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Maintained","score":3,"reason":"4 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 3","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":0,"reason":"Found 1/18 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Pinned-Dependencies","score":2,"reason":"dependency not pinned by hash detected -- score normalized to 2","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:25: update your workflow using https://app.stepsecurity.io/secureworkflow/metarhia/metatests/test.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:27: update your workflow using https://app.stepsecurity.io/secureworkflow/metarhia/metatests/test.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:30: update your workflow using https://app.stepsecurity.io/secureworkflow/metarhia/metatests/test.yml/master?enable=pin","Info:   0 out of   3 GitHub-owned GitHubAction dependencies pinned","Info:   1 out of   1 npmCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":9,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Warn: project license file does not contain an FSF or OSI license."],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 15 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":8,"reason":"2 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-xffm-g5w8-qvg7","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-16T23:46:48.424Z","repository_id":13964831,"created_at":"2025-08-16T23:46:48.425Z","updated_at":"2025-08-16T23:46:48.425Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34507160,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-18T02:00:06.871Z","response_time":128,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["assert","assertion","assertions","case","cases","ci","continuous-integration","declarative","impress","javascript","js","maojian","metarhia","mock","node","node-tap","nodejs","runner","tap","test"],"created_at":"2024-11-12T16:20:59.095Z","updated_at":"2026-06-18T20:41:54.671Z","avatar_url":"https://github.com/metarhia.png","language":"JavaScript","funding_links":["https://patreon.com/tshemsedinov"],"categories":[],"sub_categories":[],"readme":"# metatests\n\n[![ci status](https://github.com/metarhia/metatests/workflows/Testing%20CI/badge.svg)](https://github.com/metarhia/metatests/actions?query=workflow%3A%22Testing+CI%22+branch%3Amaster)\n[![snyk](https://snyk.io/test/github/metarhia/metatests/badge.svg)](https://snyk.io/test/github/metarhia/metatests)\n[![npm version](https://badge.fury.io/js/metatests.svg)](https://badge.fury.io/js/metatests)\n[![npm downloads/month](https://img.shields.io/npm/dm/metatests.svg)](https://www.npmjs.com/package/metatests)\n[![npm downloads](https://img.shields.io/npm/dt/metatests.svg)](https://www.npmjs.com/package/metatests)\n[![license](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/metarhia/metatests/blob/master/LICENSE)\n\n`metatests` is an extremely simple to use test framework and runner for Metarhia\ntechnology stack built on the following principles:\n\n- Test cases are files, tests are either imperative (functions) or declarative\n  (arrays and structures).\n\n- Assertions are done using the built-in Node.js `assert` module. The framework\n  also provides additional testing facilities (like spies).\n\n- Tests can be run in parallel.\n\n- All tests are executed in isolated sandboxes. The framework allows to easily\n  mock modules required by tests and provides ready-to-use mocks for timers and\n  other core functionality.\n\n- Testing asynchronous operations must be supported.\n\n- Testing pure functions without asynchronous operations and state can be done\n  without extra boilerplate code using DSL based on arrays.\n\n  ```javascript\n  mt.case(\n    'Test common.duration',\n    { common },\n    {\n      // ...\n      'common.duration': [\n        ['1d', 86400000],\n        ['10h', 36000000],\n        ['7m', 420000],\n        ['13s', 13000],\n        ['2d 43s', 172843000],\n        // ...\n      ],\n      // ...\n    },\n  );\n  ```\n\n  ([Prior art](https://github.com/metarhia/impress/blob/a457976b86f6a846c922f9435ab33f20dfaaad30/tests/unittests/api.common.test.js))\n\n- The framework must work in Node.js and browsers (using Webpack or any other\n  module bundler that supports CommonJS modules and emulates Node.js globals).\n\n## Contributors\n\n- See github for full [contributors list](https://github.com/metarhia/metatests/graphs/contributors)\n\n## API\n\n- [Interface metatests](#interface-metatests)\n  - [case](#casecaption-namespace-list-runner)\n  - [DeclarativeTest](#class-declarativetest-extends-test)\n    - [DeclarativeTest.prototype.constructor](#declarativetestprototypeconstructorcaption-namespace-list-options)\n    - [DeclarativeTest.prototype.run](#declarativetestprototyperun)\n    - [DeclarativeTest.prototype.runNow](#declarativetestprototyperunnow)\n  - [equal](#equalval1-val2)\n  - [strictEqual](#strictequalval1-val2)\n  - [reporters.Reporter](#class-reportersreporter)\n    - [reporters.Reporter.prototype.constructor](#reportersreporterprototypeconstructoroptions)\n    - [reporters.Reporter.prototype.error](#reportersreporterprototypeerrortest-error)\n    - [reporters.Reporter.prototype.finish](#reportersreporterprototypefinish)\n    - [reporters.Reporter.prototype.log](#reportersreporterprototypelogargs)\n    - [reporters.Reporter.prototype.logComment](#reportersreporterprototypelogcommentargs)\n    - [reporters.Reporter.prototype.record](#reportersreporterprototyperecordtest)\n  - [reporters.ConciseReporter](#class-reportersconcisereporter-extends-reporter)\n    - [reporters.ConciseReporter.prototype.constructor](#reportersconcisereporterprototypeconstructoroptions)\n    - [reporters.ConciseReporter.prototype.error](#reportersconcisereporterprototypeerrortest-error)\n    - [reporters.ConciseReporter.prototype.finish](#reportersconcisereporterprototypefinish)\n    - [reporters.ConciseReporter.prototype.listFailure](#reportersconcisereporterprototypelistfailuretest-res-message)\n    - [reporters.ConciseReporter.prototype.parseTestResults](#reportersconcisereporterprototypeparsetestresultstest-subtest)\n    - [reporters.ConciseReporter.prototype.printAssertErrorSeparator](#reportersconcisereporterprototypeprintasserterrorseparator)\n    - [reporters.ConciseReporter.prototype.printSubtestSeparator](#reportersconcisereporterprototypeprintsubtestseparator)\n    - [reporters.ConciseReporter.prototype.printTestSeparator](#reportersconcisereporterprototypeprinttestseparator)\n    - [reporters.ConciseReporter.prototype.record](#reportersconcisereporterprototyperecordtest)\n  - [reporters.TapReporter](#class-reporterstapreporter-extends-reporter)\n    - [reporters.TapReporter.prototype.constructor](#reporterstapreporterprototypeconstructoroptions)\n    - [reporters.TapReporter.prototype.error](#reporterstapreporterprototypeerrortest-error)\n    - [reporters.TapReporter.prototype.finish](#reporterstapreporterprototypefinish)\n    - [reporters.TapReporter.prototype.listFailure](#reporterstapreporterprototypelistfailuretest-res-offset)\n    - [reporters.TapReporter.prototype.logComment](#reporterstapreporterprototypelogcommentargs)\n    - [reporters.TapReporter.prototype.parseTestResults](#reporterstapreporterprototypeparsetestresultstest-offset--0)\n    - [reporters.TapReporter.prototype.record](#reporterstapreporterprototyperecordtest)\n  - [runner.Runner](#class-runnerrunner-extends-eventemitter)\n    - [runner.Runner.prototype.constructor](#runnerrunnerprototypeconstructoroptions)\n    - [runner.Runner.prototype.addTest](#runnerrunnerprototypeaddtesttest)\n    - [runner.Runner.prototype.finish](#runnerrunnerprototypefinish)\n    - [runner.Runner.prototype.removeReporter](#runnerrunnerprototyperemovereporter)\n    - [runner.Runner.prototype.resume](#runnerrunnerprototyperesume)\n    - [runner.Runner.prototype.runTodo](#runnerrunnerprototyperuntodoactive--true)\n    - [runner.Runner.prototype.setReporter](#runnerrunnerprototypesetreporterreporter)\n    - [runner.Runner.prototype.wait](#runnerrunnerprototypewait)\n  - [runner.instance](#runnerinstance)\n  - [speed](#speedcaption-count-cases)\n  - [measure](#measurecases-options)\n  - [convertToCsv](#converttocsvresults)\n  - [ImperativeTest](#class-imperativetest-extends-test)\n    - [ImperativeTest.prototype.constructor](#imperativetestprototypeconstructorcaption-func-options)\n    - [ImperativeTest.prototype.afterEach](#imperativetestprototypeaftereachfunc)\n    - [ImperativeTest.prototype.assert](#imperativetestprototypeassertvalue-message)\n    - [ImperativeTest.prototype.assertNot](#imperativetestprototypeassertnotvalue-message)\n    - [ImperativeTest.prototype.bailout](#imperativetestprototypebailouterr-message)\n    - [ImperativeTest.prototype.beforeEach](#imperativetestprototypebeforeeachfunc)\n    - [ImperativeTest.prototype.case](#imperativetestprototypecasemessage-namespace-list-options--)\n    - [ImperativeTest.prototype.cb](#imperativetestprototypecbmsg-cb)\n    - [ImperativeTest.prototype.cbFail](#imperativetestprototypecbfailfail-cb-afterallcb)\n    - [ImperativeTest.prototype.contains](#imperativetestprototypecontainsactual-subobj-message-sort-test)\n    - [ImperativeTest.prototype.containsGreedy](#imperativetestprototypecontainsgreedyactual-subobj-message-sort-test)\n    - [ImperativeTest.prototype.defer](#imperativetestprototypedeferfn-options)\n    - [ImperativeTest.prototype.doesNotThrow](#imperativetestprototypedoesnotthrowfn-message)\n    - [ImperativeTest.prototype.end](#imperativetestprototypeend)\n    - [ImperativeTest.prototype.endAfterSubtests](#imperativetestprototypeendaftersubtests)\n    - [ImperativeTest.prototype.equal](#imperativetestprototypeequalactual-expected-message)\n    - [ImperativeTest.prototype.error](#imperativetestprototypeerrorerr-message)\n    - [ImperativeTest.prototype.fail](#imperativetestprototypefailmessage-err)\n    - [ImperativeTest.prototype.is](#imperativetestprototypeischeckfn-val-message)\n    - [ImperativeTest.prototype.isArray](#imperativetestprototypeisarrayval-message)\n    - [ImperativeTest.prototype.isBuffer](#imperativetestprototypeisbufferval-message)\n    - [ImperativeTest.prototype.isError](#imperativetestprototypeiserroractual-expected-message)\n    - [ImperativeTest.prototype.isRejected](#imperativetestprototypeisrejectedinput-err)\n    - [ImperativeTest.prototype.isResolved](#imperativetestprototypeisresolvedinput-expected)\n    - [ImperativeTest.prototype.mustCall](#imperativetestprototypemustcallfn-count-name)\n    - [ImperativeTest.prototype.mustNotCall](#imperativetestprototypemustnotcallfn-name)\n    - [ImperativeTest.prototype.notEqual](#imperativetestprototypenotequalactual-expected-message)\n    - [ImperativeTest.prototype.notOk](#imperativetestprototypenotokvalue-message)\n    - [ImperativeTest.prototype.notSameTopology](#imperativetestprototypenotsametopologyobj1-obj2-message)\n    - [ImperativeTest.prototype.ok](#imperativetestprototypeokvalue-message)\n    - [ImperativeTest.prototype.on](#imperativetestprototypeonname-listener)\n    - [ImperativeTest.prototype.pass](#imperativetestprototypepassmessage)\n    - [ImperativeTest.prototype.plan](#imperativetestprototypeplann)\n    - [ImperativeTest.prototype.regex](#imperativetestprototyperegexregex-input-message)\n    - [ImperativeTest.prototype.rejects](#imperativetestprototyperejectsinput-err)\n    - [ImperativeTest.prototype.resolves](#imperativetestprototyperesolvesinput-expected)\n    - [ImperativeTest.prototype.run](#imperativetestprototyperun)\n    - [ImperativeTest.prototype.same](#imperativetestprototypesameactual-expected-message)\n    - [ImperativeTest.prototype.sameTopology](#imperativetestprototypesametopologyobj1-obj2-message)\n    - [ImperativeTest.prototype.strictEqual](#imperativetestprototypestrictequalactual-expected-message)\n    - [ImperativeTest.prototype.strictNotSame](#imperativetestprototypestrictnotsameactual-expected-message)\n    - [ImperativeTest.prototype.strictSame](#imperativetestprototypestrictsameactual-expected-message)\n    - [ImperativeTest.prototype.test](#imperativetestprototypetestcaption-func-options)\n    - [ImperativeTest.prototype.testAsync](#imperativetestprototypetestasyncmessage-func-options--)\n    - [ImperativeTest.prototype.testSync](#imperativetestprototypetestsyncmessage-func-options--)\n    - [ImperativeTest.prototype.throws](#imperativetestprototypethrowsfn-expected-message)\n    - [ImperativeTest.prototype.type](#imperativetestprototypetypeobj-type-message)\n  - [test](#testcaption-func-options-runner)\n  - [testSync](#testsynccaption-func-options---runner--runnerinstance)\n  - [testAsync](#testasynccaption-func-options---runner--runnerinstance)\n\n### Interface: metatests\n\n#### case(caption, namespace, list, runner)\n\n- `caption`: [`\u003cstring\u003e`][string] case caption\n- `namespace`: [`\u003cObject\u003e`][object] namespace to use in this case test\n- `list`: [`\u003cObject\u003e`][object] hash of [`\u003cArray\u003e`][array], hash keys are\n  function and method names. [`\u003cArray\u003e`][array] contains call parameters last\n  [`\u003cArray\u003e`][array] item is an expected result (to compare) or\n  [`\u003cFunction\u003e`][function] (pass result to compare)\n- `runner`: [`\u003cRunner\u003e`][runner] runner for this case test, optional, default:\n  `metatests.runner.instance`\n\nCreate declarative test\n\n#### class DeclarativeTest extends Test\n\n##### DeclarativeTest.prototype.constructor(caption, namespace, list, options)\n\n##### DeclarativeTest.prototype.run()\n\n##### DeclarativeTest.prototype.runNow()\n\n#### equal(val1, val2)\n\n#### strictEqual(val1, val2)\n\n#### class reporters.Reporter\n\n##### reporters.Reporter.prototype.constructor(options)\n\n- `options`: [`\u003cObject\u003e`][object]\n  - `stream`: `\u003cstream.Writable\u003e` optional\n\n##### reporters.Reporter.prototype.error(test, error)\n\n- `test`: `\u003cTest\u003e`\n- `error`: [`\u003cError\u003e`][error]\n\nFail test with error\n\n##### reporters.Reporter.prototype.finish()\n\n##### reporters.Reporter.prototype.log(...args)\n\n##### reporters.Reporter.prototype.logComment(...args)\n\n##### reporters.Reporter.prototype.record(test)\n\n- `test`: `\u003cTest\u003e`\n\nRecord test\n\n#### class reporters.ConciseReporter extends Reporter\n\n##### reporters.ConciseReporter.prototype.constructor(options)\n\n##### reporters.ConciseReporter.prototype.error(test, error)\n\n##### reporters.ConciseReporter.prototype.finish()\n\n##### reporters.ConciseReporter.prototype.listFailure(test, res, message)\n\n##### reporters.ConciseReporter.prototype.parseTestResults(test, subtest)\n\n##### reporters.ConciseReporter.prototype.printAssertErrorSeparator()\n\n##### reporters.ConciseReporter.prototype.printSubtestSeparator()\n\n##### reporters.ConciseReporter.prototype.printTestSeparator()\n\n##### reporters.ConciseReporter.prototype.record(test)\n\n#### class reporters.TapReporter extends Reporter\n\n##### reporters.TapReporter.prototype.constructor(options)\n\n##### reporters.TapReporter.prototype.error(test, error)\n\n##### reporters.TapReporter.prototype.finish()\n\n##### reporters.TapReporter.prototype.listFailure(test, res, offset)\n\n##### reporters.TapReporter.prototype.logComment(...args)\n\n##### reporters.TapReporter.prototype.parseTestResults(test, offset = 0)\n\n##### reporters.TapReporter.prototype.record(test)\n\n#### class runner.Runner extends EventEmitter\n\n##### runner.Runner.prototype.constructor(options)\n\n##### runner.Runner.prototype.addTest(test)\n\n##### runner.Runner.prototype.finish()\n\n##### runner.Runner.prototype.removeReporter()\n\n##### runner.Runner.prototype.resume()\n\n##### runner.Runner.prototype.runTodo(active = true)\n\n##### runner.Runner.prototype.setReporter(reporter)\n\n##### runner.Runner.prototype.wait()\n\n#### runner.instance\n\n- [`\u003cRunner\u003e`][runner]\n\n#### speed(caption, count, cases)\n\n- `caption`: [`\u003cstring\u003e`][string] name of the benchmark\n- `count`: [`\u003cnumber\u003e`][number] amount of times ro run each function\n- `cases`: [`\u003cArray\u003e`][array] functions to check\n\nMicrobenchmark each passed function and compare results.\n\n#### measure(cases\\[, options\\])\n\n- `cases`: [`\u003cArray\u003e`][array] cases to test, each case contains\n  - `fn`: [`\u003cFunction\u003e`][function] function to check, will be called with each\n    args provided\n  - `name`: [`\u003cstring\u003e`][string] case name, function.name by default\n  - `argCases`: [`\u003cArray\u003e`][array] array of arguments to create runs with. When\n    omitted `fn` will be run once without arguments. Total amount of runs will\n    be `runs * argCases.length`.\n  - `n`: [`\u003cnumber\u003e`][number] number of times to run the test, defaultCount from\n    options by default\n- `options`: [`\u003cObject\u003e`][object]\n  - `defaultCount`: [`\u003cnumber\u003e`][number] number of times to run the function by\n    default, default: 1e6\n  - `runs`: [`\u003cnumber\u003e`][number] number of times to run the case, default: 20\n  - `preflight`: [`\u003cnumber\u003e`][number] number of times to pre-run the case for\n    each set of arguments, default: 10\n  - `preflightCount`: [`\u003cnumber\u003e`][number] number of times to run the function\n    in the preflight stage, default: 1e4\n  - `listener`: [`\u003cObject\u003e`][object] appropriate function will be called to\n    report events, optional\n    - `preflight`: [`\u003cFunction\u003e`][function] called when preflight is starting,\n      optional\n      - `name`: [`\u003cstring\u003e`][string] case name\n      - `count`: [`\u003cnumber\u003e`][number] number of times it will be run\n      - `args`: [`\u003cArray\u003e`][array] function arguments\n    - `run`: [`\u003cFunction\u003e`][function] called when run is starting, optional\n      - `name`: [`\u003cstring\u003e`][string] case name\n      - `count`: [`\u003cnumber\u003e`][number] number of times it will be run\n      - `args`: [`\u003cArray\u003e`][array] function arguments\n    - `cycle`: [`\u003cFunction\u003e`][function] called when run is done, optional\n      - `name`: [`\u003cstring\u003e`][string] case name\n      - `result`: [`\u003cObject\u003e`][object] case results\n    - `done`: [`\u003cFunction\u003e`][function] called when all runs for given\n      configurations are done, optional\n      - `name`: [`\u003cstring\u003e`][string] case name\n      - `args`: [`\u003cArray\u003e`][array] current configuration\n      - `results`: [`\u003cArray\u003e`][array] results of all runs with this\n        configuration\n    - `finish`: [`\u003cFunction\u003e`][function] called when measuring is finished,\n      optional\n      - `results`: [`\u003cArray\u003e`][array] all case results\n\n_Returns:_ [`\u003cArray\u003e`][array] results of all cases as objects of structure\n\n- `name`: [`\u003cstring\u003e`][string] case name\n- `args`: [`\u003cArray\u003e`][array] arguments for this run\n- `count`: [`\u003cnumber\u003e`][number] number of times case was run\n- `time`: [`\u003cnumber\u003e`][number] time in nanoseconds it took to make `count` runs\n- `result`: `\u003cany\u003e` result of one of the runs\n\nMicrobenchmark each passed configuration multiple times\n\n#### convertToCsv(results)\n\n- `results`: [`\u003cArray\u003e`][array] all results from `measure` run\n\n_Returns:_ [`\u003cstring\u003e`][string] valid CSV representation of the results\n\nConvert metatests.measure result to csv.\n\n#### class ImperativeTest extends Test\n\n##### ImperativeTest.prototype.constructor(caption, func, options)\n\n##### ImperativeTest.prototype.afterEach(func)\n\n- `func`: [`\u003cFunction\u003e`][function]\n  - `subtest`: `\u003cImperativeTest\u003e` test instance\n  - `callback`: [`\u003cFunction\u003e`][function]\n  - _Returns:_ [`\u003cPromise\u003e`][promise]|`\u003cvoid\u003e`\n\nSet a function to run after each subtest.\n\nThe function must either return a promise or call a callback.\n\n##### ImperativeTest.prototype.assert(value\\[, message\\])\n\n- `value`: `\u003cany\u003e` value to check\n- `message`: [`\u003cstring\u003e`][string] description of the check, optional\n\nCheck if value is truthy.\n\n##### ImperativeTest.prototype.assertNot(value\\[, message\\])\n\n- `value`: `\u003cany\u003e` value to check\n- `message`: [`\u003cstring\u003e`][string] description of the check, optional\n\nCheck if value is falsy.\n\n##### ImperativeTest.prototype.bailout(\\[err\\]\\[, message\\])\n\n- `err`: [`\u003cError\u003e`][error] bailout error\n- `message`: [`\u003cstring\u003e`][string] bailout message\n\nFail this test and throw an error.\n\nIf both `err` and `message` are provided `err.toString()` will be appended to\n`message`.\n\n##### ImperativeTest.prototype.beforeEach(func)\n\n- `func`: [`\u003cFunction\u003e`][function]\n  - `subtest`: `\u003cImperativeTest\u003e` test instance\n  - `callback`: [`\u003cFunction\u003e`][function]\n    - `context`: `\u003cany\u003e` context of the test. It will pe passed as a second\n      argument to test function and is available at `test.context`\n  - _Returns:_ [`\u003cPromise\u003e`][promise]|`\u003cvoid\u003e` nothing or `Promise` resolved\n    with context\n\nSet a function to run before each subtest.\n\nThe function must either return a promise or call a callback.\n\n##### ImperativeTest.prototype.case(message, namespace, list, options = {})\n\nCreate a declarative [`case()`][case()] subtest of this test.\n\n##### ImperativeTest.prototype.cb(\\[msg\\]\\[, cb\\])\n\n- `msg`: [`\u003cstring\u003e`][string] test.error message\n- `cb`: [`\u003cFunction\u003e`][function] callback function\n\n_Returns:_ [`\u003cFunction\u003e`][function] function to pass to callback\n\nCreate error-first callback wrapper to perform automatic checks.\n\nThis will check for [`test.mustCall()`][test.mustcall()] the callback and\n`{test.error()}` the first callback argument.\n\n##### ImperativeTest.prototype.cbFail(\\[fail\\]\\[, cb\\[, afterAllCb\\]\\])\n\n- `fail`: [`\u003cstring\u003e`][string] test.fail message\n- `cb`: [`\u003cFunction\u003e`][function] callback function to call if there was no error\n- `afterAllCb`: [`\u003cFunction\u003e`][function] function called after callback handling\n\n_Returns:_ [`\u003cFunction\u003e`][function] function to pass to callback\n\nCreate error-first callback wrapper to fail test if call fails.\n\nThis will check for [`test.mustCall()`][test.mustcall()] the callback and if the\ncall errored will use [`test.fail()`][test.fail()] and\n[`test.end()`][test.end()]\n\n##### ImperativeTest.prototype.contains(actual, subObj\\[, message\\[, sort\\[, test\\]\\]\\])\n\n- `actual`: `\u003cany\u003e` actual data\n- `subObj`: `\u003cany\u003e` expected properties\n- `message`: [`\u003cstring\u003e`][string] description of the check, optional\n- `sort`: `\u003cboolean | Function\u003e` if true or a sort function sort data\n  properties, default: false\n- `cmp`: [`\u003cFunction\u003e`][function] test function, default: compare.strictEqual\n  - `actual`: `\u003cany\u003e`\n  - `expected`: `\u003cany\u003e`\n  - _Returns:_ [`\u003cboolean\u003e`][boolean] true if actual is equal to expected, false\n    otherwise\n\nCheck that actual contains all properties of subObj.\n\nProperties will be compared with test function.\n\n##### ImperativeTest.prototype.containsGreedy(actual, subObj\\[, message\\[, sort\\[, test\\]\\]\\])\n\n- `actual`: `\u003cany\u003e` actual data\n- `subObj`: `\u003cany\u003e` expected properties\n- `message`: [`\u003cstring\u003e`][string] description of the check, optional\n- `cmp`: [`\u003cFunction\u003e`][function] test function, default: compare.strictEqual\n  - `actual`: `\u003cany\u003e`\n  - `expected`: `\u003cany\u003e`\n  - _Returns:_ [`\u003cboolean\u003e`][boolean] true if actual is equal to expected, false\n    otherwise\n\nCheck greedily that actual contains all properties of subObj.\n\nSimilar to [`test.contains()`][test.contains()] but will succeed if at least one\nof the properties in actual match the one in subObj.\n\n##### ImperativeTest.prototype.defer(fn, options)\n\n- `fn`: [`\u003cFunction\u003e`][function] function to call before the end of test. Can\n  return a promise that will defer the end of test.\n- `options`: [`\u003cObject\u003e`][object]\n  - `ignoreErrors`: [`\u003cboolean\u003e`][boolean] ignore errors from fn function,\n    default: `false`\n\nDefer a function call until the 'before' end of test.\n\n##### ImperativeTest.prototype.doesNotThrow(fn\\[, message\\])\n\n- `fn`: [`\u003cFunction\u003e`][function] function to run\n- `message`: [`\u003cstring\u003e`][string] description of the check, optional\n\nCheck that fn doesn't throw.\n\n##### ImperativeTest.prototype.end()\n\nFinish the test.\n\nThis will fail if the test has unfinished subtests or plan is not complete.\n\n##### ImperativeTest.prototype.endAfterSubtests()\n\nMark this test to call end after its subtests are done.\n\n##### ImperativeTest.prototype.equal(actual, expected\\[, message\\])\n\n- `actual`: `\u003cany\u003e` actual data\n- `expected`: `\u003cany\u003e` expected data\n- `message`: [`\u003cstring\u003e`][string] description of the check, optional\n\nCompare actual and expected for non-strict equality.\n\n##### ImperativeTest.prototype.error(err\\[, message\\])\n\n- `err`: `\u003cany\u003e` error to check\n- `message`: [`\u003cstring\u003e`][string] description of the check, optional\n\nFail if err is instance of Error.\n\n##### ImperativeTest.prototype.fail(\\[message\\]\\[, err\\])\n\n- `message`: `\u003cstring | Error\u003e` failure message or error, optional\n- `err`: [`\u003cError\u003e`][error] error, optional\n\nFail this test recording failure message.\n\nThis doesn't call [`test.end()`][test.end()].\n\n##### ImperativeTest.prototype.is(checkFn, val\\[, message\\])\n\n- `checkFn`: [`\u003cFunction\u003e`][function] condition function\n  - `val`: `\u003cany\u003e` provided value\n- _Returns:_ [`\u003cboolean\u003e`][boolean] true if condition is satisfied and false\n  otherwise\n- `val`: `\u003cany\u003e` value to check the condition against\n- `message`: [`\u003cstring\u003e`][string] check message, optional\n\nCheck whether `val` satisfies custom `checkFn` condition.\n\n##### ImperativeTest.prototype.isArray(val\\[, message\\])\n\n- `val`: `\u003cany\u003e` value to check\n- `message`: [`\u003cstring\u003e`][string] check message, optional\n\nCheck if `val` satisfies `Array.isArray`.\n\n##### ImperativeTest.prototype.isBuffer(val\\[, message\\])\n\n- `val`: `\u003cany\u003e` value to check\n- `message`: [`\u003cstring\u003e`][string] check message, optional\n\nCheck if `val` satisfies `Buffer.isBuffer`.\n\n##### ImperativeTest.prototype.isError(actual\\[, expected\\[, message\\]\\])\n\n- `actual`: `\u003cany\u003e` actual error to compare\n- `expected`: `\u003cany\u003e` expected error, default: new Error()\n- `message`: [`\u003cstring\u003e`][string] description of the check, optional\n\nCheck if actual is equal to expected error.\n\n##### ImperativeTest.prototype.isRejected(input, err)\n\n- `input`: `\u003cPromise | Function\u003e` promise of function returning thenable\n- `err`: `\u003cany\u003e` value to be checked with [`test.isError()`][test.iserror()]\n  against rejected value\n\nCheck that input rejects.\n\n##### ImperativeTest.prototype.isResolved(input\\[, expected\\])\n\n- `input`: `\u003cPromise | Function\u003e` promise of function returning thenable\n- `expected`: `\u003cany\u003e` if passed it will be checked with\n  [`test.strictSame()`][test.strictsame()] against resolved value\n\nVerify that input resolves.\n\n##### ImperativeTest.prototype.mustCall(\\[fn\\[, count\\[, name\\]\\]\\])\n\n- `fn`: [`\u003cFunction\u003e`][function] function to be checked, default: () =\u003e {}\n- `count`: [`\u003cnumber\u003e`][number] amount of times fn must be called, default: 1\n- `name`: [`\u003cstring\u003e`][string] name of the function, default: 'anonymous'\n\n_Returns:_ [`\u003cFunction\u003e`][function] function to check with, will forward all\narguments to fn, and result from fn\n\nCheck that fn is called specified amount of times.\n\n##### ImperativeTest.prototype.mustNotCall(\\[fn\\[, name\\]\\])\n\n- `fn`: [`\u003cFunction\u003e`][function] function to not be checked, default: () =\u003e {}\n- `name`: [`\u003cstring\u003e`][string] name of the function, default: 'anonymous'\n\n_Returns:_ [`\u003cFunction\u003e`][function] function to check with, will forward all\narguments to fn, and result from fn\n\nCheck that fn is not called.\n\n##### ImperativeTest.prototype.notEqual(actual, expected\\[, message\\])\n\n- `actual`: `\u003cany\u003e` actual data\n- `expected`: `\u003cany\u003e` expected data\n- `message`: [`\u003cstring\u003e`][string] description of the check, optional\n\nCompare actual and expected for non-strict not-equality.\n\n##### ImperativeTest.prototype.notOk(value\\[, message\\])\n\n- `value`: `\u003cany\u003e` value to check\n- `message`: [`\u003cstring\u003e`][string] description of the check, optional\n\nCheck if value is falsy.\n\n##### ImperativeTest.prototype.notSameTopology(obj1, obj2\\[, message\\])\n\n- `obj1`: `\u003cany\u003e` actual data\n- `obj2`: `\u003cany\u003e` expected data\n- `message`: [`\u003cstring\u003e`][string] description of the check, optional\n\nCompare actual and expected to not have the same topology.\n\n##### ImperativeTest.prototype.ok(value\\[, message\\])\n\n- `value`: `\u003cany\u003e` value to check\n- `message`: [`\u003cstring\u003e`][string] description of the check, optional\n\nCheck if value is truthy.\n\n##### ImperativeTest.prototype.on(name, listener)\n\n##### ImperativeTest.prototype.pass(\\[message\\])\n\n- `message`: [`\u003cstring\u003e`][string] message to record\n\nRecord a passing assertion.\n\n##### ImperativeTest.prototype.plan(n)\n\n- `n`: [`\u003cnumber\u003e`][number] amount of assertions\n\nPlan this test to have exactly n assertions and end test after\n\nthis amount of assertions is reached.\n\n##### ImperativeTest.prototype.regex(regex, input\\[, message\\])\n\n- `regex`: [`\u003cRegExp\u003e`][regexp]|[`\u003cstring\u003e`][string] pattern to match\n- `input`: [`\u003cstring\u003e`][string] input to check\n- `message`: [`\u003cstring\u003e`][string]\n\nTest whether input matches the provided RegExp.\n\n##### ImperativeTest.prototype.rejects(input, err)\n\n- `input`: `\u003cPromise | Function\u003e` promise of function returning thenable\n- `err`: `\u003cany\u003e` value to be checked with [`test.isError()`][test.iserror()]\n  against rejected value\n\nCheck that input rejects.\n\n##### ImperativeTest.prototype.resolves(input\\[, expected\\])\n\n- `input`: `\u003cPromise | Function\u003e` promise of function returning thenable\n- `expected`: `\u003cany\u003e` if passed it will be checked with\n  [`test.strictSame()`][test.strictsame()] against resolved value\n\nVerify that input resolves.\n\n##### ImperativeTest.prototype.run()\n\nStart running the test.\n\n##### ImperativeTest.prototype.same(actual, expected\\[, message\\])\n\n- `actual`: `\u003cany\u003e` actual data\n- `expected`: `\u003cany\u003e` expected data\n- `message`: [`\u003cstring\u003e`][string] description of the check, optional\n\nCompare actual and expected for non-strict equality.\n\n##### ImperativeTest.prototype.sameTopology(obj1, obj2\\[, message\\])\n\n- `obj1`: `\u003cany\u003e` actual data\n- `obj2`: `\u003cany\u003e` expected data\n- `message`: [`\u003cstring\u003e`][string] description of the check, optional\n\nCompare actual and expected to have same topology.\n\nUseful for comparing objects with circular references for equality.\n\n##### ImperativeTest.prototype.strictEqual(actual, expected\\[, message\\])\n\n- `actual`: `\u003cany\u003e` actual data\n- `expected`: `\u003cany\u003e` expected data\n- `message`: [`\u003cstring\u003e`][string] description of the check, optional\n\nCompare actual and expected for strict equality.\n\n##### ImperativeTest.prototype.strictNotSame(actual, expected\\[, message\\])\n\n- `actual`: `\u003cany\u003e` actual data\n- `expected`: `\u003cany\u003e` expected data\n- `message`: [`\u003cstring\u003e`][string] description of the check, optional\n\nCompare actual and expected for strict non-equality.\n\n##### ImperativeTest.prototype.strictSame(actual, expected\\[, message\\])\n\n- `actual`: `\u003cany\u003e` actual data\n- `expected`: `\u003cany\u003e` expected data\n- `message`: [`\u003cstring\u003e`][string] description of the check, optional\n\nCompare actual and expected for strict equality.\n\n##### ImperativeTest.prototype.test(caption, func, options)\n\n- `caption`: [`\u003cstring\u003e`][string] name of the test\n- `func`: [`\u003cFunction\u003e`][function] test function\n  - `test`: `\u003cImperativeTest\u003e` test instance\n- `options`: `\u003cTestOptions\u003e`\n  - `run`: [`\u003cboolean\u003e`][boolean] auto start test, default: true\n  - `async`: [`\u003cboolean\u003e`][boolean] if true do nothing, if false auto-end test\n    on nextTick after `func` run, default: true\n  - `timeout`: [`\u003cnumber\u003e`][number] time in milliseconds after which test is\n    considered timeouted.\n  - `parallelSubtests`: [`\u003cboolean\u003e`][boolean] if true subtests will be run in\n    parallel, otherwise subtests are run sequentially, default: false\n  - `dependentSubtests`: [`\u003cboolean\u003e`][boolean] if true each subtest will be\n    executed sequentially in order of addition to the parent test\n    short-circuiting if any subtest fails, default: false\n\n_Returns:_ `\u003cImperativeTest\u003e` subtest instance\n\nCreate a subtest of this test.\n\nIf the subtest fails this test will fail as well.\n\n##### ImperativeTest.prototype.testAsync(message, func, options = {})\n\nCreate an asynchronous subtest of this test.\n\nSimple wrapper for [`test.test()`][test.test()] setting `async` option to\n`true`.\n\n##### ImperativeTest.prototype.testSync(message, func, options = {})\n\nCreate a synchronous subtest of this test\n\nSimple wrapper for [`test.test()`][test.test()] setting `async` option to\n`false`.\n\n##### ImperativeTest.prototype.throws(fn\\[, expected\\[, message\\]\\])\n\n- `fn`: [`\u003cFunction\u003e`][function] function to run\n- `expected`: `\u003cany\u003e` expected error, default: new Error()\n- `message`: [`\u003cstring\u003e`][string] description of the check, optional\n\nCheck that fn throws expected error.\n\n##### ImperativeTest.prototype.type(obj, type\\[, message\\])\n\n- `obj`: `\u003cany\u003e` value to check\n- `type`: `\u003cstring | Function\u003e` class or class name to check\n- `message`: [`\u003cstring\u003e`][string] description of the check, optional\n\nCheck if obj is of specified type.\n\n#### test(caption, func\\[, options\\[, runner\\]\\])\n\n- `caption`: [`\u003cstring\u003e`][string] name of the test\n- `func`: [`\u003cFunction\u003e`][function] test function\n  - `test`: `\u003cImperativeTest\u003e` test instance\n- `options`: `\u003cTestOptions\u003e`\n  - `run`: [`\u003cboolean\u003e`][boolean] auto start test, default: true\n  - `async`: [`\u003cboolean\u003e`][boolean] if true do nothing, if false auto-end test\n    on nextTick after `func` run, default: true\n  - `timeout`: [`\u003cnumber\u003e`][number] time in milliseconds after which test is\n    considered timeouted.\n  - `parallelSubtests`: [`\u003cboolean\u003e`][boolean] if true subtests will be run in\n    parallel, otherwise subtests are run sequentially, default: false\n  - `dependentSubtests`: [`\u003cboolean\u003e`][boolean] if true each subtest will be\n    executed sequentially in order of addition to the parent test\n    short-circuiting if any subtest fails, default: false\n- `runner`: [`\u003cRunner\u003e`][runner] runner instance to use to run this test\n\n_Returns:_ `\u003cImperativeTest\u003e` test instance\n\nCreate a test case.\n\n#### testSync(caption, func, options = {}, runner = runnerInstance)\n\nCreate a synchronous test\n\nSimple wrapper for [`test()`][test()] setting `async` option to `false`.\n\n#### testAsync(caption, func, options = {}, runner = runnerInstance)\n\nCreate an asynchronous test\n\nSimple wrapper for [`test()`][test()] setting `async` option to `true`.\n\n[object]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object\n[function]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function\n[regexp]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp\n[promise]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise\n[array]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array\n[error]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error\n[boolean]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type\n[number]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type\n[string]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type\n[runner]: #class-runnerrunner-extends-eventemitter\n[test()]: #testcaption-func-options-runner\n[test.test()]: #imperativetestprototypetestcaption-func-options\n[test.strictsame()]: #imperativetestprototypestrictsameactual-expected-message\n[test.contains()]: #imperativetestprototypecontainsactual-subobj-message-sort-test\n[test.mustcall()]: #imperativetestprototypemustcallfn-count-name\n[test.iserror()]: #imperativetestprototypeiserroractual-expected-message\n[test.fail()]: #imperativetestprototypefailmessage-err\n[test.end()]: #imperativetestprototypeend\n[case()]: #casecaption-namespace-list-runner\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmetarhia%2Fmetatests","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmetarhia%2Fmetatests","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmetarhia%2Fmetatests/lists"}