packages/sql-fixture/tests/Unit/Platform/MySql/Value/IntegerGeneratorTest.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\IntegerGenerator 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\IntegerRange::class)]
16#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFixture\TypeMapper\IntegerWidth::class)]
17final class IntegerGeneratorTest extends TestCase
18{
19    public function testGenerateTinyIntStaysWithinDeclaredDomain(): void
20    {
21        $faker = Factory::create();
22        $faker->seed(42);
23        $value = (new Subject())->generateTinyInt($faker, new ColumnDefinition('n', 'TINYINT', length: null));
24        self::assertIsInt($value);
25        self::assertGreaterThanOrEqual(-128, $value);
26        self::assertLessThanOrEqual(127, $value);
27    }
28
29    public function testGenerateSmallIntStaysWithinDeclaredDomain(): void
30    {
31        $faker = Factory::create();
32        $faker->seed(42);
33        $value = (new Subject())->generateSmallInt($faker, new ColumnDefinition('n', 'SMALLINT', length: null));
34        self::assertGreaterThanOrEqual(-32768, $value);
35        self::assertLessThanOrEqual(32767, $value);
36    }
37
38    public function testGenerateMediumIntStaysWithinDeclaredDomain(): void
39    {
40        $faker = Factory::create();
41        $faker->seed(42);
42        $value = (new Subject())->generateMediumInt($faker, new ColumnDefinition('n', 'MEDIUMINT', length: null));
43        self::assertGreaterThanOrEqual(-8388608, $value);
44        self::assertLessThanOrEqual(8388607, $value);
45    }
46
47    public function testGenerateIntStaysWithinDeclaredDomain(): void
48    {
49        $faker = Factory::create();
50        $faker->seed(42);
51        $value = (new Subject())->generateInt($faker, new ColumnDefinition('n', 'INT', length: null));
52        self::assertGreaterThanOrEqual(-2147483648, $value);
53        self::assertLessThanOrEqual(2147483647, $value);
54    }
55
56    public function testGenerateBigIntStaysWithinDeclaredDomain(): void
57    {
58        $faker = Factory::create();
59        $faker->seed(42);
60        $value = (new Subject())->generateBigInt($faker, new ColumnDefinition('n', 'BIGINT', length: null));
61        self::assertGreaterThanOrEqual(-9223372036854775808, $value);
62        self::assertLessThanOrEqual(9223372036854775807, $value);
63    }
64
65    public function testGenerateBitStaysWithinDeclaredDomain(): void
66    {
67        $faker = Factory::create();
68        $faker->seed(42);
69        $value = (new Subject())->generateBit($faker, new ColumnDefinition('n', 'BIT', length: 8));
70        self::assertGreaterThanOrEqual(0, $value);
71        self::assertLessThanOrEqual(255, $value);
72    }
73
74    public function testGenerateBitUsesOneBitWhenLengthIsOmitted(): void
75    {
76        $faker = Factory::create();
77        $generator = new Subject();
78        $values = array_map(static function (int $seed) use ($faker, $generator): int {
79            $faker->seed($seed);
80            return $generator->generateBit($faker, new ColumnDefinition('flag', 'BIT'));
81        }, range(1, 32));
82        self::assertSame(0, min($values));
83        self::assertSame(1, max($values));
84    }
85
86    #[\PHPUnit\Framework\Attributes\DataProvider('providerFullWidthBitSeeds')]
87    public function testGenerateBitAvoidsOverflowForFullWidthBitColumns(int $seed): void
88    {
89        $faker = Factory::create();
90        $generator = new Subject();
91        $faker->seed($seed);
92        $value = $generator->generateBit($faker, new ColumnDefinition('flags', 'BIT', length: 64));
93        self::assertGreaterThanOrEqual(0, $value);
94        self::assertLessThanOrEqual(PHP_INT_MAX, $value);
95    }
96    /**
97     * @return list<array{int}>
98     */
99    public static function providerFullWidthBitSeeds(): array
100    {
101        return array_map(static fn (int $seed): array => [$seed], range(1, 32));
102    }
103}
104