diff options
| author | Even Rouault <even.rouault@spatialys.com> | 2021-04-10 20:15:34 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-04-10 20:15:34 +0200 |
| commit | 34ea13913717b20982778d5e5f13b4a5ee8288ab (patch) | |
| tree | c16c443866a0eec19c488e415fc75815a090327e /test | |
| parent | 84a679954b1fa4c41c7bdbac87013be78b64bea4 (diff) | |
| parent | a77ce5cf343c00fc95b5f3d9b2c27e02b6205fd3 (diff) | |
| download | PROJ-34ea13913717b20982778d5e5f13b4a5ee8288ab.tar.gz PROJ-34ea13913717b20982778d5e5f13b4a5ee8288ab.zip | |
Merge pull request #2656 from rouault/createFromUserInput_improvements
createFromUserInput(): various enhancements
Diffstat (limited to 'test')
| -rw-r--r-- | test/unit/test_factory.cpp | 23 | ||||
| -rw-r--r-- | test/unit/test_io.cpp | 248 |
2 files changed, 271 insertions, 0 deletions
diff --git a/test/unit/test_factory.cpp b/test/unit/test_factory.cpp index c67f1490..edc8b190 100644 --- a/test/unit/test_factory.cpp +++ b/test/unit/test_factory.cpp @@ -4244,4 +4244,27 @@ TEST(factory, objectInsertion) { } } +// --------------------------------------------------------------------------- + +TEST(factory, ogc_timecrs) { + auto ctxt = DatabaseContext::create(); + auto factory = AuthorityFactory::create(ctxt, Identifier::OGC); + factory->createCoordinateReferenceSystem("AnsiDate"); + factory->createCoordinateReferenceSystem("JulianDate"); + factory->createCoordinateReferenceSystem("UnixTime"); +} + +// --------------------------------------------------------------------------- + +TEST(factory, ogc_crs) { + auto ctxt = DatabaseContext::create(); + auto factory = AuthorityFactory::create(ctxt, Identifier::OGC); + factory->createCoordinateReferenceSystem("CRS84"); + factory->createCoordinateReferenceSystem("84"); + factory->createCoordinateReferenceSystem("CRS27"); + factory->createCoordinateReferenceSystem("CRS83"); +} + +// --------------------------------------------------------------------------- + } // namespace diff --git a/test/unit/test_io.cpp b/test/unit/test_io.cpp index 9d627ce9..780db16d 100644 --- a/test/unit/test_io.cpp +++ b/test/unit/test_io.cpp @@ -10349,6 +10349,8 @@ TEST(io, createFromUserInput) { EXPECT_NO_THROW(createFromUserInput("epsg:4326", dbContext)); EXPECT_NO_THROW( createFromUserInput("urn:ogc:def:crs:EPSG::4326", dbContext)); + EXPECT_THROW(createFromUserInput("urn:ogc:def:crs:EPSG::4326", nullptr), + ParsingException); EXPECT_NO_THROW(createFromUserInput( "urn:ogc:def:coordinateOperation:EPSG::1671", dbContext)); EXPECT_NO_THROW( @@ -10357,6 +10359,22 @@ TEST(io, createFromUserInput) { createFromUserInput("urn:ogc:def:meridian:EPSG::8901", dbContext)); EXPECT_NO_THROW( createFromUserInput("urn:ogc:def:ellipsoid:EPSG::7030", dbContext)); + + // Legacy formulations + EXPECT_NO_THROW( + createFromUserInput("urn:x-ogc:def:crs:EPSG::4326", dbContext)); + EXPECT_NO_THROW( + createFromUserInput("urn:opengis:def:crs:EPSG::4326", dbContext)); + EXPECT_NO_THROW( + createFromUserInput("urn:opengis:crs:EPSG::4326", dbContext)); + EXPECT_NO_THROW( + createFromUserInput("urn:x-ogc:def:crs:EPSG:4326", dbContext)); + EXPECT_THROW(createFromUserInput("urn:opengis:crs:EPSG::4326", nullptr), + ParsingException); + EXPECT_THROW( + createFromUserInput("urn:opengis:unhandled:EPSG::4326", dbContext), + ParsingException); + { auto obj = createFromUserInput("EPSG:2393+5717", dbContext); auto crs = nn_dynamic_pointer_cast<CompoundCRS>(obj); @@ -10637,6 +10655,236 @@ TEST(io, createFromUserInput) { // --------------------------------------------------------------------------- +TEST(io, createFromUserInput_ogc_crs_url) { + auto dbContext = DatabaseContext::create(); + + { + auto obj = createFromUserInput( + "http://www.opengis.net/def/crs/EPSG/0/4326", dbContext); + auto crs = nn_dynamic_pointer_cast<GeographicCRS>(obj); + ASSERT_TRUE(crs != nullptr); + } + + EXPECT_THROW( + createFromUserInput("http://www.opengis.net/def/crs", dbContext), + ParsingException); + + EXPECT_THROW( + createFromUserInput("http://www.opengis.net/def/crs/EPSG/0", dbContext), + ParsingException); + + EXPECT_THROW(createFromUserInput( + "http://www.opengis.net/def/crs/EPSG/0/XXXX", dbContext), + NoSuchAuthorityCodeException); + + { + auto obj = createFromUserInput( + "http://www.opengis.net/def/crs-compound?1=http://www.opengis.net/" + "def/crs/EPSG/0/4326&2=http://www.opengis.net/def/crs/EPSG/0/3855", + dbContext); + auto crs = nn_dynamic_pointer_cast<CompoundCRS>(obj); + ASSERT_TRUE(crs != nullptr); + EXPECT_EQ(crs->nameStr(), "WGS 84 + EGM2008 height"); + } + + // No part + EXPECT_THROW(createFromUserInput("http://www.opengis.net/def/crs-compound?", + dbContext), + ParsingException); + + // Just one part + EXPECT_THROW( + createFromUserInput("http://www.opengis.net/def/crs-compound?1=http://" + "www.opengis.net/def/crs/EPSG/0/4326", + dbContext), + InvalidCompoundCRSException); + + // Invalid compound CRS + EXPECT_THROW( + createFromUserInput( + "http://www.opengis.net/def/crs-compound?1=http://www.opengis.net/" + "def/crs/EPSG/0/4326&2=http://www.opengis.net/def/crs/EPSG/0/4326", + dbContext), + InvalidCompoundCRSException); + + // Missing 2= + EXPECT_THROW( + createFromUserInput( + "http://www.opengis.net/def/crs-compound?1=http://www.opengis.net/" + "def/crs/EPSG/0/4326&3=http://www.opengis.net/def/crs/EPSG/0/3855", + dbContext), + ParsingException); + + // Invalid query parameter + EXPECT_THROW( + createFromUserInput("http://www.opengis.net/def/crs-compound?1=http://" + "www.opengis.net/def/crs/EPSG/0/4326&bla", + dbContext), + ParsingException); + + // Invalid query parameter + EXPECT_THROW( + createFromUserInput("http://www.opengis.net/def/crs-compound?1=http://" + "www.opengis.net/def/crs/EPSG/0/4326&two=http://" + "www.opengis.net/def/crs/EPSG/0/3855", + dbContext), + ParsingException); +} + +// --------------------------------------------------------------------------- + +TEST(io, createFromUserInput_OGC_AUTO) { + + // UTM north + { + auto obj = createFromUserInput("AUTO:42001,-117,33", nullptr); + auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj); + ASSERT_TRUE(crs != nullptr); + EXPECT_EQ(crs->derivingConversion()->nameStr(), "UTM zone 11N"); + EXPECT_EQ( + crs->exportToPROJString(PROJStringFormatter::create().get()), + "+proj=utm +zone=11 +datum=WGS84 +units=m +no_defs +type=crs"); + } + + // UTM south + { + auto obj = createFromUserInput("AUTO:42001,-117,-33", nullptr); + auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj); + ASSERT_TRUE(crs != nullptr); + EXPECT_EQ(crs->derivingConversion()->nameStr(), "UTM zone 11S"); + EXPECT_EQ(crs->exportToPROJString(PROJStringFormatter::create().get()), + "+proj=utm +zone=11 +south +datum=WGS84 +units=m +no_defs " + "+type=crs"); + } + + // Explicit unit: metre + { + auto obj = createFromUserInput("AUTO:42001,9001,-117,33", nullptr); + auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj); + ASSERT_TRUE(crs != nullptr); + EXPECT_EQ(crs->derivingConversion()->nameStr(), "UTM zone 11N"); + EXPECT_EQ( + crs->exportToPROJString(PROJStringFormatter::create().get()), + "+proj=utm +zone=11 +datum=WGS84 +units=m +no_defs +type=crs"); + } + + // Explicit unit: foot + { + auto obj = createFromUserInput("AUTO:42001,9002,-117,33", nullptr); + auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj); + ASSERT_TRUE(crs != nullptr); + EXPECT_EQ(crs->derivingConversion()->nameStr(), "UTM zone 11N"); + EXPECT_EQ( + crs->exportToPROJString(PROJStringFormatter::create().get()), + "+proj=utm +zone=11 +datum=WGS84 +units=ft +no_defs +type=crs"); + } + + // Explicit unit: US survery foot + { + auto obj = createFromUserInput("AUTO:42001,9003,-117,33", nullptr); + auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj); + ASSERT_TRUE(crs != nullptr); + EXPECT_EQ(crs->derivingConversion()->nameStr(), "UTM zone 11N"); + EXPECT_EQ( + crs->exportToPROJString(PROJStringFormatter::create().get()), + "+proj=utm +zone=11 +datum=WGS84 +units=us-ft +no_defs +type=crs"); + } + + // Explicit unit: invalid + EXPECT_THROW(createFromUserInput("AUTO:42001,0,-117,33", nullptr), + ParsingException); + + // Invalid longitude + EXPECT_THROW(createFromUserInput("AUTO:42001,-180.01,33", nullptr), + ParsingException); + EXPECT_NO_THROW(createFromUserInput("AUTO:42001,-180,33", nullptr)); + EXPECT_THROW(createFromUserInput("AUTO:42001,180,33", nullptr), + ParsingException); + EXPECT_NO_THROW(createFromUserInput("AUTO:42001,179.999,33", nullptr)); + + // Too short + EXPECT_THROW(createFromUserInput("AUTO:42001", nullptr), ParsingException); + + // TMerc / north + { + auto obj = createFromUserInput("AUTO:42002,1,2", nullptr); + auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj); + ASSERT_TRUE(crs != nullptr); + EXPECT_EQ(crs->derivingConversion()->nameStr(), "Transverse Mercator"); + EXPECT_EQ(crs->exportToPROJString(PROJStringFormatter::create().get()), + "+proj=tmerc +lat_0=0 +lon_0=1 +k=0.9996 +x_0=500000 +y_0=0 " + "+datum=WGS84 +units=m +no_defs +type=crs"); + } + + // TMerc / south + { + auto obj = createFromUserInput("AUTO:42002,1,-2", nullptr); + auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj); + ASSERT_TRUE(crs != nullptr); + EXPECT_EQ(crs->derivingConversion()->nameStr(), "Transverse Mercator"); + EXPECT_EQ(crs->exportToPROJString(PROJStringFormatter::create().get()), + "+proj=tmerc +lat_0=0 +lon_0=1 +k=0.9996 +x_0=500000 " + "+y_0=10000000 +datum=WGS84 +units=m +no_defs +type=crs"); + } + + // Orthographic + { + auto obj = createFromUserInput("AUTO:42003,1,2", nullptr); + auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj); + ASSERT_TRUE(crs != nullptr); + EXPECT_EQ(crs->exportToPROJString(PROJStringFormatter::create().get()), + "+proj=ortho +lat_0=2 +lon_0=1 +x_0=0 +y_0=0 +datum=WGS84 " + "+units=m +no_defs +type=crs"); + } + + // Equirectangular + { + auto obj = createFromUserInput("AUTO:42004,1,0", nullptr); + auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj); + ASSERT_TRUE(crs != nullptr); + EXPECT_EQ(crs->exportToPROJString(PROJStringFormatter::create().get()), + "+proj=eqc +lat_ts=0 +lat_0=0 +lon_0=1 +x_0=0 +y_0=0 " + "+datum=WGS84 +units=m +no_defs +type=crs"); + } + + // Mollweide + { + auto obj = createFromUserInput("AUTO:42005,1", nullptr); + auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj); + ASSERT_TRUE(crs != nullptr); + EXPECT_EQ(crs->exportToPROJString(PROJStringFormatter::create().get()), + "+proj=moll +lon_0=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m " + "+no_defs +type=crs"); + } + + // Mollweide with explicit unit + { + auto obj = createFromUserInput("AUTO:42005,9001,1", nullptr); + auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj); + ASSERT_TRUE(crs != nullptr); + EXPECT_EQ(crs->exportToPROJString(PROJStringFormatter::create().get()), + "+proj=moll +lon_0=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m " + "+no_defs +type=crs"); + } + + // Invalid method id + EXPECT_THROW(createFromUserInput("AUTO:42999,1,0", nullptr), + ParsingException); + + // As urn:ogc:def:crs:OGC::AUTOxxxx:.... + { + auto obj = createFromUserInput("urn:ogc:def:crs:OGC::AUTO42001:-117:33", + nullptr); + auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj); + ASSERT_TRUE(crs != nullptr); + EXPECT_EQ( + crs->exportToPROJString(PROJStringFormatter::create().get()), + "+proj=utm +zone=11 +datum=WGS84 +units=m +no_defs +type=crs"); + } +} + +// --------------------------------------------------------------------------- + TEST(io, createFromUserInput_hack_EPSG_102100) { auto dbContext = DatabaseContext::create(); auto obj = createFromUserInput("EPSG:102100", dbContext); |
