aboutsummaryrefslogtreecommitdiff
path: root/test/unit/proj_context_test.cpp
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2019-01-09 18:30:17 +0100
committerEven Rouault <even.rouault@spatialys.com>2019-01-09 19:45:21 +0100
commit3cc9336b038118de424d018dd0bdd90e329ad8c1 (patch)
tree790ceaa32d7217f7667264217ecdec6db5c5d3b9 /test/unit/proj_context_test.cpp
parentd6dad2cee4307f6b190a96dd48942645060919cc (diff)
downloadPROJ-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.cpp146
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