packages/bison-parser/tests/Unit/Printer/RhsPrinterTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Printer;
6
7use BisonParser\Ast\Line;
8use BisonParser\Ast\Location;
9use BisonParser\Ast\Rule\Action;
10use BisonParser\Ast\Rule\DprecItem;
11use BisonParser\Ast\Rule\EmptyItem;
12use BisonParser\Ast\Rule\ExpectItem;
13use BisonParser\Ast\Rule\MergeItem;
14use BisonParser\Ast\Rule\PrecItem;
15use BisonParser\Ast\Rule\Predicate;
16use BisonParser\Ast\Rule\SymbolItem;
17use BisonParser\Ast\Symbol;
18use BisonParser\Ast\SymbolKind;
19use BisonParser\Printer\DeclarationPrinter;
20use BisonParser\Printer\RhsPrinter;
21use BisonParser\Printer\SymbolPrinter;
22use BisonParser\Scanner\Escapes;
23use PHPUnit\Framework\Attributes\CoversClass;
24use PHPUnit\Framework\Attributes\Small;
25use PHPUnit\Framework\Attributes\UsesClass;
26use PHPUnit\Framework\TestCase;
27
28#[CoversClass(RhsPrinter::class)]
29#[UsesClass(Action::class)]
30#[UsesClass(DprecItem::class)]
31#[UsesClass(EmptyItem::class)]
32#[UsesClass(Escapes::class)]
33#[UsesClass(ExpectItem::class)]
34#[UsesClass(Line::class)]
35#[UsesClass(DeclarationPrinter::class)]
36#[UsesClass(Location::class)]
37#[UsesClass(MergeItem::class)]
38#[UsesClass(PrecItem::class)]
39#[UsesClass(Predicate::class)]
40#[UsesClass(Symbol::class)]
41#[UsesClass(SymbolItem::class)]
42#[UsesClass(SymbolKind::class)]
43#[UsesClass(SymbolPrinter::class)]
44#[Small]
45final class RhsPrinterTest extends TestCase
46{
47 public function testPrint(): void
48 {
49 $printer = new RhsPrinter();
50 $at = new Location(1, 1);
51
52 self::assertSame('expr[e]', $printer->print(new SymbolItem(new Symbol(SymbolKind::Identifier, 'expr', $at), 'e')));
53 self::assertSame("'+'", $printer->print(new SymbolItem(new Symbol(SymbolKind::CharLiteral, '+', $at), null)));
54 self::assertSame('{ a }', $printer->print(new Action(null, ' a ', null, $at)));
55 self::assertSame('<int>{ b }[r]', $printer->print(new Action('int', ' b ', 'r', $at)));
56 self::assertSame('%?{ p }', $printer->print(new Predicate(' p ', $at)));
57 self::assertSame('%empty', $printer->print(new EmptyItem($at)));
58 self::assertSame('%prec UMINUS', $printer->print(new PrecItem(new Symbol(SymbolKind::Identifier, 'UMINUS', $at), $at)));
59 self::assertSame('%dprec 2', $printer->print(new DprecItem(2, $at)));
60 self::assertSame('%merge <m>', $printer->print(new MergeItem('m', $at)));
61 self::assertSame('%expect 1', $printer->print(new ExpectItem(1, false, $at)));
62 self::assertSame('%expect-rr 3', $printer->print(new ExpectItem(3, true, $at)));
63 self::assertSame("\n#line 4 \"x.y\"\n", $printer->print(new Line(4, 'x.y', $at)));
64 }
65
66 public function testReference(): void
67 {
68 $printer = new RhsPrinter();
69
70 self::assertSame('', $printer->reference(null));
71 self::assertSame('[name]', $printer->reference('name'));
72 }
73}
74