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