From ea61acb9fdb6c7f6c2084f36924d7860380320e2 Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Mon, 18 Jun 2018 21:18:49 +0200 Subject: Add pj_phi2_test (#1039 & #1045) Nigrated from: schwehr/gdal-autotest2:cpp/third_party/proj/pj_phi2_test.cc@master License intentionally changed from Apache 2 to match PROJ. --- appveyor.yml | 42 ++++++++++++++++------- test/unit/CMakeLists.txt | 12 +++++++ test/unit/Makefile.am | 10 +++++- test/unit/pj_phi2_test.cpp | 85 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 135 insertions(+), 14 deletions(-) create mode 100644 test/unit/pj_phi2_test.cpp diff --git a/appveyor.yml b/appveyor.yml index 0c92cae2..ec08f20c 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -34,8 +34,18 @@ build_script: - if "%BUILD_TYPE%" == "cmake" if "%platform%" == "x64" SET VS_FULL=%VS_VERSION% Win64 - if "%BUILD_TYPE%" == "cmake" if "%platform%" == "x86" SET VS_FULL=%VS_VERSION% - if "%BUILD_TYPE%" == "cmake" echo "%VS_FULL%" - - if "%BUILD_TYPE%" == "cmake" cmake -G "%VS_FULL%" . -DCMAKE_BUILD_TYPE=Release -DCMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE=../bin -DBUILD_LIBPROJ_SHARED=ON -DCMAKE_C_FLAGS="/WX" - - if "%BUILD_TYPE%" == "cmake" cmake --build . --config Release +# + - if "%BUILD_TYPE%" == "cmake" if "%platform%" == "x64" mkdir build_dll + - if "%BUILD_TYPE%" == "cmake" if "%platform%" == "x64" cd build_dll + - if "%BUILD_TYPE%" == "cmake" if "%platform%" == "x64" cmake -G "%VS_FULL%" .. -DCMAKE_BUILD_TYPE=Release -DBUILD_LIBPROJ_SHARED=ON -DCMAKE_C_FLAGS="/WX" + - if "%BUILD_TYPE%" == "cmake" if "%platform%" == "x64" cmake --build . --config Release + - if "%BUILD_TYPE%" == "cmake" if "%platform%" == "x64" cd .. +# + - if "%BUILD_TYPE%" == "cmake" if "%platform%" == "x86" mkdir build_static + - if "%BUILD_TYPE%" == "cmake" if "%platform%" == "x86" cd build_static + - if "%BUILD_TYPE%" == "cmake" if "%platform%" == "x86" cmake -G "%VS_FULL%" .. -DCMAKE_BUILD_TYPE=Release -DBUILD_LIBPROJ_SHARED=OFF -DCMAKE_C_FLAGS="/WX" + - if "%BUILD_TYPE%" == "cmake" if "%platform%" == "x86" cmake --build . --config Release + - if "%BUILD_TYPE%" == "cmake" if "%platform%" == "x86" cd .. test_script: - echo test_script @@ -49,17 +59,23 @@ test_script: - 7z e -aoa -y proj-datumgrid-1.7.zip - dir - cd .. - - dir - - cd bin - - echo "Contents of current directory:" - - dir - - echo "Contents of ..\test\gie:" - - dir ..\test\gie - - echo "Contents of PROJ_LIB " %PROJ_LIB% - - dir %PROJ_LIB% - - gie.exe ..\test\gie\*.gie ..\test\gigs\*.gie + - if "%BUILD_TYPE%" == "nmake" dir + - if "%BUILD_TYPE%" == "nmake" cd bin + - if "%BUILD_TYPE%" == "nmake" echo "Contents of current directory:" + - if "%BUILD_TYPE%" == "nmake" dir + - if "%BUILD_TYPE%" == "nmake" echo "Contents of ..\test\gie:" + - if "%BUILD_TYPE%" == "nmake" dir ..\test\gie + - if "%BUILD_TYPE%" == "nmake" echo "Contents of PROJ_LIB " %PROJ_LIB% + - if "%BUILD_TYPE%" == "nmake" dir %PROJ_LIB% + - if "%BUILD_TYPE%" == "nmake" gie.exe ..\test\gie\*.gie ..\test\gigs\*.gie - cd %CURDIR% - - if "%BUILD_TYPE%" == "cmake" set PATH=C:\projects\proj-4\bin;%PATH% - - if "%BUILD_TYPE%" == "cmake" ctest -C Release +# + - if "%BUILD_TYPE%" == "cmake" if "%platform%" == "x64" cd build_dll + - if "%BUILD_TYPE%" == "cmake" if "%platform%" == "x64" ctest -C Release + - if "%BUILD_TYPE%" == "cmake" if "%platform%" == "x64" cd .. +# + - if "%BUILD_TYPE%" == "cmake" if "%platform%" == "x86" cd build_static + - if "%BUILD_TYPE%" == "cmake" if "%platform%" == "x86" ctest -C Release + - if "%BUILD_TYPE%" == "cmake" if "%platform%" == "x86" cd .. deploy: off diff --git a/test/unit/CMakeLists.txt b/test/unit/CMakeLists.txt index 35c2c29d..a22665f8 100644 --- a/test/unit/CMakeLists.txt +++ b/test/unit/CMakeLists.txt @@ -57,3 +57,15 @@ target_link_libraries(proj_test_unit gtest ${PROJ_LIBRARIES}) add_test(NAME proj_test_unit COMMAND proj_test_unit) + +if (MSVC AND BUILD_LIBPROJ_SHARED) +# ph_phi2_test not compatible of a .dll build +else() +add_executable(pj_phi2_test + main.cpp + pj_phi2_test.cpp) +target_link_libraries(pj_phi2_test + gtest + ${PROJ_LIBRARIES}) +add_test(NAME pj_phi2_test COMMAND pj_phi2_test) +endif() diff --git a/test/unit/Makefile.am b/test/unit/Makefile.am index b2fa190f..8c8b60d8 100644 --- a/test/unit/Makefile.am +++ b/test/unit/Makefile.am @@ -7,7 +7,8 @@ noinst_HEADERS = gtest_include.h AM_CPPFLAGS = -I$(top_srcdir)/src -I$(top_srcdir)/test -I$(top_srcdir)/test/googletest/include AM_CXXFLAGS = @CXX_WFLAGS@ @NO_ZERO_AS_NULL_POINTER_CONSTANT_FLAG@ -bin_PROGRAMS = basic_test +bin_PROGRAMS = basic_test +bin_PROGRAMS += pj_phi2_test basic_test_SOURCES = basic_test.cpp main.cpp basic_test_LDADD = ../../src/libproj.la ../../test/googletest/libgtest.la @@ -15,4 +16,11 @@ basic_test_LDADD = ../../src/libproj.la ../../test/googletest/libgtest.la basic_test-check: basic_test ./basic_test +pj_phi2_test_SOURCES = pj_phi2_test.cpp main.cpp +pj_phi2_test_LDADD = ../../src/libproj.la ../../test/googletest/libgtest.la + +pj_phi2_test-check: pj_phi2_test + ./pj_phi2_test + check-local: basic_test-check +check-local: pj_phi2_test-check diff --git a/test/unit/pj_phi2_test.cpp b/test/unit/pj_phi2_test.cpp new file mode 100644 index 00000000..20e86e8d --- /dev/null +++ b/test/unit/pj_phi2_test.cpp @@ -0,0 +1,85 @@ +/****************************************************************************** + * + * Project: PROJ + * Purpose: Test pj_phi2 function. + * Author: Kurt Schwehr + * + ****************************************************************************** + * Copyright (c) 2018, Google Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + ****************************************************************************/ + +#include "projects.h" + +#include +#include + +#include "gtest_include.h" + +namespace { + +TEST(PjPhi2Test, Basic) { + projCtx ctx = pj_get_default_ctx(); + + EXPECT_DOUBLE_EQ(M_PI_2, pj_phi2(ctx, 0.0, 0.0)); + + EXPECT_DOUBLE_EQ(0.0, pj_phi2(ctx, 1.0, 0.0)); + EXPECT_DOUBLE_EQ(M_PI_2, pj_phi2(ctx, 0.0, 1.0)); + EXPECT_DOUBLE_EQ(M_PI, pj_phi2(ctx, -1.0, 0.0)); + EXPECT_DOUBLE_EQ(M_PI_2, pj_phi2(ctx, 0.0, -1.0)); + + EXPECT_DOUBLE_EQ(0.0, pj_phi2(ctx, 1.0, 1.0)); + EXPECT_DOUBLE_EQ(M_PI, pj_phi2(ctx, -1.0, -1.0)); + + // TODO(schwehr): M_PI_4, M_PI_2, M_PI, M_E + // https://www.gnu.org/software/libc/manual/html_node/Mathematical-Constants.html + + EXPECT_DOUBLE_EQ(-0.95445818456292697, pj_phi2(ctx, M_PI, 0.0)); + EXPECT_TRUE(std::isnan(pj_phi2(ctx, 0.0, M_PI))); + EXPECT_DOUBLE_EQ(4.0960508381527205, pj_phi2(ctx, -M_PI, 0.0)); + EXPECT_TRUE(std::isnan(pj_phi2(ctx, 0.0, -M_PI))); + + EXPECT_TRUE(std::isnan(pj_phi2(ctx, M_PI, M_PI))); + EXPECT_TRUE(std::isnan(pj_phi2(ctx, -M_PI, -M_PI))); +} + + +TEST(PjPhi2Test, AvoidUndefinedBehavior) { + auto ctx = pj_get_default_ctx(); + + constexpr auto nan = std::numeric_limits::quiet_NaN(); + EXPECT_TRUE(std::isnan(pj_phi2(ctx, nan, 0.0))); + EXPECT_TRUE(std::isnan(pj_phi2(ctx, 0.0, nan))); + EXPECT_TRUE(std::isnan(pj_phi2(ctx, nan, nan))); + + // We do not really care about the values that follow. + constexpr auto inf = std::numeric_limits::infinity(); + + EXPECT_DOUBLE_EQ(-M_PI_2, pj_phi2(ctx, inf, 0.0)); + EXPECT_TRUE(std::isnan(pj_phi2(ctx, 0.0, inf))); + + EXPECT_DOUBLE_EQ(4.7123889803846897, pj_phi2(ctx, -inf, 0.0)); + EXPECT_TRUE(std::isnan(pj_phi2(ctx, 0.0, -inf))); + + EXPECT_TRUE(std::isnan(pj_phi2(ctx, inf, inf))); + EXPECT_TRUE(std::isnan(pj_phi2(ctx, -inf, -inf))); +} + +} // namespace \ No newline at end of file -- cgit v1.2.3