packages/ztd-query-core/tests/Unit/Sql/SqlTokenTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Sql;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\TestCase;
9use ZtdQuery\Sql\SqlToken;
10use ZtdQuery\Sql\SqlTokenKind;
11
12#[CoversClass(SqlToken::class)]
13final class SqlTokenTest extends TestCase
14{
15 public function testEndOffsetIsJustPastTheLastByteOfTheLexeme(): void
16 {
17 $token = new SqlToken(SqlTokenKind::Word, 'select', 3, 0, 0);
18
19 self::assertSame(9, $token->endOffset());
20 }
21
22 public function testIsTopLevelWhenTheTokenIsInsideNoParenthesisAndNoBracket(): void
23 {
24 $token = new SqlToken(SqlTokenKind::Word, 'select', 3, 0, 0);
25
26 self::assertTrue($token->isTopLevel());
27 }
28
29 public function testIsKeywordDoesNotMindHowTheWordWasCased(): void
30 {
31 $token = new SqlToken(SqlTokenKind::Word, 'select', 3, 0, 0);
32
33 self::assertTrue($token->isKeyword('SELECT'));
34 }
35
36 public function testIsTopLevelIsFalseForATokenInsideAParenthesis(): void
37 {
38 $token = new SqlToken(SqlTokenKind::Word, 'WHERE', 0, 1, 0);
39
40 self::assertFalse($token->isTopLevel());
41 }
42
43 public function testIsTopLevelIsFalseForATokenInsideABracket(): void
44 {
45 $token = new SqlToken(SqlTokenKind::Word, 'WHERE', 0, 0, 1);
46
47 self::assertFalse($token->isTopLevel());
48 }
49
50 public function testIsKeywordIsFalseForAKeywordSpelledInsideAString(): void
51 {
52 $token = new SqlToken(SqlTokenKind::String, 'SELECT', 0, 0, 0);
53
54 self::assertFalse($token->isKeyword('SELECT'));
55 }
56
57 public function testIsKeywordIsFalseForAWordThatMerelyStartsWithIt(): void
58 {
59 $token = new SqlToken(SqlTokenKind::Word, 'SELECTED', 0, 0, 0);
60
61 self::assertFalse($token->isKeyword('SELECT'));
62 }
63 public function testSliceCarriesTheTextTheStatementWasWrittenWith(): void
64 {
65 self::assertSame('LECT', SqlToken::slice('SELECT 1', SqlTokenKind::Word, 2, 6, 0, 0)->text);
66 }
67
68 public function testSliceRemembersWhereInTheStatementItWasWritten(): void
69 {
70 self::assertSame(2, SqlToken::slice('SELECT 1', SqlTokenKind::Word, 2, 6, 1, 2)->offset);
71 }
72
73 public function testSliceCarriesHowDeeplyItWasNested(): void
74 {
75 $token = SqlToken::slice('(1)', SqlTokenKind::Number, 1, 2, 1, 3);
76
77 self::assertSame([1, 3], [$token->depth, $token->bracketDepth]);
78 }
79
80}
81