packages/sql-catalog/tests/Unit/Core/Evaluation/CallResultsTest.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\CallResults;
11use SqlCatalog\Core\Evaluation\Domain;
12use SqlCatalog\Core\Evaluation\LiteralTerm;
13
14#[CoversClass(CallResults::class)]
15#[UsesClass(Domain::class)]
16#[UsesClass(LiteralTerm::class)]
17#[UsesClass(\SqlCatalog\Core\Type\TypeShape::class)]
18final class CallResultsTest extends TestCase
19{
20    public function testKeyForTellsReadingsOfTheSameCallApart(): void
21    {
22        $results = new CallResults();
23
24        self::assertSame(
25            $results->keyFor('f', [Domain::literal('a')]),
26            $results->keyFor('f', [Domain::literal('a')]),
27        );
28        self::assertNotSame(
29            $results->keyFor('f', [Domain::literal('a')]),
30            $results->keyFor('f', [Domain::literal('b')]),
31        );
32        self::assertNotSame($results->keyFor('f', []), $results->keyFor('g', []));
33    }
34
35    public function testRecallAnswersWithWhatWasRemembered(): void
36    {
37        $results = new CallResults();
38        $result = Domain::literal('SELECT 1');
39        $results->remember('f|', $result);
40
41        self::assertSame($result, $results->recall('f|'));
42        self::assertNull($results->recall('g|'));
43    }
44
45    public function testRememberStopsOnceTheMemoryIsFull(): void
46    {
47        $results = new CallResults();
48        $indexes = range(0, CallResults::MAX_REMEMBERED);
49        array_walk($indexes, static function (int $index) use ($results): void {
50            $results->remember('f' . $index, Domain::literal($index));
51        });
52
53        self::assertSame(CallResults::MAX_REMEMBERED, $results->count());
54    }
55
56    public function testCountIsZeroBeforeAnythingIsRemembered(): void
57    {
58        self::assertSame(0, (new CallResults())->count());
59    }
60}
61