packages/sql-fixture/tests/Unit/Platform/MySql/Value/SpatialGeneratorTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Platform\MySql\Value;
6
7use Faker\Factory;
8use PDO;
9use PHPUnit\Framework\Attributes\CoversClass;
10use PHPUnit\Framework\Attributes\DataProvider;
11use PHPUnit\Framework\Attributes\Medium;
12use PHPUnit\Framework\TestCase;
13use SqlFixture\Platform\MySql\Value\SpatialGenerator as Subject;
14
15#[CoversClass(Subject::class)]
16#[Medium]
17final class SpatialGeneratorTest extends TestCase
18{
19 #[DataProvider('providerGeometrySeeds')]
20 public function testGeneratePointProducesValidNonemptyGeometry(int $seed): void
21 {
22 $pdo = new PDO(
23 (string) getenv('SQL_FIXTURE_MYSQL_DSN'),
24 (string) getenv('SQL_FIXTURE_MYSQL_USER'),
25 (string) getenv('SQL_FIXTURE_MYSQL_PASSWORD'),
26 [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_EMULATE_PREPARES => false],
27 );
28 $faker = Factory::create();
29 $faker->seed($seed);
30 $value = (new Subject())->generatePoint($faker);
31 $statement = $pdo->prepare('SELECT ST_IsValid(g), ST_IsEmpty(g), ST_GeometryType(g), ST_Dimension(g) FROM (SELECT ST_GeomFromText(?) AS g) AS geometry_input');
32 $statement->execute([$value]);
33 self::assertSame([1, 0, 'POINT', 0], $statement->fetch(PDO::FETCH_NUM));
34 }
35
36 #[DataProvider('providerGeometrySeeds')]
37 public function testGenerateLineStringProducesValidNonemptyGeometry(int $seed): void
38 {
39 $pdo = new PDO(
40 (string) getenv('SQL_FIXTURE_MYSQL_DSN'),
41 (string) getenv('SQL_FIXTURE_MYSQL_USER'),
42 (string) getenv('SQL_FIXTURE_MYSQL_PASSWORD'),
43 [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_EMULATE_PREPARES => false],
44 );
45 $faker = Factory::create();
46 $faker->seed($seed);
47 $value = (new Subject())->generateLineString($faker);
48 $statement = $pdo->prepare('SELECT ST_IsValid(g), ST_IsEmpty(g), ST_GeometryType(g), ST_Dimension(g) FROM (SELECT ST_GeomFromText(?) AS g) AS geometry_input');
49 $statement->execute([$value]);
50 self::assertSame([1, 0, 'LINESTRING', 1], $statement->fetch(PDO::FETCH_NUM));
51 }
52
53 #[DataProvider('providerGeometrySeeds')]
54 public function testGeneratePolygonProducesValidNonemptyGeometry(int $seed): void
55 {
56 $pdo = new PDO(
57 (string) getenv('SQL_FIXTURE_MYSQL_DSN'),
58 (string) getenv('SQL_FIXTURE_MYSQL_USER'),
59 (string) getenv('SQL_FIXTURE_MYSQL_PASSWORD'),
60 [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_EMULATE_PREPARES => false],
61 );
62 $faker = Factory::create();
63 $faker->seed($seed);
64 $value = (new Subject())->generatePolygon($faker);
65 $statement = $pdo->prepare('SELECT ST_IsValid(g), ST_IsEmpty(g), ST_GeometryType(g), ST_Dimension(g) FROM (SELECT ST_GeomFromText(?) AS g) AS geometry_input');
66 $statement->execute([$value]);
67 self::assertSame([1, 0, 'POLYGON', 2], $statement->fetch(PDO::FETCH_NUM));
68 }
69
70 #[DataProvider('providerGeometrySeeds')]
71 public function testGenerateMultiPointProducesValidNonemptyGeometry(int $seed): void
72 {
73 $pdo = new PDO(
74 (string) getenv('SQL_FIXTURE_MYSQL_DSN'),
75 (string) getenv('SQL_FIXTURE_MYSQL_USER'),
76 (string) getenv('SQL_FIXTURE_MYSQL_PASSWORD'),
77 [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_EMULATE_PREPARES => false],
78 );
79 $faker = Factory::create();
80 $faker->seed($seed);
81 $value = (new Subject())->generateMultiPoint($faker);
82 $statement = $pdo->prepare('SELECT ST_IsValid(g), ST_IsEmpty(g), ST_GeometryType(g), ST_Dimension(g) FROM (SELECT ST_GeomFromText(?) AS g) AS geometry_input');
83 $statement->execute([$value]);
84 self::assertSame([1, 0, 'MULTIPOINT', 0], $statement->fetch(PDO::FETCH_NUM));
85 }
86
87 #[DataProvider('providerGeometrySeeds')]
88 public function testGenerateMultiLineStringProducesValidNonemptyGeometry(int $seed): void
89 {
90 $pdo = new PDO(
91 (string) getenv('SQL_FIXTURE_MYSQL_DSN'),
92 (string) getenv('SQL_FIXTURE_MYSQL_USER'),
93 (string) getenv('SQL_FIXTURE_MYSQL_PASSWORD'),
94 [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_EMULATE_PREPARES => false],
95 );
96 $faker = Factory::create();
97 $faker->seed($seed);
98 $value = (new Subject())->generateMultiLineString($faker);
99 $statement = $pdo->prepare('SELECT ST_IsValid(g), ST_IsEmpty(g), ST_GeometryType(g), ST_Dimension(g) FROM (SELECT ST_GeomFromText(?) AS g) AS geometry_input');
100 $statement->execute([$value]);
101 self::assertSame([1, 0, 'MULTILINESTRING', 1], $statement->fetch(PDO::FETCH_NUM));
102 }
103
104 #[DataProvider('providerGeometrySeeds')]
105 public function testGenerateMultiPolygonProducesValidNonemptyGeometry(int $seed): void
106 {
107 $pdo = new PDO(
108 (string) getenv('SQL_FIXTURE_MYSQL_DSN'),
109 (string) getenv('SQL_FIXTURE_MYSQL_USER'),
110 (string) getenv('SQL_FIXTURE_MYSQL_PASSWORD'),
111 [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_EMULATE_PREPARES => false],
112 );
113 $faker = Factory::create();
114 $faker->seed($seed);
115 $value = (new Subject())->generateMultiPolygon($faker);
116 $statement = $pdo->prepare('SELECT ST_IsValid(g), ST_IsEmpty(g), ST_GeometryType(g), ST_Dimension(g) FROM (SELECT ST_GeomFromText(?) AS g) AS geometry_input');
117 $statement->execute([$value]);
118 self::assertSame([1, 0, 'MULTIPOLYGON', 2], $statement->fetch(PDO::FETCH_NUM));
119 }
120
121 #[DataProvider('providerGeometrySeeds')]
122 public function testGenerateGeometryCollectionProducesValidNonemptyGeometry(int $seed): void
123 {
124 $pdo = new PDO(
125 (string) getenv('SQL_FIXTURE_MYSQL_DSN'),
126 (string) getenv('SQL_FIXTURE_MYSQL_USER'),
127 (string) getenv('SQL_FIXTURE_MYSQL_PASSWORD'),
128 [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_EMULATE_PREPARES => false],
129 );
130 $faker = Factory::create();
131 $faker->seed($seed);
132 $value = (new Subject())->generateGeometryCollection($faker);
133 $statement = $pdo->prepare('SELECT ST_IsValid(g), ST_IsEmpty(g), ST_GeometryType(g), ST_Dimension(g) FROM (SELECT ST_GeomFromText(?) AS g) AS geometry_input');
134 $statement->execute([$value]);
135 self::assertSame([1, 0, 'GEOMCOLLECTION', 1], $statement->fetch(PDO::FETCH_NUM));
136 }
137
138 /**
139 * @return list<array{int}>
140 */
141 public static function providerGeometrySeeds(): array
142 {
143 return array_map(static fn (int $seed): array => [$seed], range(1, 24));
144 }
145}
146