packages/bison-parser/tests/Unit/Ast/GrammarFileTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Ast;
6
7use BisonParser\Ast\Declaration\Flag;
8use BisonParser\Ast\Epilogue;
9use BisonParser\Ast\GrammarFile;
10use BisonParser\Ast\Location;
11use BisonParser\Ast\Rule\Alternative;
12use BisonParser\Ast\Rule\Rule;
13use BisonParser\Ast\Symbol;
14use BisonParser\Ast\SymbolKind;
15use PHPUnit\Framework\Attributes\CoversClass;
16use PHPUnit\Framework\Attributes\Small;
17use PHPUnit\Framework\Attributes\UsesClass;
18use PHPUnit\Framework\TestCase;
19
20#[CoversClass(GrammarFile::class)]
21#[UsesClass(Alternative::class)]
22#[UsesClass(Epilogue::class)]
23#[UsesClass(Flag::class)]
24#[UsesClass(Location::class)]
25#[UsesClass(Rule::class)]
26#[UsesClass(Symbol::class)]
27#[UsesClass(SymbolKind::class)]
28#[Small]
29final class GrammarFileTest extends TestCase
30{
31    public function testRules(): void
32    {
33        $rule = new Rule(new Symbol(SymbolKind::Identifier, 'start', new Location(3, 1)), null, [new Alternative([], new Location(3, 8))], new Location(3, 1));
34        $other = new Rule(new Symbol(SymbolKind::Identifier, 'other', new Location(4, 1)), null, [new Alternative([], new Location(4, 8))], new Location(4, 1));
35        $file = new GrammarFile([new Flag('debug', '%debug', new Location(1, 1))], [new Flag('locations', '%locations', new Location(2, 1)), $rule, $other], null);
36
37        self::assertSame([$rule, $other], $file->rules());
38        self::assertNull($file->epilogue);
39    }
40
41    public function testAllDeclarations(): void
42    {
43        $before = new Flag('debug', '%debug', new Location(1, 1));
44        $among = new Flag('locations', '%locations', new Location(3, 1));
45        $rule = new Rule(new Symbol(SymbolKind::Identifier, 'start', new Location(2, 1)), null, [new Alternative([], new Location(2, 8))], new Location(2, 1));
46        $file = new GrammarFile([$before], [$rule, $among], new Epilogue('', new Location(4, 3)));
47
48        self::assertSame([$before, $among], $file->allDeclarations());
49        self::assertSame('4:3', (string) $file->epilogue?->location);
50    }
51}
52