add covers list and attributes mutator

This commit is contained in:
danilopolani
2022-03-05 16:23:05 +01:00
parent 7660517f7c
commit 2465b88462
7 changed files with 96 additions and 17 deletions

View File

@ -4,6 +4,8 @@ declare(strict_types=1);
namespace Pest\Factories\Attributes; namespace Pest\Factories\Attributes;
use Pest\Factories\Covers\CoversClass;
use Pest\Factories\Covers\CoversFunction;
use Pest\Factories\TestCaseMethodFactory; use Pest\Factories\TestCaseMethodFactory;
/** /**
@ -22,11 +24,16 @@ final class Covers
public function __invoke(TestCaseMethodFactory $method, array $attributes): array public function __invoke(TestCaseMethodFactory $method, array $attributes): array
{ {
foreach ($method->covers as $covering) { foreach ($method->covers as $covering) {
if (is_array($covering)) { if ($covering instanceof CoversClass) {
$attributes[] = "#[\PHPUnit\Framework\Attributes\CoversClass({$covering[0]}]"; $attributes[] = "#[\PHPUnit\Framework\Attributes\CoversClass({$covering->class}]";
$attributes[] = "#[\PHPUnit\Framework\Attributes\CoversFunction({$covering[1]}]";
if (!is_null($covering->method)) {
$attributes[] = "#[\PHPUnit\Framework\Attributes\CoversFunction({$covering->method}]";
}
} else if ($covering instanceof CoversFunction) {
$attributes[] = "#[\PHPUnit\Framework\Attributes\CoversFunction({$covering->function}]";
} else { } else {
$attributes[] = "#[\PHPUnit\Framework\Attributes\CoversClass($covering)]"; $attributes[] = "#[\PHPUnit\Framework\Attributes\CoversNothing]";
} }
} }

View File

@ -0,0 +1,16 @@
<?php
declare(strict_types=1);
namespace Pest\Factories\Covers;
/**
* @internal
*/
final class CoversClass
{
public function __construct(public string $class, public ?string $method = null)
{
//
}
}

View File

@ -0,0 +1,16 @@
<?php
declare(strict_types=1);
namespace Pest\Factories\Covers;
/**
* @internal
*/
final class CoversFunction
{
public function __construct(public string $function)
{
//
}
}

View File

@ -0,0 +1,13 @@
<?php
declare(strict_types=1);
namespace Pest\Factories\Covers;
/**
* @internal
*/
final class CoversNothing
{
//
}

View File

@ -35,6 +35,15 @@ final class TestCaseFactory
Annotations\Groups::class, Annotations\Groups::class,
]; ];
/**
* The list of annotations.
*
* @var array<int, class-string>
*/
private static array $attributes = [
Attributes\Covers::class,
];
/** /**
* The FQN of the Test Case class. * The FQN of the Test Case class.
* *
@ -142,7 +151,7 @@ final class TestCaseFactory
} }
$methodsCode = implode('', array_map( $methodsCode = implode('', array_map(
fn (TestCaseMethodFactory $methodFactory) => $methodFactory->buildForEvaluation($classFQN, self::$annotations), fn (TestCaseMethodFactory $methodFactory) => $methodFactory->buildForEvaluation($classFQN, self::$annotations, self::$attributes),
$methods $methods
)); ));

View File

@ -50,7 +50,7 @@ final class TestCaseMethodFactory
/** /**
* The covered classes and methods, if any. * The covered classes and methods, if any.
* *
* @var array<int, string> * @var array<int, \Pest\Factories\Covers\CoversClass|\Pest\Factories\Covers\CoversFunction|\Pest\Factories\Covers\CoversNothing>
*/ */
public array $covers = []; public array $covers = [];

View File

@ -5,7 +5,9 @@ declare(strict_types=1);
namespace Pest\PendingCalls; namespace Pest\PendingCalls;
use Closure; use Closure;
use InvalidArgumentException; use Pest\Factories\Covers\CoversClass;
use Pest\Factories\Covers\CoversFunction;
use Pest\Factories\Covers\CoversNothing;
use Pest\Factories\TestCaseMethodFactory; use Pest\Factories\TestCaseMethodFactory;
use Pest\Support\Backtrace; use Pest\Support\Backtrace;
use Pest\Support\HigherOrderCallables; use Pest\Support\HigherOrderCallables;
@ -171,19 +173,35 @@ final class TestCall
/** /**
* Sets the covered class and method. * Sets the covered class and method.
*
* @param class-string $class
* @param string|null $method
*/ */
public function covers(string|array ...$classes): TestCall public function covers(string $class, ?string $method = null): TestCall
{ {
foreach ($classes as $i => $class) { $this->testCaseMethod->covers[] = new CoversClass(...func_get_args());
if (is_array($class) && count($class) !== 2) {
throw new InvalidArgumentException(sprintf(
'The #%s covered class must be an array with exactly 2 items: class and method name.',
$i
));
}
$this->testCaseMethod->covers[] = $class; return $this;
} }
/**
* Sets the covered function.
*
* @param string $method
*/
public function coversFunction(string $method): TestCall
{
$this->testCaseMethod->covers[] = new CoversFunction(...func_get_args());
return $this;
}
/**
* Sets that the current test covers nothing.
*/
public function coversNothing(): TestCall
{
$this->testCaseMethod->covers[] = new CoversNothing();
return $this; return $this;
} }