mirror of
https://github.com/RGBCube/serenity
synced 2025-05-22 14:45:08 +00:00

Since AK can't refer to LibUnicode directly, the strategy here is that if you need case transformations, you can link LibUnicode and receive them. If you try to use either of these methods without linking it, then you'll of course get a linker error (note we don't do any fallbacks to e.g. ASCII case transformations). If you don't need these methods, you don't have to link LibUnicode.
147 lines
3.8 KiB
C++
147 lines
3.8 KiB
C++
/*
|
||
* Copyright (c) 2022, Andreas Kling <kling@serenityos.org>
|
||
*
|
||
* SPDX-License-Identifier: BSD-2-Clause
|
||
*/
|
||
|
||
#include <LibTest/TestCase.h>
|
||
|
||
#include <AK/String.h>
|
||
#include <AK/StringBuilder.h>
|
||
#include <AK/Try.h>
|
||
#include <AK/Utf8View.h>
|
||
#include <AK/Vector.h>
|
||
|
||
TEST_CASE(construct_empty)
|
||
{
|
||
String empty;
|
||
EXPECT(empty.is_empty());
|
||
EXPECT_EQ(empty.bytes().size(), 0u);
|
||
|
||
auto empty2 = MUST(String::from_utf8(""sv));
|
||
EXPECT(empty2.is_empty());
|
||
EXPECT_EQ(empty, empty2);
|
||
EXPECT_EQ(empty, ""sv);
|
||
}
|
||
|
||
TEST_CASE(move_assignment)
|
||
{
|
||
String string1 = MUST(String::from_utf8("hello"sv));
|
||
string1 = MUST(String::from_utf8("friends!"sv));
|
||
EXPECT_EQ(string1, "friends!"sv);
|
||
}
|
||
|
||
TEST_CASE(short_strings)
|
||
{
|
||
#ifdef AK_ARCH_64_BIT
|
||
auto string = MUST(String::from_utf8("abcdefg"sv));
|
||
EXPECT_EQ(string.is_short_string(), true);
|
||
EXPECT_EQ(string.bytes().size(), 7u);
|
||
EXPECT_EQ(string.bytes_as_string_view(), "abcdefg"sv);
|
||
#else
|
||
auto string = MUST(String::from_utf8("abc"sv));
|
||
EXPECT_EQ(string.is_short_string(), true);
|
||
EXPECT_EQ(string.bytes().size(), 3u);
|
||
EXPECT_EQ(string.bytes_as_string_view(), "abc"sv);
|
||
#endif
|
||
}
|
||
|
||
TEST_CASE(long_strings)
|
||
{
|
||
auto string = MUST(String::from_utf8("abcdefgh"sv));
|
||
EXPECT_EQ(string.is_short_string(), false);
|
||
EXPECT_EQ(string.bytes().size(), 8u);
|
||
EXPECT_EQ(string.bytes_as_string_view(), "abcdefgh"sv);
|
||
}
|
||
|
||
TEST_CASE(substring)
|
||
{
|
||
auto superstring = MUST(String::from_utf8("Hello I am a long string"sv));
|
||
auto short_substring = MUST(superstring.substring_from_byte_offset(0, 5));
|
||
EXPECT_EQ(short_substring, "Hello"sv);
|
||
|
||
auto long_substring = MUST(superstring.substring_from_byte_offset(0, 10));
|
||
EXPECT_EQ(long_substring, "Hello I am"sv);
|
||
}
|
||
|
||
TEST_CASE(code_points)
|
||
{
|
||
auto string = MUST(String::from_utf8("🦬🪒"sv));
|
||
|
||
Vector<u32> code_points;
|
||
for (auto code_point : string.code_points())
|
||
code_points.append(code_point);
|
||
|
||
EXPECT_EQ(code_points[0], 0x1f9acu);
|
||
EXPECT_EQ(code_points[1], 0x1fa92u);
|
||
}
|
||
|
||
TEST_CASE(string_builder)
|
||
{
|
||
StringBuilder builder;
|
||
builder.append_code_point(0x1f9acu);
|
||
builder.append_code_point(0x1fa92u);
|
||
|
||
auto string = MUST(builder.to_string());
|
||
EXPECT_EQ(string, "🦬🪒"sv);
|
||
EXPECT_EQ(string.bytes().size(), 8u);
|
||
}
|
||
|
||
TEST_CASE(ak_format)
|
||
{
|
||
auto foo = MUST(String::formatted("Hello {}", MUST(String::from_utf8("friends"sv))));
|
||
EXPECT_EQ(foo, "Hello friends"sv);
|
||
}
|
||
|
||
TEST_CASE(replace)
|
||
{
|
||
{
|
||
auto haystack = MUST(String::from_utf8("Hello enemies"sv));
|
||
auto result = MUST(haystack.replace("enemies"sv, "friends"sv, ReplaceMode::All));
|
||
EXPECT_EQ(result, "Hello friends"sv);
|
||
}
|
||
|
||
{
|
||
auto base_title = MUST(String::from_utf8("anon@courage:~"sv));
|
||
auto result = MUST(base_title.replace("[*]"sv, "(*)"sv, ReplaceMode::FirstOnly));
|
||
EXPECT_EQ(result, "anon@courage:~"sv);
|
||
}
|
||
}
|
||
|
||
TEST_CASE(to_lowercase)
|
||
{
|
||
{
|
||
auto string = MUST(String::from_utf8("Aa"sv));
|
||
auto result = MUST(string.to_lowercase());
|
||
EXPECT_EQ(result, "aa"sv);
|
||
}
|
||
{
|
||
auto string = MUST(String::from_utf8("Ωω"sv));
|
||
auto result = MUST(string.to_lowercase());
|
||
EXPECT_EQ(result, "ωω"sv);
|
||
}
|
||
{
|
||
auto string = MUST(String::from_utf8("İi̇"sv));
|
||
auto result = MUST(string.to_lowercase());
|
||
EXPECT_EQ(result, "i̇i̇"sv);
|
||
}
|
||
}
|
||
|
||
TEST_CASE(to_uppercase)
|
||
{
|
||
{
|
||
auto string = MUST(String::from_utf8("Aa"sv));
|
||
auto result = MUST(string.to_uppercase());
|
||
EXPECT_EQ(result, "AA"sv);
|
||
}
|
||
{
|
||
auto string = MUST(String::from_utf8("Ωω"sv));
|
||
auto result = MUST(string.to_uppercase());
|
||
EXPECT_EQ(result, "ΩΩ"sv);
|
||
}
|
||
{
|
||
auto string = MUST(String::from_utf8("ʼn"sv));
|
||
auto result = MUST(string.to_uppercase());
|
||
EXPECT_EQ(result, "ʼN"sv);
|
||
}
|
||
}
|