packages/sql-faker/tests/Unit/Generation/Derivation/Completion/PatternProductionsTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\SqlFaker\Generation\Derivation\Completion;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\UsesClass;
9use PHPUnit\Framework\TestCase;
10use SqlFaker\Generation\Derivation\Completion\PatternProductions;
11use SqlFaker\Generation\Plan\ProductionPattern;
12use SqlFaker\Grammar\Model\Grammar;
13use SqlFaker\Grammar\Model\Production;
14use SqlFaker\Grammar\Model\ProductionRule;
15use SqlFaker\Grammar\Model\Terminal;
16
17#[CoversClass(PatternProductions::class)]
18#[UsesClass(ProductionPattern::class)]
19#[UsesClass(Grammar::class)]
20#[UsesClass(Production::class)]
21#[UsesClass(ProductionRule::class)]
22#[UsesClass(Terminal::class)]
23final class PatternProductionsTest extends TestCase
24{
25    public function testMatchingSeparatesPatternsAndRuleScopesWhenReusingItsCache(): void
26    {
27        $empty = new Production([]);
28        $output = new Production([new Terminal('T')]);
29        $grammar = new Grammar('root', ['root' => new ProductionRule('root', [$empty, $output]), 'other' => new ProductionRule('other', [$output])]);
30        $choices = new PatternProductions($grammar);
31        self::assertSame([$output], $choices->matching('root', ProductionPattern::at(1)));
32        self::assertSame([$output], $choices->matching('root', ProductionPattern::at(1)));
33        self::assertSame([$empty], $choices->matching('root', ProductionPattern::exactly()));
34        self::assertSame([$empty, $output], $choices->matching('root', null));
35        self::assertSame([], $choices->matching('other', ProductionPattern::at(1)));
36        self::assertSame([], $choices->matching('missing', null));
37    }
38}
39