Skip to content
WktGeneratorTest.php 5.73 KiB
Newer Older
namespace Drupal\Tests\geofield\Kernel;
use Drupal\KernelTests\KernelTestBase;

/**
 * Tests WktGenerator.
 *
 * @group geofield
 */
class WktGeneratorTest extends KernelTestBase {

  /**
   * WKT Generator service.
   *
   * @var \Drupal\geofield\WktGenerator
   */
Italo Mairo's avatar
Italo Mairo committed
  public $wktGenerator;

  /**
   * Generic WKT point regex.
   *
   * @var string
   */
Italo Mairo's avatar
Italo Mairo committed
  public $pointRegex = '/^POINT \([-]?[0-9]*\.?[0-9]+ [-]?[0-9]*\.?[0-9]+\)$/';

  /**
   * Generic WKT multipoint regex.
   *
   * @var string
   */
Italo Mairo's avatar
Italo Mairo committed
  public $multipointRegex = '/^MULTIPOINT \((\([-]?[0-9]*\.?[0-9]+ [-]?[0-9]*\.?[0-9]+\), )*(\([-]?[0-9]*\.?[0-9]+ [-]?[0-9]*\.?[0-9]+\))\)$/';

  /**
   * Generic WKT linestring regex.
   *
   * @var string
   */
Italo Mairo's avatar
Italo Mairo committed
  public $linestringRegex = '/^LINESTRING \(([-]?[0-9]*\.?[0-9]+ [-]?[0-9]*\.?[0-9]+\, )*[-]?[0-9]*\.?[0-9]+ [-]?[0-9]*\.?[0-9]+\)$/';

  /**
   * Generic WKT multilinestring regex.
   *
   * @var string
   */
Italo Mairo's avatar
Italo Mairo committed
  public $multilinestringRegex = '/^MULTILINESTRING \((\(([-]?[0-9]*\.?[0-9]+ [-]?[0-9]*\.?[0-9]+\, )*[-]?[0-9]*\.?[0-9]+ [-]?[0-9]*\.?[0-9]+\), )*\(([-]?[0-9]*\.?[0-9]+ [-]?[0-9]*\.?[0-9]+\, )*[-]?[0-9]*\.?[0-9]+ [-]?[0-9]*\.?[0-9]+\)\)$/';

  /**
   * Generic WKT polygon regex.
   *
   * @var string
   */
Italo Mairo's avatar
Italo Mairo committed
  public $polygonRegex = '/^POLYGON \(\(([-]?[0-9]*\.?[0-9]+ [-]?[0-9]*\.?[0-9]+\, )*[-]?[0-9]*\.?[0-9]+ [-]?[0-9]*\.?[0-9]+\)\)$/';

  /**
   * Generic WKT multipolygon regex.
   *
   * @var string
   */
Italo Mairo's avatar
Italo Mairo committed
  public $multipolygonRegex = '/^MULTIPOLYGON \((\(\(([-]?[0-9]*\.?[0-9]+ [-]?[0-9]*\.?[0-9]+\, )*[-]?[0-9]*\.?[0-9]+ [-]?[0-9]*\.?[0-9]+\)\), )*\(\(([-]?[0-9]*\.?[0-9]+ [-]?[0-9]*\.?[0-9]+\, )*[-]?[0-9]*\.?[0-9]+ [-]?[0-9]*\.?[0-9]+\)\)\)$/';
  protected static $modules = [
  protected function setUp(): void {
Italo Mairo's avatar
Italo Mairo committed
    $this->wktGenerator = \Drupal::service('geofield.wkt_generator');
  }

  /**
   * Tests the generation of WKT points and multipoints.
   */
  public function testPoint() {
Italo Mairo's avatar
Italo Mairo committed
    $point = $this->wktGenerator->wktGeneratePoint(['3', '4']);
    $this->assertEquals('POINT (3 4)', $point, 'Point generated properly');
Italo Mairo's avatar
Italo Mairo committed
    $point = $this->wktGenerator->wktGeneratePoint();
    $match = preg_match($this->pointRegex, $point);
    $this->assertNotEmpty($match, 'Point generated properly');
Italo Mairo's avatar
Italo Mairo committed
    $multipoint = $this->wktGenerator->wktGenerateMultipoint();
    $match = preg_match($this->multipointRegex, $multipoint);
    $this->assertNotEmpty($match, 'Multipoint generated properly');
  }

  /**
   * Tests the generation of WKT linestrings and multilinestrings.
   */
  public function testLinestring() {
Italo Mairo's avatar
Italo Mairo committed
    $linestring = $this->wktGenerator->wktGenerateLinestring();
    $match = preg_match($this->linestringRegex, $linestring);
    $this->assertNotEmpty($match, 'Linestring generated properly');
Italo Mairo's avatar
Italo Mairo committed
    $linestring = $this->wktGenerator->wktGenerateLinestring([7.34, -45.66]);
    $match = preg_match('/^LINESTRING \(7.34 -45.66, ([-]?[0-9]*\.?[0-9]+ [-]?[0-9]*\.?[0-9]+\, )*[-]?[0-9]*\.?[0-9]+ [-]?[0-9]*\.?[0-9]+\)$/', $linestring);
    $this->assertNotEmpty($match, 'Linestring generated properly');
Italo Mairo's avatar
Italo Mairo committed
    $linestring = $this->wktGenerator->wktGenerateLinestring(NULL, 9);
    $match = preg_match('/^LINESTRING \(([-]?[0-9]*\.?[0-9]+ [-]?[0-9]*\.?[0-9]+\, ){8}[-]?[0-9]*\.?[0-9]+ [-]?[0-9]*\.?[0-9]+\)$/', $linestring);
    $this->assertNotEmpty($match, 'Linestring generated properly');
Italo Mairo's avatar
Italo Mairo committed
    $linestring = $this->wktGenerator->wktGenerateLinestring([7, 45], 6);
    $match = preg_match('/^LINESTRING \(7 45, ([-]?[0-9]*\.?[0-9]+ [-]?[0-9]*\.?[0-9]+\, ){4}[-]?[0-9]*\.?[0-9]+ [-]?[0-9]*\.?[0-9]+\)$/', $linestring);
    $this->assertNotEmpty($match, 'Linestring generated properly');
Italo Mairo's avatar
Italo Mairo committed
    $multilinestring = $this->wktGenerator->wktGenerateMultilinestring();
    $match = preg_match($this->multilinestringRegex, $multilinestring);
    $this->assertNotEmpty($match, 'Multilinestring generated properly');
  }

  /**
   * Tests the generation of WKT polygons and multipolygons.
   */
  public function testPolygon() {
Italo Mairo's avatar
Italo Mairo committed
    $polygon = $this->wktGenerator->wktGeneratePolygon();
    $match = preg_match($this->polygonRegex, $polygon);
    $this->assertNotEmpty($match, 'Polygon generated properly');
Italo Mairo's avatar
Italo Mairo committed
    $polygon = $this->wktGenerator->wktGeneratePolygon([7.34, -45.66]);
    $match = preg_match('/^POLYGON \(\(7.34 -45.66, ([-]?[0-9]*\.?[0-9]+ [-]?[0-9]*\.?[0-9]+\, )*7.34 -45.66\)\)$/', $polygon);
    $this->assertNotEmpty($match, 'Polygon generated properly');
Italo Mairo's avatar
Italo Mairo committed
    $polygon = $this->wktGenerator->wktGeneratePolygon(NULL, 9);
    $match = preg_match('/^POLYGON \(\(([-]?[0-9]*\.?[0-9]+ [-]?[0-9]*\.?[0-9]+\, ){9}[-]?[0-9]*\.?[0-9]+ [-]?[0-9]*\.?[0-9]+\)\)$/', $polygon);
    $this->assertNotEmpty($match, 'Polygon generated properly');
Italo Mairo's avatar
Italo Mairo committed
    $polygon = $this->wktGenerator->wktGeneratePolygon([7, 45], 6);
    $match = preg_match('/^POLYGON \(\(7 45, ([-]?[0-9]*\.?[0-9]+ [-]?[0-9]*\.?[0-9]+\, ){5}7 45\)\)$/', $polygon);
    $this->assertNotEmpty($match, 'Polygon generated properly');
Italo Mairo's avatar
Italo Mairo committed
    $multipolygon = $this->wktGenerator->wktGenerateMultipolygon();
    $match = preg_match($this->multipolygonRegex, $multipolygon);
    $this->assertNotEmpty($match, 'Multipolygon generated properly');
  }

  /**
   * Tests the generation of random WKT geometries.
   */
  public function testRandomGeometry() {
    $find = FALSE;
Italo Mairo's avatar
Italo Mairo committed
    $geometry = $this->wktGenerator->wktGenerateGeometry();
Italo Mairo's avatar
Italo Mairo committed
      $this->pointRegex,
      $this->multipointRegex,
      $this->linestringRegex,
      $this->multilinestringRegex,
      $this->polygonRegex,
      $this->multipolygonRegex,

    foreach ($patterns as $pattern) {
      if (preg_match($pattern, $geometry)) {
        $find = TRUE;
        break;
      }
    }

    $this->assertTrue($find, 'Random geometry generated properly');
  }

}