packages/sql-parser/tests/Unit/Table/TableFileTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Table;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\Small;
9use PHPUnit\Framework\Attributes\UsesClass;
10use PHPUnit\Framework\TestCase;
11use RuntimeException;
12use SqlParser\Grammar\SymbolTable;
13use SqlParser\Table\ArrayRows;
14use SqlParser\Table\PackedRows;
15use SqlParser\Table\ParseTable;
16use SqlParser\Table\TableCodec;
17use SqlParser\Table\TableFile;
18use SqlParser\Table\TableRule;
19
20#[CoversClass(TableFile::class)]
21#[UsesClass(ArrayRows::class)]
22#[UsesClass(PackedRows::class)]
23#[UsesClass(ParseTable::class)]
24#[UsesClass(SymbolTable::class)]
25#[UsesClass(TableCodec::class)]
26#[UsesClass(TableRule::class)]
27#[Small]
28final class TableFileTest extends TestCase
29{
30 public function testSaveAndLoadRoundTrip(): void
31 {
32 $path = tempnam(sys_get_temp_dir(), 'sql-parser-table');
33 self::assertIsString($path);
34 $file = new TableFile();
35 $file->save(new ParseTable(new SymbolTable(['$end', 'A'], ['$accept']), [new TableRule(2, 1, 0)], [-1], new ArrayRows([[1 => 1]])), $path);
36 $loaded = $file->load($path);
37
38 self::assertSame(['$end', 'A'], $loaded->symbols->terminals());
39 self::assertSame([1 => 1], $loaded->rows->row(0));
40 self::assertSame($loaded, $file->load($path));
41 unlink($path);
42 }
43
44 public function testLoadRejectsAMissingFile(): void
45 {
46 $this->expectException(RuntimeException::class);
47
48 (new TableFile())->load(sys_get_temp_dir() . '/sql-parser-missing-' . uniqid() . '.bin');
49 }
50
51 public function testLoadRejectsAFileThatIsNotDeflated(): void
52 {
53 $path = tempnam(sys_get_temp_dir(), 'sql-parser-plain');
54 self::assertIsString($path);
55 file_put_contents($path, 'plain text');
56
57 $this->expectException(RuntimeException::class);
58
59 try {
60 (new TableFile())->load($path);
61 } finally {
62 unlink($path);
63 }
64 }
65
66 public function testInflate(): void
67 {
68 $file = new TableFile();
69
70 self::assertSame('abc', $file->inflate((string) gzdeflate('abc')));
71 self::assertNull($file->inflate('plain text'));
72 }
73
74 public function testForget(): void
75 {
76 $path = tempnam(sys_get_temp_dir(), 'sql-parser-table');
77 self::assertIsString($path);
78 $file = new TableFile();
79 $file->save(new ParseTable(new SymbolTable(['$end'], ['$accept']), [], [], new ArrayRows([])), $path);
80 $first = $file->load($path);
81 TableFile::forget();
82
83 self::assertNotSame($first, $file->load($path));
84 unlink($path);
85 }
86}
87