packages/sql-fixture/tests/Unit/TypeMapper/IntegerRangeTest.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\TypeMapper\IntegerRange;
12use SqlFixture\TypeMapper\IntegerWidth;
13
14#[CoversClass(IntegerRange::class)]
15#[UsesClass(IntegerWidth::class)]
16final class IntegerRangeTest extends TestCase
17{
18    #[DataProvider('providerSqlIntegerBounds')]
19    public function testWidthAndSignednessDefineTheDomain(IntegerWidth $width, bool $unsigned, int $minimum, int $maximum): void
20    {
21        $range = new IntegerRange($width, $unsigned);
22        self::assertSame($minimum, $range->minimum);
23        self::assertSame($maximum, $range->maximum);
24    }
25
26    public function testDefaultSignednessIncludesNegativeValues(): void
27    {
28        $range = new IntegerRange(IntegerWidth::Bits8);
29        self::assertSame(-128, $range->minimum);
30        self::assertSame(127, $range->maximum);
31    }
32
33    /**
34     * @return list<array{IntegerWidth, bool, int, int}>
35     */
36    public static function providerSqlIntegerBounds(): array
37    {
38        return [
39            [IntegerWidth::Bits8, false, -128, 127],
40            [IntegerWidth::Bits8, true, 0, 255],
41            [IntegerWidth::Bits16, false, -32768, 32767],
42            [IntegerWidth::Bits16, true, 0, 65535],
43            [IntegerWidth::Bits24, false, -8388608, 8388607],
44            [IntegerWidth::Bits24, true, 0, 16777215],
45            [IntegerWidth::Bits32, false, -2147483648, 2147483647],
46            [IntegerWidth::Bits32, true, 0, 4294967295],
47            [IntegerWidth::Bits64, false, PHP_INT_MIN, PHP_INT_MAX],
48            [IntegerWidth::Bits64, true, 0, PHP_INT_MAX],
49        ];
50    }
51}
52