packages/sql-faker/tests/Unit/Grammar/Model/ProductionRuleTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\SqlFaker\Grammar\Model;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\UsesClass;
9use PHPUnit\Framework\TestCase;
10use SqlFaker\Grammar\Model\Production;
11use SqlFaker\Grammar\Model\ProductionRule;
12use SqlFaker\Grammar\Model\Terminal;
13
14#[CoversClass(ProductionRule::class)]
15#[CoversClass(Production::class)]
16#[CoversClass(Terminal::class)]
17#[UsesClass(\SqlFaker\Grammar\Model\NonTerminal::class)]
18final class ProductionRuleTest extends TestCase
19{
20    public function testExposesItsLeftHandSideAndAlternatives(): void
21    {
22        $alternatives = [new Production([new Terminal('A')])];
23        $rule = new ProductionRule('expr', $alternatives);
24
25        self::assertSame('expr', $rule->lhs);
26        self::assertSame($alternatives, $rule->alternatives);
27    }
28
29    public function testLhs(): void
30    {
31        $rule = new ProductionRule('stmt', []);
32
33        self::assertSame('stmt', $rule->lhs);
34    }
35
36    public function testAlternatives(): void
37    {
38        $alt1 = new Production([new Terminal('A')]);
39        $alt2 = new Production([new Terminal('B')]);
40        $rule = new ProductionRule('expr', [$alt1, $alt2]);
41
42        self::assertSame([$alt1, $alt2], $rule->alternatives);
43    }
44}
45