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