#include #include #include #include #include #include namespace { void Require(bool condition) { if (!condition) throw std::runtime_error("NID buffer validation failed"); } template void RequireRejected(TAction action) { try { action(); } catch (const std::runtime_error&) { return; } throw std::runtime_error("Malformed NID buffer was accepted"); } } int main() { try { using namespace Nid::Internal; const std::vector unterminated{'n', 'a', 'm', 'e'}; RequireRejected([&] { ReadCStr(unterminated, 0); }); RequireRejected([&] { ReadCStr(unterminated, 3); }); const std::vector strings{'a', 0, 'b', 'c', 0}; Require(ReadCStr(strings, 0) == "a"); Require(ReadCStr(strings, 1).empty()); Require(ReadCStr(strings, 2) == "bc"); Require(ReadCStr(strings, 4).empty()); RequireRejected([&] { ReadCStr(strings, strings.size()); }); RequireRejected([&] { ReadCStr({}, 0); }); std::vector bytes(8, 0xa5); const std::uint64_t value = 0x1020304050607080; Write(bytes, 0, value); Require(Read(bytes, 0) == value); Write(bytes, 4, 0x12345678); Require(Read(bytes, 4) == 0x12345678); const auto before = bytes; for (const auto offset : {std::size_t{5}, std::size_t{8}, std::size_t{9}, std::numeric_limits::max(), std::numeric_limits::max() - 1, std::numeric_limits::max() - 3}) { RequireRejected([&] { Read(bytes, offset); }); RequireRejected([&] { Write(bytes, offset, 0); }); Require(bytes == before); } RequireRejected([&] { Read(bytes, 1); }); std::vector empty; RequireRejected([&] { Read(empty, 0); }); RequireRejected([&] { Write(empty, 0, 0); }); std::cout << "NID buffer validation passed\n"; } catch (const std::exception& error) { std::cerr << error.what() << '\n'; return 1; } }