From 0dcd7e44b314358df25d3eae93fc34f98c74fd70 Mon Sep 17 00:00:00 2001
From: Christoph Lehmann <christoph.lehmann@ufz.de>
Date: Wed, 7 Feb 2024 11:33:25 +0100
Subject: [PATCH] [T] Added unit tests

---
 Tests/CMakeLists.txt               |   7 ++
 Tests/ProcessLib/Graph/TestGet.cpp | 155 +++++++++++++++++++++++++++++
 2 files changed, 162 insertions(+)
 create mode 100644 Tests/ProcessLib/Graph/TestGet.cpp

diff --git a/Tests/CMakeLists.txt b/Tests/CMakeLists.txt
index 37424555842..366bef26927 100644
--- a/Tests/CMakeLists.txt
+++ b/Tests/CMakeLists.txt
@@ -59,6 +59,8 @@ if(NOT OGS_BUILD_WHEEL)
     endif()
 endif()
 
+append_source_files(TEST_SOURCES ProcessLib/Graph)
+
 if(OGS_BUILD_GUI)
     append_source_files(TEST_SOURCES FileIO_Qt)
 endif()
@@ -82,6 +84,11 @@ endif()
 
 ogs_add_executable(testrunner ${TEST_SOURCES})
 
+target_sources(testrunner
+  PRIVATE
+    ProcessLib/Graph/TestGet.cpp
+)
+
 target_link_libraries(
     testrunner
     PRIVATE $<$<NOT:$<BOOL:${OGS_BUILD_WHEEL}>>:ApplicationsLib>
diff --git a/Tests/ProcessLib/Graph/TestGet.cpp b/Tests/ProcessLib/Graph/TestGet.cpp
new file mode 100644
index 00000000000..344fadb644c
--- /dev/null
+++ b/Tests/ProcessLib/Graph/TestGet.cpp
@@ -0,0 +1,155 @@
+/**
+ * \file
+ * \copyright
+ * Copyright (c) 2012-2024, OpenGeoSys Community (http://www.opengeosys.org)
+ *            Distributed under a Modified BSD License.
+ *              See accompanying file LICENSE.txt or
+ *              http://www.opengeosys.org/project/license
+ *
+ */
+
+#include <gtest/gtest.h>
+
+#include "BaseLib/StrongType.h"
+#include "ProcessLib/Graph/Get.h"
+
+TEST(ProcessLib_Graph_Get, ReadSingleTuple)
+{
+    namespace PG = ProcessLib::Graph;
+    std::tuple<char, double, int> const t{'a', 5.5, 3};
+
+    // check same values
+    EXPECT_EQ('a', PG::get<char>(t));
+    EXPECT_EQ(5.5, PG::get<double>(t));
+    EXPECT_EQ(3, PG::get<int>(t));
+
+    // check same addresses
+    EXPECT_EQ(&std::get<char>(t), &PG::get<char>(t));
+    EXPECT_EQ(&std::get<double>(t), &PG::get<double>(t));
+    EXPECT_EQ(&std::get<int>(t), &PG::get<int>(t));
+}
+
+TEST(ProcessLib_Graph_Get, WriteSingleTuple)
+{
+    namespace PG = ProcessLib::Graph;
+    std::tuple<char, double, int> t{'a', 5.5, 3};
+
+    PG::get<char>(t) = 'b';
+    PG::get<double>(t) = 6.25;
+    PG::get<int>(t) = 5;
+
+    // check with std::get
+    EXPECT_EQ('b', std::get<char>(t));
+    EXPECT_EQ(6.25, std::get<double>(t));
+    EXPECT_EQ(5, std::get<int>(t));
+}
+
+TEST(ProcessLib_Graph_Get, ReadTwoTuples)
+{
+    namespace PG = ProcessLib::Graph;
+
+    using S1 = BaseLib::StrongType<int, struct S1Tag>;
+    using S2 = BaseLib::StrongType<double, struct S2Tag>;
+
+    std::tuple<char, S1> const t1{'a', 2};
+    std::tuple<S2, int> const t2{5.5, 4};
+
+    // check same values
+    EXPECT_EQ('a', PG::get<char>(t1, t2));
+    EXPECT_EQ(2, *PG::get<S1>(t1, t2));
+    EXPECT_EQ(5.5, *PG::get<S2>(t1, t2));
+    EXPECT_EQ(4, PG::get<int>(t1, t2));
+
+    // order does not matter
+    EXPECT_EQ('a', PG::get<char>(t2, t1));
+    EXPECT_EQ(2, *PG::get<S1>(t2, t1));
+    EXPECT_EQ(5.5, *PG::get<S2>(t2, t1));
+    EXPECT_EQ(4, PG::get<int>(t2, t1));
+
+    // check same addresses
+    EXPECT_EQ(&std::get<char>(t1), &PG::get<char>(t1, t2));
+    EXPECT_EQ(&std::get<S1>(t1), &PG::get<S1>(t1, t2));
+    EXPECT_EQ(&std::get<S2>(t2), &PG::get<S2>(t1, t2));
+    EXPECT_EQ(&std::get<int>(t2), &PG::get<int>(t1, t2));
+}
+
+TEST(ProcessLib_Graph_Get, WriteTwoTuples)
+{
+    namespace PG = ProcessLib::Graph;
+
+    using S1 = BaseLib::StrongType<int, struct S1Tag>;
+    using S2 = BaseLib::StrongType<double, struct S2Tag>;
+
+    std::tuple<char, S1> t1{'a', 2};
+    std::tuple<S2, int> t2{5.5, 4};
+
+    PG::get<char>(t1, t2) = 'c';
+    PG::get<S1>(t2, t1) = S1{7};
+    PG::get<S2>(t1, t2) = S2{6.5};
+    PG::get<int>(t2, t1) = 9;
+
+    // check with std::get
+    EXPECT_EQ('c', std::get<char>(t1));
+    EXPECT_EQ(7, *std::get<S1>(t1));
+    EXPECT_EQ(6.5, *std::get<S2>(t2));
+    EXPECT_EQ(9, std::get<int>(t2));
+}
+
+TEST(ProcessLib_Graph_Get, ReadMultipleTuples)
+{
+    namespace PG = ProcessLib::Graph;
+
+    using S1 = BaseLib::StrongType<int, struct S1Tag>;
+    using S2 = BaseLib::StrongType<double, struct S2Tag>;
+    using S3 = BaseLib::StrongType<char, struct S3Tag>;
+
+    std::tuple<char, S1> const t1{'a', 2};
+    std::tuple<S2> const t2{5.5};
+    std::tuple<> const t3;
+    std::tuple<std::string, S3, int> const t4{"str", 'x', 4};
+
+    // check same values
+    EXPECT_EQ('a', PG::get<char>(t1, t2, t3, t4));
+    EXPECT_EQ(2, *PG::get<S1>(t3, t1, t2, t4));
+    EXPECT_EQ(5.5, *PG::get<S2>(t4, t1, t3, t2));
+    EXPECT_EQ(4, PG::get<int>(t1, t4, t3, t2));
+    EXPECT_EQ("str", PG::get<std::string>(t3, t4, t1, t2));
+    EXPECT_EQ('x', *PG::get<S3>(t4, t3, t1, t2));
+
+    // check same addresses
+    EXPECT_EQ(&std::get<char>(t1), &PG::get<char>(t1, t2, t3, t4));
+    EXPECT_EQ(&std::get<S1>(t1), &PG::get<S1>(t3, t4, t1, t2));
+    EXPECT_EQ(&std::get<S2>(t2), &PG::get<S2>(t1, t3, t2, t4));
+    EXPECT_EQ(&std::get<int>(t4), &PG::get<int>(t1, t4, t2, t3));
+    EXPECT_EQ(&std::get<S3>(t4), &PG::get<S3>(t2, t4, t1, t3));
+    EXPECT_EQ(&std::get<std::string>(t4),
+              &PG::get<std::string>(t2, t3, t1, t4));
+}
+
+TEST(ProcessLib_Graph_Get, WriteMultipleTuples)
+{
+    namespace PG = ProcessLib::Graph;
+
+    using S1 = BaseLib::StrongType<int, struct S1Tag>;
+    using S2 = BaseLib::StrongType<double, struct S2Tag>;
+    using S3 = BaseLib::StrongType<char, struct S3Tag>;
+
+    std::tuple<char, S1> t1{'a', 2};
+    std::tuple<S2> t2{5.5};
+    std::tuple<> t3;
+    std::tuple<std::string, S3, int> t4{"str", 'x', 4};
+
+    PG::get<char>(t1, t2, t3, t4) = 'c';
+    PG::get<S1>(t3, t1, t2, t4) = S1{5};
+    PG::get<S2>(t4, t1, t3, t2) = S2{7.5};
+    PG::get<int>(t1, t4, t3, t2) = 11;
+    PG::get<std::string>(t3, t4, t1, t2) = "rts";
+    PG::get<S3>(t4, t3, t1, t2) = S3{'y'};
+
+    EXPECT_EQ('c', std::get<char>(t1));
+    EXPECT_EQ(5, *std::get<S1>(t1));
+    EXPECT_EQ(7.5, *std::get<S2>(t2));
+    EXPECT_EQ(11, std::get<int>(t4));
+    EXPECT_EQ("rts", std::get<std::string>(t4));
+    EXPECT_EQ('y', *std::get<S3>(t4));
+}
-- 
GitLab