{"id":15014487,"url":"https://github.com/t-regx/phpunit-data-provider","last_synced_at":"2026-01-11T16:04:21.632Z","repository":{"id":45366033,"uuid":"190622268","full_name":"t-regx/phpunit-data-provider","owner":"t-regx","description":"Allows you to mix multiple PhpUnit @dataProvider without duplication","archived":false,"fork":false,"pushed_at":"2025-01-15T11:19:01.000Z","size":888,"stargazers_count":63,"open_issues_count":2,"forks_count":5,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-10-19T07:48:21.313Z","etag":null,"topics":["data-provider","data-providers","php","phpunit"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/t-regx.png","metadata":{"files":{"readme":"ReadMe.md","changelog":null,"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":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":"danon"}},"created_at":"2019-06-06T17:28:01.000Z","updated_at":"2025-06-13T08:34:09.000Z","dependencies_parsed_at":"2025-02-16T23:00:24.305Z","dependency_job_id":"3214cbd0-4b75-4773-84a6-6f317b9aa2c0","html_url":"https://github.com/t-regx/phpunit-data-provider","commit_stats":null,"previous_names":["t-regx/crossdataproviders"],"tags_count":11,"template":false,"template_full_name":null,"purl":"pkg:github/t-regx/phpunit-data-provider","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/t-regx%2Fphpunit-data-provider","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/t-regx%2Fphpunit-data-provider/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/t-regx%2Fphpunit-data-provider/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/t-regx%2Fphpunit-data-provider/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/t-regx","download_url":"https://codeload.github.com/t-regx/phpunit-data-provider/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/t-regx%2Fphpunit-data-provider/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28312381,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-11T14:58:17.114Z","status":"ssl_error","status_checked_at":"2026-01-11T14:55:53.580Z","response_time":60,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["data-provider","data-providers","php","phpunit"],"created_at":"2024-09-24T19:45:41.429Z","updated_at":"2026-01-11T16:04:21.617Z","avatar_url":"https://github.com/t-regx.png","language":"PHP","readme":"\u003cp align=\"center\"\u003e\u003ca href=\"https://t-regx.com/\"\u003e\u003cimg src=\".github/assets/t.regx.png\"\u003e\u003c/a\u003e\u003c/p\u003e\n\n# Helper for PhpUnit @dataProvider\n\nHandy `require-dev` testing tool for [PhpUnit]. It allows to manage data providers\nwith `zip()`, `join()`, `cross()`, `pairs()`, `slice()`, `map()` and more.\n\n[![Build Status](https://github.com/t-regx/CrossDataProviders/workflows/build/badge.svg?branch=master)][build]\n[![Coverage Status](https://coveralls.io/repos/github/t-regx/CrossDataProviders/badge.svg?branch=master)][coveralls]\n[![Dependencies](https://img.shields.io/badge/dependencies-0-brightgreen.svg)][repository]\n[![License](https://img.shields.io/github/license/t-regx/CrossDataProviders.svg)][license]\n[![Composer lock](https://img.shields.io/badge/.lock-uncommited-green.svg)][repository]\n\n[![PHP Version](https://img.shields.io/badge/PHP-7.1-blue.svg)][1]\n[![PHP Version](https://img.shields.io/badge/PHP-7.2-blue.svg)][1]\n[![PHP Version](https://img.shields.io/badge/PHP-7.3-blue.svg)][1]\n[![PHP Version](https://img.shields.io/badge/PHP-7.4-blue.svg)][1]\n[![PHP Version](https://img.shields.io/badge/PHP-8.0-blue.svg)][1]\n[![PHP Version](https://img.shields.io/badge/PHP-8.1-blue.svg)][1]\n[![PHP Version](https://img.shields.io/badge/PHP-8.2-blue.svg)][1]\n[![PHP Version](https://img.shields.io/badge/PHP-8.3-blue.svg)][1]\n[![PHP Version](https://img.shields.io/badge/PHP-8.4-blue.svg)][1]\n\n[![PRs Welcome](https://img.shields.io/badge/PR-welcome-brightgreen.svg?style=popout)](https://github.com/t-regx/CrossDataProviders/pulls)\n\n1. [Installation](#installation)\n   * [Composer](#installation)\n2. [Overview](#overview)\n   * [`DataProvider::list()`](#dataproviderlist)\n   * [`DataProvider::join()`](#dataproviderjoin)\n   * [`DataProvider::zip()`](#dataproviderzip)\n   * [`DataProvider::cross()`](#dataprovidercross)\n   * [`DataProvider::pairs()`](#dataproviderpairs)\n   * [`DataProvider::of()`](#dataproviderof)\n   * [`DataProvider::tuples()`](#dataprovidertuples)\n   * [`DataProvider::dictionary()`](#dataproviderdictionary)\n   * [`DataProvider.map()`](#dataprovidermap)\n   * [`DataProvider.slice()`](#dataproviderslice)\n   * [`DataProvider.entries()`](#dataproviderentries)\n3. [Documentation](#documentation)\n   * [Functionalities](#functionalities)\n   * [Features](#features)\n   * [Example](#example-usage)\n   * [Advanced example](#advanced-usage)\n4. [Migration](#migration-from-previous-version)\n\n# Installation\n\nInstallation for PHP 7.1 and later:\n\n```bash\ncomposer require --dev rawr/phpunit-data-provider\n```\n\n# Overview\n\n`DataProvider` can be used to build, compose and edit data providers to be used with [PhpUnit]\nby [@sebastianbergmann](https://github.com/sebastianbergmann).\n\n### `DataProvider::list()`\n\n`DataProvider::list()` provides a list of elements. Test is invoked each time with a single argument.\n\n```php\n/**\n * @test \n * @dataProvider colors\n */\npublic function test(string $color): void {\n  // your test here\n}\n\npublic function colors(): DataProvider {\n  return DataProvider::list('blue', 'yellow', 'red');\n}\n```\n\n![list.png](.github/assets/example/list.png)\n\nAdditionally, `DataProvider::list()` [names](#names) rows based on values.\n\n### `DataProvider::join()`\n\nVertically join data providers together.\n\n💡 Useful when two data providers are used in other tests, and a new test should use both of them.\n\n```php\n/**\n * @test \n * @dataProvider colors\n */\npublic function test(string $color, string $thing): void {\n  // your test here\n}\n\npublic function colors(): DataProvider {\n  return DataProvider::join($this-\u003eblueColors(), $this-\u003eyellowColors(), $this-\u003eredColors());\n}\n\npublic function blueColors(): DataProvider {\n  return DataProvider::tuples(\n    ['blue', 'sky'], \n    ['deep blue', 'ocean']\n  );\n}\n\npublic function yellowColors(): iterable {\n  yield 'sun' =\u003e ['yellow', 'sun'];\n}\n\npublic function redColors(): array {\n  return [\n    'apple' =\u003e ['red', 'apple']\n  ];\n}\n```\n\n![join.png](.github/assets/example/join.png)\n\nNote:\n\n- Only data provider with equal amounts of arguments in rows can be joined. `DataProvider.drop()` can be used to trim\n  overflowing columns, or [`DataProvider::zip()`][zip] to widen data provider with less rows.\n\n### `DataProvider::zip()`\n\nHorizontally join data providers together.\n\n💡 Useful for keeping data providers clean and simple.\n\n```php\n/**\n * @test \n * @dataProvider colors\n */\npublic function test($blueColor, $blueThing, $adjective, Factory $factory): void {\n  // your test here\n}\n\npublic function colors(): DataProvider {\n  return DataProvider::zip($this-\u003eblueThings(), $this-\u003eadjectives(), $this-\u003efactories());\n}\n\npublic function blueThings(): DataProvider {\n  return DataProvider::tuples(\n    ['blue', 'ink'],\n    ['light blue', 'shirt'],\n    ['deep blue', 'ocean']\n  );\n}\n\npublic function adjectives(): iterable {\n  return DataProvider::list('liquid', 'comfortable', 'majestic');\n}\n\npublic function factories(): iterable {\n  yield [new InkFactory()];\n  yield [new ShirtFactory()];\n  yield [new OceanFactory()];\n}\n```\n\n![zip.png](.github/assets/example/zip.png)\n\nNote:\n\n- Only data provider with equal amounts of rows can be zipped. `DataProvider.slice()` can be used to trim overflowing\n  rows, or [`DataProvider::join()`][join] to prolong a shorter data provider.\n\n### `DataProvider::cross()`\n\nCreates a square matrix of given data providers.\n\n💡 Useful for testing all combinations of arguments.\n\n```php\n/**\n * @test \n * @dataProvider colorsAndThings\n */\npublic function test(string $color, string $shade): void {\n  // your test here\n}\n\npublic function colorsAndThings(): DataProvider {\n  return DataProvider::cross($this-\u003ecolors(), $this-\u003ethings());\n}\n\npublic function colors(): array {\n  return [\n    ['blue'], ['yellow'], ['red']\n  ];\n}\n\npublic function things(): iterable {\n  return DataProvider::list('sky', 'sun', 'apple');\n}\n```\n\n![cross.png](.github/assets/example/cross.png)\n\n### `DataProvider::pairs()`\n\nCalls test with two arguments. Each argument is paired with all of the other arguments. All rows are [named](#names)\naccording to the arguments.\n\nExample shows a test paring image formats:\n\n```php\n/**\n * @test\n * @dataProvider formats\n */\npublic function shouldConvertFile(string $from, string $to): void {\n  // your test here\n}\n\npublic function formats(): array {\n  return DataProviders::distinctPairs('png', 'jpg', 'bmp');\n}\n```\n\n![pairs.png](.github/assets/example/pairs.png)\n\n### `DataProvider::of()`\n\nInstantiates a `DataProvider` from a raw-array accepted by [PhpUnit].\n\n```php\npublic function example(): DataProvider {\n  return DataProvider::of($this-\u003erawArray());\n}\n\npublic function rawArrayDataProvider(): array {\n  return [\n    'key' =\u003e ['argument 1', 'argument 2']\n  ];\n}\n```\n\n![of.png](.github/assets/example/of.png)\n\nNotes:\n\n- Also accepts [`iterable`], [`\\Generator`] and other [types accepted][accepted types] by [PhpUnit].\n\n### `DataProvider::tuples()`\n\nProvide multiple arguments for each a test. `DataProvider::tuples()` [names](#names) each row based on the values.\n\n```php\n/**\n * @test \n * @dataProvider colors\n */\npublic function test(string $color, string $thing): void {\n  // your test here\n}\n\npublic function colors(): DataProvider {\n  return DataProvider::tuples(\n    ['blue', 'sky'], \n    ['yellow', 'sun'],\n    ['red', 'apple']\n  );\n}\n```\n\n![tuples.png](.github/assets/example/tuples.png)\n\n### `DataProvider::dictionary()`\n\nSpecify a single argument for test. [`DataProvider::dictionary()`][dictionary] [names](#names) each row based on the\nprovided array key.\n\n```php\n/**\n * @test \n * @dataProvider colors\n */\npublic function test(string $color): void {\n  // your test here\n}\n\npublic function colors(): DataProvider {\n  return DataProvider::dictionary([\n    'custom name 1' =\u003e 'blue',\n    'custom name 2' =\u003e 'yellow',\n    'custom name 3' =\u003e 'red'\n  ]);\n}\n```\n\n![dictionary.png](.github/assets/example/dictionary.png)\n\nIn most cases, [`DataProvider::list()`][list] or [`DataProvider::tuples()`][tuples] should be used to [name](#names)\nrows based on arguments. Method `DataProvider::dictionary()` is useful when the arguments are not self-explanatory:\n\n```php\npublic function ports(): DataProvider {\n  return DataProvider::dictionary([\n    'http'  =\u003e 80, \n    'https' =\u003e 443, \n    'ftp'   =\u003e 21  \n  ]);\n}\n```\n\n### `DataProvider.map()`\n\nTransform each row's values in `DataProvider` to any other set of values.\n\n💡 Useful for separating providers content and their form.\n\n```php\n/**\n* @test\n* @dataProvider folderIterators\n*/\npublic function test(\\Iterator $iterator, string $name): void {\n  // your test here\n}\n\npublic function folderIterators(): DataProvider {\n  return $this-\u003efolders()-\u003emap(function (string $name, string $path): array {\n      return [\n          new \\DirectoryIterator($path),\n          $name\n      ];\n  });\n}\n\npublic function folders(): DataProvider {\n  return DataProvider::tuples(\n      ['temporary', '/tmp'],\n      ['user directory', '/home'],\n      ['system resources', '/usr/bin']);\n}\n```\n\n![map.png](.github/assets/example/map.png)\n\nNotes:\n- Names in `DataProvider` will be preserved.\n\n### `DataProvider.slice()`\n\nRemove leading or trailing rows from `DataProvider`.\n\n💡 Useful for adapting `DataProvider` to be zipped or limit provided values.\n\n```php\n/**\n * @test \n * @dataProvider limitedColors\n */\npublic function test(string $color, string $thing): void {\n  // your test here\n}\n\npublic function limitedColors(): DataProvider {\n    return $this-\u003ecolors()-\u003eslice(0, 2);    \n}\n\npublic function colors(): DataProvider {\n  return DataProvider::tuples(\n    ['blue', 'sky'], \n    ['yellow', 'sun'],\n    ['red', 'apple']\n  );\n}\n```\n\n### `DataProvider.entries()`\n\nProvide two arguments for each a test, from key-value pairs.\n`DataProvider::entries()` [names](#names) each row based on the key-value pair.\n\n```php\n/**\n * @test \n * @dataProvider colors\n */\npublic function test(string $color, string $thing): void {\n  // your test here\n}\n\npublic function colors(): DataProvider {\n  return DataProvider::entries(\n    'blue'   =\u003e 'sky', \n    'yellow' =\u003e 'sun',\n    'red'    =\u003e 'apple',\n  );\n}\n```\n\n![entries.png](.github/assets/example/entries.png)\n\n# Documentation\n\n### Functionalities\n\n- Creating new data providers:\n\n   - [`DataProvider::list()`][list], [`DataProvider::tuples()`][tuples], [`DataProvider::dictionary()`][dictionary],\n     [`DataProvider::pairs()`][pairs], [`DataProvider::distinctPairs()`][pairs]\n\n- Composing existing providers:\n\n   - [`DataProvider::zip()`][zip], [`DataProvider::join()`][join], [`DataProvider::cross()`][cross], [`DataProvider::of()`][of]\n\n- Editing existing providers:\n\n   - [`DataProvider.map()`][map], [`DataProvider.slice()`][slice], `DataProvider.drop()`. These methods don't modify `DataProvider`\n     instance, but return a new instance.\n\n### Features\n\n- Clear naming\n   - Each `DataProvider` builder sets proper [names](#names) for rows, based on values.\n- Duplicate keys:\n   - Duplicate keys are properly handled and formatted in an informative manner. No rows are ever being \"lost\" when\n     editing.\n- Lazy evaluation:\n   - Iterators are being evaluated only when called. Argument iterators are only called once, even if `DataProvider` is\n     called multiple times.\n- `DataProvider` accepts many [provider types](#accepted-types).\n\n### Names\n\n`DataProvider` sets proper names for each row based on values.\n\n```php\n/**\n * @test \n * @dataProvider colors\n */\npublic function test(string $color, string $thing): void {\n  // your test here\n}\n\npublic function colors(): DataProvider {\n  return DataProvider::tuples(\n    ['blue', 'sky'], \n    ['yellow', 'sun'],\n    ['red', 'apple']\n  );\n}\n```\n\n![names](.github/assets/screen/names.dark.png#gh-dark-mode-only)\n![names](.github/assets/screen/names.light.png#gh-light-mode-only)\n\n## Example usage\n\n[`DataProvider::cross()`][cross] returns an instance of `DataProvider` which is a square matrix of input data providers.\n\n```php\n/**\n * @test\n * @dataProvider services\n */\npublic function shouldLogin(string $service, string $method, int $port): void {\n  // your test here\n}\n\npublic function services(): DataProvider {\n  return DataProvider::cross(\n    [\n      ['github.com'], ['bitbucket.com'], ['gitlab.com'], ['sourceforge.net']\n    ],\n    [\n      ['http', 80],\n      ['https', 443],\n      ['ssh', 22]\n    ]);\n}\n```\n\nThis is equivalent of having a regular data provider that is composed of 12 entries, similar to:\n\n```php\npublic function services(): array {\n  return [\n    ['github.com', 'http', 80],\n    ['github.com', 'https', 443],\n    ['github.com', 'ssh', 22],\n    ['bitbucket.com', 'http', 80],\n    ['bitbucket.com', 'https', 443],\n    ['bitbucket.com', 'ssh', 22],\n    ['gitlab.com', 'http', 80],\n    ['gitlab.com', 'https', 443],\n    ['gitlab.com', 'ssh', 22],\n    ['sourceforge.net', 'http', 80],\n    ['sourceforge.net', 'https', 443],\n    ['sourceforge.net', 'ssh', 22],\n  ];\n}\n```\n\n`DataProvider::cross()` accepts data providers of different\ntypes: [`array`], [`\\Iterator`], [`\\IteratorAggregate`], [`\\Traversable`], [`\\Generator`],\n[`iterable`] and `DataProvider`.\n\nThat means `DataProvider` can be composed together.\n\n```php\npublic function services(): DataProvider {\n  return DataProvider::cross(\n    DataProvider::list('github.com', 'bitbucket.com', 'gitlab.com', 'sourceforge.net'),\n    DataProvider::tuples(['http', 80], ['https', 443], ['ssh', 22]));\n}\n```\n\n## Advanced usage\n\n`DataProvider` can be combined with other `DataProvider`s as well as regular [PhpUnit] data providers.\n\n```php\n/**\n * @test\n * @dataProvider urls\n */\npublic function test0(string $url): void {\n  // your test here\n}\n\n/**\n * @test\n * @dataProvider services\n */\npublic function test1(string $url, string $name, string $method, int $port): void {\n  // your test here\n}\n\n/**\n * @test\n * @dataProvider allServices\n */\npublic function test2(string $url, string $name, string $method, int $port): void {\n  // your test here\n}\n\npublic function urls(): DataProvider {\n  return DataProvider::list('github.com', 'bitbucket.com', 'gitlab.com', 'sourceforge.net');\n}\n\npublic function rawArrayProvider(): array {\n  return [\n    ['GitHub'],\n    ['BitBucket'],\n    ['GitLab'],\n    ['SourceForge']\n  ];\n}\n\npublic function services(): DataProvider {\n  return DataProvider::cross(\n    DataProvider::zip($this-\u003eurls(), $this-\u003erawArrayProvider()),\n    DataProvider::tuples(\n      ['http', 80],\n      ['https', 443],\n      ['ssh', 22]));\n}\n\npublic function allServices(): DataProvider {\n  return DataProvider::join(\n    $this-\u003eservices(),\n    $this-\u003elocalServices()\n  );\n}\n\npublic function localServices(): array {\n   return [\n     'my local service' =\u003e ['localhost', 'local', 'http', '80']\n   ];\n}\n```\n\n### Accepted types\n\n`DataProvider` accepts any type of data provider:\n\n- all types allowed\n  by [PhpUnit]: [`array`], [`iterable`], [`\\Traversable`], [`\\Iterator`], [`\\IteratorAggregate`], [`\\Generator`]\n- `DataProvider` itself, allowing data providers to be composed together\n\n### Notes\n\nNotes on [`DataProvider::join()`][join]:\n\n- [`DataProvider::join()`][join] preserves names of each data provider, and also joins the names vertically. Duplicates\n  in titles are preserved and presented appropriately.\n- [`DataProvider::join()`][join] accepts [any type][accepted types] of data-provider.\n- [`DataProvider::join()`][join] is conceptually similar to calling [`\\array_merge()`] on raw-array providers,\n  but [`\\array_merge()`] would override duplicate keys, while [`DataProvider::join()`][join] preserves duplicate keys,\n  and titles them appropriately.\n- [`DataProvider::join()`][join] variadic arguments `...iterable` and can be used to join many data providers\n- [`DataProvider::join()`][join] can only join data providers with the same amount of arguments in each row, otherwise\n  `IrregularDataProviderException` is thrown.\n- [`DataProvider::join()`][join] accepts `DataProvider` or other [`iterable`] accepted by [PhpUnit]. If improper\n  data-provider is passed, `MalformedDataProviderException`\n  is thrown.\n\nNotes on [`DataProvider::zip()`][zip]:\n\n- [`DataProvider::zip()`][zip] preserves names of each data provider, and also joins them horizontally.\n- [`DataProvider::zip()`][zip] accepts [any type][accepted types] of data-provider.\n- [`DataProvider::zip()`][zip] variadic arguments `...iterable` and can zip many data providers\n- [`DataProvider::zip()`][zip] can only zip data providers with the same amount of rows, otherwise\n  `IrregularDataProviderException` is thrown. Additionally, each particular data provider must have the same amount of\n  arguments in each row.\n- `DataProvider::zip()` accepts `DataProvider` or other `iterable` accepted by [PhpUnit]. If improper data-provider is\n  passed, `MalformedDataProviderException`\n  is thrown.\n\nNote on [`DataProvider::pairs()`][pairs]:\n\n- `DataProvider::pairs()` produces duplicate [pairs] (for example `'png', 'png'`), while `DataProvider::distinctPairs()`\n  only makes pairs of different arguments.\n\nNote on [`DataProvider::tuples()`][tuples]:\n\n- `DataProvider::tuples()` is similar to `DataProvider::of()`, but `::of()` accepts an explicit name,\n  while `DataProvider::tuples()` titles the rows according to the values in the row.\n\n# Migration from previous version\n\nTo use version `3.0.0`, migrating from [`2.4.0`][previous] or earlier:\n\n- Library namespace changed from `\\TRegx\\DataProvider\\ ` to `\\TRegx\\PhpUnit\\DataProviders\\ `.\n- Change `\\TRegx\\DataProvider\\DataProviders::cross()` to `\\TRegx\\PhpUnit\\DataProviders\\DataProvider::cross()`.\n- Change `\\TRegx\\DataProvider\\CrossDataProviders::cross()` to `\\TRegx\\PhpUnit\\DataProviders\\DataProvider::cross()`.\n- Change your data providers return type from `array` to `iterable` or `\\TRegx\\PhpUnit\\DataProviders\\DataProvider`.\n- Removed `\\TRegx\\DataProvider\\CrossDataProviders::builder()`, use `\\TRegx\\PhpUnit\\DataProviders\\DataProvider::cross()`\n  instead.\n\n[build]: https://github.com/t-regx/CrossDataProviders/actions/\n\n[1]: https://github.com/t-regx/CrossDataProviders/runs/2375602376\n\n[repository]: https://github.com/t-regx/CrossDataProviders\n\n[license]: https://github.com/t-regx/CrossDataProviders/blob/master/LICENSE\n\n[coveralls]: https://coveralls.io/github/t-regx/CrossDataProviders?branch=master\n\n[PhpUnit]: https://github.com/sebastianbergmann/phpunit\n\n[previous]: https://github.com/t-regx/CrossDataProviders/releases/tag/2.1.0\n\n[accepted types]: #accepted-types\n\n[`\\Traversable`]: https://www.php.net/manual/en/class.traversable.php\n\n[`\\Iterator`]: https://www.php.net/manual/en/class.iterator.php\n\n[`\\IteratorAggregate`]: https://www.php.net/manual/en/class.iteratoraggregate.php\n\n[`\\Generator`]: https://www.php.net/manual/en/class.generator.php\n\n[`iterable`]: https://www.php.net/manual/en/language.types.iterable.php\n\n[`array`]: https://www.php.net/manual/en/language.types.array.php\n\n[`\\array_merge()`]: https://www.php.net/manual/en/function.array-merge.php\n\n[list]: #dataproviderlist\n\n[zip]: #dataproviderzip\n\n[join]: #dataproviderjoin\n\n[of]: #dataproviderof\n\n[cross]: #dataprovidercross\n\n[tuples]: #dataprovidertuples\n\n[dictionary]: #dataproviderdictionary\n\n[pairs]: #dataproviderpairs\n\n[map]: #dataprovidermap\n\n[slice]: #dataproviderslice\n","funding_links":["https://github.com/sponsors/danon"],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ft-regx%2Fphpunit-data-provider","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ft-regx%2Fphpunit-data-provider","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ft-regx%2Fphpunit-data-provider/lists"}