| // __ _____ _____ _____ |
| // __| | __| | | | JSON for Modern C++ (supporting code) |
| // | | |__ | | | | | | version 3.12.0 |
| // |_____|_____|_____|_|___| https://github.com/nlohmann/json |
| // |
| // SPDX-FileCopyrightText: 2013-2026 Niels Lohmann <https://nlohmann.me> |
| // SPDX-License-Identifier: MIT |
| |
| // This file contains the C++17-only part of unit-msgpack.cpp (std::byte |
| // input). It is kept in a separate translation unit so the (much larger) |
| // unit-msgpack.cpp does not need to be compiled and run a second time just |
| // for this one test case (#5418). |
| |
| #include "doctest_compatibility.h" |
| |
| #include <nlohmann/json.hpp> |
| using nlohmann::json; |
| |
| #ifdef JSON_HAS_CPP_17 |
| #include <cstddef> |
| #include <vector> |
| |
| // Test suite for verifying MessagePack handling with std::byte input |
| TEST_CASE("MessagePack with std::byte") |
| { |
| |
| SECTION("std::byte compatibility") |
| { |
| SECTION("vector roundtrip") |
| { |
| json original = |
| { |
| {"name", "test"}, |
| {"value", 42}, |
| {"array", {1, 2, 3}} |
| }; |
| |
| std::vector<uint8_t> temp = json::to_msgpack(original); |
| // Convert the uint8_t vector to std::byte vector |
| std::vector<std::byte> msgpack_data(temp.size()); |
| for (size_t i = 0; i < temp.size(); ++i) |
| { |
| msgpack_data[i] = std::byte(temp[i]); |
| } |
| // Deserialize from std::byte vector back to JSON |
| json from_bytes; |
| CHECK_NOTHROW(from_bytes = json::from_msgpack(msgpack_data)); |
| |
| CHECK(from_bytes == original); |
| } |
| |
| SECTION("empty vector") |
| { |
| const std::vector<std::byte> empty_data; |
| CHECK_THROWS_WITH_AS([&]() |
| { |
| [[maybe_unused]] auto result = json::from_msgpack(empty_data); |
| return true; |
| } |
| (), |
| "[json.exception.parse_error.110] parse error at byte 1: syntax error while parsing MessagePack value: unexpected end of input", |
| json::parse_error&); |
| } |
| |
| SECTION("comparison with workaround") |
| { |
| json original = |
| { |
| {"string", "hello"}, |
| {"integer", 42}, |
| {"float", 3.14}, |
| {"boolean", true}, |
| {"null", nullptr}, |
| {"array", {1, 2, 3}}, |
| {"object", {{"key", "value"}}} |
| }; |
| |
| std::vector<uint8_t> temp = json::to_msgpack(original); |
| |
| std::vector<std::byte> msgpack_data(temp.size()); |
| for (size_t i = 0; i < temp.size(); ++i) |
| { |
| msgpack_data[i] = std::byte(temp[i]); |
| } |
| // Attempt direct deserialization using std::byte input |
| const json direct_result = json::from_msgpack(msgpack_data); |
| |
| // Test the workaround approach: reinterpret as unsigned char* and use iterator range |
| const auto* const char_start = reinterpret_cast<unsigned char const*>(msgpack_data.data()); |
| const auto* const char_end = char_start + msgpack_data.size(); |
| json workaround_result = json::from_msgpack(char_start, char_end); |
| |
| // Verify that the final deserialized JSON matches the original JSON |
| CHECK(direct_result == workaround_result); |
| CHECK(direct_result == original); |
| } |
| } |
| } |
| #endif |