From 4f3e112de7de9b8e7c687892b47e45d4906747a3 Mon Sep 17 00:00:00 2001 From: gpedro Date: Mon, 2 Mar 2020 23:34:52 -0400 Subject: [PATCH 1/3] fix: prevent wrong formatting float values by locale --- composer.json | 1 + src/Types/Point.php | 11 ++- tests/Unit/Types/PointLocaleTest.php | 105 +++++++++++++++++++++++++++ 3 files changed, 115 insertions(+), 2 deletions(-) create mode 100644 tests/Unit/Types/PointLocaleTest.php diff --git a/composer.json b/composer.json index 3c22d1c2..49fec7f8 100644 --- a/composer.json +++ b/composer.json @@ -18,6 +18,7 @@ "php": ">=5.5", "ext-pdo": "*", "ext-json": "*", + "ext-intl": "*", "illuminate/database": "^5.2|^6.0", "geo-io/wkb-parser": "^1.0", "jmikola/geojson": "^1.0" diff --git a/src/Types/Point.php b/src/Types/Point.php index 40719af4..707ca732 100644 --- a/src/Types/Point.php +++ b/src/Types/Point.php @@ -2,6 +2,7 @@ namespace Grimzy\LaravelMysqlSpatial\Types; +use NumberFormatter; use GeoJson\GeoJson; use GeoJson\Geometry\Point as GeoJsonPoint; use Grimzy\LaravelMysqlSpatial\Exceptions\InvalidGeoJsonException; @@ -40,7 +41,13 @@ public function setLng($lng) public function toPair() { - return $this->getLng().' '.$this->getLat(); + $formatter = new NumberFormatter('en_US', NumberFormatter::DECIMAL); + $formatter->setAttribute(NumberFormatter::MAX_FRACTION_DIGITS, -1); + + $lng = $formatter->format($this->getLng()); + $lat = $formatter->format($this->getLat()); + + return $lng . ' ' . $lat; } public static function fromPair($pair) @@ -62,7 +69,7 @@ public static function fromString($wktArgument) public function __toString() { - return $this->getLng().' '.$this->getLat(); + return $this->toPair(); } /** diff --git a/tests/Unit/Types/PointLocaleTest.php b/tests/Unit/Types/PointLocaleTest.php new file mode 100644 index 00000000..e62aa70a --- /dev/null +++ b/tests/Unit/Types/PointLocaleTest.php @@ -0,0 +1,105 @@ +assertInstanceOf(Point::class, $point); + $this->assertEquals(2, $point->getLat()); + $this->assertEquals(1, $point->getLng()); + } + + public function testToWKT() + { + $point = new Point(1, 2); + + $this->assertEquals('POINT(2 1)', $point->toWKT()); + } + + public function testGettersAndSetters() + { + $point = new Point(1, 2); + $this->assertSame(1.0, $point->getLat()); + $this->assertSame(2.0, $point->getLng()); + + $point->setLat('3'); + $point->setLng('4'); + + $this->assertSame(3.0, $point->getLat()); + $this->assertSame(4.0, $point->getLng()); + } + + public function testPairLocale() + { + setlocale(LC_ALL, 'pt_BR.UTF-8'); + $point = Point::fromPair('1.5 2'); + + $this->assertSame(1.5, $point->getLng()); + $this->assertSame(2.0, $point->getLat()); + + $this->assertSame('1.5 2', $point->toPair()); + setlocale(LC_ALL, "en-US.UTF-8"); + } + + public function testPair() + { + $point = Point::fromPair('1.5 2'); + + $this->assertSame(1.5, $point->getLng()); + $this->assertSame(2.0, $point->getLat()); + + $this->assertSame('1.5 2', $point->toPair()); + } + + public function testToString() + { + $point = Point::fromString('1.3 2'); + + $this->assertSame(1.3, $point->getLng()); + $this->assertSame(2.0, $point->getLat()); + + $this->assertEquals('1.3 2', (string) $point); + } + + public function testFromJson() + { + $point = Point::fromJson('{"type":"Point","coordinates":[3.4,1.2]}'); + $this->assertInstanceOf(Point::class, $point); + $this->assertEquals(1.2, $point->getLat()); + $this->assertEquals(3.4, $point->getLng()); + } + + public function testInvalidGeoJsonException() + { + $this->setExpectedException(\Grimzy\LaravelMysqlSpatial\Exceptions\InvalidGeoJsonException::class); + Point::fromJson('{"type": "LineString","coordinates":[[1,1],[2,2]]}'); + } + + public function testJsonSerialize() + { + $point = new Point(1.2, 3.4); + + $this->assertInstanceOf(\GeoJson\Geometry\Point::class, $point->jsonSerialize()); + $this->assertSame('{"type":"Point","coordinates":[3.4,1.2]}', json_encode($point)); + } +} From 0f0ec2673b1a9433e746059f1002de08fa3b692d Mon Sep 17 00:00:00 2001 From: Joseph Estefane Date: Tue, 3 Mar 2020 02:31:43 -0500 Subject: [PATCH 2/3] Fix build --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 9973c293..22ee6ce7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,7 +19,7 @@ services: - docker before_install: - - echo "memory_limit=2G" >> ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/travis.ini + - echo "memory_limit=3G" >> ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/travis.ini - sudo /etc/init.d/mysql stop - make start_db V=$MYSQL_VERSION From b063f8cf50ed157f6dc51cc6991a70633a05d918 Mon Sep 17 00:00:00 2001 From: Gabriel Pedro Date: Tue, 3 Mar 2020 07:12:29 -0400 Subject: [PATCH 3/3] fix: travis --- src/Types/Point.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Types/Point.php b/src/Types/Point.php index 707ca732..2a186d83 100644 --- a/src/Types/Point.php +++ b/src/Types/Point.php @@ -42,7 +42,7 @@ public function setLng($lng) public function toPair() { $formatter = new NumberFormatter('en_US', NumberFormatter::DECIMAL); - $formatter->setAttribute(NumberFormatter::MAX_FRACTION_DIGITS, -1); + $formatter->setAttribute(NumberFormatter::MAX_FRACTION_DIGITS, 12); $lng = $formatter->format($this->getLng()); $lat = $formatter->format($this->getLat());