@@ -167,4 +167,134 @@ public static function provideDimensionalModifierRoundTripCases(): array
167167 'srid with polygon zm ' => ['SRID=4326;POLYGON ZM((-122.5 37.7 0 1, -122.5 37.8 0 1, -122.4 37.8 0 1, -122.4 37.7 0 1, -122.5 37.7 0 1)) ' ],
168168 ];
169169 }
170+
171+ #[DataProvider('provideFromComponentsData ' )]
172+ #[Test]
173+ public function can_create_from_components (
174+ GeometryType $ geometryType ,
175+ string $ coordinates ,
176+ ?int $ srid ,
177+ ?DimensionalModifier $ dimensionalModifier ,
178+ string $ expectedWkt
179+ ): void {
180+ $ wktSpatialData = WktSpatialData::fromComponents ($ geometryType , $ coordinates , $ srid , $ dimensionalModifier );
181+
182+ $ this ->assertSame ($ geometryType , $ wktSpatialData ->getGeometryType ());
183+ $ this ->assertSame ($ srid , $ wktSpatialData ->getSrid ());
184+ $ this ->assertSame ($ dimensionalModifier , $ wktSpatialData ->getDimensionalModifier ());
185+ $ this ->assertSame ($ expectedWkt , $ wktSpatialData ->getWkt ());
186+ }
187+
188+ /**
189+ * @return array<string, array{GeometryType, string, int|null, DimensionalModifier|null, string}>
190+ */
191+ public static function provideFromComponentsData (): array
192+ {
193+ return [
194+ 'simple point ' => [
195+ GeometryType::POINT ,
196+ '1 2 ' ,
197+ null ,
198+ null ,
199+ 'POINT(1 2) ' ,
200+ ],
201+ 'point with srid ' => [
202+ GeometryType::POINT ,
203+ '-122.4194 37.7749 ' ,
204+ 4326 ,
205+ null ,
206+ 'SRID=4326;POINT(-122.4194 37.7749) ' ,
207+ ],
208+ 'linestring with dimensional modifier ' => [
209+ GeometryType::LINESTRING ,
210+ '0 0 1, 1 1 2 ' ,
211+ null ,
212+ DimensionalModifier::M,
213+ 'LINESTRING M(0 0 1, 1 1 2) ' ,
214+ ],
215+ 'polygon with all parameters ' => [
216+ GeometryType::POLYGON ,
217+ '0 0 0 1, 0 1 0 1, 1 1 0 1, 1 0 0 1, 0 0 0 1 ' ,
218+ 4326 ,
219+ DimensionalModifier::ZM ,
220+ 'SRID=4326;POLYGON ZM(0 0 0 1, 0 1 0 1, 1 1 0 1, 1 0 0 1, 0 0 0 1) ' ,
221+ ],
222+ ];
223+ }
224+
225+ #[DataProvider('provideInvalidCoordinatesData ' )]
226+ #[Test]
227+ public function from_components_throws_exception_for_invalid_coordinates (string $ invalidCoordinates ): void
228+ {
229+ $ this ->expectException (InvalidWktSpatialDataException::class);
230+ WktSpatialData::fromComponents (GeometryType::POINT , $ invalidCoordinates );
231+ }
232+
233+ /**
234+ * @return array<string, array{string}>
235+ */
236+ public static function provideInvalidCoordinatesData (): array
237+ {
238+ return [
239+ 'empty string ' => ['' ],
240+ 'whitespace only ' => [' ' ],
241+ ];
242+ }
243+
244+ #[DataProvider('providePointData ' )]
245+ #[Test]
246+ public function can_create_point (
247+ float |int |string $ longitude ,
248+ float |int |string $ latitude ,
249+ ?int $ srid ,
250+ string $ expectedWkt
251+ ): void {
252+ $ wktSpatialData = WktSpatialData::point ($ longitude , $ latitude , $ srid );
253+
254+ $ this ->assertSame (GeometryType::POINT , $ wktSpatialData ->getGeometryType ());
255+ $ this ->assertSame ($ srid , $ wktSpatialData ->getSrid ());
256+ $ this ->assertNull ($ wktSpatialData ->getDimensionalModifier ());
257+ $ this ->assertSame ($ expectedWkt , $ wktSpatialData ->getWkt ());
258+ }
259+
260+ /**
261+ * @return array<string, array{float|int|string, float|int|string, int|null, string}>
262+ */
263+ public static function providePointData (): array
264+ {
265+ return [
266+ 'integer coordinates ' => [1 , 2 , null , 'POINT(1 2) ' ],
267+ 'float coordinates ' => [-122.4194 , 37.7749 , null , 'POINT(-122.4194 37.7749) ' ],
268+ 'string coordinates ' => ['-122.4194 ' , '37.7749 ' , null , 'POINT(-122.4194 37.7749) ' ],
269+ 'with srid ' => [-122.4194 , 37.7749 , 4326 , 'SRID=4326;POINT(-122.4194 37.7749) ' ],
270+ ];
271+ }
272+
273+ #[DataProvider('providePoint3dData ' )]
274+ #[Test]
275+ public function can_create_3d_point (
276+ float |int |string $ longitude ,
277+ float |int |string $ latitude ,
278+ float |int |string $ elevation ,
279+ ?int $ srid ,
280+ string $ expectedWkt
281+ ): void {
282+ $ wktSpatialData = WktSpatialData::point3d ($ longitude , $ latitude , $ elevation , $ srid );
283+
284+ $ this ->assertSame (GeometryType::POINT , $ wktSpatialData ->getGeometryType ());
285+ $ this ->assertSame ($ srid , $ wktSpatialData ->getSrid ());
286+ $ this ->assertSame (DimensionalModifier::Z, $ wktSpatialData ->getDimensionalModifier ());
287+ $ this ->assertSame ($ expectedWkt , $ wktSpatialData ->getWkt ());
288+ }
289+
290+ /**
291+ * @return array<string, array{float|int|string, float|int|string, float|int|string, int|null, string}>
292+ */
293+ public static function providePoint3dData (): array
294+ {
295+ return [
296+ 'simple 3d point ' => [1 , 2 , 3 , null , 'POINT Z(1 2 3) ' ],
297+ 'with srid ' => [-122.4194 , 37.7749 , 100 , 4326 , 'SRID=4326;POINT Z(-122.4194 37.7749 100) ' ],
298+ ];
299+ }
170300}
0 commit comments