From 244a24104ded3a4573aeffa32160af21f76cbce6 Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Tue, 15 Dec 2020 00:51:46 +0100 Subject: Revise error codes to have a reduced set exposed in the public API. Fixes #2482 And also add proj_context_errno_string() Revise gie 'expect failure errno XXXX' strings --- test/unit/gie_self_tests.cpp | 11 --------- test/unit/proj_errno_string_test.cpp | 43 ++++++++++++++---------------------- 2 files changed, 16 insertions(+), 38 deletions(-) (limited to 'test/unit') diff --git a/test/unit/gie_self_tests.cpp b/test/unit/gie_self_tests.cpp index f9252137..70e67dcc 100644 --- a/test/unit/gie_self_tests.cpp +++ b/test/unit/gie_self_tests.cpp @@ -48,7 +48,6 @@ TEST(gie, cart_selftest) { PJ_COORD a, b, obs[2]; PJ_COORD coord[2]; - int err; size_t n, sz; double dist, h, t; const char *const args[3] = {"proj=utm", "zone=32", "ellps=GRS80"}; @@ -89,16 +88,6 @@ TEST(gie, cart_selftest) { /* Clear any previous error */ proj_errno_reset(P); - /* Invalid projection */ - a = proj_trans(P, static_cast(42), a); - ASSERT_EQ(a.lpz.lam, HUGE_VAL); - - err = proj_errno(P); - ASSERT_NE(err, 0); - - /* Clear error again */ - proj_errno_reset(P); - /* Clean up */ proj_destroy(P); diff --git a/test/unit/proj_errno_string_test.cpp b/test/unit/proj_errno_string_test.cpp index a592b31f..d58c5e3f 100644 --- a/test/unit/proj_errno_string_test.cpp +++ b/test/unit/proj_errno_string_test.cpp @@ -35,37 +35,26 @@ namespace { -TEST(ProjErrnoStringTest, NoError) { EXPECT_EQ(0, proj_errno_string(0)); } +TEST(ProjErrnoStringTest, NoError) { EXPECT_EQ(nullptr, proj_errno_string(0)); } TEST(ProjErrnoStringTest, ProjErrnos) { - EXPECT_STREQ("no arguments in initialization list", proj_errno_string(-1)); - EXPECT_STREQ("invalid projection system error (-1000)", - proj_errno_string(-1000)); - EXPECT_STREQ("invalid projection system error (-9999)", - proj_errno_string(-9999)); - // for errnos < -9999, -9999 is always returned - const int min = std::numeric_limits::min(); - EXPECT_STREQ("invalid projection system error (-9999)", - proj_errno_string(min)); - EXPECT_STREQ("invalid projection system error (-9999)", - proj_errno_string(-10000)); + EXPECT_STREQ("Unknown error (code -1)", proj_errno_string(-1)); + EXPECT_STREQ("Invalid PROJ string syntax", + proj_errno_string(PROJ_ERR_INVALID_OP_WRONG_SYNTAX)); + EXPECT_STREQ( + "Unspecified error related to coordinate operation initialization", + proj_errno_string(PROJ_ERR_INVALID_OP)); + EXPECT_STREQ("Unspecified error related to coordinate transformation", + proj_errno_string(PROJ_ERR_COORD_TRANSFM)); } -TEST(ProjErrnoStringTest, SystemErrnos) { - const int max = std::numeric_limits::max(); - -#ifdef HAVE_STRERROR - EXPECT_STREQ(strerror(5), proj_errno_string(5)); - EXPECT_STREQ(strerror(9999), proj_errno_string(9999)); - EXPECT_STREQ(strerror(10000), proj_errno_string(10000)); - EXPECT_STREQ(strerror(max), proj_errno_string(max)); -#else - EXPECT_STREQ("no system list, errno: 5\n", proj_errno_string(5)); - EXPECT_STREQ("no system list, errno: 9999\n", proj_errno_string(9999)); - // for errnos > 9999, 9999 is always returned - EXPECT_STREQ("no system list, errno: 9999\n", proj_errno_string(10000)); - EXPECT_STREQ("no system list, errno: 9999\n", proj_errno_string(max)); -#endif +TEST(ProjErrnoStringTest, proj_context_errno_string) { + EXPECT_STREQ("Unknown error (code -1)", + proj_context_errno_string(nullptr, -1)); + PJ_CONTEXT *ctx = proj_context_create(); + EXPECT_STREQ("Unknown error (code -999)", + proj_context_errno_string(ctx, -999)); + proj_context_destroy(ctx); } } // namespace -- cgit v1.2.3 From 1d803550e7059729cf2734fc6190993e8b8404bf Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Tue, 15 Dec 2020 01:12:58 +0100 Subject: proj_trans_array(): make it transform all coordinates even when an error occurs --- test/unit/gie_self_tests.cpp | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) (limited to 'test/unit') diff --git a/test/unit/gie_self_tests.cpp b/test/unit/gie_self_tests.cpp index 70e67dcc..4244766e 100644 --- a/test/unit/gie_self_tests.cpp +++ b/test/unit/gie_self_tests.cpp @@ -46,7 +46,7 @@ TEST(gie, cart_selftest) { PJ_CONTEXT *ctx; PJ *P; PJ_COORD a, b, obs[2]; - PJ_COORD coord[2]; + PJ_COORD coord[3]; size_t n, sz; double dist, h, t; @@ -200,7 +200,7 @@ TEST(gie, cart_selftest) { coord[0] = proj_coord(proj_torad(12), proj_torad(55), 45, 0); coord[1] = proj_coord(proj_torad(12), proj_torad(56), 50, 0); - ASSERT_FALSE(proj_trans_array(P, PJ_FWD, 2, coord)); + ASSERT_EQ(proj_trans_array(P, PJ_FWD, 2, coord), 0); ASSERT_EQ(a.lpz.lam, coord[0].lpz.lam); ASSERT_EQ(a.lpz.phi, coord[0].lpz.phi); @@ -209,6 +209,35 @@ TEST(gie, cart_selftest) { ASSERT_EQ(b.lpz.phi, coord[1].lpz.phi); ASSERT_EQ(b.lpz.z, coord[1].lpz.z); + /* test proj_trans_array () with two failed points for the same reason */ + + coord[0] = + proj_coord(proj_torad(12), proj_torad(95), 45, 0); // invalid latitude + coord[1] = proj_coord(proj_torad(12), proj_torad(56), 50, 0); + coord[2] = + proj_coord(proj_torad(12), proj_torad(95), 45, 0); // invalid latitude + ASSERT_EQ(proj_trans_array(P, PJ_FWD, 3, coord), + PROJ_ERR_COORD_TRANSFM_INVALID_COORD); + + ASSERT_EQ(HUGE_VAL, coord[0].lpz.lam); + ASSERT_EQ(HUGE_VAL, coord[0].lpz.phi); + ASSERT_EQ(HUGE_VAL, coord[0].lpz.z); + ASSERT_EQ(b.lpz.lam, coord[1].lpz.lam); + ASSERT_EQ(b.lpz.phi, coord[1].lpz.phi); + ASSERT_EQ(b.lpz.z, coord[1].lpz.z); + ASSERT_EQ(HUGE_VAL, coord[2].lpz.lam); + ASSERT_EQ(HUGE_VAL, coord[2].lpz.phi); + ASSERT_EQ(HUGE_VAL, coord[2].lpz.z); + + /* test proj_trans_array () with two failed points for different reasons */ + + coord[0] = + proj_coord(proj_torad(12), proj_torad(95), 45, 0); // invalid latitude + coord[1] = + proj_coord(proj_torad(105), proj_torad(0), 45, + 0); // in the equatorial axis, at 90° of the central meridian + ASSERT_EQ(proj_trans_array(P, PJ_FWD, 2, coord), PROJ_ERR_COORD_TRANSFM); + /* Clean up after proj_trans_* tests */ proj_destroy(P); } -- cgit v1.2.3