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