diff --git a/src/Phpunit/TestCase.php b/src/Phpunit/TestCase.php index 58592bca..88aee7fa 100644 --- a/src/Phpunit/TestCase.php +++ b/src/Phpunit/TestCase.php @@ -25,17 +25,19 @@ protected function setUp(): void $classRefl = new \ReflectionClass(static::class); foreach ($classRefl->getMethods() as $methodRefl) { $methodDoc = $methodRefl->getDocComment(); - if ($methodDoc !== false && preg_match('~@dataProvider[ \t]+([\w\x7f-\xff]+::)?([\w\x7f-\xff]+)~', $methodDoc, $matches)) { - $providerClassRefl = $matches[1] === '' ? $classRefl : new \ReflectionClass($matches[1]); - $providerMethodRefl = $providerClassRefl->getMethod($matches[2]); - $key = $providerClassRefl->getName() . '::' . $providerMethodRefl->getName(); - if (!isset($staticClass::$processedMethods[$key])) { - $staticClass::$processedMethods[static::class] = true; - $providerInstance = $providerClassRefl->newInstanceWithoutConstructor(); - $provider = $providerMethodRefl->invoke($providerInstance); - if (!is_array($provider)) { - // yield all provider data - iterator_to_array($provider); + if ($methodDoc !== false && preg_match_all('~@dataProvider[ \t]+([\w\x7f-\xff]+::)?([\w\x7f-\xff]+)~', $methodDoc, $matchesAll, \PREG_SET_ORDER)) { + foreach ($matchesAll as $matches) { + $providerClassRefl = $matches[1] === '' ? $classRefl : new \ReflectionClass($matches[1]); + $providerMethodRefl = $providerClassRefl->getMethod($matches[2]); + $key = $providerClassRefl->getName() . '::' . $providerMethodRefl->getName(); + if (!isset($staticClass::$processedMethods[$key])) { + $staticClass::$processedMethods[$key] = true; + $providerInstance = $providerClassRefl->newInstanceWithoutConstructor(); + $provider = $providerMethodRefl->invoke($providerInstance); + if (!is_array($provider)) { + // yield all provider data + iterator_to_array($provider); + } } } } diff --git a/tests/Phpunit/TestCaseTest.php b/tests/Phpunit/TestCaseTest.php index 88c83671..f5ae61f9 100644 --- a/tests/Phpunit/TestCaseTest.php +++ b/tests/Phpunit/TestCaseTest.php @@ -17,15 +17,23 @@ private function coverCoverageFromProvider(): void } /** - * @dataProvider provideProviderCoverage + * @dataProvider provideProviderCoverage1 + * @dataProvider provideProviderCoverage2 */ - public function testProviderCoverage(string $v): void + public function testProviderCoverage1(string $v): void { - $this->assertGreaterThan(1, self::$providerCallCounter); - $this->assertTrue(in_array($v, ['x', 'y'], true)); + if ($v === 'y') { + $this->assertSame(2, self::$providerCallCounter); + } + $this->assertTrue(in_array($v, ['a', 'x', 'y'], true)); } - public function provideProviderCoverage(): \Traversable + public function provideProviderCoverage1(): \Traversable + { + yield ['a']; + } + + public function provideProviderCoverage2(): \Traversable { yield ['x']; $this->coverCoverageFromProvider();