packages/sql-faker/tests/Unit/MySql/Generation/Spacing/KeywordPhraseSpacingRuleTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\SqlFaker\MySql\Generation\Spacing;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\UsesClass;
9use PHPUnit\Framework\TestCase;
10use SqlFaker\Generation\Lexeme\Lexeme;
11use SqlFaker\Generation\Lexeme\LexemeBoundary;
12use SqlFaker\Generation\Lexeme\LexemeInput;
13use SqlFaker\Generation\Lexeme\ResolvedOutput;
14use SqlFaker\Generation\Lexeme\SpacingConstraint;
15use SqlFaker\Generation\Lexeme\SpacingRule;
16use SqlFaker\Generation\Token\TerminalSequence;
17use SqlFaker\MySql\Generation\Spacing\KeywordPhraseSpacingRule;
18
19#[CoversClass(KeywordPhraseSpacingRule::class)]
20#[UsesClass(Lexeme::class)]
21#[UsesClass(LexemeBoundary::class)]
22#[UsesClass(LexemeInput::class)]
23#[UsesClass(ResolvedOutput::class)]
24#[UsesClass(SpacingConstraint::class)]
25#[UsesClass(SpacingRule::class)]
26#[UsesClass(TerminalSequence::class)]
27#[UsesClass(\SqlFaker\Generation\Token\TerminalOccurrence::class)]
28#[UsesClass(\SqlFaker\Generation\Lexeme\LexemeSequence::class)]
29#[UsesClass(\SqlFaker\Generation\Token\ProductionOccurrence::class)]
30final class KeywordPhraseSpacingRuleTest extends TestCase
31{
32 public function testApplySeparatesOnlyPartsOfTheSameCompoundOccurrence(): void
33 {
34 $sequence = TerminalSequence::fromNames(['WITH_ROLLUP', 'WITH_ROLLUP']);
35 $input = new LexemeInput($sequence, 0, new ResolvedOutput());
36 $left = new Lexeme('WITH', 'keyword', $sequence->terminals[0], 'source', 'phrase');
37 $right = new Lexeme('ROLLUP', 'keyword', $sequence->terminals[0], 'source', 'phrase');
38 $rule = new KeywordPhraseSpacingRule();
39 self::assertSame(SpacingConstraint::SPACE, $rule->apply(new LexemeBoundary($left, $right), $input)?->allowed);
40 $other = new Lexeme('ROLLUP', 'keyword', $sequence->terminals[1], 'source', 'phrase');
41 self::assertNull($rule->apply(new LexemeBoundary($left, $other), $input));
42 }
43}
44