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