2025-06-20 23:38:34 +08:00
|
|
|
#include <gtest/gtest.h>
|
|
|
|
#include <yycc.hpp>
|
|
|
|
#include <yycc/string/op.hpp>
|
|
|
|
|
2025-10-07 18:15:17 +08:00
|
|
|
#include <yycc/prelude.hpp>
|
2025-06-22 17:14:49 +08:00
|
|
|
|
2025-06-20 23:38:34 +08:00
|
|
|
#define OP ::yycc::string::op
|
2025-07-31 22:25:14 +08:00
|
|
|
using namespace std::literals::string_view_literals;
|
2025-06-20 23:38:34 +08:00
|
|
|
|
|
|
|
namespace yycctest::string::op {
|
|
|
|
|
|
|
|
TEST(StringOp, Printf) {
|
2025-09-22 22:14:36 +08:00
|
|
|
// UTF8 string
|
|
|
|
{
|
|
|
|
auto rv = OP::printf(u8"%s == %s", u8"Hello World", u8"Hello, world");
|
|
|
|
EXPECT_EQ(rv, u8"Hello World == Hello, world");
|
|
|
|
}
|
|
|
|
// Ordinary string
|
|
|
|
{
|
|
|
|
auto rv = OP::printf("%s == %s", "Hello World", "Hello, world");
|
|
|
|
EXPECT_EQ(rv, "Hello World == Hello, world");
|
|
|
|
}
|
2025-06-20 23:38:34 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
TEST(StringOp, Replace) {
|
2025-06-22 17:14:49 +08:00
|
|
|
// Normal case
|
|
|
|
{
|
2025-07-31 22:25:14 +08:00
|
|
|
auto rv = OP::replace(u8"aabbcc", u8"bb", u8"dd");
|
|
|
|
EXPECT_EQ(rv, u8"aaddcc");
|
2025-06-22 17:14:49 +08:00
|
|
|
}
|
|
|
|
// No matched expected string
|
|
|
|
{
|
2025-07-31 22:25:14 +08:00
|
|
|
auto rv = OP::replace(u8"aabbcc", u8"zz", u8"yy");
|
|
|
|
EXPECT_EQ(rv, u8"aabbcc");
|
2025-06-22 17:14:49 +08:00
|
|
|
}
|
|
|
|
// Empty expected string
|
|
|
|
{
|
2025-07-31 22:25:14 +08:00
|
|
|
auto rv = OP::replace(u8"aabbcc", std::u8string_view(), u8"zz");
|
|
|
|
EXPECT_EQ(rv, u8"aabbcc");
|
2025-06-22 17:14:49 +08:00
|
|
|
}
|
|
|
|
// Empty replace string
|
|
|
|
{
|
2025-07-31 22:25:14 +08:00
|
|
|
auto rv = OP::replace(u8"aaaabbaa", u8"aa", u8"");
|
|
|
|
EXPECT_EQ(rv, u8"bb");
|
2025-06-22 17:14:49 +08:00
|
|
|
}
|
|
|
|
// Nested replacing
|
|
|
|
{
|
2025-07-31 22:25:14 +08:00
|
|
|
auto rv = OP::replace(u8"aaxcc", u8"x", u8"yx");
|
|
|
|
EXPECT_EQ(rv, u8"aayxcc");
|
2025-06-22 17:14:49 +08:00
|
|
|
}
|
|
|
|
// Empty source string
|
|
|
|
{
|
2025-07-31 22:25:14 +08:00
|
|
|
auto rv = OP::replace(std::u8string_view(), u8"", u8"xy");
|
|
|
|
EXPECT_EQ(rv, u8"");
|
2025-06-22 17:14:49 +08:00
|
|
|
}
|
2025-06-20 23:38:34 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
TEST(StringOp, Lower) {
|
2025-07-31 22:25:14 +08:00
|
|
|
auto rv = OP::to_lower(u8"LOWER");
|
|
|
|
EXPECT_EQ(rv, u8"lower");
|
2025-06-20 23:38:34 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
TEST(StringOp, Upper) {
|
2025-07-31 22:25:14 +08:00
|
|
|
auto rv = OP::to_upper(u8"upper");
|
|
|
|
EXPECT_EQ(rv, u8"UPPER");
|
2025-06-20 23:38:34 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
TEST(StringOp, Join) {
|
2025-07-31 22:25:14 +08:00
|
|
|
std::vector<std::u8string_view> datas{u8""sv, u8"1"sv, u8"2"sv, u8""sv};
|
|
|
|
auto rv = OP::join(datas.begin(), datas.end(), u8", ");
|
|
|
|
EXPECT_EQ(rv, u8", 1, 2, ");
|
2025-06-20 23:38:34 +08:00
|
|
|
}
|
|
|
|
|
2025-09-26 21:43:12 +08:00
|
|
|
TEST(StringOp, Strip) {
|
|
|
|
// Normal strip
|
|
|
|
{
|
2025-09-28 16:13:06 +08:00
|
|
|
auto rv = OP::strip(u8" \taaa\n", u8" \t\r\n");
|
2025-09-26 21:43:12 +08:00
|
|
|
EXPECT_EQ(rv, u8"aaa");
|
|
|
|
}
|
2025-09-28 16:13:06 +08:00
|
|
|
{
|
|
|
|
auto rv = OP::lstrip(u8" \taaa\n", u8" \t\r\n");
|
|
|
|
EXPECT_EQ(rv, u8"aaa\n");
|
|
|
|
}
|
|
|
|
{
|
|
|
|
auto rv = OP::rstrip(u8" \taaa\n", u8" \t\r\n");
|
|
|
|
EXPECT_EQ(rv, u8" \taaa");
|
|
|
|
}
|
2025-09-26 21:43:12 +08:00
|
|
|
|
2025-10-01 20:53:43 +08:00
|
|
|
// Full strip
|
|
|
|
{
|
|
|
|
auto rv = OP::strip(u8" ", u8" ");
|
|
|
|
EXPECT_TRUE(rv.empty());
|
|
|
|
}
|
|
|
|
|
2025-09-26 21:43:12 +08:00
|
|
|
// Special strip
|
|
|
|
{
|
2025-09-28 16:13:06 +08:00
|
|
|
auto rv = OP::strip(u8"啊啊啊aaaあああ", u8"啊あ");
|
2025-09-26 21:43:12 +08:00
|
|
|
EXPECT_EQ(rv, u8"aaa");
|
|
|
|
}
|
|
|
|
{
|
2025-09-28 16:13:06 +08:00
|
|
|
auto rv = OP::strip(u8"啊啊啊aaaあああ", u8"啊");
|
|
|
|
EXPECT_EQ(rv, u8"aaaあああ");
|
2025-09-26 21:43:12 +08:00
|
|
|
}
|
|
|
|
{
|
2025-09-28 16:13:06 +08:00
|
|
|
auto rv = OP::strip(u8"啊啊啊aaaあああ", u8"あ");
|
|
|
|
EXPECT_EQ(rv, u8"啊啊啊aaa");
|
|
|
|
}
|
|
|
|
|
|
|
|
// Possible buggy strip.
|
|
|
|
// We use 2 UTF8 code points introduced following:
|
|
|
|
// U+00AA (UTF-8: C2 AA)
|
|
|
|
// U+1002A (UTF-8 : F0 90 80 AA)
|
|
|
|
{
|
|
|
|
auto rv = OP::rstrip(u8"aaa\u00AA", u8"\u00AA\U0001002A");
|
|
|
|
EXPECT_EQ(rv, u8"aaa");
|
2025-09-26 21:43:12 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2025-10-01 20:53:43 +08:00
|
|
|
TEST(StringOp, Trim) {
|
|
|
|
// Normal trim
|
|
|
|
{
|
|
|
|
auto rv = OP::trim(u8" \taaa\n", u8" \t\r\n");
|
|
|
|
EXPECT_EQ(rv, u8"aaa");
|
|
|
|
}
|
|
|
|
{
|
|
|
|
auto rv = OP::ltrim(u8" \taaa\n", u8" \t\r\n");
|
|
|
|
EXPECT_EQ(rv, u8"aaa\n");
|
|
|
|
}
|
|
|
|
{
|
|
|
|
auto rv = OP::rtrim(u8" \taaa\n", u8" \t\r\n");
|
|
|
|
EXPECT_EQ(rv, u8" \taaa");
|
|
|
|
}
|
|
|
|
|
|
|
|
// Bad words
|
|
|
|
{
|
|
|
|
EXPECT_ANY_THROW(OP::trim(u8"q啊啊啊aaaあああp", u8"p啊q"));
|
|
|
|
}
|
|
|
|
|
|
|
|
// Full trim
|
|
|
|
{
|
|
|
|
auto rv = OP::trim(u8" ", u8" ");
|
|
|
|
EXPECT_TRUE(rv.empty());
|
|
|
|
}
|
|
|
|
}
|
2025-06-20 23:38:34 +08:00
|
|
|
TEST(StringOp, Split) {
|
2025-06-22 17:14:49 +08:00
|
|
|
// Normal
|
|
|
|
{
|
2025-07-31 22:25:14 +08:00
|
|
|
auto rv = OP::split(u8", 1, 2, ", u8", ");
|
2025-06-22 17:14:49 +08:00
|
|
|
ASSERT_EQ(rv.size(), 4u);
|
2025-07-31 22:25:14 +08:00
|
|
|
EXPECT_EQ(rv[0], u8"");
|
|
|
|
EXPECT_EQ(rv[1], u8"1");
|
|
|
|
EXPECT_EQ(rv[2], u8"2");
|
|
|
|
EXPECT_EQ(rv[3], u8"");
|
2025-06-22 17:14:49 +08:00
|
|
|
}
|
|
|
|
// No matched delimiter
|
|
|
|
{
|
2025-07-31 22:25:14 +08:00
|
|
|
auto rv = OP::split(u8"test", u8"-");
|
2025-06-22 17:14:49 +08:00
|
|
|
ASSERT_EQ(rv.size(), 1u);
|
2025-07-31 22:25:14 +08:00
|
|
|
EXPECT_EQ(rv[0], u8"test");
|
2025-06-22 17:14:49 +08:00
|
|
|
}
|
|
|
|
// Empty delimiter
|
|
|
|
{
|
2025-07-31 22:25:14 +08:00
|
|
|
auto rv = OP::split(u8"test", std::u8string_view());
|
2025-06-22 17:14:49 +08:00
|
|
|
ASSERT_EQ(rv.size(), 1u);
|
2025-07-31 22:25:14 +08:00
|
|
|
EXPECT_EQ(rv[0], u8"test");
|
2025-06-22 17:14:49 +08:00
|
|
|
}
|
|
|
|
// Empty source string
|
|
|
|
{
|
2025-07-31 22:25:14 +08:00
|
|
|
auto rv = OP::split(std::u8string_view(), u8"");
|
2025-06-22 17:14:49 +08:00
|
|
|
ASSERT_EQ(rv.size(), 1u);
|
|
|
|
EXPECT_TRUE(rv[0].empty());
|
|
|
|
}
|
2025-06-20 23:38:34 +08:00
|
|
|
}
|
|
|
|
|
2025-06-22 17:14:49 +08:00
|
|
|
} // namespace yycctest::string::op
|