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