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