|
|
|
@ -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 |
|
|
|
|