packages/sql-fixture/tests/Unit/Platform/PostgreSql/Value/DecimalGeneratorTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Platform\PostgreSql\Value;
6
7use Faker\Factory;
8use PHPUnit\Framework\Attributes\CoversClass;
9use PHPUnit\Framework\TestCase;
10use SqlFixture\Platform\PostgreSql\Value\DecimalGenerator as Subject;
11use SqlFixture\Schema\ColumnDefinition;
12
13#[CoversClass(Subject::class)]
14#[\PHPUnit\Framework\Attributes\UsesClass(ColumnDefinition::class)]
15#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFixture\TypeMapper\DecimalRange::class)]
16final class DecimalGeneratorTest extends TestCase
17{
18    public function testGenerateDecimalHonorsScaleAndPrecision(): void
19    {
20        $faker = Factory::create();
21        $faker->seed(42);
22        $generator = new Subject();
23        $value = $generator->generateDecimal($faker, new ColumnDefinition('price', 'DECIMAL', precision: 4, scale: 2));
24        self::assertGreaterThanOrEqual(-99.99, $value);
25        self::assertLessThanOrEqual(99.99, $value);
26        self::assertEqualsWithDelta(round($value, 2), $value, 0.000001);
27
28    }
29    public function testGenerateDecimalProducesNonzeroFractionalValues(): void
30    {
31        $faker = Factory::create();
32        $column = new ColumnDefinition('ratio', 'DECIMAL', precision: 2, scale: 2, nullable: false);
33        $values = array_map(static function (int $seed) use ($faker, $column): float {
34            $faker->seed($seed);
35            return (new Subject())->generateDecimal($faker, $column);
36        }, range(1, 20));
37        self::assertGreaterThan(1, count(array_unique($values)));
38        self::assertGreaterThanOrEqual(-0.99, min($values));
39        self::assertLessThanOrEqual(0.99, max($values));
40    }
41}
42