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