packages/sql-faker/tests/Unit/Compiler/Bison/Directive/BisonDeclarationBoundaryTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\SqlFaker\Compiler\Bison\Directive;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\DataProvider;
9use PHPUnit\Framework\Attributes\UsesClass;
10use PHPUnit\Framework\TestCase;
11use SqlFaker\Compiler\Bison\Directive\BisonDeclarationBoundary;
12use SqlFaker\Compiler\Bison\Lexer\BisonLexeme;
13
14#[CoversClass(BisonDeclarationBoundary::class)]
15#[UsesClass(BisonLexeme::class)]
16final class BisonDeclarationBoundaryTest extends TestCase
17{
18 #[DataProvider('providerLexeme')]
19 public function testContinuesWithSeparatesArgumentsFromWhatStartsSomethingElse(
20 BisonLexeme $lexeme,
21 bool $expected,
22 ): void {
23 self::assertSame($expected, (new BisonDeclarationBoundary())->continuesWith($lexeme));
24 }
25
26 /**
27 * @return iterable<string, array{BisonLexeme, bool}>
28 */
29 public static function providerLexeme(): iterable
30 {
31 yield 'another directive ends it' => [BisonLexeme::Directive, false];
32 yield 'a prologue ends it' => [BisonLexeme::Prologue, false];
33 yield 'the section separator ends it' => [BisonLexeme::PercentPercent, false];
34 yield 'the end of file ends it' => [BisonLexeme::Eof, false];
35 yield 'a name continues it' => [BisonLexeme::Identifier, true];
36 yield 'a number continues it' => [BisonLexeme::Number, true];
37 yield 'a character literal continues it' => [BisonLexeme::CharLiteral, true];
38 yield 'a string literal continues it' => [BisonLexeme::StringLiteral, true];
39 yield 'a type tag continues it' => [BisonLexeme::TypeTag, true];
40 yield 'a colon continues it' => [BisonLexeme::Colon, true];
41 yield 'a semicolon continues it' => [BisonLexeme::Semicolon, true];
42 yield 'a pipe continues it' => [BisonLexeme::Pipe, true];
43 yield 'an action continues it' => [BisonLexeme::Action, true];
44 }
45
46 public function testContinuesWithAnswersForEveryLexeme(): void
47 {
48 $boundary = new BisonDeclarationBoundary();
49
50 $answered = array_map(
51 static fn (BisonLexeme $lexeme): bool => $boundary->continuesWith($lexeme),
52 BisonLexeme::cases(),
53 );
54
55 self::assertCount(count(BisonLexeme::cases()), $answered);
56 }
57}
58