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