packages/sql-faker/tests/Unit/PostgreSql/Generation/Rewrite/TimeZoneIntervalRuleTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\SqlFaker\PostgreSql\Generation\Rewrite;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\UsesClass;
9use PHPUnit\Framework\TestCase;
10use SqlFaker\Generation\Derivation\DerivationTrace;
11use SqlFaker\Grammar\Model\NonTerminal;
12use SqlFaker\Grammar\Model\Production;
13use SqlFaker\Grammar\Model\Terminal;
14use SqlFaker\PostgreSql\Generation\Rewrite\TimeZoneIntervalRule;
15
16#[CoversClass(TimeZoneIntervalRule::class)]
17#[UsesClass(DerivationTrace::class)]
18#[UsesClass(NonTerminal::class)]
19#[UsesClass(Production::class)]
20#[UsesClass(Terminal::class)]
21#[UsesClass(\SqlFaker\Generation\Token\ProductionOccurrence::class)]
22#[UsesClass(\SqlFaker\Generation\Token\TerminalOccurrence::class)]
23#[UsesClass(\SqlFaker\Generation\Token\TerminalSequence::class)]
24final class TimeZoneIntervalRuleTest extends TestCase
25{
26    public function testRewriteAppliesOnlyToTimeZoneIntervals(): void
27    {
28        $trace = new DerivationTrace('root');
29        $trace->expand(0, new Production([new NonTerminal('zone_value'), new NonTerminal('opt_interval')]), 0);
30        $trace->expand(0, new Production([new Terminal('INTERVAL'), new Terminal('SCONST'), new NonTerminal('opt_interval')]), 0);
31        $trace->expand(2, new Production([new Terminal('YEAR_P'), new Terminal('TO'), new Terminal('MONTH_P')]), 0);
32        $trace->expand(5, new Production([new Terminal('YEAR_P')]), 0);
33        $input = $trace->terminals();
34        $result = (new TimeZoneIntervalRule())->rewrite($input);
35        self::assertSame(['INTERVAL', 'SCONST', 'HOUR_P', 'YEAR_P'], $result->names());
36        self::assertSame($result, (new TimeZoneIntervalRule())->rewrite($result));
37    }
38}
39