@@ -6,6 +6,7 @@ import CppUtils;
66namespace CppUtils::UnitTest::FileSystem::File
77{
88 auto _ = TestSuite{"FileSystem/File", {"Logger", "FileSystem/Directory"}, [](TestSuite& suite) {
9+ using namespace std::literals;
910 using Logger = TestSuite::Logger;
1011
1112 suite.addTest("forFiles", [&] {
@@ -33,6 +34,86 @@ namespace CppUtils::UnitTest::FileSystem::File
3334 suite.expectEqual(filesCounter, 1u);
3435 }};
3536 });
37+
38+ suite.addTest("Binary/readByBlocks", [&] {
39+ CppUtils::FileSystem::TemporaryDirectory{[&suite](const auto& directory) -> void {
40+ const auto filePath = directory / "test.tmp";
41+ auto originalData = std::vector<std::byte>{std::byte{0xDE}, std::byte{0xAD}, std::byte{0xBE}, std::byte{0xEF}};
42+ CppUtils::FileSystem::Binary::writeVector(filePath, originalData);
43+
44+ auto resultData = std::vector<std::byte>{};
45+ auto nbBlocks = 0u;
46+ const auto blockSize = 2uz;
47+ const auto result = CppUtils::FileSystem::Binary::readByBlocks(filePath, [&](auto block) {
48+ resultData.insert(std::end(resultData), std::begin(block), std::end(block));
49+ ++nbBlocks;
50+ }, blockSize);
51+
52+ suite.expect(result.has_value());
53+ suite.expectEqual(resultData, originalData);
54+ suite.expectEqual(nbBlocks, (std::size(originalData) + blockSize - 1) / blockSize);
55+ }};
56+ });
57+
58+ suite.addTest("String/readByBlocks", [&] {
59+ CppUtils::FileSystem::TemporaryDirectory{[&suite](const auto& directory) -> void {
60+ const auto filePath = directory / "test.tmp";
61+ constexpr auto originalString = "Hello World!"sv;
62+ CppUtils::FileSystem::String::write(filePath, originalString);
63+
64+ auto resultString = ""s;
65+ auto nbBlocks = 0u;
66+ const auto blockSize = 5uz;
67+ const auto result = CppUtils::FileSystem::String::readByBlocks(filePath, [&](std::string_view block) {
68+ resultString += block;
69+ ++nbBlocks;
70+ }, blockSize);
71+
72+ suite.expect(result.has_value());
73+ suite.expectEqual(resultString, originalString);
74+ suite.expectEqual(nbBlocks, (std::size(originalString) + blockSize - 1) / blockSize);
75+ }};
76+ });
77+
78+ suite.addTest("readByBlocks (error)", [&] {
79+ const auto result = CppUtils::FileSystem::Binary::readByBlocks("non_existent_file.tmp", [](auto) {});
80+ suite.expect(not result.has_value());
81+ suite.expect(result.error().type == CppUtils::FileSystem::Error::Type::OpenFailed);
82+ suite.expectEqual(result.error().message, "Failed to open file"sv);
83+ });
84+
85+ suite.addTest("readByBlocks (callback error propagation)", [&] {
86+ CppUtils::FileSystem::TemporaryDirectory{[&suite](const auto& directory) -> void {
87+ const auto filePath = directory / "test.tmp";
88+ CppUtils::FileSystem::String::write(filePath, "Some content");
89+
90+ const auto result = CppUtils::FileSystem::Binary::readByBlocks(filePath, [](auto) -> std::expected<void, std::string_view> {
91+ return std::unexpected{"Error from callback"};
92+ });
93+
94+ suite.expect(not result.has_value());
95+ suite.expect(result.error().type == CppUtils::FileSystem::Error::Type::CallbackError);
96+ suite.expectEqual(result.error().message, "Error from callback"sv);
97+ }};
98+ });
99+
100+ suite.addTest("IncrementalHash", [&] {
101+ CppUtils::FileSystem::TemporaryDirectory{[&suite](const auto& directory) -> void {
102+ const auto filePath = directory / "test.tmp";
103+ constexpr auto originalString = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."sv;
104+ CppUtils::FileSystem::String::write(filePath, originalString);
105+
106+ auto finalHash = CppUtils::Type::HashOffset;
107+ const auto result = CppUtils::FileSystem::Binary::readByBlocks(filePath, [&finalHash](auto block) {
108+ finalHash = CppUtils::Type::hash(block, finalHash);
109+ }, 8uz);
110+
111+ suite.expect(result.has_value());
112+ auto expectedHash = CppUtils::Type::hash(originalString);
113+
114+ suite.expectEqual(finalHash, expectedHash);
115+ }};
116+ });
36117 }};
37118
38119 namespace Binary
0 commit comments