packages/sql-fixture/tests/Unit/Platform/Sqlite/Value/ColumnGeneratorTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Platform\Sqlite\Value;
6
7use Faker\Factory;
8use PHPUnit\Framework\Attributes\CoversClass;
9use PHPUnit\Framework\TestCase;
10use SqlFixture\Platform\Sqlite\Value\ColumnGenerator as Subject;
11use SqlFixture\Schema\ColumnDefinition;
12
13#[CoversClass(Subject::class)]
14#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFixture\Platform\Sqlite\Value\TypeAffinity::class)]
15#[\PHPUnit\Framework\Attributes\UsesClass(ColumnDefinition::class)]
16#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFixture\TypeMapper\ParagraphGenerator::class)]
17#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFixture\TypeMapper\IntegerRange::class)]
18#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFixture\TypeMapper\IntegerWidth::class)]
19#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFixture\TypeMapper\DecimalRange::class)]
20final class ColumnGeneratorTest extends TestCase
21{
22 public function testGenerateValueRespectsStringLength(): void
23 {
24 $faker = Factory::create();
25 $faker->seed(42);
26 $value = (new Subject())->generateValue($faker, new ColumnDefinition('code', 'VARCHAR', length: 12));
27 self::assertIsString($value);
28 self::assertLessThanOrEqual(12, strlen($value));
29 self::assertNotSame('', $value);
30 }
31
32 public function testGenerateIntegerRespectsNumericDomain(): void
33 {
34 $faker = Factory::create();
35 $faker->seed(42);
36 $value = (new Subject())->generateInteger($faker, new ColumnDefinition('amount', 'INTEGER', precision: 5, scale: 2));
37 self::assertGreaterThanOrEqual(-2147483648, $value);
38 self::assertLessThanOrEqual(2147483647, $value);
39 }
40
41 public function testGenerateRealRespectsNumericDomain(): void
42 {
43 $faker = Factory::create();
44 $faker->seed(42);
45 $value = (new Subject())->generateReal($faker, new ColumnDefinition('amount', 'DECIMAL', precision: 5, scale: 2));
46 self::assertGreaterThanOrEqual(-999.99, $value);
47 self::assertLessThanOrEqual(999.99, $value);
48 }
49
50 public function testGenerateNumericRespectsNumericDomain(): void
51 {
52 $faker = Factory::create();
53 $faker->seed(42);
54 $value = (new Subject())->generateNumeric($faker, new ColumnDefinition('amount', 'DECIMAL', precision: 5, scale: 2));
55 self::assertIsNumeric($value);
56 self::assertGreaterThanOrEqual(-999.99, $value);
57 self::assertLessThanOrEqual(999.99, $value);
58 }
59
60 public function testGenerateDecimalRespectsNumericDomain(): void
61 {
62 $faker = Factory::create();
63 $faker->seed(42);
64 $value = (new Subject())->generateDecimal($faker, new ColumnDefinition('amount', 'DECIMAL', precision: 5, scale: 2));
65 self::assertGreaterThanOrEqual(-999.99, $value);
66 self::assertLessThanOrEqual(999.99, $value);
67 }
68
69 public function testGenerateTextReturnsDeclaredLength(): void
70 {
71 $faker = Factory::create();
72 $value = (new Subject())->generateText($faker, new ColumnDefinition('value', 'TEXT', length: 10));
73 self::assertNotSame('', $value);
74 self::assertLessThanOrEqual(10, strlen($value));
75 }
76
77 public function testGenerateBlobReturnsDeclaredLength(): void
78 {
79 $faker = Factory::create();
80 $value = (new Subject())->generateBlob($faker, new ColumnDefinition('value', 'BLOB', length: 10));
81 self::assertNotSame('', $value);
82 self::assertLessThanOrEqual(10, strlen($value));
83 }
84 public function testGenerateDecimalProducesNonzeroFractionalValues(): void
85 {
86 $faker = Factory::create();
87 $column = new ColumnDefinition('ratio', 'DECIMAL', precision: 2, scale: 2, nullable: false);
88 $values = array_map(static function (int $seed) use ($faker, $column): float {
89 $faker->seed($seed);
90 return (new Subject())->generateDecimal($faker, $column);
91 }, range(1, 20));
92 self::assertGreaterThan(1, count(array_unique($values)));
93 self::assertGreaterThanOrEqual(-0.99, min($values));
94 self::assertLessThanOrEqual(0.99, max($values));
95 }
96}
97