From d4019e4222e1c096541877dd41f2a23417f200a0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Martin=20W=C3=B6lzer?= <martin@libclapp.org>
Date: Tue, 6 Sep 2022 21:22:53 +0200
Subject: [PATCH] src/include/clapp/value.h: moved stringify() function from
 src/clapp/option_container.cpp

---
 src/clapp/option_container.cpp | 12 ------------
 src/include/clapp/value.h      |  6 ++++++
 src/include/clapp/value.hpp    | 12 ++++++++++++
 tests/value.cpp                | 31 +++++++++++++++++++++++++++++++
 4 files changed, 49 insertions(+), 12 deletions(-)

diff --git a/src/clapp/option_container.cpp b/src/clapp/option_container.cpp
index 06f2ec45..dda9d375 100644
--- a/src/clapp/option_container.cpp
+++ b/src/clapp/option_container.cpp
@@ -145,18 +145,6 @@ void clapp::parser::basic_option_container_t::validate_options() const {
     }
 }
 
-namespace clapp {
-static std::string stringify(
-    std::optional<std::vector<std::string>>& opt_str_vec) {
-    return std::accumulate(opt_str_vec.value().begin(),
-                           opt_str_vec.value().end(), std::string{},
-                           [](std::string& lhs, const std::string& rhs) {
-                               return lhs.empty() ? (rhs) : (lhs + " " + rhs);
-                           });
-}
-
-}  // namespace clapp
-
 void clapp::parser::basic_option_container_t::validate_options_xor(
     const types::variant_opt_conf_container_t* options,
     const std::string& options_str,
diff --git a/src/include/clapp/value.h b/src/include/clapp/value.h
index 70816a81..7c8fd52c 100644
--- a/src/include/clapp/value.h
+++ b/src/include/clapp/value.h
@@ -19,6 +19,7 @@
 #include <clapp/filesystem.h>
 
 #include <functional>
+#include <numeric>
 #include <optional>
 #include <string>
 #include <string_view>
@@ -106,6 +107,11 @@ class path_exists_t {
 };
 #endif
 
+inline std::string concat_str(const std::string &lhs, const std::string &rhs);
+
+inline std::string stringify(
+    const std::optional<std::vector<std::string>> &opt_str_vec);
+
 }  // namespace value
 
 }  // namespace clapp
diff --git a/src/include/clapp/value.hpp b/src/include/clapp/value.hpp
index c455f608..c86ec873 100644
--- a/src/include/clapp/value.hpp
+++ b/src/include/clapp/value.hpp
@@ -204,4 +204,16 @@ clapp::fs::path clapp::value::convert_value<clapp::fs::path>(
     std::string_view param);
 #endif
 
+std::string clapp::value::concat_str(const std::string& lhs,
+                                     const std::string& rhs) {
+    return lhs.empty() ? (rhs) : (lhs + " " + rhs);
+}
+
+std::string clapp::value::stringify(
+    const std::optional<std::vector<std::string>>& opt_str_vec) {
+    return std::accumulate(opt_str_vec.value().begin(),
+                           opt_str_vec.value().end(), std::string{},
+                           concat_str);
+}
+
 #endif
diff --git a/tests/value.cpp b/tests/value.cpp
index c5e0f4b1..47b53cba 100644
--- a/tests/value.cpp
+++ b/tests/value.cpp
@@ -501,3 +501,34 @@ TEST(value, foundFuncTReturnsExit) {
     ASSERT_THAT(ret.value().get_exit_code(), testing::Eq(exit_code));
     ASSERT_THAT(stringstr.str(), testing::StrEq("called func-name2"));
 }
+
+TEST(value, concatStr) {
+    ASSERT_THAT(clapp::value::concat_str("", "b"), testing::StrEq("b"));
+    ASSERT_THAT(clapp::value::concat_str("a", "b"), testing::StrEq("a b"));
+    ASSERT_THAT(clapp::value::concat_str("a", ""), testing::StrEq("a "));
+}
+
+TEST(value, stringifyNulloptThrows) {
+    const std::optional<std::vector<std::string>> opt_str_vec{std::nullopt};
+    ASSERT_THROW(clapp::value::stringify(opt_str_vec),
+                 std::bad_optional_access);
+}
+
+TEST(value, stringifyEmptyVec) {
+    const std::optional<std::vector<std::string>> opt_str_vec{
+        std::vector<std::string>{}};
+    ASSERT_THAT(clapp::value::stringify(opt_str_vec), testing::StrEq(""));
+}
+
+TEST(value, stringifyVecWithOneElement) {
+    const std::optional<std::vector<std::string>> opt_str_vec{
+        std::vector<std::string>{"one"}};
+    ASSERT_THAT(clapp::value::stringify(opt_str_vec), testing::StrEq("one"));
+}
+
+TEST(value, stringifyVecWithTwoElements) {
+    const std::optional<std::vector<std::string>> opt_str_vec{
+        std::vector<std::string>{"one", "two"}};
+    ASSERT_THAT(clapp::value::stringify(opt_str_vec),
+                testing::StrEq("one two"));
+}
-- 
GitLab