packages/sql-faker/tests/Unit/Generation/Coverage/CoverageSetsTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\SqlFaker\Generation\Coverage;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\TestCase;
9use SqlFaker\Generation\Coverage\CoverageSets;
10
11#[CoversClass(CoverageSets::class)]
12final class CoverageSetsTest extends TestCase
13{
14    public function testIncludeUnionsProductionIdsWithoutDoubleCounting(): void
15    {
16        $one = new CoverageSets();
17        $one->reached = ['a' => true, 'outside' => true];
18        $one->emitted = ['a' => true];
19        $two = new CoverageSets();
20        $two->reached = ['b' => true];
21        $two->emitted = ['b' => true];
22        $two->include($one);
23        $two->include($one);
24        self::assertSame(2, $two->measurement(['a', 'b'])['reached']);
25        self::assertSame(2, $two->measurement(['a', 'b'])['emitted']);
26        self::assertSame([], $two->measurement(['a', 'b'])['notReachedIds']);
27    }
28
29    public function testMeasurementHandlesAnEmptyDenominator(): void
30    {
31        $measurement = (new CoverageSets())->measurement([]);
32        self::assertSame(0.0, $measurement['reachedRate']);
33        self::assertSame(0.0, $measurement['emittedRate']);
34    }
35
36    public function testMeasurementExposesStableSortedSetsAndBothRatesForTheFullInventory(): void
37    {
38        $sets = new CoverageSets();
39        $sets->reached = ['c' => true, 'a' => true, 'outside' => true];
40        $sets->emitted = ['outside' => true, 'a' => true];
41        self::assertSame([
42            'reachedIds' => ['a', 'c', 'outside'], 'emittedIds' => ['a', 'outside'],
43            'notReachedIds' => ['b', 'd'], 'notEmittedIds' => ['c'],
44            'reached' => 2, 'emitted' => 1, 'total' => 4, 'reachedRate' => 0.5, 'emittedRate' => 0.25,
45        ], $sets->measurement(['a', 'b', 'c', 'd']));
46    }
47
48}
49