mirror of
https://github.com/trapexit/mergerfs.git
synced 2026-10-26 02:48:59 -04:00
Rework string utils, more test cases
This commit is contained in:
parent
107a3acf95
commit
3a45be4cd8
8 changed files with 371 additions and 206 deletions
207
tests/tests.cpp
207
tests/tests.cpp
|
|
@ -28,7 +28,7 @@ test_config_bool()
|
|||
void
|
||||
test_config_uint64()
|
||||
{
|
||||
ConfigUINT64 v;
|
||||
ConfigU64 v;
|
||||
|
||||
TEST_CHECK(v.from_string("0") == 0);
|
||||
TEST_CHECK(v == (uint64_t)0);
|
||||
|
|
@ -79,45 +79,222 @@ void
|
|||
test_str_stuff()
|
||||
{
|
||||
std::vector<std::string> v;
|
||||
std::set<std::string> s;
|
||||
std::pair<std::string, std::string> kv;
|
||||
|
||||
v.clear();
|
||||
str::split("",':',&v);
|
||||
// split() - vector
|
||||
v = str::split("",':');
|
||||
TEST_CHECK(v.size() == 0);
|
||||
|
||||
v.clear();
|
||||
str::split("a:b:c",':',&v);
|
||||
v = str::split("a:b:c",':');
|
||||
TEST_CHECK(v.size() == 3);
|
||||
TEST_CHECK(v[0] == "a");
|
||||
TEST_CHECK(v[1] == "b");
|
||||
TEST_CHECK(v[2] == "c");
|
||||
|
||||
v.clear();
|
||||
str::split("a::b:c",':',&v);
|
||||
v = str::split("a::b:c",':');
|
||||
TEST_CHECK(v.size() == 4);
|
||||
TEST_CHECK(v[0] == "a");
|
||||
TEST_CHECK(v[1] == "");
|
||||
TEST_CHECK(v[2] == "b");
|
||||
TEST_CHECK(v[3] == "c");
|
||||
|
||||
v.clear();
|
||||
str::lsplit1("foo=bar=baz",'=',&v);
|
||||
v = str::split("single",':');
|
||||
TEST_CHECK(v.size() == 1);
|
||||
TEST_CHECK(v[0] == "single");
|
||||
|
||||
// split_to_set()
|
||||
s = str::split_to_set("",':');
|
||||
TEST_CHECK(s.size() == 0);
|
||||
|
||||
s = str::split_to_set("a:b:c",':');
|
||||
TEST_CHECK(s.size() == 3);
|
||||
TEST_CHECK(s.count("a") == 1);
|
||||
TEST_CHECK(s.count("b") == 1);
|
||||
TEST_CHECK(s.count("c") == 1);
|
||||
|
||||
s = str::split_to_set("a:a:b",':');
|
||||
TEST_CHECK(s.size() == 2);
|
||||
TEST_CHECK(s.count("a") == 1);
|
||||
TEST_CHECK(s.count("b") == 1);
|
||||
|
||||
// split_on_null()
|
||||
std::string nullstr = "hello";
|
||||
nullstr += '\0';
|
||||
nullstr += "world";
|
||||
nullstr += '\0';
|
||||
nullstr += "test";
|
||||
v = str::split_on_null(std::string_view(nullstr.data(), nullstr.size()));
|
||||
TEST_CHECK(v.size() == 3);
|
||||
TEST_CHECK(v[0] == "hello");
|
||||
TEST_CHECK(v[1] == "world");
|
||||
TEST_CHECK(v[2] == "test");
|
||||
|
||||
v = str::split_on_null("");
|
||||
TEST_CHECK(v.size() == 0);
|
||||
|
||||
// lsplit1()
|
||||
v = str::lsplit1("foo=bar=baz",'=');
|
||||
TEST_CHECK(v.size() == 2);
|
||||
TEST_CHECK(v[0] == "foo");
|
||||
TEST_CHECK(v[1] == "bar=baz");
|
||||
|
||||
v.clear();
|
||||
str::lsplit1("",'=',&v);
|
||||
v = str::lsplit1("",'=');
|
||||
TEST_CHECK(v.size() == 0);
|
||||
|
||||
v.clear();
|
||||
str::rsplit1("foo=bar=baz",'=',&v);
|
||||
v = str::lsplit1("no_delimiter",'=');
|
||||
TEST_CHECK(v.size() == 1);
|
||||
TEST_CHECK(v[0] == "no_delimiter");
|
||||
|
||||
// rsplit1()
|
||||
v = str::rsplit1("foo=bar=baz",'=');
|
||||
TEST_CHECK(v.size() == 2);
|
||||
TEST_CHECK(v[0] == "foo=bar");
|
||||
TEST_CHECK(v[1] == "baz");
|
||||
|
||||
v.clear();
|
||||
str::rsplit1("",'=',&v);
|
||||
v = str::rsplit1("",'=');
|
||||
TEST_CHECK(v.size() == 0);
|
||||
|
||||
v = str::rsplit1("no_delimiter",'=');
|
||||
TEST_CHECK(v.size() == 1);
|
||||
TEST_CHECK(v[0] == "no_delimiter");
|
||||
|
||||
// splitkv()
|
||||
kv = str::splitkv("key=value", '=');
|
||||
TEST_CHECK(kv.first == "key");
|
||||
TEST_CHECK(kv.second == "value");
|
||||
|
||||
kv = str::splitkv("key=", '=');
|
||||
TEST_CHECK(kv.first == "key");
|
||||
TEST_CHECK(kv.second == "");
|
||||
|
||||
kv = str::splitkv("key", '=');
|
||||
TEST_CHECK(kv.first == "key");
|
||||
TEST_CHECK(kv.second == "");
|
||||
|
||||
kv = str::splitkv("", '=');
|
||||
TEST_CHECK(kv.first == "");
|
||||
TEST_CHECK(kv.second == "");
|
||||
|
||||
// join() - vector with substr
|
||||
v = {"abc", "def", "ghi"};
|
||||
std::string joined = str::join(v, 1, ':');
|
||||
TEST_CHECK(joined == "bc:ef:hi");
|
||||
|
||||
// join() - vector
|
||||
joined = str::join(v, ':');
|
||||
TEST_CHECK(joined == "abc:def:ghi");
|
||||
|
||||
v = {"single"};
|
||||
joined = str::join(v, ':');
|
||||
TEST_CHECK(joined == "single");
|
||||
|
||||
v = {};
|
||||
joined = str::join(v, ':');
|
||||
TEST_CHECK(joined == "");
|
||||
|
||||
// join() - set
|
||||
s = {"a", "b", "c"};
|
||||
joined = str::join(s, ':');
|
||||
TEST_CHECK(joined == "a:b:c");
|
||||
|
||||
s = {};
|
||||
joined = str::join(s, ':');
|
||||
TEST_CHECK(joined == "");
|
||||
|
||||
// longest_common_prefix_index()
|
||||
v = {"/foo/bar", "/foo/baz", "/foo/qux"};
|
||||
TEST_CHECK(str::longest_common_prefix_index(v) == 5);
|
||||
|
||||
v = {"/foo/bar"};
|
||||
TEST_CHECK(str::longest_common_prefix_index(v) == std::string::npos);
|
||||
|
||||
v = {};
|
||||
TEST_CHECK(str::longest_common_prefix_index(v) == std::string::npos);
|
||||
|
||||
v = {"abc", "xyz"};
|
||||
TEST_CHECK(str::longest_common_prefix_index(v) == 0);
|
||||
|
||||
// longest_common_prefix()
|
||||
v = {"/foo/bar", "/foo/baz"};
|
||||
TEST_CHECK(str::longest_common_prefix(v) == "/foo/ba");
|
||||
|
||||
v = {"/foo/bar"}; // Single element - returns empty string (implementation detail)
|
||||
TEST_CHECK(str::longest_common_prefix(v) == "");
|
||||
|
||||
v = {};
|
||||
TEST_CHECK(str::longest_common_prefix(v) == "");
|
||||
|
||||
// remove_common_prefix_and_join()
|
||||
v = {"/foo/bar", "/foo/baz", "/foo/qux"};
|
||||
joined = str::remove_common_prefix_and_join(v, ':');
|
||||
TEST_CHECK(joined == "bar:baz:qux");
|
||||
|
||||
v = {};
|
||||
joined = str::remove_common_prefix_and_join(v, ':');
|
||||
TEST_CHECK(joined == "");
|
||||
|
||||
// startswith() - string_view
|
||||
TEST_CHECK(str::startswith("hello world", "hello") == true);
|
||||
TEST_CHECK(str::startswith("hello world", "world") == false);
|
||||
TEST_CHECK(str::startswith("hello", "hello world") == false);
|
||||
TEST_CHECK(str::startswith("", "") == true);
|
||||
TEST_CHECK(str::startswith("hello", "") == true);
|
||||
|
||||
// startswith() - char*
|
||||
TEST_CHECK(str::startswith("hello world", "hello") == true);
|
||||
TEST_CHECK(str::startswith("hello world", "world") == false);
|
||||
|
||||
// endswith()
|
||||
TEST_CHECK(str::endswith("hello world", "world") == true);
|
||||
TEST_CHECK(str::endswith("hello world", "hello") == false);
|
||||
TEST_CHECK(str::endswith("hello", "hello world") == false);
|
||||
TEST_CHECK(str::endswith("", "") == true);
|
||||
TEST_CHECK(str::endswith("hello", "") == true);
|
||||
|
||||
// trim()
|
||||
TEST_CHECK(str::trim(" hello ") == "hello");
|
||||
TEST_CHECK(str::trim("hello") == "hello");
|
||||
TEST_CHECK(str::trim(" ") == "");
|
||||
TEST_CHECK(str::trim("") == "");
|
||||
TEST_CHECK(str::trim("\t\nhello\r\n") == "hello");
|
||||
TEST_CHECK(str::trim(" hello world ") == "hello world");
|
||||
|
||||
// eq()
|
||||
TEST_CHECK(str::eq("hello", "hello") == true);
|
||||
TEST_CHECK(str::eq("hello", "world") == false);
|
||||
TEST_CHECK(str::eq("", "") == true);
|
||||
|
||||
// replace()
|
||||
TEST_CHECK(str::replace("hello world", ' ', '_') == "hello_world");
|
||||
TEST_CHECK(str::replace("abc", 'x', 'y') == "abc");
|
||||
TEST_CHECK(str::replace("", 'x', 'y') == "");
|
||||
TEST_CHECK(str::replace("aaa", 'a', 'b') == "bbb");
|
||||
|
||||
// erase_fnmatches()
|
||||
v = {"foo.txt", "bar.cpp", "baz.h", "test.txt"};
|
||||
std::vector<std::string> patterns = {"*.txt"};
|
||||
str::erase_fnmatches(patterns, v);
|
||||
TEST_CHECK(v.size() == 2);
|
||||
// Order may vary, just check elements exist
|
||||
bool has_bar_cpp = false;
|
||||
bool has_baz_h = false;
|
||||
for(const auto& s : v) {
|
||||
if(s == "bar.cpp") has_bar_cpp = true;
|
||||
if(s == "baz.h") has_baz_h = true;
|
||||
}
|
||||
TEST_CHECK(has_bar_cpp);
|
||||
TEST_CHECK(has_baz_h);
|
||||
|
||||
v = {"foo.txt", "bar.cpp"};
|
||||
patterns = {"*.txt", "*.cpp"};
|
||||
str::erase_fnmatches(patterns, v);
|
||||
TEST_CHECK(v.size() == 0);
|
||||
|
||||
v = {"foo.txt", "bar.cpp"};
|
||||
patterns = {};
|
||||
str::erase_fnmatches(patterns, v);
|
||||
TEST_CHECK(v.size() == 2);
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue