packages/requirements/tests/Unit/Model/TestReferenceTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Model;
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\Fields;
13use Requirements\Input\InvalidInputException;
14use Requirements\Model\TestReference;
15
16#[CoversClass(TestReference::class)]
17#[UsesClass(Fields::class)]
18#[Small]
19final class TestReferenceTest extends TestCase
20{
21 public function testFromReadsRunnerAndTarget(): void
22 {
23 $reference = TestReference::from(['runner' => 'unit', 'target' => 'Sample\PassingTest::testPass']);
24 self::assertSame('unit', $reference->runner);
25 self::assertSame('auto', $reference->run);
26 self::assertSame('Sample\PassingTest::testPass', $reference->target);
27 }
28
29 #[DataProvider('providerFromRejectsInvalidEntries')]
30 public function testFromRejectsInvalidEntries(mixed $value, string $message): void
31 {
32 $this->expectException(InvalidInputException::class);
33 $this->expectExceptionMessage($message);
34 TestReference::from($value);
35 }
36
37 /**
38 * @return array<string, array{mixed, string}>
39 */
40 public static function providerFromRejectsInvalidEntries(): array
41 {
42 return [
43 'not a mapping' => ['unit', 'test must be a mapping.'],
44 'unknown field' => [['runner' => 'unit', 'target' => 't', 'name' => 'n'], "test: unknown field 'name'."],
45 'unknown policy' => [['runner' => 'unit', 'target' => 't', 'run' => 'never'], 'Test run must be auto or manual.'],
46 'boolean policy' => [['runner' => 'unit', 'target' => 't', 'run' => false], 'run must be a nonempty string.'],
47 'missing runner' => [['target' => 't'], 'runner must be a nonempty string.'],
48 'missing target' => [['runner' => 'unit'], 'target must be a nonempty string.'],
49 ];
50 }
51 public function testFromRetainsManualExecutionPolicy(): void
52 {
53 self::assertSame('manual', TestReference::from(['runner' => 'unit', 'target' => 'slow', 'run' => 'manual'])->run);
54 }
55}
56