diff options
Diffstat (limited to 'test/unit/test_factory.cpp')
| -rw-r--r-- | test/unit/test_factory.cpp | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/test/unit/test_factory.cpp b/test/unit/test_factory.cpp index e0616baa..d153d401 100644 --- a/test/unit/test_factory.cpp +++ b/test/unit/test_factory.cpp @@ -4086,6 +4086,97 @@ TEST(factory, objectInsertion) { ensemble.get(), IComparable::Criterion::EQUIVALENT)); ctxt->stopInsertStatementsSession(); } + + // non-EPSG projection method + { + auto ctxt = DatabaseContext::create(); + ctxt->startInsertStatementsSession(); + const auto crs = nn_dynamic_pointer_cast<CRS>( + PROJStringParser().createFromPROJString( + "+proj=sinu +lon_0=195 +x_0=0 +y_0=0 +R=3396000 +units=m " + "+no_defs +type=crs")); + ASSERT_TRUE(crs != nullptr); + const auto statements = ctxt->getInsertStatementsFor( + NN_NO_CHECK(crs), "HOBU", "XXXX", false); + bool found = false; + for (const auto &sql : statements) { + if (sql.find("INSERT INTO conversion") != std::string::npos) { + found = true; + const char *expected = + "VALUES('HOBU','CONVERSION_XXXX'," + "'unknown','','PROJ','sinu','Sinusoidal',"; + EXPECT_TRUE(sql.find(expected) != std::string::npos) << sql; + } + } + EXPECT_TRUE(found); + const auto crsNew = + AuthorityFactory::create(ctxt, "HOBU")->createProjectedCRS("XXXX"); + EXPECT_TRUE(crsNew->isEquivalentTo(crs.get(), + IComparable::Criterion::EQUIVALENT)); + ctxt->stopInsertStatementsSession(); + } + + // Missing projection method and parameter id + { + auto ctxt = DatabaseContext::create(); + ctxt->startInsertStatementsSession(); + const auto wkt = + "PROJCRS[\"unknown\",\n" + " BASEGEOGCRS[\"unknown\",\n" + " DATUM[\"World Geodetic System 1984\",\n" + " ELLIPSOID[\"WGS 84\",6378137,298.257223563,\n" + " LENGTHUNIT[\"metre\",1]]],\n" + " PRIMEM[\"Greenwich\",0,\n" + " ANGLEUNIT[\"degree\",0.0174532925199433]]],\n" + " CONVERSION[\"UTM zone 31N\",\n" + " METHOD[\"Transverse Mercator\"],\n" + " PARAMETER[\"Latitude of natural origin\",0,\n" + " ANGLEUNIT[\"degree\",0.0174532925199433]],\n" + " PARAMETER[\"Longitude of natural origin\",3,\n" + " ANGLEUNIT[\"degree\",0.0174532925199433]],\n" + " PARAMETER[\"Scale factor at natural origin\",0.9996,\n" + " SCALEUNIT[\"unity\",1]],\n" + " PARAMETER[\"False easting\",500000,\n" + " LENGTHUNIT[\"metre\",1]],\n" + " PARAMETER[\"False northing\",0,\n" + " LENGTHUNIT[\"metre\",1]]],\n" + " CS[Cartesian,2],\n" + " AXIS[\"(E)\",east,\n" + " ORDER[1],\n" + " LENGTHUNIT[\"metre\",1]],\n" + " AXIS[\"(N)\",north,\n" + " ORDER[2],\n" + " LENGTHUNIT[\"metre\",1]]]"; + const auto crs = + nn_dynamic_pointer_cast<CRS>(WKTParser().createFromWKT(wkt)); + ASSERT_TRUE(crs != nullptr); + const auto statements = ctxt->getInsertStatementsFor( + NN_NO_CHECK(crs), "HOBU", "XXXX", false); + bool found = false; + const char *expected = + "INSERT INTO conversion VALUES('HOBU','CONVERSION_XXXX'," + "'UTM zone 31N','','EPSG','9807','Transverse Mercator'," + "'EPSG','8801','Latitude of natural origin',0,'EPSG','9102'," + "'EPSG','8802','Longitude of natural origin',3,'EPSG','9102'," + "'EPSG','8805','Scale factor at natural origin',0.9996," + "'EPSG','9201'," + "'EPSG','8806','False easting',500000,'EPSG','9001'," + "'EPSG','8807','False northing',0,'EPSG','9001'," + "NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL," + "NULL,0)"; + for (const auto &sql : statements) { + if (sql.find("INSERT INTO conversion") != std::string::npos) { + found = true; + EXPECT_TRUE(sql.find(expected) != std::string::npos) << sql; + } + } + EXPECT_TRUE(found); + const auto crsNew = + AuthorityFactory::create(ctxt, "HOBU")->createProjectedCRS("XXXX"); + EXPECT_TRUE(crsNew->isEquivalentTo(crs.get(), + IComparable::Criterion::EQUIVALENT)); + ctxt->stopInsertStatementsSession(); + } } } // namespace |
