|
31 | 31 | #include <velocypack/Builder.h>
|
32 | 32 |
|
33 | 33 | #include "Aql/VelocyPackHelper.h"
|
34 |
| -#include "Basics/Common.h" |
35 | 34 | #include "Basics/voc-errors.h"
|
36 | 35 | #include "Geo/GeoJson.h"
|
37 | 36 | #include "Geo/ShapeContainer.h"
|
@@ -183,6 +182,36 @@ TEST_F(InvalidGeoJSONInputTest, bad_point_too_many_coordinates) {
|
183 | 182 | coords->add(VPackValue(0.0));
|
184 | 183 | coords->add(VPackValue(0.0));
|
185 | 184 | coords->add(VPackValue(0.0));
|
| 185 | + coords->add(VPackValue(0.0)); // 4 coordinates - this should be invalid |
| 186 | + } |
| 187 | + VPackSlice vpack = builder.slice(); |
| 188 | + |
| 189 | + ASSERT_EQ(geo::json::Type::POINT, geo::json::type(vpack)); |
| 190 | + ASSERT_TRUE(geo::json::parsePoint(vpack, point).is(TRI_ERROR_BAD_PARAMETER)); |
| 191 | +} |
| 192 | + |
| 193 | +TEST_F(InvalidGeoJSONInputTest, bad_point_invalid_coordinate_count) { |
| 194 | + { |
| 195 | + velocypack::ObjectBuilder object(&builder); |
| 196 | + object->add("type", VPackValue("Point")); |
| 197 | + velocypack::ArrayBuilder coords(&builder, "coordinates"); |
| 198 | + coords->add(VPackValue(0.0)); |
| 199 | + } |
| 200 | + VPackSlice vpack = builder.slice(); |
| 201 | + |
| 202 | + ASSERT_EQ(geo::json::Type::POINT, geo::json::type(vpack)); |
| 203 | + ASSERT_TRUE(geo::json::parsePoint(vpack, point).is(TRI_ERROR_BAD_PARAMETER)); |
| 204 | +} |
| 205 | + |
| 206 | +TEST_F(InvalidGeoJSONInputTest, bad_point_four_coordinates) { |
| 207 | + { |
| 208 | + velocypack::ObjectBuilder object(&builder); |
| 209 | + object->add("type", VPackValue("Point")); |
| 210 | + velocypack::ArrayBuilder coords(&builder, "coordinates"); |
| 211 | + coords->add(VPackValue(0.0)); |
| 212 | + coords->add(VPackValue(0.0)); |
| 213 | + coords->add(VPackValue(0.0)); |
| 214 | + coords->add(VPackValue(0.0)); |
186 | 215 | }
|
187 | 216 | VPackSlice vpack = builder.slice();
|
188 | 217 |
|
@@ -262,12 +291,14 @@ TEST_F(InvalidGeoJSONInputTest, bad_multipoint_extra_numbers_in_bad_points) {
|
262 | 291 | point->add(VPackValue(0.0));
|
263 | 292 | point->add(VPackValue(0.0));
|
264 | 293 | point->add(VPackValue(0.0));
|
| 294 | + point->add(VPackValue(0.0)); // 4 coordinates - invalid |
265 | 295 | }
|
266 | 296 | {
|
267 | 297 | velocypack::ArrayBuilder point(&builder);
|
268 | 298 | point->add(VPackValue(0.0));
|
269 | 299 | point->add(VPackValue(0.0));
|
270 | 300 | point->add(VPackValue(0.0));
|
| 301 | + point->add(VPackValue(0.0)); // 4 coordinates - invalid |
271 | 302 | }
|
272 | 303 | }
|
273 | 304 | VPackSlice vpack = builder.slice();
|
@@ -327,12 +358,14 @@ TEST_F(InvalidGeoJSONInputTest, bad_linestring_extra_numbers_in_bad_points) {
|
327 | 358 | point->add(VPackValue(0.0));
|
328 | 359 | point->add(VPackValue(0.0));
|
329 | 360 | point->add(VPackValue(0.0));
|
| 361 | + point->add(VPackValue(0.0)); // 4 coordinates - invalid |
330 | 362 | }
|
331 | 363 | {
|
332 | 364 | velocypack::ArrayBuilder point(&builder);
|
333 | 365 | point->add(VPackValue(0.0));
|
334 | 366 | point->add(VPackValue(0.0));
|
335 | 367 | point->add(VPackValue(0.0));
|
| 368 | + point->add(VPackValue(0.0)); // 4 coordinates - invalid |
336 | 369 | }
|
337 | 370 | }
|
338 | 371 | VPackSlice vpack = builder.slice();
|
@@ -412,12 +445,14 @@ TEST_F(InvalidGeoJSONInputTest,
|
412 | 445 | point->add(VPackValue(0.0));
|
413 | 446 | point->add(VPackValue(0.0));
|
414 | 447 | point->add(VPackValue(0.0));
|
| 448 | + point->add(VPackValue(0.0)); // 4 coordinates - invalid |
415 | 449 | }
|
416 | 450 | {
|
417 | 451 | velocypack::ArrayBuilder point(&builder);
|
418 | 452 | point->add(VPackValue(0.0));
|
419 | 453 | point->add(VPackValue(0.0));
|
420 | 454 | point->add(VPackValue(0.0));
|
| 455 | + point->add(VPackValue(0.0)); // 4 coordinates - invalid |
421 | 456 | }
|
422 | 457 | }
|
423 | 458 | VPackSlice vpack = builder.slice();
|
@@ -487,12 +522,14 @@ TEST_F(InvalidGeoJSONInputTest, bad_loop_extra_numbers_in_bad_points) {
|
487 | 522 | point->add(VPackValue(0.0));
|
488 | 523 | point->add(VPackValue(0.0));
|
489 | 524 | point->add(VPackValue(0.0));
|
| 525 | + point->add(VPackValue(0.0)); // 4 coordinates - invalid |
490 | 526 | }
|
491 | 527 | {
|
492 | 528 | velocypack::ArrayBuilder point(&builder);
|
493 | 529 | point->add(VPackValue(0.0));
|
494 | 530 | point->add(VPackValue(0.0));
|
495 | 531 | point->add(VPackValue(0.0));
|
| 532 | + point->add(VPackValue(0.0)); // 4 coordinates - invalid |
496 | 533 | }
|
497 | 534 | }
|
498 | 535 | VPackSlice vpack = builder.slice();
|
@@ -627,24 +664,28 @@ TEST_F(InvalidGeoJSONInputTest, bad_polygon_extra_numbers_in_bad_points) {
|
627 | 664 | point->add(VPackValue(0.0));
|
628 | 665 | point->add(VPackValue(0.0));
|
629 | 666 | point->add(VPackValue(0.0));
|
| 667 | + point->add(VPackValue(0.0)); // 4 coordinates - invalid |
630 | 668 | }
|
631 | 669 | {
|
632 | 670 | velocypack::ArrayBuilder point(&builder);
|
633 | 671 | point->add(VPackValue(1.0));
|
634 | 672 | point->add(VPackValue(0.0));
|
635 | 673 | point->add(VPackValue(0.0));
|
| 674 | + point->add(VPackValue(0.0)); // 4 coordinates - invalid |
636 | 675 | }
|
637 | 676 | {
|
638 | 677 | velocypack::ArrayBuilder point(&builder);
|
639 | 678 | point->add(VPackValue(0.0));
|
640 | 679 | point->add(VPackValue(1.0));
|
641 | 680 | point->add(VPackValue(0.0));
|
| 681 | + point->add(VPackValue(0.0)); // 4 coordinates - invalid |
642 | 682 | }
|
643 | 683 | {
|
644 | 684 | velocypack::ArrayBuilder point(&builder);
|
645 | 685 | point->add(VPackValue(0.0));
|
646 | 686 | point->add(VPackValue(0.0));
|
647 | 687 | point->add(VPackValue(0.0));
|
| 688 | + point->add(VPackValue(0.0)); // 4 coordinates - invalid |
648 | 689 | }
|
649 | 690 | }
|
650 | 691 | }
|
@@ -974,24 +1015,28 @@ TEST_F(InvalidGeoJSONInputTest, bad_multipolygon_extra_numbers_in_bad_points) {
|
974 | 1015 | point->add(VPackValue(0.0));
|
975 | 1016 | point->add(VPackValue(0.0));
|
976 | 1017 | point->add(VPackValue(0.0));
|
| 1018 | + point->add(VPackValue(0.0)); // 4 coordinates - invalid |
977 | 1019 | }
|
978 | 1020 | {
|
979 | 1021 | velocypack::ArrayBuilder point(&builder);
|
980 | 1022 | point->add(VPackValue(1.0));
|
981 | 1023 | point->add(VPackValue(0.0));
|
982 | 1024 | point->add(VPackValue(0.0));
|
| 1025 | + point->add(VPackValue(0.0)); // 4 coordinates - invalid |
983 | 1026 | }
|
984 | 1027 | {
|
985 | 1028 | velocypack::ArrayBuilder point(&builder);
|
986 | 1029 | point->add(VPackValue(0.0));
|
987 | 1030 | point->add(VPackValue(1.0));
|
988 | 1031 | point->add(VPackValue(0.0));
|
| 1032 | + point->add(VPackValue(0.0)); // 4 coordinates - invalid |
989 | 1033 | }
|
990 | 1034 | {
|
991 | 1035 | velocypack::ArrayBuilder point(&builder);
|
992 | 1036 | point->add(VPackValue(0.0));
|
993 | 1037 | point->add(VPackValue(0.0));
|
994 | 1038 | point->add(VPackValue(0.0));
|
| 1039 | + point->add(VPackValue(0.0)); // 4 coordinates - invalid |
995 | 1040 | }
|
996 | 1041 | }
|
997 | 1042 | }
|
@@ -1238,6 +1283,40 @@ TEST_F(ValidGeoJSONInputTest, valid_point) {
|
1238 | 1283 | ASSERT_EQ(1.0, point.lat().degrees());
|
1239 | 1284 | }
|
1240 | 1285 |
|
| 1286 | +TEST_F(ValidGeoJSONInputTest, valid_point_with_z_coordinate) { |
| 1287 | + { |
| 1288 | + velocypack::ObjectBuilder object(&builder); |
| 1289 | + object->add("type", VPackValue("Point")); |
| 1290 | + velocypack::ArrayBuilder coords(&builder, "coordinates"); |
| 1291 | + coords->add(VPackValue(0.0)); |
| 1292 | + coords->add(VPackValue(1.0)); |
| 1293 | + coords->add(VPackValue(100.0)); // Z coordinate (elevation) |
| 1294 | + } |
| 1295 | + VPackSlice vpack = builder.slice(); |
| 1296 | + |
| 1297 | + ASSERT_EQ(geo::json::Type::POINT, geo::json::type(vpack)); |
| 1298 | + ASSERT_TRUE(geo::json::parsePoint(vpack, point).ok()); |
| 1299 | + ASSERT_EQ(0.0, point.lng().degrees()); |
| 1300 | + ASSERT_EQ(1.0, point.lat().degrees()); |
| 1301 | +} |
| 1302 | + |
| 1303 | +TEST_F(ValidGeoJSONInputTest, valid_point_with_z_coordinate_negative) { |
| 1304 | + { |
| 1305 | + velocypack::ObjectBuilder object(&builder); |
| 1306 | + object->add("type", VPackValue("Point")); |
| 1307 | + velocypack::ArrayBuilder coords(&builder, "coordinates"); |
| 1308 | + coords->add(VPackValue(0.0)); |
| 1309 | + coords->add(VPackValue(1.0)); |
| 1310 | + coords->add(VPackValue(-100.0)); // Negative Z coordinate |
| 1311 | + } |
| 1312 | + VPackSlice vpack = builder.slice(); |
| 1313 | + |
| 1314 | + ASSERT_EQ(geo::json::Type::POINT, geo::json::type(vpack)); |
| 1315 | + ASSERT_TRUE(geo::json::parsePoint(vpack, point).ok()); |
| 1316 | + ASSERT_EQ(0.0, point.lng().degrees()); |
| 1317 | + ASSERT_EQ(1.0, point.lat().degrees()); |
| 1318 | +} |
| 1319 | + |
1241 | 1320 | TEST_F(ValidGeoJSONInputTest, valid_point_as_region) {
|
1242 | 1321 | {
|
1243 | 1322 | velocypack::ObjectBuilder object(&builder);
|
@@ -2199,4 +2278,46 @@ TEST_F(ValidGeoJSONInputTest, NestedHoles) {
|
2199 | 2278 | ASSERT_TRUE(r.ok()) << r.errorMessage();
|
2200 | 2279 | }
|
2201 | 2280 |
|
| 2281 | +TEST_F(ValidGeoJSONInputTest, valid_linestring_with_z_coordinates) { |
| 2282 | + { |
| 2283 | + velocypack::ObjectBuilder object(&builder); |
| 2284 | + object->add("type", VPackValue("Linestring")); |
| 2285 | + velocypack::ArrayBuilder points(&builder, "coordinates"); |
| 2286 | + { |
| 2287 | + velocypack::ArrayBuilder point(&builder); |
| 2288 | + point->add(VPackValue(0.0)); |
| 2289 | + point->add(VPackValue(0.0)); |
| 2290 | + point->add(VPackValue(100.0)); // Z coordinate |
| 2291 | + } |
| 2292 | + { |
| 2293 | + velocypack::ArrayBuilder point(&builder); |
| 2294 | + point->add(VPackValue(1.0)); |
| 2295 | + point->add(VPackValue(0.0)); |
| 2296 | + point->add(VPackValue(200.0)); // Z coordinate |
| 2297 | + } |
| 2298 | + { |
| 2299 | + velocypack::ArrayBuilder point(&builder); |
| 2300 | + point->add(VPackValue(1.0)); |
| 2301 | + point->add(VPackValue(1.0)); |
| 2302 | + point->add(VPackValue(300.0)); // Z coordinate |
| 2303 | + } |
| 2304 | + { |
| 2305 | + velocypack::ArrayBuilder point(&builder); |
| 2306 | + point->add(VPackValue(0.0)); |
| 2307 | + point->add(VPackValue(1.0)); |
| 2308 | + point->add(VPackValue(400.0)); // Z coordinate |
| 2309 | + } |
| 2310 | + } |
| 2311 | + VPackSlice vpack = builder.slice(); |
| 2312 | + |
| 2313 | + ASSERT_EQ(geo::json::Type::LINESTRING, geo::json::type(vpack)); |
| 2314 | + ASSERT_TRUE(geo::json::parseLinestring(vpack, line).ok()); |
| 2315 | + |
| 2316 | + ASSERT_EQ(4, line.num_vertices()); |
| 2317 | + ASSERT_EQ(S2LatLng::FromDegrees(0.0, 0.0).ToPoint(), line.vertex(0)); |
| 2318 | + ASSERT_EQ(S2LatLng::FromDegrees(0.0, 1.0).ToPoint(), line.vertex(1)); |
| 2319 | + ASSERT_EQ(S2LatLng::FromDegrees(1.0, 1.0).ToPoint(), line.vertex(2)); |
| 2320 | + ASSERT_EQ(S2LatLng::FromDegrees(1.0, 0.0).ToPoint(), line.vertex(3)); |
| 2321 | +} |
| 2322 | + |
2202 | 2323 | } // namespace arangodb
|
0 commit comments