packages/requirements/tests/Unit/Model/ExcerptTest.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\Excerpt;
15
16#[CoversClass(Excerpt::class)]
17#[UsesClass(Fields::class)]
18#[Small]
19final class ExcerptTest extends TestCase
20{
21 public function testFromReadsSelectorAndQuote(): void
22 {
23 $excerpt = Excerpt::from(['selector' => '#a', 'quote' => 'Names shall start with a letter.']);
24 self::assertSame('#a', $excerpt->selector);
25 self::assertSame('Names shall start with a letter.', $excerpt->quote);
26 }
27
28 #[DataProvider('providerFromRejectsInvalidEntries')]
29 public function testFromRejectsInvalidEntries(mixed $value, string $message): void
30 {
31 $this->expectException(InvalidInputException::class);
32 $this->expectExceptionMessage($message);
33 Excerpt::from($value);
34 }
35
36 /**
37 * @return array<string, array{mixed, string}>
38 */
39 public static function providerFromRejectsInvalidEntries(): array
40 {
41 return [
42 'not a mapping' => ['#a', 'evidence must be a mapping.'],
43 'unknown field' => [['selector' => '#a', 'quote' => 'q', 'note' => 'n'], "evidence: unknown field 'note'."],
44 'missing selector' => [['quote' => 'q'], 'selector must be a nonempty string.'],
45 'blank quote' => [['selector' => '#a', 'quote' => ' '], 'quote must be a nonempty string.'],
46 ];
47 }
48}
49