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