1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 02:47:35 +00:00

AK: Add String::from_stream method

The caller is responsible for determining how long the string is that
they want to read.
This commit is contained in:
Andrew Kaster 2023-02-19 18:34:29 -07:00 committed by Linus Groh
parent 7ac7a73758
commit 0ea697ace5
3 changed files with 84 additions and 0 deletions

View file

@ -10,6 +10,7 @@
#include <LibTest/TestCase.h>
#include <AK/MemoryStream.h>
#include <AK/StringBuilder.h>
#include <AK/Try.h>
#include <AK/Utf8View.h>
@ -67,6 +68,54 @@ TEST_CASE(long_strings)
EXPECT_EQ(string.bytes_as_string_view(), "abcdefgh"sv);
}
TEST_CASE(long_streams)
{
{
u8 bytes[64] = {};
constexpr auto test_view = "Well, hello friends"sv;
FixedMemoryStream stream(Bytes { bytes, sizeof(bytes) });
MUST(stream.write(test_view.bytes()));
MUST(stream.seek(0));
auto string = MUST(String::from_stream(stream, test_view.length()));
EXPECT_EQ(string.is_short_string(), false);
EXPECT_EQ(string.bytes().size(), 19u);
EXPECT_EQ(string.bytes_as_string_view(), test_view);
}
{
AllocatingMemoryStream stream;
MUST(stream.write(("abc"sv).bytes()));
auto string = MUST(String::from_stream(stream, 3u));
EXPECT_EQ(string.is_short_string(), true);
EXPECT_EQ(string.bytes().size(), 3u);
EXPECT_EQ(string.bytes_as_string_view(), "abc"sv);
}
{
AllocatingMemoryStream stream;
MUST(stream.write(("0123456789"sv).bytes()));
auto string = MUST(String::from_stream(stream, 9u));
EXPECT_EQ(string.is_short_string(), false);
EXPECT_EQ(string.bytes().size(), 9u);
EXPECT_EQ(string.bytes_as_string_view(), "012345678"sv);
}
{
AllocatingMemoryStream stream;
MUST(stream.write_value(0xffffffff));
MUST(stream.write_value(0xffffffff));
MUST(stream.write_value(0xffffffff));
auto error_or_string = String::from_stream(stream, stream.used_buffer_size());
EXPECT_EQ(error_or_string.is_error(), true);
}
}
TEST_CASE(from_code_points)
{
for (u32 code_point = 0; code_point < 0x80; ++code_point) {