packages/sql-fixture/tests/Unit/TypeMapper/DecimalRangeTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\TypeMapper;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\DataProvider;
9use PHPUnit\Framework\Attributes\UsesClass;
10use PHPUnit\Framework\TestCase;
11use SqlFixture\Schema\ColumnDefinition;
12use SqlFixture\TypeMapper\DecimalRange;
13
14#[CoversClass(DecimalRange::class)]
15#[UsesClass(ColumnDefinition::class)]
16final class DecimalRangeTest extends TestCase
17{
18 #[DataProvider('providerDecimalBounds')]
19 public function testPrecisionAndScaleDefineRepresentableValues(?int $precision, ?int $scale, bool $unsigned, float $minimum, float $maximum, int $digits): void
20 {
21 $column = new ColumnDefinition('amount', 'DECIMAL', precision: $precision, scale: $scale);
22 $range = new DecimalRange($column, $unsigned);
23 self::assertSame($digits, $range->scale);
24 self::assertSame($minimum, $range->minimum);
25 self::assertSame($maximum, $range->maximum);
26 }
27
28 public function testDefaultSignednessRetainsNegativeFractions(): void
29 {
30 $range = new DecimalRange(new ColumnDefinition('ratio', 'DECIMAL', precision: 2, scale: 2));
31 self::assertSame(-0.99, $range->minimum);
32 self::assertSame(0.99, $range->maximum);
33 }
34
35 /**
36 * @return list<array{?int, ?int, bool, float, float, int}>
37 */
38 public static function providerDecimalBounds(): array
39 {
40 return [
41 [null, null, false, -9999999999.0, 9999999999.0, 0],
42 [null, 2, false, -99999999.99, 99999999.99, 2],
43 [5, null, false, -99999.0, 99999.0, 0],
44 [5, 2, false, -999.99, 999.99, 2],
45 [5, 2, true, 0.0, 999.99, 2],
46 [2, 2, false, -0.99, 0.99, 2],
47 [2, 2, true, 0.0, 0.99, 2],
48 [1, 0, false, -9.0, 9.0, 0],
49 [1, 0, true, 0.0, 9.0, 0],
50 ];
51 }
52}
53