packages/deriver/tests/Unit/Reporter/TextReporterTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Reporter;
6
7use Deriver\Deriver\Candidate;
8use Deriver\Deriver\Candidate\Alternative;
9use Deriver\Deriver\Candidate\CandidateCollection;
10use Deriver\Deriver\Candidate\ResultRef;
11use Deriver\Deriver\Candidate\Snapshot;
12use Deriver\Deriver\Evaluator\Evidence\EvidenceKind;
13use Deriver\Deriver\Evaluator\Evidence\Node;
14use Deriver\Deriver\Evaluator\Term;
15use Deriver\Reporter\TextReporter;
16use PHPUnit\Framework\Attributes\CoversNothing;
17use PHPUnit\Framework\TestCase;
18
19#[CoversNothing]
20final class TextReporterTest extends TestCase
21{
22    public function testReportKeepsNativeLiteralTypesVisible(): void
23    {
24        $node = new Node(EvidenceKind::Observation);
25        $evidence = [new Alternative($node, $node, new Snapshot('s', [], [], new \Deriver\Deriver\Evaluator\TargetProfile(), 'environment'))];
26        $candidates = new CandidateCollection([new Candidate(Term::fromNative(['id' => 7, 'enabled' => false]), $evidence)], new ResultRef('r'));
27        $text = (new TextReporter())->report($candidates);
28        self::assertStringContainsString('[0] analyzed array', $text);
29        self::assertStringContainsString("'enabled' => false", $text);
30        self::assertStringContainsString('Evidence: 1 derivation(s).', $text);
31    }
32
33    public function testReportDistinguishesPartialsAndInterruption(): void
34    {
35        $node = new Node(EvidenceKind::Observation);
36        $evidence = [new Alternative($node, $node, new Snapshot('s', [], [], new \Deriver\Deriver\Evaluator\TargetProfile(), 'environment'))];
37        $candidates = new CandidateCollection([new Candidate(Term::parameter('id', 'int'), $evidence)], new ResultRef('r'), interrupted: true);
38        $text = (new TextReporter())->report($candidates);
39        self::assertStringContainsString('[0] partials int', $text);
40        self::assertStringContainsString("'literal' => 'id'", $text);
41        self::assertStringContainsString('Exploration interrupted', $text);
42    }
43
44    public function testReportDescribesAnEmptyCollection(): void
45    {
46        self::assertSame("No candidates.\n", (new TextReporter())->report(new CandidateCollection([], new ResultRef('r'))));
47    }
48}
49