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