packages/sql-catalog/tests/Unit/Core/Evaluation/ArrayEntryTest.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\ArrayEntry;
11use SqlCatalog\Core\Evaluation\Domain;
12use SqlCatalog\Core\Evaluation\LiteralTerm;
13use SqlCatalog\Core\Evaluation\OpaqueTerm;
14use SqlCatalog\Core\Text\LiteralText;
15use SqlCatalog\Core\Text\TextPattern;
16use SqlCatalog\Core\Type\TypeShape;
17
18#[CoversClass(ArrayEntry::class)]
19#[UsesClass(Domain::class)]
20#[UsesClass(LiteralTerm::class)]
21#[UsesClass(OpaqueTerm::class)]
22#[UsesClass(LiteralText::class)]
23#[UsesClass(TextPattern::class)]
24#[UsesClass(TypeShape::class)]
25final class ArrayEntryTest extends TestCase
26{
27    public function testScalarKeyReadsAResolvedStringKey(): void
28    {
29        $entry = new ArrayEntry(Domain::literal(':id'), Domain::literal(1));
30        self::assertSame(':id', $entry->scalarKey());
31    }
32
33    public function testScalarKeyReadsAResolvedIntegerKey(): void
34    {
35        self::assertSame(2, (new ArrayEntry(Domain::literal(2), Domain::literal('x')))->scalarKey());
36    }
37
38    public function testScalarKeyIsNullWithoutAKey(): void
39    {
40        self::assertNull((new ArrayEntry(null, Domain::literal('x')))->scalarKey());
41    }
42
43    public function testScalarKeyIsNullWhenTheKeyDidNotResolve(): void
44    {
45        self::assertNull((new ArrayEntry(Domain::unknown(), Domain::literal('x')))->scalarKey());
46    }
47
48    public function testScalarKeyIsNullForANonStringScalar(): void
49    {
50        self::assertNull((new ArrayEntry(Domain::literal(true), Domain::literal('x')))->scalarKey());
51    }
52
53    public function testSignatureCombinesKeyAndValue(): void
54    {
55        $keyed = new ArrayEntry(Domain::literal('a'), Domain::literal(1));
56        $unkeyed = new ArrayEntry(null, Domain::literal(1));
57        self::assertNotSame($keyed->signature(), $unkeyed->signature());
58    }
59}
60