packages/requirements/tests/Unit/Test/RegistryTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Test;
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\Input\InvalidInputException;
13use Requirements\Test\BehatRunner;
14use Requirements\Test\PhpUnitRunner;
15use Requirements\Test\Registry;
16use stdClass;
17use Tests\Fake\CountingRunner;
18
19#[CoversClass(Registry::class)]
20#[UsesClass(PhpUnitRunner::class)]
21#[UsesClass(BehatRunner::class)]
22#[Small]
23final class RegistryTest extends TestCase
24{
25    public function testGetReturnsTheBuiltInPhpUnitRunner(): void
26    {
27        self::assertInstanceOf(PhpUnitRunner::class, (new Registry())->get('phpunit'));
28    }
29
30    public function testGetReturnsTheBuiltInBehatRunner(): void
31    {
32        self::assertInstanceOf(BehatRunner::class, (new Registry())->get('behat'));
33    }
34
35    public function testGetReturnsTheSameInstanceEachTime(): void
36    {
37        $registry = new Registry();
38        self::assertSame($registry->get('phpunit'), $registry->get('phpunit'));
39    }
40
41    public function testGetReturnsAConfiguredExtensionBesideTheBuiltIns(): void
42    {
43        $registry = new Registry(['custom' => CountingRunner::class]);
44        self::assertInstanceOf(CountingRunner::class, $registry->get('custom'));
45        self::assertInstanceOf(PhpUnitRunner::class, $registry->get('phpunit'));
46        self::assertInstanceOf(BehatRunner::class, $registry->get('behat'));
47    }
48
49    public function testGetReturnsAConfiguredExtensionReplacingABuiltIn(): void
50    {
51        self::assertInstanceOf(CountingRunner::class, (new Registry(['phpunit' => CountingRunner::class]))->get('phpunit'));
52    }
53
54    #[DataProvider('providerGetRejectsUnknownNames')]
55    public function testGetRejectsUnknownNames(string $name): void
56    {
57        $this->expectException(InvalidInputException::class);
58        $this->expectExceptionMessage("Unknown runner extension: $name");
59        (new Registry(['custom' => CountingRunner::class]))->get($name);
60    }
61
62    /**
63     * @return array<string, array{string}>
64     */
65    public static function providerGetRejectsUnknownNames(): array
66    {
67        return [
68            'unknown' => ['jest'],
69            'different case' => ['PHPUnit'],
70        ];
71    }
72
73    #[DataProvider('providerGetIsNeverReachedForClassesThatAreNotRunners')]
74    public function testGetIsNeverReachedForClassesThatAreNotRunners(string $class): void
75    {
76        $this->expectException(InvalidInputException::class);
77        $this->expectExceptionMessage("$class must implement RunnerExtension.");
78        (new Registry(['custom' => CountingRunner::class, 'other' => $class]))->get('custom');
79    }
80
81    /**
82     * @return array<string, array{string}>
83     */
84    public static function providerGetIsNeverReachedForClassesThatAreNotRunners(): array
85    {
86        return [
87            'other class' => [stdClass::class],
88            'missing class' => ['App\MissingRunner'],
89        ];
90    }
91}
92