packages/sql-parser/tests/Unit/Parser/SyntaxExceptionTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Parser;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\Small;
9use PHPUnit\Framework\Attributes\UsesClass;
10use PHPUnit\Framework\TestCase;
11use SqlParser\Lexer\SourcePosition;
12use SqlParser\Lexer\Token;
13use SqlParser\Parser\SyntaxException;
14
15#[CoversClass(SyntaxException::class)]
16#[UsesClass(SourcePosition::class)]
17#[UsesClass(Token::class)]
18#[UsesClass(\SqlParser\Lexer\SourceException::class)]
19#[Small]
20final class SyntaxExceptionTest extends TestCase
21{
22    public function testMessageNamesTheTokenAndTheExpectation(): void
23    {
24        $token = new Token(4, 'FROM', 'FROM', 7);
25        $exception = new SyntaxException($token, ['IDENT', 'NUM'], 'SELECT FROM');
26
27        self::assertSame("Unexpected 'FROM' at line 1, column 8, expected IDENT, NUM", $exception->getMessage());
28        self::assertSame($token, $exception->token);
29        self::assertSame(['IDENT', 'NUM'], $exception->expected);
30        self::assertSame(7, $exception->offset);
31    }
32
33    public function testMessageShortensALongExpectation(): void
34    {
35        $exception = new SyntaxException(new Token(0, '$end', '', 6), ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I'], 'SELECT');
36
37        self::assertSame('Unexpected end of input at line 1, column 7, expected A, B, C, D, E, F, G, H, ...', $exception->getMessage());
38    }
39
40    public function testMessageWithoutExpectation(): void
41    {
42        self::assertSame("Unexpected 'x' at line 1, column 1", (new SyntaxException(new Token(1, 'ID', 'x', 0), [], 'x'))->getMessage());
43    }
44}
45