packages/sql-semantics/tests/Unit/Statement/ImmutableGraphTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Statement;
6
7use DateTime;
8use PHPUnit\Framework\Attributes\CoversClass;
9use PHPUnit\Framework\Attributes\Medium;
10use PHPUnit\Framework\Attributes\UsesClass;
11use PHPUnit\Framework\TestCase;
12use SqlSemantics\Statement\Element;
13use SqlSemantics\Statement\ImmutableGraph;
14use SqlSemantics\Statement\Model\Sqlite\Value\CmdWithCommitEndTransOpt_ccca6149 as Commit;
15use SqlSemantics\Statement\Model\Sqlite\Value\TransOptWithTransaction_ea573324 as Transaction;
16use SqlSemantics\Statement\Writer;
17
18#[CoversClass(ImmutableGraph::class)]
19#[UsesClass(\SqlSemantics\Statement\Assertion::class)]
20#[UsesClass(\SqlSemantics\Statement\Comments::class)]
21#[Medium]
22final class ImmutableGraphTest extends TestCase
23{
24 public function testContainsOnlyImmutableValuesAcceptsGeneratedDescendants(): void
25 {
26 $value = new Commit('COMMIT', new Transaction());
27 self::assertTrue((new ImmutableGraph())->containsOnlyImmutableValues($value));
28 }
29
30 public function testContainsOnlyImmutableValuesRejectsMutableState(): void
31 {
32 $value = new class () implements Element {
33 public string $sql = 'SELECT 1';
34
35 public function write(Writer $writer): void
36 {
37 $writer->append($this->sql);
38 }
39 };
40 self::assertFalse((new ImmutableGraph())->containsOnlyImmutableValues($value));
41 }
42
43 public function testContainsOnlyImmutableValuesAcceptsCommentsAndRejectsOtherObjects(): void
44 {
45 $commented = new Commit('COMMIT', new Transaction(), new \SqlSemantics\Statement\Comments([0 => ['-- c']]));
46 self::assertTrue((new ImmutableGraph())->containsOnlyImmutableValues($commented));
47 $value = new class (new DateTime()) implements Element {
48 public function __construct(public readonly DateTime $state)
49 {
50 }
51
52 public function write(Writer $writer): void
53 {
54 $writer->append('SELECT');
55 }
56 };
57 self::assertFalse((new ImmutableGraph())->containsOnlyImmutableValues($value));
58 }
59}
60