#include <catch2/catch_test_macros.hpp>
#include <set>
#include <vector>
using namespace std::literals;
TEST_CASE("split<char>(\"\", \"\", ...)", "[Z]")
{
std::vector<std::string> tokens, delims;
[&](auto token){ tokens.emplace_back(token); },
[&](auto delim){ delims.emplace_back(delim); });
CHECK(tokens.empty());
CHECK(delims.empty());
[&](auto token){ tokens.emplace_back(token); });
CHECK(tokens.empty());
}
TEST_CASE("split<wchar_t>(L\"\", L\"\", ...)", "[Z]")
{
std::vector<std::wstring> tokens, delims;
[&](auto token){ tokens.emplace_back(token); },
[&](auto delim){ delims.emplace_back(delim); });
CHECK(tokens.empty());
CHECK(delims.empty());
[&](auto token){ tokens.emplace_back(token); });
CHECK(tokens.empty());
}
TEST_CASE("split<char32_t>(U\"\", U\"\", ...)", "[Z]")
{
std::vector<std::u32string> tokens, delims;
[&](auto token){ tokens.emplace_back(token); },
[&](auto delim){ delims.emplace_back(delim); });
CHECK(tokens.empty());
CHECK(delims.empty());
[&](auto token){ tokens.emplace_back(token); });
CHECK(tokens.empty());
}
TEST_CASE("split<wchar_t>() for Tailos", "[I]")
{
std::vector<std::wstring> tokens;
std::set<std::wstring> token_set, delim_set;
[&](auto token){
tokens.emplace_back(token);
token_set.emplace(token);
return true;
},
[&](auto delim){
delim_set.emplace(delim);
return true;
});
CHECK(tokens.size() == 4);
CHECK(tokens == decltype(tokens){L"Tâi", L"uân", L"Tâi", L"gí"});
CHECK(token_set.size() == 3);
CHECK(delim_set.size() == 2);
}
TEST_CASE("split<char>(ascii)", "[I]")
{
std::vector<std::string> tokens;
[&](auto token){
tokens.emplace_back(token);
return true;
});
CHECK(tokens.size() == 2);
CHECK(tokens == decltype(tokens){"Hello", "world!"});
}
TEST_CASE("split<char32_t>(ascii)", "[I]")
{
std::vector<std::u32string> tokens;
[&](auto token){
tokens.emplace_back(token);
return true;
});
CHECK(tokens.size() == 2);
CHECK(tokens == decltype(tokens){U"Hello", U"world!"});
}
void split(const S &token_list, std::type_identity_t< std::basic_string_view< T > > splitters, std::regular_invocable< std::basic_string_view< T > > auto &&apply_token, std::regular_invocable< std::basic_string_view< T > > auto &&apply_delim)
Split token_list at any character in splitters, feeding each token to apply_token and each run of spl...