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