phpmyadmin/test/classes/Gis/GisMultiLineStringTest.php
Maximilian Krög afc0e3bcd8
Fix svg class for MultiLineString
It should be multilinestirng instead of linestring,
it's also multipoint and multipolygon, so it makes sense.
Though ultimately this value is never read by phpmyadmin.

Signed-off-by: Maximilian Krög <maxi_kroeg@web.de>
2026-02-21 20:28:15 +01:00

431 lines
14 KiB
PHP

<?php
declare(strict_types=1);
namespace PhpMyAdmin\Tests\Gis;
use PhpMyAdmin\Gis\GisMultiLineString;
use PhpMyAdmin\Image\ImageWrapper;
use TCPDF;
use function preg_match;
/**
* @covers \PhpMyAdmin\Gis\GisMultiLineString
*/
class GisMultiLineStringTest extends GisGeomTestCase
{
/** @var GisMultiLineString */
protected $object;
/**
* Sets up the fixture, for example, opens a network connection.
* This method is called before a test is executed.
*/
protected function setUp(): void
{
parent::setUp();
$this->object = GisMultiLineString::singleton();
}
/**
* Tears down the fixture, for example, closes a network connection.
* This method is called after a test is executed.
*/
protected function tearDown(): void
{
parent::tearDown();
unset($this->object);
}
/**
* data provider for testGenerateWkt
*
* @return array data for testGenerateWkt
*/
public static function providerForTestGenerateWkt(): array
{
$temp = [
0 => [
'MULTILINESTRING' => [
'no_of_lines' => 2,
0 => [
'no_of_points' => 2,
0 => [
'x' => 5.02,
'y' => 8.45,
],
1 => [
'x' => 6.14,
'y' => 0.15,
],
],
1 => [
'no_of_points' => 2,
0 => [
'x' => 1.23,
'y' => 4.25,
],
1 => [
'x' => 9.15,
'y' => 0.47,
],
],
],
],
];
$temp1 = $temp;
unset($temp1[0]['MULTILINESTRING'][1][1]['y']);
$temp2 = $temp;
$temp2[0]['MULTILINESTRING']['no_of_lines'] = 0;
$temp3 = $temp;
$temp3[0]['MULTILINESTRING'][1]['no_of_points'] = 1;
return [
[
$temp,
0,
null,
'MULTILINESTRING((5.02 8.45,6.14 0.15),(1.23 4.25,9.15 0.47))',
],
// values at undefined index
[
$temp,
1,
null,
'MULTILINESTRING(( , ))',
],
// if a coordinate is missing, default is empty string
[
$temp1,
0,
null,
'MULTILINESTRING((5.02 8.45,6.14 0.15),(1.23 4.25,9.15 ))',
],
// missing coordinates are replaced with provided values (3rd parameter)
[
$temp1,
0,
'0',
'MULTILINESTRING((5.02 8.45,6.14 0.15),(1.23 4.25,9.15 0))',
],
// at least one line should be there
[
$temp2,
0,
null,
'MULTILINESTRING((5.02 8.45,6.14 0.15))',
],
// a line should have at least two points
[
$temp3,
0,
'0',
'MULTILINESTRING((5.02 8.45,6.14 0.15),(1.23 4.25,9.15 0.47))',
],
];
}
/**
* test getShape method
*/
public function testGetShape(): void
{
$row_data = [
'numparts' => 2,
'parts' => [
0 => [
'points' => [
0 => [
'x' => 5.02,
'y' => 8.45,
],
1 => [
'x' => 6.14,
'y' => 0.15,
],
],
],
1 => [
'points' => [
0 => [
'x' => 1.23,
'y' => 4.25,
],
1 => [
'x' => 9.15,
'y' => 0.47,
],
],
],
],
];
self::assertSame(
$this->object->getShape($row_data),
'MULTILINESTRING((5.02 8.45,6.14 0.15),(1.23 4.25,9.15 0.47))'
);
}
/**
* data provider for testGenerateParams
*
* @return array data for testGenerateParams
*/
public static function providerForTestGenerateParams(): array
{
$temp = [
'MULTILINESTRING' => [
'no_of_lines' => 2,
0 => [
'no_of_points' => 2,
0 => [
'x' => 5.02,
'y' => 8.45,
],
1 => [
'x' => 6.14,
'y' => 0.15,
],
],
1 => [
'no_of_points' => 2,
0 => [
'x' => 1.23,
'y' => 4.25,
],
1 => [
'x' => 9.15,
'y' => 0.47,
],
],
],
];
$temp1 = $temp;
$temp1['gis_type'] = 'MULTILINESTRING';
return [
[
"'MULTILINESTRING((5.02 8.45,6.14 0.15),(1.23 4.25,9.15 0.47))',124",
null,
[
'srid' => '124',
0 => $temp,
],
],
[
'MULTILINESTRING((5.02 8.45,6.14 0.15),(1.23 4.25,9.15 0.47))',
2,
[2 => $temp1],
],
];
}
/**
* data provider for testScaleRow
*
* @return array data for testScaleRow
*/
public static function providerForTestScaleRow(): array
{
return [
[
'MULTILINESTRING((36 14,47 23,62 75),(36 10,17 23,178 53))',
[
'minX' => 17,
'maxX' => 178,
'minY' => 10,
'maxY' => 75,
],
],
];
}
/**
* @requires extension gd
*/
public function testPrepareRowAsPng(): void
{
$image = ImageWrapper::create(120, 150);
self::assertNotNull($image);
$return = $this->object->prepareRowAsPng(
'MULTILINESTRING((36 14,47 23,62 75),(36 10,17 23,178 53))',
'image',
'#B02EE0',
['x' => 12, 'y' => 69, 'scale' => 2, 'height' => 150],
$image
);
self::assertSame(120, $return->width());
self::assertSame(150, $return->height());
}
/**
* test case for prepareRowAsPdf() method
*
* @param string $spatial GIS MULTILINESTRING object
* @param string $label label for the GIS MULTILINESTRING object
* @param string $line_color color for the GIS MULTILINESTRING object
* @param array $scale_data array containing data related to scaling
* @param TCPDF $pdf TCPDF instance
*
* @dataProvider providerForPrepareRowAsPdf
*/
public function testPrepareRowAsPdf(
string $spatial,
string $label,
string $line_color,
array $scale_data,
TCPDF $pdf
): void {
$return = $this->object->prepareRowAsPdf($spatial, $label, $line_color, $scale_data, $pdf);
self::assertInstanceOf(TCPDF::class, $return);
}
/**
* data provider for testPrepareRowAsPdf() test case
*
* @return array test data for testPrepareRowAsPdf() test case
*/
public static function providerForPrepareRowAsPdf(): array
{
return [
[
'MULTILINESTRING((36 14,47 23,62 75),(36 10,17 23,178 53))',
'pdf',
'#B02EE0',
[
'x' => 12,
'y' => 69,
'scale' => 2,
'height' => 150,
],
new TCPDF(),
],
];
}
/**
* test case for prepareRowAsSvg() method
*
* @param string $spatial GIS MULTILINESTRING object
* @param string $label label for the GIS MULTILINESTRING object
* @param string $lineColor color for the GIS MULTILINESTRING object
* @param array $scaleData array containing data related to scaling
* @param string $output expected output
*
* @dataProvider providerForPrepareRowAsSvg
*/
public function testPrepareRowAsSvg(
string $spatial,
string $label,
string $lineColor,
array $scaleData,
string $output
): void {
$string = $this->object->prepareRowAsSvg($spatial, $label, $lineColor, $scaleData);
self::assertSame(1, preg_match($output, $string));
}
/**
* data provider for testPrepareRowAsSvg() test case
*
* @return array test data for testPrepareRowAsSvg() test case
*/
public static function providerForPrepareRowAsSvg(): array
{
return [
[
'MULTILINESTRING((36 14,47 23,62 75),(36 10,17 23,178 53))',
'svg',
'#B02EE0',
[
'x' => 12,
'y' => 69,
'scale' => 2,
'height' => 150,
],
'/^(<polyline points="48,260 70,242 100,138 " data-label="svg" '
. 'class="multilinestring vector" fill="none" stroke="#B02EE0" '
. 'stroke-width="2" id="svg)(\d+)("\/><polyline points="48,268 10,'
. '242 332,182 " data-label="svg" class="multilinestring vector" fill="none" '
. 'stroke="#B02EE0" stroke-width="2" id="svg)(\d+)("\/>)$/',
],
];
}
/**
* test case for prepareRowAsOl() method
*
* @param string $spatial GIS MULTILINESTRING object
* @param int $srid spatial reference ID
* @param string $label label for the GIS MULTILINESTRING object
* @param array $line_color color for the GIS MULTILINESTRING object
* @param array $scale_data array containing data related to scaling
* @param string $output expected output
*
* @dataProvider providerForPrepareRowAsOl
*/
public function testPrepareRowAsOl(
string $spatial,
int $srid,
string $label,
array $line_color,
array $scale_data,
string $output
): void {
self::assertSame($output, $this->object->prepareRowAsOl(
$spatial,
$srid,
$label,
$line_color,
$scale_data
));
}
/**
* data provider for testPrepareRowAsOl() test case
*
* @return array test data for testPrepareRowAsOl() test case
*/
public static function providerForPrepareRowAsOl(): array
{
return [
[
'MULTILINESTRING((36 14,47 23,62 75),(36 10,17 23,178 53))',
4326,
'Ol',
[176, 46, 224],
[
'minX' => '0',
'minY' => '0',
'maxX' => '1',
'maxY' => '1',
],
'var style = new ol.style.Style({stroke: new ol.style.Stroke({"color":[176,46,224],'
. '"width":2}), text: new ol.style.Text({"text":"Ol"})});var minLoc = [0, 0];var ma'
. 'xLoc = [1, 1];var ext = ol.extent.boundingExtent([minLoc, maxLoc]);ext = ol.proj'
. '.transformExtent(ext, ol.proj.get("EPSG:4326"), ol.proj.get(\'EPSG:3857\'));map.'
. 'getView().fit(ext, map.getSize());var arr = [];var lineArr = [];var line = new o'
. 'l.geom.LineString(new Array((new ol.geom.Point([36,14]).transform(ol.proj.get("E'
. 'PSG:4326"), ol.proj.get(\'EPSG:3857\'))).getCoordinates(), (new ol.geom.Point([4'
. '7,23]).transform(ol.proj.get("EPSG:4326"), ol.proj.get(\'EPSG:3857\'))).getCoord'
. 'inates(), (new ol.geom.Point([62,75]).transform(ol.proj.get("EPSG:4326"), ol.pro'
. 'j.get(\'EPSG:3857\'))).getCoordinates()));var coord = line.getCoordinates();for (var i = 0;'
. ' i < coord.length; i++) lineArr.push(coord[i]);arr.push(lineArr);var lineArr = [];var lin'
. 'e = new ol.geom.LineString(new Array((new ol.geom.Point([36,10]).transform(ol.pr'
. 'oj.get("EPSG:4326"), ol.proj.get(\'EPSG:3857\'))).getCoordinates(), (new ol.geom'
. '.Point([17,23]).transform(ol.proj.get("EPSG:4326"), ol.proj.get(\'EPSG:3857\')))'
. '.getCoordinates(), (new ol.geom.Point([178,53]).transform(ol.proj.get("EPSG:4326'
. '"), ol.proj.get(\'EPSG:3857\'))).getCoordinates()));var coord = line.getCoordina'
. 'tes();for (var i = 0; i < coord.length; i++) lineArr.push(coord[i]);arr.push(lineArr);va'
. 'r multiLineString = new ol.geom.MultiLineString(arr);var feature = new ol.Feature({geometry:'
. ' multiLineString});feature.setStyle(style);vectorLayer.addFeature(feature);',
],
];
}
}