OSDN Git Service

strutils::join(): Fix the bug when the second element is empty
authorTakashi Sawanaka <sdottaka@users.sourceforge.net>
Wed, 16 Jun 2021 00:03:55 +0000 (09:03 +0900)
committerTakashi Sawanaka <sdottaka@users.sourceforge.net>
Wed, 16 Jun 2021 00:03:55 +0000 (09:03 +0900)
Src/Common/UnicodeString.h
Testing/GoogleTest/UnicodeString/UnicodeString_test.cpp

index 738e417..b5e5fe2 100644 (file)
@@ -69,7 +69,7 @@ String join(const InputIterator& begin, const InputIterator& end, const String&
        result.reserve(sum);
        for (InputIterator it = begin; it != end; ++it)
        {
-               if (!result.empty()) result.append(delim);
+               if (it != begin) result.append(delim);
                result += *it;
        }
        return result;
@@ -81,7 +81,7 @@ String join(const InputIterator& begin, const InputIterator& end, const String&
        String result;
        for (InputIterator it = begin; it != end; ++it)
        {
-               if (!result.empty()) result.append(delim);
+               if (it != begin) result.append(delim);
                result += func(*it);
        }
        return result;
index b30a3c0..3fcf92f 100644 (file)
@@ -359,4 +359,53 @@ namespace
                EXPECT_TRUE(String(257, ' ') == strutils::format(_T("%s"), String(257, ' ').c_str()));\r
        }\r
 \r
+       TEST_F(UnicodeStringTest, Join)\r
+       {\r
+               std::vector<String> strs;\r
+               strs = std::vector<String>{ _T("") };\r
+               EXPECT_EQ(_T(""), strutils::join(strs.begin(), strs.end(), _T("|")));\r
+               strs = std::vector<String>();\r
+               EXPECT_EQ(_T(""), strutils::join(strs.begin(), strs.end(), _T("|")));\r
+               strs = std::vector<String>{ _T(""), _T("") };\r
+               EXPECT_EQ(_T("|"), strutils::join(strs.begin(), strs.end(), _T("|")));\r
+               strs = std::vector<String>{ _T("a") };\r
+               EXPECT_EQ(_T("a"), strutils::join(strs.begin(), strs.end(), _T("|")));\r
+               strs = std::vector<String>{ _T("a"),  _T("b") };\r
+               EXPECT_EQ(_T("a|b"), strutils::join(strs.begin(), strs.end(), _T("|")));\r
+               strs = std::vector<String>{ _T(""),  _T("b") };\r
+               EXPECT_EQ(_T("|b"), strutils::join(strs.begin(), strs.end(), _T("|")));\r
+               strs = std::vector<String>{ _T("a"),  _T("") };\r
+               EXPECT_EQ(_T("a|"), strutils::join(strs.begin(), strs.end(), _T("|")));\r
+               strs = std::vector<String>{ _T("a"),  _T("b"), _T("c") };\r
+               EXPECT_EQ(_T("a|b|c"), strutils::join(strs.begin(), strs.end(), _T("|")));\r
+               strs = std::vector<String>{ _T(""),  _T("b"), _T("c") };\r
+               EXPECT_EQ(_T("|b|c"), strutils::join(strs.begin(), strs.end(), _T("|")));\r
+               strs = std::vector<String>{ _T("a"),  _T(""), _T("c") };\r
+               EXPECT_EQ(_T("a||c"), strutils::join(strs.begin(), strs.end(), _T("|")));\r
+               strs = std::vector<String>{ _T("a"),  _T("b"), _T("") };\r
+               EXPECT_EQ(_T("a|b|"), strutils::join(strs.begin(), strs.end(), _T("|")));\r
+\r
+               strs = std::vector<String>{ };\r
+               EXPECT_EQ(_T(""), strutils::join(strs.begin(), strs.end(), _T("|"),\r
+                       [](const auto& str) { return strutils::makeupper(str); }));\r
+               strs = std::vector<String>{ _T("") };\r
+               EXPECT_EQ(_T(""), strutils::join(strs.begin(), strs.end(), _T("|"),\r
+                       [](const auto& str) { return strutils::makeupper(str); }));\r
+               strs = std::vector<String>{ _T(""), _T("")};\r
+               EXPECT_EQ(_T("|"), strutils::join(strs.begin(), strs.end(), _T("|"),\r
+                       [](const auto& str) { return strutils::makeupper(str); }));\r
+               strs = std::vector<String>{ _T("a"),  _T("b"), _T("c") };\r
+               EXPECT_EQ(_T("A|B|C"), strutils::join(strs.begin(), strs.end(), _T("|"),\r
+                       [](const auto& str) { return strutils::makeupper(str); }));\r
+               strs = std::vector<String>{ _T(""),  _T("b"), _T("c") };\r
+               EXPECT_EQ(_T("|B|C"), strutils::join(strs.begin(), strs.end(), _T("|"),\r
+                       [](const auto& str) { return strutils::makeupper(str); }));\r
+               strs = std::vector<String>{ _T("a"),  _T(""), _T("c") };\r
+               EXPECT_EQ(_T("A||C"), strutils::join(strs.begin(), strs.end(), _T("|"),\r
+                       [](const auto& str) { return strutils::makeupper(str); }));\r
+               strs = std::vector<String>{ _T("a"),  _T("b"), _T("") };\r
+               EXPECT_EQ(_T("A|B|"), strutils::join(strs.begin(), strs.end(), _T("|"),\r
+                       [](const auto& str) { return strutils::makeupper(str); }));\r
+       }\r
+\r
 }  // namespace\r