Merge branch 'develop' of https://github.com/nlohmann/json into issue2286
Conflicts: single_include/nlohmann/json.hpp
This commit is contained in:
commit
42f8708940
22 changed files with 2770 additions and 2785 deletions
|
@ -151,7 +151,7 @@ foreach(file ${files})
|
|||
$<$<NOT:$<CXX_COMPILER_ID:MSVC>>:-Wno-deprecated;-Wno-float-equal>
|
||||
$<$<CXX_COMPILER_ID:GNU>:-Wno-deprecated-declarations>
|
||||
)
|
||||
target_include_directories(${testcase} PRIVATE ${CMAKE_BINARY_DIR}/include thirdparty/doctest thirdparty/fifo_map)
|
||||
target_include_directories(${testcase} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/utils ${CMAKE_BINARY_DIR}/include thirdparty/doctest thirdparty/fifo_map)
|
||||
target_link_libraries(${testcase} PRIVATE ${NLOHMANN_JSON_TARGET_NAME})
|
||||
|
||||
if (JSON_Coverage)
|
||||
|
|
3
test/cmake_target_include_directories/project/Bar.cpp
Normal file
3
test/cmake_target_include_directories/project/Bar.cpp
Normal file
|
@ -0,0 +1,3 @@
|
|||
#include "Bar.hpp"
|
||||
|
||||
class Bar;
|
4
test/cmake_target_include_directories/project/Bar.hpp
Normal file
4
test/cmake_target_include_directories/project/Bar.hpp
Normal file
|
@ -0,0 +1,4 @@
|
|||
#include <nlohmann/json.hpp>
|
||||
#include "Foo.hpp"
|
||||
|
||||
class Bar : public Foo{};
|
|
@ -9,3 +9,13 @@ set_target_properties(with_private_target PROPERTIES CXX_STANDARD 11)
|
|||
add_executable(with_private_system_target main.cpp)
|
||||
target_include_directories(with_private_system_target PRIVATE SYSTEM ${nlohmann_json_source}/include)
|
||||
set_target_properties(with_private_system_target PROPERTIES CXX_STANDARD 11)
|
||||
|
||||
# regression from https://github.com/nlohmann/json/discussions/2281
|
||||
add_library(Foo STATIC Foo.cpp Bar.cpp)
|
||||
target_include_directories(Foo PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} ${nlohmann_json_source}/include)
|
||||
set_target_properties(Foo PROPERTIES CXX_STANDARD 11)
|
||||
|
||||
add_library(Bar STATIC Bar.cpp)
|
||||
target_link_libraries(Bar PRIVATE Foo)
|
||||
target_include_directories(Bar PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} ${nlohmann_json_source}/include)
|
||||
set_target_properties(Bar PROPERTIES CXX_STANDARD 11)
|
||||
|
|
3
test/cmake_target_include_directories/project/Foo.cpp
Normal file
3
test/cmake_target_include_directories/project/Foo.cpp
Normal file
|
@ -0,0 +1,3 @@
|
|||
#include "Foo.hpp"
|
||||
|
||||
class Foo;
|
4
test/cmake_target_include_directories/project/Foo.hpp
Normal file
4
test/cmake_target_include_directories/project/Foo.hpp
Normal file
|
@ -0,0 +1,4 @@
|
|||
#pragma once
|
||||
#include <nlohmann/json.hpp>
|
||||
|
||||
class Foo{};
|
|
@ -35,6 +35,7 @@ using nlohmann::json;
|
|||
#include <fstream>
|
||||
#include <sstream>
|
||||
#include <test_data.hpp>
|
||||
#include <test_utils.hpp>
|
||||
|
||||
TEST_CASE("BSON")
|
||||
{
|
||||
|
@ -1263,10 +1264,7 @@ TEST_CASE("BSON roundtrips" * doctest::skip())
|
|||
json j1 = json::parse(f_json);
|
||||
|
||||
// parse BSON file
|
||||
std::ifstream f_bson(filename + ".bson", std::ios::binary);
|
||||
std::vector<std::uint8_t> packed(
|
||||
(std::istreambuf_iterator<char>(f_bson)),
|
||||
std::istreambuf_iterator<char>());
|
||||
auto packed = utils::read_binary_file(filename + ".bson");
|
||||
json j2;
|
||||
CHECK_NOTHROW(j2 = json::from_bson(packed));
|
||||
|
||||
|
@ -1296,10 +1294,7 @@ TEST_CASE("BSON roundtrips" * doctest::skip())
|
|||
json j1 = json::parse(f_json);
|
||||
|
||||
// parse BSON file
|
||||
std::ifstream f_bson(filename + ".bson", std::ios::binary);
|
||||
std::vector<std::uint8_t> packed(
|
||||
(std::istreambuf_iterator<char>(f_bson)),
|
||||
std::istreambuf_iterator<char>());
|
||||
auto packed = utils::read_binary_file(filename + ".bson");
|
||||
json j2;
|
||||
CHECK_NOTHROW(j2 = json::from_bson({packed.data(), packed.size()}));
|
||||
|
||||
|
@ -1314,10 +1309,7 @@ TEST_CASE("BSON roundtrips" * doctest::skip())
|
|||
json j1 = json::parse(f_json);
|
||||
|
||||
// parse BSON file
|
||||
std::ifstream f_bson(filename + ".bson", std::ios::binary);
|
||||
std::vector<std::uint8_t> packed(
|
||||
(std::istreambuf_iterator<char>(f_bson)),
|
||||
std::istreambuf_iterator<char>());
|
||||
auto packed = utils::read_binary_file(filename + ".bson");
|
||||
|
||||
{
|
||||
INFO_WITH_TEMP(filename + ": output adapters: std::vector<std::uint8_t>");
|
||||
|
|
|
@ -39,6 +39,7 @@ using nlohmann::json;
|
|||
#include <iostream>
|
||||
#include <set>
|
||||
#include <test_data.hpp>
|
||||
#include <test_utils.hpp>
|
||||
|
||||
namespace
|
||||
{
|
||||
|
@ -1920,9 +1921,7 @@ TEST_CASE("single CBOR roundtrip")
|
|||
json j1 = json::parse(f_json);
|
||||
|
||||
// parse CBOR file
|
||||
std::ifstream f_cbor(filename + ".cbor", std::ios::binary);
|
||||
std::vector<uint8_t> packed((std::istreambuf_iterator<char>(f_cbor)),
|
||||
std::istreambuf_iterator<char>());
|
||||
auto packed = utils::read_binary_file(filename + ".cbor");
|
||||
json j2;
|
||||
CHECK_NOTHROW(j2 = json::from_cbor(packed));
|
||||
|
||||
|
@ -1994,10 +1993,7 @@ TEST_CASE("CBOR regressions")
|
|||
try
|
||||
{
|
||||
// parse CBOR file
|
||||
std::ifstream f_cbor(filename, std::ios::binary);
|
||||
std::vector<uint8_t> vec1(
|
||||
(std::istreambuf_iterator<char>(f_cbor)),
|
||||
std::istreambuf_iterator<char>());
|
||||
auto vec1 = utils::read_binary_file(filename);
|
||||
json j1 = json::from_cbor(vec1);
|
||||
|
||||
try
|
||||
|
@ -2204,10 +2200,7 @@ TEST_CASE("CBOR roundtrips" * doctest::skip())
|
|||
json j1 = json::parse(f_json);
|
||||
|
||||
// parse CBOR file
|
||||
std::ifstream f_cbor(filename + ".cbor", std::ios::binary);
|
||||
std::vector<uint8_t> packed(
|
||||
(std::istreambuf_iterator<char>(f_cbor)),
|
||||
std::istreambuf_iterator<char>());
|
||||
auto packed = utils::read_binary_file(filename + ".cbor");
|
||||
json j2;
|
||||
CHECK_NOTHROW(j2 = json::from_cbor(packed));
|
||||
|
||||
|
@ -2237,10 +2230,7 @@ TEST_CASE("CBOR roundtrips" * doctest::skip())
|
|||
json j1 = json::parse(f_json);
|
||||
|
||||
// parse CBOR file
|
||||
std::ifstream f_cbor(filename + ".cbor", std::ios::binary);
|
||||
std::vector<uint8_t> packed(
|
||||
(std::istreambuf_iterator<char>(f_cbor)),
|
||||
std::istreambuf_iterator<char>());
|
||||
auto packed = utils::read_binary_file(filename + ".cbor");
|
||||
json j2;
|
||||
CHECK_NOTHROW(j2 = json::from_cbor({packed.data(), packed.size()}));
|
||||
|
||||
|
@ -2255,10 +2245,7 @@ TEST_CASE("CBOR roundtrips" * doctest::skip())
|
|||
json j1 = json::parse(f_json);
|
||||
|
||||
// parse CBOR file
|
||||
std::ifstream f_cbor(filename + ".cbor", std::ios::binary);
|
||||
std::vector<uint8_t> packed(
|
||||
(std::istreambuf_iterator<char>(f_cbor)),
|
||||
std::istreambuf_iterator<char>());
|
||||
auto packed = utils::read_binary_file(filename + ".cbor");
|
||||
|
||||
if (!exclude_packed.count(filename))
|
||||
{
|
||||
|
@ -2493,15 +2480,11 @@ TEST_CASE("examples from RFC 7049 Appendix A")
|
|||
|
||||
SECTION("byte arrays")
|
||||
{
|
||||
std::ifstream f_cbor(TEST_DATA_DIRECTORY "/binary_data/cbor_binary.cbor", std::ios::binary);
|
||||
std::vector<uint8_t> packed((std::istreambuf_iterator<char>(f_cbor)),
|
||||
std::istreambuf_iterator<char>());
|
||||
auto packed = utils::read_binary_file(TEST_DATA_DIRECTORY "/binary_data/cbor_binary.cbor");
|
||||
json j;
|
||||
CHECK_NOTHROW(j = json::from_cbor(packed));
|
||||
|
||||
std::ifstream f_bin(TEST_DATA_DIRECTORY "/binary_data/cbor_binary.out", std::ios::binary);
|
||||
std::vector<uint8_t> expected((std::istreambuf_iterator<char>(f_bin)),
|
||||
std::istreambuf_iterator<char>());
|
||||
auto expected = utils::read_binary_file(TEST_DATA_DIRECTORY "/binary_data/cbor_binary.out");
|
||||
CHECK(j == json::binary(expected));
|
||||
|
||||
CHECK(json::to_cbor(json::binary(std::vector<uint8_t> {}, 0x42)) == std::vector<uint8_t> {0xd8, 0x42, 0x40});
|
||||
|
@ -2722,4 +2705,25 @@ TEST_CASE("Tagged values")
|
|||
CHECK_THROWS_AS(json::from_cbor(v_tagged, true, true, json::cbor_tag_handler_t::ignore), json::parse_error);
|
||||
}
|
||||
}
|
||||
|
||||
SECTION("tagged binary")
|
||||
{
|
||||
// create a binary value of subtype 42
|
||||
json j;
|
||||
j["binary"] = json::binary({0xCA, 0xFE, 0xBA, 0xBE}, 42);
|
||||
|
||||
// convert to CBOR
|
||||
const auto v = json::to_cbor(j);
|
||||
CHECK(v == std::vector<std::uint8_t> {0xA1, 0x66, 0x62, 0x69, 0x6E, 0x61, 0x72, 0x79, 0xD8, 0x2A, 0x44, 0xCA, 0xFE, 0xBA, 0xBE});
|
||||
|
||||
// parse error when parsing tagged value
|
||||
CHECK_THROWS_AS(json::from_cbor(v), json::parse_error);
|
||||
CHECK_THROWS_WITH(json::from_cbor(v), "[json.exception.parse_error.112] parse error at byte 9: syntax error while parsing CBOR value: invalid byte: 0xD8");
|
||||
|
||||
// binary without subtype when tags are ignored
|
||||
json jb = json::from_cbor(v, true, true, json::cbor_tag_handler_t::ignore);
|
||||
CHECK(jb.is_object());
|
||||
CHECK(jb["binary"].is_binary());
|
||||
CHECK(!jb["binary"].get_binary().has_subtype());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -278,8 +278,8 @@ TEST_CASE("value conversion")
|
|||
SECTION("reserve is called on containers that supports it")
|
||||
{
|
||||
// make sure all values are properly copied
|
||||
json j({1, 2, 3, 4, 5, 6, 7, 8, 9, 10});
|
||||
auto v2 = j.get<std::vector<int>>();
|
||||
json j2({1, 2, 3, 4, 5, 6, 7, 8, 9, 10});
|
||||
auto v2 = j2.get<std::vector<int>>();
|
||||
CHECK(v2.size() == 10);
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -37,6 +37,7 @@ using nlohmann::json;
|
|||
#include <iomanip>
|
||||
#include <set>
|
||||
#include <test_data.hpp>
|
||||
#include <test_utils.hpp>
|
||||
|
||||
namespace
|
||||
{
|
||||
|
@ -514,7 +515,7 @@ TEST_CASE("MessagePack")
|
|||
(static_cast<uint32_t>(result[2]) << 020) +
|
||||
(static_cast<uint32_t>(result[3]) << 010) +
|
||||
static_cast<uint32_t>(result[4]);
|
||||
CHECK(restored == i);
|
||||
CHECK(static_cast<std::int32_t>(restored) == i);
|
||||
|
||||
// roundtrip
|
||||
CHECK(json::from_msgpack(result) == j);
|
||||
|
@ -1609,9 +1610,7 @@ TEST_CASE("single MessagePack roundtrip")
|
|||
json j1 = json::parse(f_json);
|
||||
|
||||
// parse MessagePack file
|
||||
std::ifstream f_msgpack(filename + ".msgpack", std::ios::binary);
|
||||
std::vector<uint8_t> packed((std::istreambuf_iterator<char>(f_msgpack)),
|
||||
std::istreambuf_iterator<char>());
|
||||
auto packed = utils::read_binary_file(filename + ".msgpack");
|
||||
json j2;
|
||||
CHECK_NOTHROW(j2 = json::from_msgpack(packed));
|
||||
|
||||
|
@ -1824,10 +1823,7 @@ TEST_CASE("MessagePack roundtrips" * doctest::skip())
|
|||
json j1 = json::parse(f_json);
|
||||
|
||||
// parse MessagePack file
|
||||
std::ifstream f_msgpack(filename + ".msgpack", std::ios::binary);
|
||||
std::vector<uint8_t> packed(
|
||||
(std::istreambuf_iterator<char>(f_msgpack)),
|
||||
std::istreambuf_iterator<char>());
|
||||
auto packed = utils::read_binary_file(filename + ".msgpack");
|
||||
json j2;
|
||||
CHECK_NOTHROW(j2 = json::from_msgpack(packed));
|
||||
|
||||
|
@ -1857,10 +1853,7 @@ TEST_CASE("MessagePack roundtrips" * doctest::skip())
|
|||
json j1 = json::parse(f_json);
|
||||
|
||||
// parse MessagePack file
|
||||
std::ifstream f_msgpack(filename + ".msgpack", std::ios::binary);
|
||||
std::vector<uint8_t> packed(
|
||||
(std::istreambuf_iterator<char>(f_msgpack)),
|
||||
std::istreambuf_iterator<char>());
|
||||
auto packed = utils::read_binary_file(filename + ".msgpack");
|
||||
json j2;
|
||||
CHECK_NOTHROW(j2 = json::from_msgpack({packed.data(), packed.size()}));
|
||||
|
||||
|
@ -1875,10 +1868,7 @@ TEST_CASE("MessagePack roundtrips" * doctest::skip())
|
|||
json j1 = json::parse(f_json);
|
||||
|
||||
// parse MessagePack file
|
||||
std::ifstream f_msgpack(filename + ".msgpack", std::ios::binary);
|
||||
std::vector<uint8_t> packed(
|
||||
(std::istreambuf_iterator<char>(f_msgpack)),
|
||||
std::istreambuf_iterator<char>());
|
||||
auto packed = utils::read_binary_file(filename + ".msgpack");
|
||||
|
||||
if (!exclude_packed.count(filename))
|
||||
{
|
||||
|
|
|
@ -1516,8 +1516,8 @@ TEST_CASE("regression tests")
|
|||
|
||||
SECTION("issue #838 - incorrect parse error with binary data in keys")
|
||||
{
|
||||
uint8_t key1[] = { 103, 92, 117, 48, 48, 48, 55, 92, 114, 215, 126, 214, 95, 92, 34, 174, 40, 71, 38, 174, 40, 71, 38, 223, 134, 247, 127 };
|
||||
std::string key1_str(key1, key1 + sizeof(key1) / sizeof(key1[0]));
|
||||
uint8_t key1[] = { 103, 92, 117, 48, 48, 48, 55, 92, 114, 215, 126, 214, 95, 92, 34, 174, 40, 71, 38, 174, 40, 71, 38, 223, 134, 247, 127, 0 };
|
||||
std::string key1_str(reinterpret_cast<char*>(key1));
|
||||
json j = key1_str;
|
||||
CHECK_THROWS_AS(j.dump(), json::type_error&);
|
||||
CHECK_THROWS_WITH(j.dump(), "[json.exception.type_error.316] invalid UTF-8 byte at index 10: 0x7E");
|
||||
|
|
|
@ -36,6 +36,7 @@ using nlohmann::json;
|
|||
#include <fstream>
|
||||
#include <set>
|
||||
#include <test_data.hpp>
|
||||
#include <test_utils.hpp>
|
||||
|
||||
namespace
|
||||
{
|
||||
|
@ -2508,11 +2509,8 @@ TEST_CASE("UBJSON roundtrips" * doctest::skip())
|
|||
std::ifstream f_json(filename);
|
||||
json j1 = json::parse(f_json);
|
||||
|
||||
// parse MessagePack file
|
||||
std::ifstream f_ubjson(filename + ".ubjson", std::ios::binary);
|
||||
std::vector<uint8_t> packed(
|
||||
(std::istreambuf_iterator<char>(f_ubjson)),
|
||||
std::istreambuf_iterator<char>());
|
||||
// parse UBJSON file
|
||||
auto packed = utils::read_binary_file(filename + ".ubjson");
|
||||
json j2;
|
||||
CHECK_NOTHROW(j2 = json::from_ubjson(packed));
|
||||
|
||||
|
@ -2526,7 +2524,7 @@ TEST_CASE("UBJSON roundtrips" * doctest::skip())
|
|||
std::ifstream f_json(filename);
|
||||
json j1 = json::parse(f_json);
|
||||
|
||||
// parse MessagePack file
|
||||
// parse UBJSON file
|
||||
std::ifstream f_ubjson(filename + ".ubjson", std::ios::binary);
|
||||
json j2;
|
||||
CHECK_NOTHROW(j2 = json::from_ubjson(f_ubjson));
|
||||
|
@ -2541,11 +2539,8 @@ TEST_CASE("UBJSON roundtrips" * doctest::skip())
|
|||
std::ifstream f_json(filename);
|
||||
json j1 = json::parse(f_json);
|
||||
|
||||
// parse MessagePack file
|
||||
std::ifstream f_ubjson(filename + ".ubjson", std::ios::binary);
|
||||
std::vector<uint8_t> packed(
|
||||
(std::istreambuf_iterator<char>(f_ubjson)),
|
||||
std::istreambuf_iterator<char>());
|
||||
// parse UBJSON file
|
||||
auto packed = utils::read_binary_file(filename + ".ubjson");
|
||||
json j2;
|
||||
CHECK_NOTHROW(j2 = json::from_ubjson({packed.data(), packed.size()}));
|
||||
|
||||
|
@ -2559,11 +2554,8 @@ TEST_CASE("UBJSON roundtrips" * doctest::skip())
|
|||
std::ifstream f_json(filename);
|
||||
json j1 = json::parse(f_json);
|
||||
|
||||
// parse MessagePack file
|
||||
std::ifstream f_ubjson(filename + ".ubjson", std::ios::binary);
|
||||
std::vector<uint8_t> packed(
|
||||
(std::istreambuf_iterator<char>(f_ubjson)),
|
||||
std::istreambuf_iterator<char>());
|
||||
// parse UBJSON file
|
||||
auto packed = utils::read_binary_file(filename + ".ubjson");
|
||||
|
||||
{
|
||||
INFO_WITH_TEMP(filename + ": output adapters: std::vector<uint8_t>");
|
||||
|
|
25
test/utils/test_utils.hpp
Normal file
25
test/utils/test_utils.hpp
Normal file
|
@ -0,0 +1,25 @@
|
|||
#pragma once
|
||||
|
||||
#include <cstdint> // uint8_t
|
||||
#include <fstream> // ifstream, istreambuf_iterator, ios
|
||||
#include <vector> // vector
|
||||
|
||||
namespace utils
|
||||
{
|
||||
|
||||
inline std::vector<std::uint8_t> read_binary_file(const std::string& filename)
|
||||
{
|
||||
std::ifstream file(filename, std::ios::binary);
|
||||
file.unsetf(std::ios::skipws);
|
||||
|
||||
file.seekg(0, std::ios::end);
|
||||
const auto size = file.tellg();
|
||||
file.seekg(0, std::ios::beg);
|
||||
|
||||
std::vector<std::uint8_t> byte_vector;
|
||||
byte_vector.reserve(static_cast<std::size_t>(size));
|
||||
byte_vector.insert(byte_vector.begin(), std::istream_iterator<std::uint8_t>(file), std::istream_iterator<std::uint8_t>());
|
||||
return byte_vector;
|
||||
}
|
||||
|
||||
} // namespace utils
|
Loading…
Add table
Add a link
Reference in a new issue