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