packages/sql-catalog/tests/Unit/Core/Evaluation/ObjectTermTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Core\Evaluation;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\UsesClass;
9use PHPUnit\Framework\TestCase;
10use SqlCatalog\Core\Evaluation\ObjectTerm;
11use SqlCatalog\Core\Text\TextHole;
12use SqlCatalog\Core\Text\TextPattern;
13use SqlCatalog\Core\Type\TypeShape;
14
15#[CoversClass(ObjectTerm::class)]
16#[UsesClass(TextHole::class)]
17#[UsesClass(TextPattern::class)]
18#[UsesClass(TypeShape::class)]
19#[UsesClass(\SqlCatalog\Core\Evaluation\ArrayTerm::class)]
20final class ObjectTermTest extends TestCase
21{
22    public function testToPatternLeavesAGap(): void
23    {
24        self::assertSame('{$}', (new ObjectTerm('PDO'))->toPattern()->display());
25    }
26
27    public function testTypeIsTheClass(): void
28    {
29        self::assertSame('PDO', (new ObjectTerm('PDO'))->type()->display());
30    }
31
32    public function testSignatureIsWrittenExactly(): void
33    {
34        self::assertSame('object:App\\Status:Active:', (new ObjectTerm('App\\Status', 'Active'))->signature());
35        self::assertSame('object:PDOStatement::a.php:3:pdo.prepare', (new ObjectTerm('PDOStatement', null, 'a.php:3:pdo.prepare'))->signature());
36        self::assertSame('object:PDO::', (new ObjectTerm('PDO'))->signature());
37    }
38
39    public function testSignatureSeparatesCasesAndStatements(): void
40    {
41        $case = new ObjectTerm('App\\Status', 'Active');
42        $statement = new ObjectTerm('PDOStatement', null, 'a.php:3:pdo.prepare');
43        self::assertNotSame($case->signature(), (new ObjectTerm('App\\Status', 'Banned'))->signature());
44        self::assertStringContainsString('a.php:3:pdo.prepare', $statement->signature());
45    }
46
47    public function testSignatureDistinguishesAllocationsAndSnapshotsWithoutLosingOtherIdentity(): void
48    {
49        $a = new ObjectTerm('Builder', 'case', 'statement', 'allocation');
50        $b = new ObjectTerm('Builder', 'case', 'statement', 'other');
51        $c = new ObjectTerm('Builder', 'case', 'statement', 'allocation', new \SqlCatalog\Core\Evaluation\ArrayTerm([]));
52        self::assertNotSame($a->signature(), $b->signature());
53        self::assertNotSame($a->signature(), $c->signature());
54        self::assertNotSame($a->signature(), (new ObjectTerm('Builder', 'other', 'statement', 'allocation'))->signature());
55        self::assertNotSame($a->signature(), (new ObjectTerm('Builder', 'case', 'other', 'allocation'))->signature());
56        self::assertNotSame($a->signature(), (new ObjectTerm('Other', 'case', 'statement', 'allocation'))->signature());
57    }
58}
59