packages/sql-faker/tests/Unit/Compiler/Bison/Ast/BisonAstTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\SqlFaker\Compiler\Bison\Ast;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\TestCase;
9use SqlFaker\Compiler\Bison\Ast\BisonAlternativeNode;
10use SqlFaker\Compiler\Bison\Ast\BisonAst;
11use SqlFaker\Compiler\Bison\Ast\BisonRuleNode;
12use SqlFaker\Compiler\Bison\Ast\BisonStartDeclaration;
13
14#[CoversClass(BisonAst::class)]
15#[CoversClass(BisonStartDeclaration::class)]
16#[CoversClass(BisonRuleNode::class)]
17#[CoversClass(BisonAlternativeNode::class)]
18final class BisonAstTest extends TestCase
19{
20    public function testExposesEveryPartOfTheGrammarFile(): void
21    {
22        $declaration = new BisonStartDeclaration('start');
23        $rule = new BisonRuleNode('start', [
24            new BisonAlternativeNode([], null, null, null, null),
25        ]);
26
27        $ast = new BisonAst('start', '%{ code %}', [$declaration], [$rule], 'epilogue');
28
29        self::assertSame('start', $ast->startSymbol);
30        self::assertSame('%{ code %}', $ast->prologue);
31        self::assertSame([$declaration], $ast->declarations);
32        self::assertSame([$rule], $ast->rules);
33        self::assertSame('epilogue', $ast->epilogue);
34    }
35
36    public function testExposesOmittedPartsAsNull(): void
37    {
38        $ast = new BisonAst('start', null, [], [], null);
39
40        self::assertSame('start', $ast->startSymbol);
41        self::assertNull($ast->prologue);
42        self::assertSame([], $ast->declarations);
43        self::assertSame([], $ast->rules);
44        self::assertNull($ast->epilogue);
45    }
46}
47