more fixes

This commit is contained in:
Nuno Maduro
2024-09-05 01:19:17 +01:00
parent 68785986a0
commit 98e947e0cc
3 changed files with 24 additions and 15 deletions

View File

@ -215,8 +215,10 @@ if (! function_exists('afterAll')) {
if (! function_exists('covers')) { if (! function_exists('covers')) {
/** /**
* Specifies which classes, or functions, a test method covers. * Specifies which classes, or functions, a test method covers.
*
* @param array<int, string>|string $classesOrFunctions
*/ */
function covers(string ...$classesOrFunctions): void function covers(array|string ...$classesOrFunctions): void
{ {
$filename = Backtrace::file(); $filename = Backtrace::file();

View File

@ -514,14 +514,19 @@ final class TestCall
/** /**
* Sets the covered classes or methods. * Sets the covered classes or methods.
*
* @param array<int, string>|string $classesOrFunctions
*/ */
public function covers(string ...$classesOrFunctions): self public function covers(array|string ...$classesOrFunctions): self
{ {
foreach ($classesOrFunctions as $classOrFunction) { /** @var array<int, string> $classesOrFunctions */
$isClass = class_exists($classOrFunction) || trait_exists($classOrFunction); $classesOrFunctions = array_reduce($classesOrFunctions, fn ($carry, $item): array => is_array($item) ? array_merge($carry, $item) : array_merge($carry, [$item]), []);
$isMethod = function_exists($classOrFunction);
if (! $isClass && ! $isMethod) { foreach ($classesOrFunctions as $classOrFunction) {
$isClass = class_exists($classOrFunction) || trait_exists($classOrFunction) || interface_exists($classOrFunction) || enum_exists($classOrFunction);
$isFunction = function_exists($classOrFunction);
if (! $isClass && ! $isFunction) {
throw new InvalidArgumentException(sprintf('No class or method named "%s" has been found.', $classOrFunction)); throw new InvalidArgumentException(sprintf('No class or method named "%s" has been found.', $classOrFunction));
} }

View File

@ -12,35 +12,37 @@ $runCounter = 0;
function testCoversFunction() {} function testCoversFunction() {}
covers([CoversClass1::class]);
it('uses the correct PHPUnit attribute for class', function () { it('uses the correct PHPUnit attribute for class', function () {
$attributes = (new ReflectionClass($this))->getAttributes(); $attributes = (new ReflectionClass($this))->getAttributes();
expect($attributes[1]->getName())->toBe('PHPUnit\Framework\Attributes\CoversClass'); expect($attributes[1]->getName())->toBe('PHPUnit\Framework\Attributes\CoversClass');
expect($attributes[1]->getArguments()[0])->toBe('Tests\Fixtures\Covers\CoversClass1'); expect($attributes[1]->getArguments()[0])->toBe('Tests\Fixtures\Covers\CoversClass1');
})->coversClass(CoversClass1::class); });
it('uses the correct PHPUnit attribute for function', function () { it('uses the correct PHPUnit attribute for function', function () {
$attributes = (new ReflectionClass($this))->getAttributes(); $attributes = (new ReflectionClass($this))->getAttributes();
expect($attributes[2]->getName())->toBe('PHPUnit\Framework\Attributes\CoversFunction'); expect($attributes[3]->getName())->toBe('PHPUnit\Framework\Attributes\CoversFunction');
expect($attributes[2]->getArguments()[0])->toBe('testCoversFunction'); expect($attributes[3]->getArguments()[0])->toBe('testCoversFunction');
})->coversFunction('testCoversFunction'); })->coversFunction('testCoversFunction');
it('guesses if the given argument is a class or function', function () { it('guesses if the given argument is a class or function', function () {
$attributes = (new ReflectionClass($this))->getAttributes(); $attributes = (new ReflectionClass($this))->getAttributes();
expect($attributes[3]->getName())->toBe(CoversClass::class); expect($attributes[5]->getName())->toBe(CoversClass::class);
expect($attributes[3]->getArguments()[0])->toBe(CoversClass3::class); expect($attributes[5]->getArguments()[0])->toBe(CoversClass3::class);
expect($attributes[4]->getName())->toBe(CoversFunction::class); expect($attributes[6]->getName())->toBe(CoversFunction::class);
expect($attributes[4]->getArguments()[0])->toBe('testCoversFunction'); expect($attributes[6]->getArguments()[0])->toBe('testCoversFunction');
})->covers(CoversClass3::class, 'testCoversFunction'); })->covers(CoversClass3::class, 'testCoversFunction');
it('uses the correct PHPUnit attribute for trait', function () { it('uses the correct PHPUnit attribute for trait', function () {
$attributes = (new ReflectionClass($this))->getAttributes(); $attributes = (new ReflectionClass($this))->getAttributes();
expect($attributes[5]->getName())->toBe('PHPUnit\Framework\Attributes\CoversClass'); expect($attributes[8]->getName())->toBe('PHPUnit\Framework\Attributes\CoversClass');
expect($attributes[5]->getArguments()[0])->toBe('Tests\Fixtures\Covers\CoversTrait'); expect($attributes[8]->getArguments()[0])->toBe('Tests\Fixtures\Covers\CoversTrait');
})->coversClass(CoversTrait::class); })->coversClass(CoversTrait::class);
it('uses the correct PHPUnit attribute for covers nothing', function () { it('uses the correct PHPUnit attribute for covers nothing', function () {