packages/sql-parser/tests/Unit/Resource/ResourceWriterTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Resource;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\Small;
9use PHPUnit\Framework\Attributes\UsesClass;
10use PHPUnit\Framework\TestCase;
11use SqlParser\Grammar\SymbolTable;
12use SqlParser\Resource\ResourceWriter;
13use SqlParser\Resource\SqlVersion;
14use SqlParser\Table\ArrayRows;
15use SqlParser\Table\PackedRows;
16use SqlParser\Table\ParseTable;
17use SqlParser\Table\TableCodec;
18use SqlParser\Table\TableFile;
19
20#[CoversClass(ResourceWriter::class)]
21#[UsesClass(ArrayRows::class)]
22#[UsesClass(PackedRows::class)]
23#[UsesClass(ParseTable::class)]
24#[UsesClass(SqlVersion::class)]
25#[UsesClass(SymbolTable::class)]
26#[UsesClass(TableCodec::class)]
27#[UsesClass(TableFile::class)]
28#[Small]
29final class ResourceWriterTest extends TestCase
30{
31    public function testWriteTable(): void
32    {
33        $directory = sys_get_temp_dir() . '/sql-parser-writer-' . uniqid();
34        $version = new SqlVersion('sqlite', 'sqlite-0.0.0', "{$directory}/tables/t.bin", "{$directory}/keywords/k.php");
35        (new ResourceWriter())->writeTable($version, new ParseTable(new SymbolTable(['$end', 'A'], ['$accept']), [], [], new ArrayRows([])));
36
37        self::assertSame(['$end', 'A'], (new TableFile())->load($version->tablePath)->symbols->terminals());
38        unlink($version->tablePath);
39        rmdir("{$directory}/tables");
40        rmdir($directory);
41    }
42
43    public function testWriteKeywords(): void
44    {
45        $directory = sys_get_temp_dir() . '/sql-parser-writer-' . uniqid();
46        $version = new SqlVersion('sqlite', 'sqlite-0.0.0', "{$directory}/tables/t.bin", "{$directory}/keywords/k.php");
47        (new ResourceWriter())->writeKeywords($version, ['keywords' => ['SELECT' => 'SELECT']], 'parse.y');
48        $loaded = require $version->keywordPath;
49
50        self::assertSame(['keywords' => ['SELECT' => 'SELECT']], $loaded);
51        self::assertStringContainsString('generated from parse.y', (string) file_get_contents($version->keywordPath));
52        unlink($version->keywordPath);
53        rmdir("{$directory}/keywords");
54        rmdir($directory);
55    }
56
57    public function testExport(): void
58    {
59        $exported = (new ResourceWriter())->export(['keywords' => ['A' => 'A_SYM'], 'name' => 'x'], 0);
60
61        self::assertSame("[\n    'keywords' => [\n        'A' => 'A_SYM',\n    ],\n    'name' => 'x',\n]", $exported);
62    }
63
64    public function testEnsureDirectory(): void
65    {
66        $directory = sys_get_temp_dir() . '/sql-parser-dir-' . uniqid();
67        (new ResourceWriter())->ensureDirectory("{$directory}/nested/file.txt");
68
69        self::assertDirectoryExists("{$directory}/nested");
70        rmdir("{$directory}/nested");
71        rmdir($directory);
72    }
73}
74