packages/sql-parser/tests/Unit/Parser/SqlParserTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Parser;
6
7use PHPUnit\Framework\Attributes\CoversNothing;
8use PHPUnit\Framework\Attributes\DataProvider;
9use PHPUnit\Framework\TestCase;
10use SqlParser\Lexer\Token;
11use SqlParser\MySql\MySqlParser;
12use SqlParser\Parser\SqlParser;
13use SqlParser\PostgreSql\PostgreSqlParser;
14use SqlParser\Sqlite\SqliteParser;
15
16#[CoversNothing]
17final class SqlParserTest extends TestCase
18{
19 /**
20 * @return iterable<string, array{SqlParser}>
21 */
22 public static function providerParsers(): iterable
23 {
24 yield 'mysql' => [new MySqlParser()];
25 yield 'postgres' => [new PostgreSqlParser()];
26 yield 'sqlite' => [new SqliteParser()];
27 }
28
29 #[DataProvider('providerParsers')]
30 public function testParsePreservesSourceThroughTheContract(SqlParser $parser): void
31 {
32 $sql = ' SELECT 1 /* trailing */ ';
33 self::assertSame($sql, $parser->parse($sql)->toString());
34 }
35
36 #[DataProvider('providerParsers')]
37 public function testTokenizePreservesSourceThroughTheContract(SqlParser $parser): void
38 {
39 $sql = ' SELECT 1 /* trailing */ ';
40 $restored = implode('', array_map(static fn (Token $token): string => $token->leading . $token->text, $parser->tokenize($sql)));
41 self::assertSame($sql, $restored);
42 }
43
44 #[DataProvider('providerParsers')]
45 public function testVersionIdentifiesTheConfiguredRelease(SqlParser $parser): void
46 {
47 self::assertNotSame('', $parser->version());
48 }
49}
50