packages/sql-catalog/tests/Unit/Core/Evaluation/OpaqueTermTest.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\OpaqueTerm;
11use SqlCatalog\Core\Text\Origin;
12use SqlCatalog\Core\Text\TextHole;
13use SqlCatalog\Core\Text\TextPattern;
14use SqlCatalog\Core\Type\TypeShape;
15
16#[CoversClass(OpaqueTerm::class)]
17#[UsesClass(TextHole::class)]
18#[UsesClass(TextPattern::class)]
19#[UsesClass(TypeShape::class)]
20final class OpaqueTermTest extends TestCase
21{
22    public function testUnresolvedKnowsNothingAboutTheValue(): void
23    {
24        $term = OpaqueTerm::unresolved('$name');
25        self::assertSame(Origin::Unresolved, $term->origin);
26        self::assertSame('mixed', $term->type()->display());
27        self::assertSame('$name', $term->expression);
28    }
29
30    public function testToPatternLeavesAGapCarryingTheOrigin(): void
31    {
32        $pattern = (new OpaqueTerm(TypeShape::of(['string']), Origin::External, 'readInput()', '$sql'))->toPattern();
33        self::assertSame('{$}', $pattern->display());
34        self::assertSame(Origin::External, $pattern->holes()[0]->origin);
35        self::assertSame('readInput()', $pattern->holes()[0]->expression);
36        self::assertSame('$sql', $pattern->holes()[0]->variable);
37    }
38
39    public function testTypeIsTheDeclaredOne(): void
40    {
41        self::assertSame('int', (new OpaqueTerm(TypeShape::of(['int']), Origin::Parameter))->type()->display());
42    }
43
44    public function testSignatureCombinesTypeAndOrigin(): void
45    {
46        $left = new OpaqueTerm(TypeShape::of(['int']), Origin::Parameter);
47        $right = new OpaqueTerm(TypeShape::of(['int']), Origin::External);
48        self::assertNotSame($left->signature(), $right->signature());
49    }
50}
51