packages/deriver/tests/Unit/Deriver/Evaluator/Enumeration/EnumeratorTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Deriver\Evaluator\Enumeration;
6
7use Deriver\Deriver\Evaluator\Enumeration\Choices;
8use Deriver\Deriver\Evaluator\Enumeration\Enumerator as Subject;
9use Deriver\Deriver\Evaluator\Term;
10use PHPUnit\Framework\Attributes\CoversNothing;
11use PHPUnit\Framework\TestCase;
12
13#[CoversNothing]
14final class EnumeratorTest extends TestCase
15{
16    public function testNextPrunesConflictingSelectors(): void
17    {
18        $inner = (new Choices())->make([[Term::constant(1),['x' => true]],[Term::constant(2),['x' => false]]]);
19        $cursor = new Subject((new Choices())->make([[$inner,['x' => false]]]));
20        $next = $cursor->next();
21        self::assertNotNull($next);
22        self::assertSame(2, $next[0]->native());
23        self::assertNull($cursor->next());
24    }
25
26    public function testHasRemainingDoesNotConsumeTheFrontier(): void
27    {
28        $cursor = new Subject(Term::constant(1));
29        self::assertTrue($cursor->hasRemaining());
30        $cursor->next();
31        self::assertFalse($cursor->hasRemaining());
32    }
33
34    public function testRemainderRetainsTheCurrentAndUnvisitedValues(): void
35    {
36        $cursor = new Subject((new Choices())->make([[Term::constant(1),[]],[Term::constant(2),[]]]));
37        $current = $cursor->next();
38        self::assertNotNull($current);
39        $rest = $cursor->remainder($current);
40        self::assertCount(2, iterator_to_array((new Choices())->alternatives($rest), false));
41    }
42
43}
44