packages/lemon-parser/tests/Unit/Ast/RhsItemTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Ast;
6
7use LemonParser\Ast\Location;
8use LemonParser\Ast\RhsItem;
9use LemonParser\Ast\Symbol;
10use PHPUnit\Framework\Attributes\CoversClass;
11use PHPUnit\Framework\Attributes\Small;
12use PHPUnit\Framework\Attributes\UsesClass;
13use PHPUnit\Framework\TestCase;
14
15#[CoversClass(RhsItem::class)]
16#[UsesClass(Location::class)]
17#[UsesClass(Symbol::class)]
18#[Small]
19final class RhsItemTest extends TestCase
20{
21    public function testIsMultiTerminal(): void
22    {
23        $single = new RhsItem([new Symbol('expr', new Location(1, 10))], 'A');
24        $shared = new RhsItem([new Symbol('PLUS', new Location(1, 15)), new Symbol('MINUS', new Location(1, 20))], null);
25
26        self::assertFalse($single->isMultiTerminal());
27        self::assertTrue($shared->isMultiTerminal());
28        self::assertSame('A', $single->alias);
29    }
30
31    public function testLocation(): void
32    {
33        $item = new RhsItem([new Symbol('PLUS', new Location(1, 15)), new Symbol('MINUS', new Location(1, 20))], null);
34
35        self::assertSame('1:15', (string) $item->location());
36    }
37}
38