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