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