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