packages/sql-catalog/tests/Unit/Core/Evaluation/TermTest.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\ArrayTerm;
11use SqlCatalog\Core\Evaluation\LiteralTerm;
12use SqlCatalog\Core\Evaluation\ObjectTerm;
13use SqlCatalog\Core\Evaluation\OpaqueTerm;
14use SqlCatalog\Core\Evaluation\PatternTerm;
15use SqlCatalog\Core\Evaluation\Term;
16use SqlCatalog\Core\Text\LiteralText;
17use SqlCatalog\Core\Text\TextHole;
18use SqlCatalog\Core\Text\TextPattern;
19use SqlCatalog\Core\Type\TypeShape;
20
21#[CoversClass(Term::class)]
22#[UsesClass(ArrayTerm::class)]
23#[UsesClass(LiteralTerm::class)]
24#[UsesClass(ObjectTerm::class)]
25#[UsesClass(OpaqueTerm::class)]
26#[UsesClass(PatternTerm::class)]
27#[UsesClass(LiteralText::class)]
28#[UsesClass(TextHole::class)]
29#[UsesClass(TextPattern::class)]
30#[UsesClass(TypeShape::class)]
31final class TermTest extends TestCase
32{
33 public function testToPatternIsExactOnlyForResolvedTerms(): void
34 {
35 self::assertTrue((new LiteralTerm('x'))->toPattern()->isExact());
36 self::assertFalse(OpaqueTerm::unresolved()->toPattern()->isExact());
37 self::assertFalse((new ArrayTerm([]))->toPattern()->isExact());
38 self::assertFalse((new ObjectTerm('PDO'))->toPattern()->isExact());
39 }
40
41 public function testTypeIsReportedByEveryKindOfTerm(): void
42 {
43 self::assertSame('string', (new LiteralTerm('x'))->type()->display());
44 self::assertSame('string', (new PatternTerm(TextPattern::fromText('x')))->type()->display());
45 self::assertSame('array', (new ArrayTerm([]))->type()->display());
46 }
47
48 public function testSignatureSeparatesTermsOfDifferentKinds(): void
49 {
50 $signatures = [
51 (new LiteralTerm('x'))->signature(),
52 (new ArrayTerm([]))->signature(),
53 (new ObjectTerm('PDO'))->signature(),
54 OpaqueTerm::unresolved()->signature(),
55 ];
56 self::assertCount(4, array_unique($signatures));
57 }
58}
59