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