packages/sql-fixture/tests/Unit/Platform/MySql/Value/DecimalGeneratorTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Platform\MySql\Value;
6
7use Faker\Factory;
8use PHPUnit\Framework\Attributes\CoversClass;
9use PHPUnit\Framework\TestCase;
10use SqlFixture\Platform\MySql\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, unsigned: true));
24 self::assertGreaterThanOrEqual(0, $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