packages/sql-faker/tests/Unit/MySql/Generation/Spacing/VariableSpacingRuleTest.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\TerminalOccurrence;
17use SqlFaker\Generation\Token\TerminalSequence;
18use SqlFaker\MySql\Generation\Spacing\VariableSpacingRule;
19
20#[CoversClass(VariableSpacingRule::class)]
21#[UsesClass(Lexeme::class)]
22#[UsesClass(LexemeBoundary::class)]
23#[UsesClass(LexemeInput::class)]
24#[UsesClass(ResolvedOutput::class)]
25#[UsesClass(SpacingConstraint::class)]
26#[UsesClass(SpacingRule::class)]
27#[UsesClass(TerminalOccurrence::class)]
28#[UsesClass(TerminalSequence::class)]
29#[UsesClass(\SqlFaker\Generation\Lexeme\LexemeSequence::class)]
30#[UsesClass(\SqlFaker\Generation\Token\ProductionOccurrence::class)]
31final class VariableSpacingRuleTest extends TestCase
32{
33 public function testApplyConstrainsOnlyItsSourceDefinedBoundary(): void
34 {
35 $origin = new TerminalOccurrence('TOKEN', 1, [0], []);
36 $input = new LexemeInput(new TerminalSequence([$origin]), 0, new ResolvedOutput());
37 $left = new Lexeme('@', 'symbol', $origin, 'source');
38 $right = new Lexeme('name', 'symbol', $origin, 'source');
39 $rule = new VariableSpacingRule();
40 self::assertSame(SpacingConstraint::JOIN, $rule->apply(new LexemeBoundary($left, $right), $input)?->allowed);
41 $plain = new Lexeme('word', 'keyword', new TerminalOccurrence('OTHER', 2), 'other');
42 self::assertNull($rule->apply(new LexemeBoundary($plain, $plain), $input));
43 }
44}
45