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