/* * This source code is released into the public domain. */ // Include this first to ensure it's self-contained. #include "words.hh" #include #include #include #include #include "ctype.hh" using namespace std::literals; using namespace lfjail; #define TEST_CASE(name) \ ATF_TEST_CASE_WITHOUT_HEAD(name) \ ATF_TEST_CASE_BODY(name) TEST_CASE(basic) { auto const str = "foo bar baz"s; auto vec = words(str) | std::ranges::to(); ATF_REQUIRE_EQ(vec.size(), 3); ATF_REQUIRE_EQ("foo", vec[0]); ATF_REQUIRE_EQ("bar", vec[1]); ATF_REQUIRE_EQ("baz", vec[2]); } TEST_CASE(charsep) { auto const str = "foo*bar*baz"s; auto vec = words(str, '*') | std::ranges::to(); ATF_REQUIRE_EQ(vec.size(), 3); ATF_REQUIRE_EQ("foo", vec[0]); ATF_REQUIRE_EQ("bar", vec[1]); ATF_REQUIRE_EQ("baz", vec[2]); } TEST_CASE(as_view) { auto vec = "foo bar baz"s | words() | std::ranges::to(); ATF_REQUIRE_EQ(vec.size(), 3); ATF_REQUIRE_EQ("foo", vec[0]); ATF_REQUIRE_EQ("bar", vec[1]); ATF_REQUIRE_EQ("baz", vec[2]); } TEST_CASE(as_view_char) { auto vec = "foo*bar*baz"s | words('*') | std::ranges::to(); ATF_REQUIRE_EQ(vec.size(), 3); ATF_REQUIRE_EQ("foo", vec[0]); ATF_REQUIRE_EQ("bar", vec[1]); ATF_REQUIRE_EQ("baz", vec[2]); } TEST_CASE(as_view_pred) { auto vec = "foo bar baz"s | words(is_c_space) | std::ranges::to(); ATF_REQUIRE_EQ(vec.size(), 3); ATF_REQUIRE_EQ("foo", vec[0]); ATF_REQUIRE_EQ("bar", vec[1]); ATF_REQUIRE_EQ("baz", vec[2]); } TEST_CASE(empty) { auto vec = words(""s) | std::ranges::to(); ATF_REQUIRE_EQ(0, vec.size()); } TEST_CASE(temporary) { auto vec = words("foo bar baz"s) | std::ranges::to(); ATF_REQUIRE_EQ(vec.size(), 3); ATF_REQUIRE_EQ("foo", vec[0]); ATF_REQUIRE_EQ("bar", vec[1]); ATF_REQUIRE_EQ("baz", vec[2]); } TEST_CASE(range_for) { std::vector vec; for (auto &&word: words("foo bar baz"s)) vec.emplace_back(std::move(word)); ATF_REQUIRE_EQ(vec.size(), 3); ATF_REQUIRE_EQ("foo", vec[0]); ATF_REQUIRE_EQ("bar", vec[1]); ATF_REQUIRE_EQ("baz", vec[2]); } TEST_CASE(predicate) { auto vec = words("foo|bar|baz"s, [](char c) { return c == '|'; }) | std::ranges::to(); ATF_REQUIRE_EQ(vec.size(), 3); ATF_REQUIRE_EQ("foo", vec[0]); ATF_REQUIRE_EQ("bar", vec[1]); ATF_REQUIRE_EQ("baz", vec[2]); } TEST_CASE(multi_whitespace) { auto vec = words("foo bar baz"s) | std::ranges::to(); ATF_REQUIRE_EQ(vec.size(), 3); ATF_REQUIRE_EQ("foo", vec[0]); ATF_REQUIRE_EQ("bar", vec[1]); ATF_REQUIRE_EQ("baz", vec[2]); } TEST_CASE(leading_whitespace) { auto vec = words(" foo bar baz"s) | std::ranges::to(); ATF_REQUIRE_EQ(vec.size(), 3); ATF_REQUIRE_EQ("foo", vec[0]); ATF_REQUIRE_EQ("bar", vec[1]); ATF_REQUIRE_EQ("baz", vec[2]); } TEST_CASE(trailing_whitespace) { auto vec = words("foo bar baz "s) | std::ranges::to(); ATF_REQUIRE_EQ(vec.size(), 3); ATF_REQUIRE_EQ("foo", vec[0]); ATF_REQUIRE_EQ("bar", vec[1]); ATF_REQUIRE_EQ("baz", vec[2]); } ATF_INIT_TEST_CASES(tcs) { ATF_ADD_TEST_CASE(tcs, basic); ATF_ADD_TEST_CASE(tcs, charsep); ATF_ADD_TEST_CASE(tcs, as_view); ATF_ADD_TEST_CASE(tcs, as_view_pred); ATF_ADD_TEST_CASE(tcs, as_view_char); ATF_ADD_TEST_CASE(tcs, empty); ATF_ADD_TEST_CASE(tcs, temporary); ATF_ADD_TEST_CASE(tcs, range_for); ATF_ADD_TEST_CASE(tcs, predicate); ATF_ADD_TEST_CASE(tcs, multi_whitespace); ATF_ADD_TEST_CASE(tcs, leading_whitespace); ATF_ADD_TEST_CASE(tcs, trailing_whitespace); }