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