Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion include/libdnf5/conf/option_string_list.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,9 @@ class LIBDNF_API OptionStringContainer : public Option {
// @replaces libdnf:conf/OptionStringList.hpp:method:OptionStringList.fromString(const std::string & value)
ValueType from_string(std::string value) const;

/// Converts input value to the string.
/// Converts input container of string items to a single string.
/// Items are joined using the first delimiter character. Backslashes and delimiter characters
/// within items are escaped with a backslash.
// @replaces libdnf:conf/OptionStringList.hpp:method:OptionStringList.toString(const ValueType & value)
std::string to_string(const ValueType & value) const;

Expand Down
23 changes: 17 additions & 6 deletions libdnf5/conf/option_string_list.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -297,17 +297,28 @@ void OptionStringContainer<T, IsAppend>::add_item(Priority priority, const std::

template <typename T, bool IsAppend>
std::string OptionStringContainer<T, IsAppend>::to_string(const ValueType & value) const {
std::ostringstream oss;
std::string result;

const std::string_view delimiters{get_delimiters()};

bool next{false};
for (auto & val : value) {
for (auto & item : value) {
if (next) {
oss << ", ";
if (!delimiters.empty()) {
result += delimiters[0];
}
} else {
next = true;
}
oss << val;
for (const auto ch : item) {
if (ch == '\\' || delimiters.find(ch) != delimiters.npos) {
result += '\\';
}
result += ch;
}
}
return oss.str();

return result;
}

template <typename T, bool IsAppend>
Expand All @@ -332,7 +343,7 @@ inline std::string OptionStringContainer<T, IsAppend>::get_value_string() const

template <typename T, bool IsAppend>
inline const char * OptionStringContainer<T, IsAppend>::get_default_delimiters() noexcept {
return " ,\n";
return ", \n";
}

template <typename T, bool IsAppend>
Expand Down
28 changes: 28 additions & 0 deletions test/libdnf5/conf/test_option.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -494,6 +494,34 @@ void OptionTest::test_options_string_list_custom_delimiters() {
CPPUNIT_ASSERT_EQUAL((std::vector<std::string>{"Dfirstx", "DsecondX"}), option3.get_value());
}

void OptionTest::test_options_string_list_to_string() {
OptionStringList option(std::vector<std::string>{"Dfirstx", "DsecondX"});
CPPUNIT_ASSERT_EQUAL(std::string{"Dfirstx,DsecondX"}, option.get_value_string());

option.set(Option::Priority::RUNTIME, std::vector<std::string>{" ", "DsecondX"});
CPPUNIT_ASSERT_EQUAL(std::string{"\\ ,DsecondX"}, option.get_value_string());

option.set(Option::Priority::RUNTIME, std::vector<std::string>{"asdasd", " ", "DsecondX"});
CPPUNIT_ASSERT_EQUAL(std::string{"asdasd,\\ ,DsecondX"}, option.get_value_string());

option.set(Option::Priority::RUNTIME, std::vector<std::string>{"asdasd", ",", "\\DsecondX"});
CPPUNIT_ASSERT_EQUAL(std::string{"asdasd,\\,,\\\\DsecondX"}, option.get_value_string());

option.set(Option::Priority::RUNTIME, std::vector<std::string>{" asdasd, ", "DsecondX"});
CPPUNIT_ASSERT_EQUAL(std::string{"\\ asdasd\\,\\ ,DsecondX"}, option.get_value_string());
}

void OptionTest::test_options_string_list_custom_delimiters_to_string() {
OptionStringList option(std::vector<std::string>{"aa; b", "ccc,"}, "", true, ";");
CPPUNIT_ASSERT_EQUAL(std::string{"aa\\; b;ccc,"}, option.get_value_string());

option.set(Option::Priority::RUNTIME, std::vector<std::string>{"", ";aa; :b", "ccc,"});
CPPUNIT_ASSERT_EQUAL(std::string{";\\;aa\\; :b;ccc,"}, option.get_value_string());

OptionStringList option2(std::vector<std::string>{"", ";a\\a; :b", "ccc,"}, "", true, ";:");
CPPUNIT_ASSERT_EQUAL(std::string{";\\;a\\\\a\\; \\:b;ccc,"}, option2.get_value_string());
}

void OptionTest::test_options_string_set() {
const OptionStringSet::ValueType initial{"x", "y", "z"};
OptionStringSet option(initial);
Expand Down
4 changes: 4 additions & 0 deletions test/libdnf5/conf/test_option.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@ class OptionTest : public CppUnit::TestCase {
CPPUNIT_TEST(test_options_string_list);
CPPUNIT_TEST(test_options_string_list_delimiters);
CPPUNIT_TEST(test_options_string_list_custom_delimiters);
CPPUNIT_TEST(test_options_string_list_to_string);
CPPUNIT_TEST(test_options_string_list_custom_delimiters_to_string);
CPPUNIT_TEST(test_options_string_set);
CPPUNIT_TEST(test_options_list_add);
CPPUNIT_TEST(test_options_list_add_item);
Expand All @@ -54,6 +56,8 @@ class OptionTest : public CppUnit::TestCase {
void test_options_string_list();
void test_options_string_list_delimiters();
void test_options_string_list_custom_delimiters();
void test_options_string_list_to_string();
void test_options_string_list_custom_delimiters_to_string();
void test_options_string_set();
void test_options_list_add();
void test_options_list_add_item();
Expand Down