aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorYuqian Yang <crupest@crupest.life>2026-03-07 20:42:37 +0800
committerYuqian Yang <crupest@crupest.life>2026-03-07 20:42:37 +0800
commit38756822825e20eca3b9e01b735946175223d692 (patch)
treefc2a495bfc0e082d5ed9a1642278ae6467fe2742 /test
parent924f4b472712d0cfc55b81dcb3eaed3f8a478288 (diff)
downloadcru-38756822825e20eca3b9e01b735946175223d692.tar.gz
cru-38756822825e20eca3b9e01b735946175223d692.tar.bz2
cru-38756822825e20eca3b9e01b735946175223d692.zip
Refactor stream.
Diffstat (limited to 'test')
-rw-r--r--test/base/CMakeLists.txt3
-rw-r--r--test/base/io/AutoReadStreamTest.cpp32
-rw-r--r--test/base/io/BufferStreamTest.cpp39
-rw-r--r--test/base/io/MemoryStreamTest.cpp30
-rw-r--r--test/base/platform/win/StreamTest.cpp7
5 files changed, 107 insertions, 4 deletions
diff --git a/test/base/CMakeLists.txt b/test/base/CMakeLists.txt
index 52f61a8c..94022b1a 100644
--- a/test/base/CMakeLists.txt
+++ b/test/base/CMakeLists.txt
@@ -5,6 +5,9 @@ add_executable(CruBaseTest
StringUtilTest.cpp
SubProcessTest.cpp
TimerTest.cpp
+ io/AutoReadStreamTest.cpp
+ io/BufferStreamTest.cpp
+ io/MemoryStreamTest.cpp
toml/ParserTest.cpp
xml/ParserTest.cpp
)
diff --git a/test/base/io/AutoReadStreamTest.cpp b/test/base/io/AutoReadStreamTest.cpp
new file mode 100644
index 00000000..e95b7c24
--- /dev/null
+++ b/test/base/io/AutoReadStreamTest.cpp
@@ -0,0 +1,32 @@
+#include "cru/base/io/AutoReadStream.h"
+#include "cru/base/io/MemoryStream.h"
+
+#include <catch2/catch_test_macros.hpp>
+
+#include <algorithm>
+#include <cstddef>
+#include <ranges>
+
+TEST_CASE("AutoReadStream should work.", "[io][stream]") {
+ using namespace cru::io;
+
+ const int size = 100;
+ std::vector<std::byte> buffer(size);
+ buffer[1] = std::byte(0xf0);
+ buffer[2] = std::byte(0x0f);
+
+ MemoryStream underlying_stream(buffer.data(), buffer.size(), true);
+ AutoReadStream stream(&underlying_stream, true, false);
+
+ REQUIRE(stream.CanRead());
+ REQUIRE(!stream.CanWrite());
+
+ std::vector<std::byte> buffer2(size * 2);
+
+ auto read = stream.Read(buffer2.data(), buffer2.size());
+ auto read2 = stream.Read(buffer2.data(), size, 1);
+
+ REQUIRE(read == size);
+ REQUIRE(std::ranges::equal(buffer, buffer2 | std::views::take(size)));
+ REQUIRE(read2 == Stream::kEOF);
+}
diff --git a/test/base/io/BufferStreamTest.cpp b/test/base/io/BufferStreamTest.cpp
new file mode 100644
index 00000000..70780b48
--- /dev/null
+++ b/test/base/io/BufferStreamTest.cpp
@@ -0,0 +1,39 @@
+#include "cru/base/io/BufferStream.h"
+
+#include <catch2/catch_test_macros.hpp>
+
+#include <algorithm>
+#include <cstddef>
+#include <ranges>
+#include <thread>
+
+TEST_CASE("BufferStream should work.", "[io][stream]") {
+ using namespace cru::io;
+
+ const int size = 100;
+ std::vector<std::byte> buffer(size);
+ buffer[1] = std::byte(0xf0);
+ buffer[2] = std::byte(0x0f);
+
+ BufferStream stream;
+
+ std::vector<std::byte> buffer2(size * 2);
+ cru::Index read, read2;
+
+ std::thread read_thread([&] {
+ read = stream.Read(buffer2.data(), buffer2.size());
+ read2 = stream.Read(buffer2.data(), size, 1);
+ });
+
+ std::thread write_thread([&] {
+ stream.Write(buffer.data(), buffer.size());
+ stream.WriteEof();
+ });
+
+ read_thread.join();
+ write_thread.join();
+
+ REQUIRE(read == size);
+ REQUIRE(std::ranges::equal(buffer, buffer2 | std::views::take(size)));
+ REQUIRE(read2 == Stream::kEOF);
+}
diff --git a/test/base/io/MemoryStreamTest.cpp b/test/base/io/MemoryStreamTest.cpp
new file mode 100644
index 00000000..684971b1
--- /dev/null
+++ b/test/base/io/MemoryStreamTest.cpp
@@ -0,0 +1,30 @@
+#include "cru/base/io/MemoryStream.h"
+#include "cru/base/io/Stream.h"
+
+#include <catch2/catch_test_macros.hpp>
+
+#include <algorithm>
+#include <cstddef>
+#include <ranges>
+
+TEST_CASE("MemoryStream should work.", "[io][stream]") {
+ using namespace cru::io;
+ const int size = 100;
+ std::vector<std::byte> buffer(size);
+
+ buffer[1] = std::byte(0xf0);
+ buffer[2] = std::byte(0x0f);
+
+ MemoryStream stream(buffer.data(), size, true);
+
+ REQUIRE(stream.CanRead());
+ REQUIRE(!stream.CanWrite());
+
+ std::vector<std::byte> buffer2(size * 2);
+
+ auto read = stream.Read(buffer2.data(), buffer2.size());
+ auto read2 = stream.Read(buffer2.data(), 1);
+ REQUIRE(read == size);
+ REQUIRE(std::ranges::equal(buffer, buffer2 | std::views::take(size)));
+ REQUIRE(read2 == Stream::kEOF);
+}
diff --git a/test/base/platform/win/StreamTest.cpp b/test/base/platform/win/StreamTest.cpp
index f42fc5c2..56761b14 100644
--- a/test/base/platform/win/StreamTest.cpp
+++ b/test/base/platform/win/StreamTest.cpp
@@ -1,3 +1,4 @@
+#include "cru/base/Guard.h"
#include "cru/base/StringUtil.h"
#include "cru/base/platform/win/Stream.h"
@@ -15,6 +16,7 @@ TEST_CASE("StreamConvert FileStreamWork", "[stream]") {
(std::filesystem::temp_directory_path() / "cru_test_temp.XXXXXX")
.native();
_wmktemp(temp_file_path.data());
+ Guard _([temp_file_path] { std::filesystem::remove(temp_file_path); });
std::string path = string::ToUtf8String(temp_file_path);
@@ -32,8 +34,6 @@ TEST_CASE("StreamConvert FileStreamWork", "[stream]") {
REQUIRE(std::string_view(buffer.get(), 3) == "abc");
com_stream->Release();
file2.Close();
-
- std::filesystem::remove(temp_file_path);
}
TEST_CASE("ComStream Work", "[stream]") {
@@ -45,6 +45,7 @@ TEST_CASE("ComStream Work", "[stream]") {
(std::filesystem::temp_directory_path() / "cru_test_temp.XXXXXX")
.native();
_wmktemp(temp_file_path.data());
+ Guard _([temp_file_path] { std::filesystem::remove(temp_file_path); });
std::string path = string::ToUtf8String(temp_file_path);
@@ -62,6 +63,4 @@ TEST_CASE("ComStream Work", "[stream]") {
REQUIRE(std::string_view(reinterpret_cast<const char*>(buffer.get()), 3) ==
"abc");
file2.Close();
-
- std::filesystem::remove(temp_file_path);
}