dbi = $this->createDatabaseInterface(); DatabaseInterface::$instance = $this->dbi; } /** * Scale the data set */ public function testScaleDataSet(): void { $this->dbi->setVersion(['@@version' => '5.5.0']); $gis = GisVisualization::getByData([], new GisVisualizationSettings(600, 450, 'abc')); $dataSet = (new ReflectionMethod(GisVisualization::class, 'scaleDataSet'))->invokeArgs($gis, [ [ ['abc' => null],// The column is nullable ['abc' => 2],// Some impossible test case ], ]); self::assertNull($dataSet); $dataSet = (new ReflectionMethod(GisVisualization::class, 'scaleDataSet'))->invokeArgs($gis, [ [ ['abc' => null],// The column is nullable ['abc' => 2],// Some impossible test case ['abc' => 'MULTILINESTRING((36 140,47 233,62 75),(36 100,17 233,178 93))'], ['abc' => 'POINT(100 250)'], ['abc' => 'MULTIPOINT(125 50,156 250,178 143,175 80)'], ], ]); self::assertEquals( new ScaleData( offsetX: -45.35714285714286, offsetY: 42.85714285714286, scale: 2.1, height: 450, ), $dataSet, ); // Regression test for bug with 0.0 sentinel values $dataSet = (new ReflectionMethod(GisVisualization::class, 'scaleDataSet'))->invokeArgs($gis, [ [ ['abc' => 'MULTIPOLYGON(((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1 1)))'], ['abc' => 'MULTIPOLYGON(((10 10,10 13,13 13,13 10,10 10),(11 11,11 12,12 12,12 11,11 11)))'], ], ]); self::assertEquals( new ScaleData( scale: 32.30769230769231, offsetX: -2.7857142857142865, offsetY: -0.4642857142857143, height: 450, ), $dataSet, ); } /** * Modify the query for an old version */ public function testModifyQueryOld(): void { $this->dbi->setVersion(['@@version' => '5.5.0']); $queryString = (new ReflectionMethod(GisVisualization::class, 'modifySqlQuery')) ->invokeArgs(GisVisualization::getByData([], new GisVisualizationSettings(600, 450, 'abc')), ['']); self::assertSame('SELECT ASTEXT(`abc`) AS `abc`, SRID(`abc`) AS `srid` FROM () AS `temp_gis`', $queryString); } /** * Modify the query for an MySQL 8.0 version */ public function testModifyQuery(): void { $this->dbi->setVersion(['@@version' => '8.0.0']); $queryString = (new ReflectionMethod(GisVisualization::class, 'modifySqlQuery')) ->invokeArgs(GisVisualization::getByData([], new GisVisualizationSettings(600, 450, 'abc')), ['']); self::assertSame( 'SELECT ST_ASTEXT(`abc`) AS `abc`, ST_SRID(`abc`) AS `srid` FROM () AS `temp_gis`', $queryString, ); } /** * Modify the query for an MySQL 8.0 version and trim the SQL end character */ public function testModifyQueryTrimSqlEnd(): void { $this->dbi->setVersion(['@@version' => '8.0.0']); $queryString = (new ReflectionMethod(GisVisualization::class, 'modifySqlQuery'))->invokeArgs( GisVisualization::getByData([], new GisVisualizationSettings(600, 450, 'abc')), ['SELECT 1 FROM foo;'], ); self::assertSame( 'SELECT ST_ASTEXT(`abc`) AS `abc`, ST_SRID(`abc`) AS `srid` FROM (SELECT 1 FROM foo) AS `temp_gis`', $queryString, ); } /** * Modify the query for an MySQL 8.0 version using a label column */ public function testModifyQueryLabelColumn(): void { $this->dbi->setVersion(['@@version' => '8.0.0']); $queryString = (new ReflectionMethod(GisVisualization::class, 'modifySqlQuery'))->invokeArgs( GisVisualization::getByData([], new GisVisualizationSettings(600, 450, 'country_geom', 'country name')), [''], ); self::assertSame( 'SELECT `country name`, ST_ASTEXT(`country_geom`) AS `country_geom`,' . ' ST_SRID(`country_geom`) AS `srid` FROM () AS `temp_gis`', $queryString, ); } /** * Modify the query for an MySQL 8.0 version adding a LIMIT statement */ public function testModifyQueryWithLimit(): void { $this->dbi->setVersion(['@@version' => '8.0.0']); $gis = GisVisualization::getByData([], new GisVisualizationSettings(600, 450, 'abc')); (new ReflectionProperty(GisVisualization::class, 'rows'))->setValue($gis, 10); $queryString = (new ReflectionMethod(GisVisualization::class, 'modifySqlQuery'))->invokeArgs($gis, ['']); self::assertSame( 'SELECT ST_ASTEXT(`abc`) AS `abc`, ST_SRID(`abc`) AS `srid` FROM () AS `temp_gis` LIMIT 10', $queryString, ); $gis = GisVisualization::getByData([], new GisVisualizationSettings(600, 450, 'abc')); (new ReflectionProperty(GisVisualization::class, 'pos'))->setValue($gis, 10); (new ReflectionProperty(GisVisualization::class, 'rows'))->setValue($gis, 15); $queryString = (new ReflectionMethod(GisVisualization::class, 'modifySqlQuery'))->invokeArgs($gis, ['']); self::assertSame( 'SELECT ST_ASTEXT(`abc`) AS `abc`, ST_SRID(`abc`) AS `srid` FROM () AS `temp_gis` LIMIT 10, 15', $queryString, ); } /** * Modify the query for an MySQL 8.0.1 version */ public function testModifyQueryVersion8(): void { $this->dbi->setVersion(['@@version' => '8.0.1']); $queryString = (new ReflectionMethod(GisVisualization::class, 'modifySqlQuery')) ->invokeArgs(GisVisualization::getByData([], new GisVisualizationSettings(600, 450, 'abc')), ['']); self::assertSame( 'SELECT ST_ASTEXT(`abc`, \'axis-order=long-lat\') AS `abc`, ST_SRID(`abc`) AS `srid` FROM () AS `temp_gis`', $queryString, ); } /** * Modify the query for a MariaDB 10.4 version */ public function testModifyQueryMariaDB(): void { $this->dbi->setVersion(['@@version' => '8.0.0-MariaDB']); $queryString = (new ReflectionMethod(GisVisualization::class, 'modifySqlQuery')) ->invokeArgs(GisVisualization::getByData([], new GisVisualizationSettings(600, 450, 'abc')), ['']); self::assertSame( 'SELECT ST_ASTEXT(`abc`) AS `abc`, ST_SRID(`abc`) AS `srid` FROM () AS `temp_gis`', $queryString, ); } }