aboutsummaryrefslogtreecommitdiff
path: root/test/unit/test_c_api.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/unit/test_c_api.cpp')
-rw-r--r--test/unit/test_c_api.cpp38
1 files changed, 38 insertions, 0 deletions
diff --git a/test/unit/test_c_api.cpp b/test/unit/test_c_api.cpp
index 1b08e884..20fb0583 100644
--- a/test/unit/test_c_api.cpp
+++ b/test/unit/test_c_api.cpp
@@ -127,6 +127,10 @@ class CApi : public ::testing::Test {
PJ *m_obj = nullptr;
explicit ObjectKeeper(PJ *obj) : m_obj(obj) {}
~ObjectKeeper() { proj_destroy(m_obj); }
+ void clear() {
+ proj_destroy(m_obj);
+ m_obj = nullptr;
+ }
ObjectKeeper(const ObjectKeeper &) = delete;
ObjectKeeper &operator=(const ObjectKeeper &) = delete;
@@ -2738,6 +2742,40 @@ TEST_F(CApi, proj_clone) {
// ---------------------------------------------------------------------------
+TEST_F(CApi, proj_clone_of_obj_with_alternative_operations) {
+ // NAD27 to NAD83
+ auto obj =
+ proj_create_crs_to_crs(m_ctxt, "EPSG:4267", "EPSG:4269", nullptr);
+ ObjectKeeper keeper(obj);
+ ASSERT_NE(obj, nullptr);
+
+ PJ_COORD c;
+ c.xyzt.x = 40.5;
+ c.xyzt.y = -60;
+ c.xyzt.z = 0;
+ c.xyzt.t = 2021;
+ PJ_COORD c_trans_ref = proj_trans(obj, PJ_FWD, c);
+ EXPECT_NE(c_trans_ref.xyzt.x, c.xyzt.x);
+ EXPECT_NEAR(c_trans_ref.xyzt.x, c.xyzt.x, 1e-3);
+ EXPECT_NEAR(c_trans_ref.xyzt.y, c.xyzt.y, 1e-3);
+
+ auto clone = proj_clone(m_ctxt, obj);
+ ObjectKeeper keeperClone(clone);
+ ASSERT_NE(clone, nullptr);
+
+ EXPECT_TRUE(proj_is_equivalent_to(obj, clone, PJ_COMP_STRICT));
+
+ keeper.clear();
+ obj = nullptr;
+ (void)obj;
+
+ PJ_COORD c_trans = proj_trans(clone, PJ_FWD, c);
+ EXPECT_EQ(c_trans.xyzt.x, c_trans_ref.xyzt.x);
+ EXPECT_EQ(c_trans.xyzt.y, c_trans_ref.xyzt.y);
+}
+
+// ---------------------------------------------------------------------------
+
TEST_F(CApi, proj_crs_alter_geodetic_crs) {
auto projCRS = proj_create_from_wkt(
m_ctxt,