packages/requirements/tests/Unit/Verification/TargetResultsTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Verification;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\DataProvider;
9use PHPUnit\Framework\Attributes\Small;
10use PHPUnit\Framework\Attributes\UsesClass;
11use PHPUnit\Framework\TestCase;
12use Requirements\Model\TestReference;
13use Requirements\Test\TestResult;
14use Requirements\Verification\TargetResults;
15use Requirements\Verification\VerificationResult;
16
17#[CoversClass(TargetResults::class)]
18#[UsesClass(TestReference::class)]
19#[UsesClass(TestResult::class)]
20#[UsesClass(VerificationResult::class)]
21#[Small]
22final class TargetResultsTest extends TestCase
23{
24 /**
25 * @param array<string, TestResult> $cache
26 */
27 #[DataProvider('providerResults')]
28 public function testSummarizeDistinguishesFailureDeferralAndExecutedCases(array $cache, string $status, int $tests, int $passed, int $deferred): void
29 {
30 $targets = ["unit\0fast" => new TestReference('unit', 'fast'), "unit\0slow" => new TestReference('unit', 'slow', 'manual')];
31 $result = (new TargetResults())->summarize($targets, $cache);
32 self::assertSame($status, $result->status);
33 self::assertSame($tests, $result->tests);
34 self::assertSame($passed, $result->passedTargets);
35 self::assertSame($deferred, $result->deferredTargets);
36 self::assertSame(2, $result->totalTargets);
37 self::assertSame($deferred > 0, str_contains($result->message, 'use --all'));
38 }
39
40 /**
41 * @return array<string, array{array<string, TestResult>, string, int, int, int}>
42 */
43 public static function providerResults(): array
44 {
45 return [
46 'all deferred' => [[], 'deferred', 0, 0, 2],
47 'partly deferred' => [["unit\0fast" => new TestResult('passed', 2)], 'deferred', 2, 1, 1],
48 'failure with deferral' => [["unit\0fast" => new TestResult('failed', 1, 'Assertion failed.')], 'failed', 1, 0, 1],
49 'zero executed cases' => [["unit\0fast" => new TestResult('passed', 0)], 'failed', 0, 0, 1],
50 'all passed' => [["unit\0fast" => new TestResult('passed', 2), "unit\0slow" => new TestResult('passed', 3)], 'passed', 5, 2, 0],
51 'failure without deferral' => [["unit\0fast" => new TestResult('passed', 2), "unit\0slow" => new TestResult('error', 0, 'Cannot run.')], 'failed', 2, 1, 0],
52 ];
53 }
54}
55