packages/sql-faker/tests/Unit/Compiler/Lemon/LemonSymbolsTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\SqlFaker\Compiler\Lemon;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\TestCase;
9use SqlFaker\Compiler\Lemon\LemonSymbols;
10
11#[CoversClass(LemonSymbols::class)]
12final class LemonSymbolsTest extends TestCase
13{
14    public function testDeclareTokenMakesALowercaseNameATerminal(): void
15    {
16        $symbols = new LemonSymbols();
17        $symbols->declareToken('strict');
18
19        self::assertTrue($symbols->isTerminal('strict'));
20    }
21
22    public function testDeclareRuleMakesACapitalisedNameANonTerminal(): void
23    {
24        $symbols = new LemonSymbols();
25        $symbols->declareRule('SELECT');
26
27        self::assertFalse($symbols->isTerminal('SELECT'));
28    }
29
30    public function testDeclareTokensOnReadsEveryNameADirectiveLists(): void
31    {
32        $symbols = new LemonSymbols();
33        $symbols->declareTokensOn('SELECT INSERT DELETE.', '/\s+/');
34
35        self::assertTrue($symbols->isTerminal('DELETE'));
36    }
37
38    public function testDeclareTokensOnIgnoresWhatIsNotSpelledLikeAToken(): void
39    {
40        $symbols = new LemonSymbols();
41        $symbols->declareTokensOn('SELECT expr', '/\s+/');
42
43        self::assertFalse($symbols->isTerminal('expr'));
44    }
45
46    public function testIsTerminalFallsBackToTheSpellingConventionForAnUnknownName(): void
47    {
48        $symbols = new LemonSymbols();
49
50        self::assertTrue($symbols->isTerminal('SELECT'));
51        self::assertFalse($symbols->isTerminal('expr'));
52    }
53
54    public function testIsTokenNameAcceptsANameWrittenInCapitals(): void
55    {
56        self::assertTrue(LemonSymbols::isTokenName('CREATE_TABLE2'));
57    }
58
59    public function testIsTokenNameRejectsANameThatIsNotWrittenInCapitals(): void
60    {
61        self::assertFalse(LemonSymbols::isTokenName('createTable'));
62    }
63}
64