diff options
| author | Even Rouault <even.rouault@spatialys.com> | 2019-01-09 18:30:17 +0100 |
|---|---|---|
| committer | Even Rouault <even.rouault@spatialys.com> | 2019-01-09 19:45:21 +0100 |
| commit | 3cc9336b038118de424d018dd0bdd90e329ad8c1 (patch) | |
| tree | 790ceaa32d7217f7667264217ecdec6db5c5d3b9 /test/unit/proj_context_test.cpp | |
| parent | d6dad2cee4307f6b190a96dd48942645060919cc (diff) | |
| download | PROJ-3cc9336b038118de424d018dd0bdd90e329ad8c1.tar.gz PROJ-3cc9336b038118de424d018dd0bdd90e329ad8c1.zip | |
proj.h: add proj_context_set_file_finder() and proj_context_set_search_paths() (refs #1150)
Diffstat (limited to 'test/unit/proj_context_test.cpp')
| -rw-r--r-- | test/unit/proj_context_test.cpp | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/test/unit/proj_context_test.cpp b/test/unit/proj_context_test.cpp new file mode 100644 index 00000000..23c46f29 --- /dev/null +++ b/test/unit/proj_context_test.cpp @@ -0,0 +1,146 @@ +/****************************************************************************** + * + * Project: PROJ + * Purpose: Test functions in proj_context namespae + * Author: Even Rouault <even dot rouault at spatialys dot com> + * + ****************************************************************************** + * Copyright (c) 2019, Even Rouault <even dot rouault at spatialys dot com> + * + * 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 <stdlib.h> +#ifdef _MSC_VER +#include <io.h> +#else +#include <unistd.h> +#endif + +#include "proj.h" +#include "proj_internal.h" + +#include "gtest_include.h" + +namespace { + +static std::string createTempDict(std::string &dirname) { + const char *temp_dir = getenv("TEMP"); + if (!temp_dir) { + temp_dir = getenv("TMP"); + } +#ifndef WIN32 + if (!temp_dir) { + temp_dir = "/tmp"; + } +#endif + if (!temp_dir) + return std::string(); + + dirname = temp_dir; + + std::string tmpFilename; + tmpFilename = temp_dir; + tmpFilename += DIR_CHAR; + tmpFilename += "temp_proj_dic"; + + FILE *f = fopen(tmpFilename.c_str(), "wt"); + if (!f) + return std::string(); + fprintf( + f, + "<MY_PIPELINE> +proj=pipeline +step +proj=utm +zone=31 +ellps=GRS80\n"); + fclose(f); + return tmpFilename; +} + +// --------------------------------------------------------------------------- + +static int MyUnlink(const std::string &filename) { +#ifdef _MSC_VER + return _unlink(filename.c_str()); +#else + return unlink(filename.c_str()); +#endif +} + +// --------------------------------------------------------------------------- + +TEST(proj_context, proj_context_set_file_finder) { + + std::string dirname; + auto filename = createTempDict(dirname); + if (filename.empty()) + return; + + auto ctx = proj_context_create(); + + struct FinderData { + PJ_CONTEXT *got_ctx = nullptr; + std::string dirname{}; + std::string tmpFilename{}; + }; + + const auto finder = [](PJ_CONTEXT *got_ctx, const char *file, + void *user_data) -> const char * { + auto finderData = static_cast<FinderData *>(user_data); + finderData->got_ctx = got_ctx; + finderData->tmpFilename = finderData->dirname; + finderData->tmpFilename += DIR_CHAR; + finderData->tmpFilename += file; + return finderData->tmpFilename.c_str(); + }; + + FinderData finderData; + finderData.dirname = dirname; + proj_context_set_file_finder(ctx, finder, &finderData); + + auto P = proj_create(ctx, "+init=temp_proj_dic:MY_PIPELINE"); + EXPECT_NE(P, nullptr); + proj_destroy(P); + + EXPECT_EQ(finderData.got_ctx, ctx); + + proj_context_destroy(ctx); +} + +// --------------------------------------------------------------------------- + +TEST(proj_context, proj_context_set_search_paths) { + + std::string dirname; + auto filename = createTempDict(dirname); + if (filename.empty()) + return; + + auto ctx = proj_context_create(); + + const char *path = dirname.c_str(); + proj_context_set_search_paths(ctx, 1, &path); + + auto P = proj_create(ctx, "+init=temp_proj_dic:MY_PIPELINE"); + EXPECT_NE(P, nullptr); + proj_destroy(P); + + proj_context_destroy(ctx); + + MyUnlink(filename); +} + +} // namespace |
