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