Merge branch 'develop' into feature/sax2
This commit is contained in:
commit
303a0c5843
11 changed files with 1187 additions and 183 deletions
|
@ -1527,6 +1527,89 @@ TEST_CASE("parser class")
|
|||
});
|
||||
CHECK(j_empty_array == json());
|
||||
}
|
||||
|
||||
SECTION("skip in GeoJSON")
|
||||
{
|
||||
auto geojsonExample = R"(
|
||||
{ "type": "FeatureCollection",
|
||||
"features": [
|
||||
{ "type": "Feature",
|
||||
"geometry": {"type": "Point", "coordinates": [102.0, 0.5]},
|
||||
"properties": {"prop0": "value0"}
|
||||
},
|
||||
{ "type": "Feature",
|
||||
"geometry": {
|
||||
"type": "LineString",
|
||||
"coordinates": [
|
||||
[102.0, 0.0], [103.0, 1.0], [104.0, 0.0], [105.0, 1.0]
|
||||
]
|
||||
},
|
||||
"properties": {
|
||||
"prop0": "value0",
|
||||
"prop1": 0.0
|
||||
}
|
||||
},
|
||||
{ "type": "Feature",
|
||||
"geometry": {
|
||||
"type": "Polygon",
|
||||
"coordinates": [
|
||||
[ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0],
|
||||
[100.0, 1.0], [100.0, 0.0] ]
|
||||
]
|
||||
},
|
||||
"properties": {
|
||||
"prop0": "value0",
|
||||
"prop1": {"this": "that"}
|
||||
}
|
||||
}
|
||||
]
|
||||
})";
|
||||
|
||||
json::parser_callback_t cb = [&](int depth, json::parse_event_t event, json & parsed)
|
||||
{
|
||||
// skip uninteresting events
|
||||
if (event == json::parse_event_t::value and !parsed.is_primitive())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
switch (event)
|
||||
{
|
||||
case json::parse_event_t::key:
|
||||
{
|
||||
return true;
|
||||
}
|
||||
case json::parse_event_t::value:
|
||||
{
|
||||
return false;
|
||||
}
|
||||
case json::parse_event_t::object_start:
|
||||
{
|
||||
return true;
|
||||
}
|
||||
case json::parse_event_t::object_end:
|
||||
{
|
||||
return false;
|
||||
}
|
||||
case json::parse_event_t::array_start:
|
||||
{
|
||||
return true;
|
||||
}
|
||||
case json::parse_event_t::array_end:
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
auto j = json::parse(geojsonExample, cb, true);
|
||||
CHECK(j == json());
|
||||
}
|
||||
}
|
||||
|
||||
SECTION("constructing from contiguous containers")
|
||||
|
|
|
@ -32,10 +32,72 @@ SOFTWARE.
|
|||
#include <nlohmann/json.hpp>
|
||||
using nlohmann::json;
|
||||
|
||||
#include "fifo_map.hpp"
|
||||
|
||||
#include <fstream>
|
||||
#include <list>
|
||||
#include <cstdio>
|
||||
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
// for #972
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
|
||||
template<class K, class V, class dummy_compare, class A>
|
||||
using my_workaround_fifo_map = nlohmann::fifo_map<K, V, nlohmann::fifo_map_compare<K>, A>;
|
||||
using my_json = nlohmann::basic_json<my_workaround_fifo_map>;
|
||||
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
// for #977
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace ns
|
||||
{
|
||||
struct foo
|
||||
{
|
||||
int x;
|
||||
};
|
||||
|
||||
template <typename, typename SFINAE = void>
|
||||
struct foo_serializer;
|
||||
|
||||
template<typename T>
|
||||
struct foo_serializer<T, typename std::enable_if<std::is_same<foo, T>::value>::type>
|
||||
{
|
||||
template <typename BasicJsonType>
|
||||
static void to_json(BasicJsonType& j, const T& value)
|
||||
{
|
||||
j = BasicJsonType{{"x", value.x}};
|
||||
}
|
||||
template <typename BasicJsonType>
|
||||
static void from_json(const BasicJsonType& j, T& value) // !!!
|
||||
{
|
||||
nlohmann::from_json(j.at("x"), value.x);
|
||||
}
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
struct foo_serializer < T, typename std::enable_if < !std::is_same<foo, T>::value >::type >
|
||||
{
|
||||
template <typename BasicJsonType>
|
||||
static void to_json(BasicJsonType& j, const T& value) noexcept
|
||||
{
|
||||
::nlohmann::to_json(j, value);
|
||||
}
|
||||
template <typename BasicJsonType>
|
||||
static void from_json(const BasicJsonType& j, T& value) //!!!
|
||||
{
|
||||
::nlohmann::from_json(j, value);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
using foo_json = nlohmann::basic_json<std::map, std::vector, std::string, bool, std::int64_t,
|
||||
std::uint64_t, double, std::allocator, ns::foo_serializer>;
|
||||
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
// for #805
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace
|
||||
{
|
||||
struct nocopy
|
||||
|
@ -1436,4 +1498,20 @@ TEST_CASE("regression tests")
|
|||
//CHECK_THROWS_WITH(json::from_ubjson(v_ubjson),
|
||||
// "[json.exception.out_of_range.408] excessive object size: 8658170730974374167");
|
||||
}
|
||||
|
||||
SECTION("issue #972 - Segmentation fault on G++ when trying to assign json string literal to custom json type")
|
||||
{
|
||||
my_json foo = R"([1, 2, 3])"_json;
|
||||
}
|
||||
|
||||
SECTION("issue #977 - Assigning between different json types")
|
||||
{
|
||||
foo_json lj = ns::foo{3};
|
||||
ns::foo ff = lj;
|
||||
CHECK(lj.is_object());
|
||||
CHECK(lj.size() == 1);
|
||||
CHECK(lj["x"] == 3);
|
||||
CHECK(ff.x == 3);
|
||||
nlohmann::json nj = lj; // This line works as expected
|
||||
}
|
||||
}
|
||||
|
|
|
@ -693,6 +693,83 @@ TEST_CASE("custom serializer that does adl by default", "[udt]")
|
|||
CHECK(me == cj.get<udt::person>());
|
||||
}
|
||||
|
||||
TEST_CASE("different basic_json types conversions")
|
||||
{
|
||||
using json = nlohmann::json;
|
||||
|
||||
SECTION("null")
|
||||
{
|
||||
json j;
|
||||
custom_json cj = j;
|
||||
CHECK(cj == nullptr);
|
||||
}
|
||||
|
||||
SECTION("boolean")
|
||||
{
|
||||
json j = true;
|
||||
custom_json cj = j;
|
||||
CHECK(cj == true);
|
||||
}
|
||||
|
||||
SECTION("discarded")
|
||||
{
|
||||
json j(json::value_t::discarded);
|
||||
custom_json cj;
|
||||
CHECK_NOTHROW(cj = j);
|
||||
CHECK(cj.type() == custom_json::value_t::discarded);
|
||||
}
|
||||
|
||||
SECTION("array")
|
||||
{
|
||||
json j = {1, 2, 3};
|
||||
custom_json cj = j;
|
||||
CHECK((cj == std::vector<int> {1, 2, 3}));
|
||||
}
|
||||
|
||||
SECTION("integer")
|
||||
{
|
||||
json j = 42;
|
||||
custom_json cj = j;
|
||||
CHECK(cj == 42);
|
||||
}
|
||||
|
||||
SECTION("float")
|
||||
{
|
||||
json j = 42.0;
|
||||
custom_json cj = j;
|
||||
CHECK(cj == 42.0);
|
||||
}
|
||||
|
||||
SECTION("unsigned")
|
||||
{
|
||||
json j = 42u;
|
||||
custom_json cj = j;
|
||||
CHECK(cj == 42u);
|
||||
}
|
||||
|
||||
SECTION("string")
|
||||
{
|
||||
json j = "forty-two";
|
||||
custom_json cj = j;
|
||||
CHECK(cj == "forty-two");
|
||||
}
|
||||
|
||||
SECTION("object")
|
||||
{
|
||||
json j = {{"forty", "two"}};
|
||||
custom_json cj = j;
|
||||
auto m = j.get<std::map<std::string, std::string>>();
|
||||
CHECK(cj == m);
|
||||
}
|
||||
|
||||
SECTION("get<custom_json>")
|
||||
{
|
||||
json j = 42;
|
||||
custom_json cj = j.get<custom_json>();
|
||||
CHECK(cj == 42);
|
||||
}
|
||||
}
|
||||
|
||||
namespace
|
||||
{
|
||||
struct incomplete;
|
||||
|
@ -730,6 +807,6 @@ TEST_CASE("Issue #924")
|
|||
// Prevent get<std::vector<Evil>>() to throw
|
||||
auto j = json::array();
|
||||
|
||||
(void) j.get<Evil>();
|
||||
(void) j.get<std::vector<Evil>>();
|
||||
CHECK_NOTHROW(j.get<Evil>());
|
||||
CHECK_NOTHROW(j.get<std::vector<Evil>>());
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue