Adding tests
This commit is contained in:
parent
32eedd480a
commit
a0e66dbd10
@ -1,26 +1,29 @@
|
||||
#include <nlohmann/detail/macro_scope.hpp>
|
||||
|
||||
#define ANNOTATED_JSON_NOT_ALLOWED static_assert(false, "Annotated macro requires even number of arguments where each property is accompanied by a string comment.")
|
||||
|
||||
#define NLOHMANN_JSON_ANNOTATED_TO(v1, w1) nlohmann_json_j[#v1] = nlohmann_json_t.v1;
|
||||
|
||||
#define NLOHMANN_JSON_ANNOTATED_EXPAND( x ) x
|
||||
#define NLOHMANN_JSON_ANNOTATED_GET_MACRO(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, NAME,...) NAME
|
||||
#define NLOHMANN_JSON_ANNOTATED_GET_MACRO(_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,NAME,...) NAME
|
||||
#define NLOHMANN_JSON_ANNOTATED_PASTE(...) NLOHMANN_JSON_ANNOTATED_EXPAND(NLOHMANN_JSON_ANNOTATED_GET_MACRO(__VA_ARGS__, \
|
||||
NLOHMANN_JSON_ANNOTATED_PASTE30, \
|
||||
NLOHMANN_JSON_ANNOTATED_PASTE28, \
|
||||
NLOHMANN_JSON_ANNOTATED_PASTE26, \
|
||||
NLOHMANN_JSON_ANNOTATED_PASTE24, \
|
||||
NLOHMANN_JSON_ANNOTATED_PASTE22, \
|
||||
NLOHMANN_JSON_ANNOTATED_PASTE20, \
|
||||
NLOHMANN_JSON_ANNOTATED_PASTE18, \
|
||||
NLOHMANN_JSON_ANNOTATED_PASTE16, \
|
||||
NLOHMANN_JSON_ANNOTATED_PASTE14, \
|
||||
NLOHMANN_JSON_ANNOTATED_PASTE12, \
|
||||
NLOHMANN_JSON_ANNOTATED_PASTE10, \
|
||||
NLOHMANN_JSON_ANNOTATED_PASTE8, \
|
||||
NLOHMANN_JSON_ANNOTATED_PASTE6, \
|
||||
NLOHMANN_JSON_ANNOTATED_PASTE4, \
|
||||
NLOHMANN_JSON_ANNOTATED_PASTE2, \
|
||||
NLOHMANN_JSON_ANNOTATED_PASTE1)(__VA_ARGS__))
|
||||
ANNOTATED_JSON_NOT_ALLOWED, NLOHMANN_JSON_ANNOTATED_PASTE30, \
|
||||
ANNOTATED_JSON_NOT_ALLOWED, NLOHMANN_JSON_ANNOTATED_PASTE28, \
|
||||
ANNOTATED_JSON_NOT_ALLOWED, NLOHMANN_JSON_ANNOTATED_PASTE26, \
|
||||
ANNOTATED_JSON_NOT_ALLOWED, NLOHMANN_JSON_ANNOTATED_PASTE24, \
|
||||
ANNOTATED_JSON_NOT_ALLOWED, NLOHMANN_JSON_ANNOTATED_PASTE22, \
|
||||
ANNOTATED_JSON_NOT_ALLOWED, NLOHMANN_JSON_ANNOTATED_PASTE20, \
|
||||
ANNOTATED_JSON_NOT_ALLOWED, NLOHMANN_JSON_ANNOTATED_PASTE18, \
|
||||
ANNOTATED_JSON_NOT_ALLOWED, NLOHMANN_JSON_ANNOTATED_PASTE16, \
|
||||
ANNOTATED_JSON_NOT_ALLOWED, NLOHMANN_JSON_ANNOTATED_PASTE14, \
|
||||
ANNOTATED_JSON_NOT_ALLOWED, NLOHMANN_JSON_ANNOTATED_PASTE12, \
|
||||
ANNOTATED_JSON_NOT_ALLOWED, NLOHMANN_JSON_ANNOTATED_PASTE10, \
|
||||
ANNOTATED_JSON_NOT_ALLOWED, NLOHMANN_JSON_ANNOTATED_PASTE8, \
|
||||
ANNOTATED_JSON_NOT_ALLOWED, NLOHMANN_JSON_ANNOTATED_PASTE6, \
|
||||
ANNOTATED_JSON_NOT_ALLOWED, NLOHMANN_JSON_ANNOTATED_PASTE4, \
|
||||
ANNOTATED_JSON_NOT_ALLOWED, NLOHMANN_JSON_ANNOTATED_PASTE2, \
|
||||
ANNOTATED_JSON_NOT_ALLOWED, ANNOTATED_JSON_NOT_ALLOWED, \
|
||||
ANNOTATED_JSON_NOT_ALLOWED)(__VA_ARGS__))
|
||||
#define NLOHMANN_JSON_ANNOTATED_PASTE2(func, v1, w1) func(v1, w1)
|
||||
#define NLOHMANN_JSON_ANNOTATED_PASTE4(func, v1, w1, v2, w2) NLOHMANN_JSON_ANNOTATED_PASTE2(func, v1, w1) NLOHMANN_JSON_ANNOTATED_PASTE2(func, v2, w2)
|
||||
#define NLOHMANN_JSON_ANNOTATED_PASTE6(func, v1, w1, v2, w2, v3, w3) NLOHMANN_JSON_ANNOTATED_PASTE2(func, v1, w1) NLOHMANN_JSON_ANNOTATED_PASTE4(func, v2, w2, v3, w3)
|
||||
@ -53,7 +56,6 @@
|
||||
#define TERNARY_EXPAND13(v1, w1, v2, w2, v3, w3, v4, w4, v5, w5, v6, w6, v7, w7, v8, w8, v9, w9, v10, w10, v11, w11, v12, w12, v13, w13) (property == #v13 ? w13 : TERNARY_EXPAND12(v1, w1, v2, w2, v3, w3, v4, w4, v5, w5, v6, w6, v7, w7, v8, w8, v9, w9, v10, w10, v11, w11, v12, w12))
|
||||
#define TERNARY_EXPAND14(v1, w1, v2, w2, v3, w3, v4, w4, v5, w5, v6, w6, v7, w7, v8, w8, v9, w9, v10, w10, v11, w11, v12, w12, v13, w13, v14, w14) (property == #v14 ? w14 : TERNARY_EXPAND13(v1, w1, v2, w2, v3, w3, v4, w4, v5, w5, v6, w6, v7, w7, v8, w8, v9, w9, v10, w10, v11, w11, v12, w12, v13, w13))
|
||||
#define TERNARY_EXPAND15(v1, w1, v2, w2, v3, w3, v4, w4, v5, w5, v6, w6, v7, w7, v8, w8, v9, w9, v10, w10, v11, w11, v12, w12, v13, w13, v14, w14, v15, w15) (property == #v15 ? w15 : TERNARY_EXPAND14(v1, w1, v2, w2, v3, w3, v4, w4, v5, w5, v6, w6, v7, w7, v8, w8, v9, w9, v10, w10, v11, w11, v12, w12, v13, w13, v14, w14))
|
||||
#define TERNARY_NOT_ALLOWED static_assert(false, "Annotated macro requires even number of arguments where each property is accompanied by a string comment.")
|
||||
|
||||
#define GET_TERNARY_EXPAND_MACRO(_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,NAME,...) NAME
|
||||
#define TERNARY_EXPAND(...) GET_TERNARY_EXPAND_MACRO(__VA_ARGS__, \
|
||||
@ -71,7 +73,7 @@
|
||||
TERNARY_EXPAND4, TERNARY_NOT_ALLOWED, \
|
||||
TERNARY_EXPAND3, TERNARY_NOT_ALLOWED, \
|
||||
TERNARY_EXPAND2, TERNARY_NOT_ALLOWED, \
|
||||
TERNARY_EXPAND1)(__VA_ARGS__)
|
||||
TERNARY_EXPAND1, TERNARY_NOT_ALLOWED)(__VA_ARGS__)
|
||||
|
||||
#define NLOHMANN_DEFINE_TYPE_INTRUSIVE_ANNOTATED(Type, ...) \
|
||||
friend void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_ANNOTATED_EXPAND(NLOHMANN_JSON_ANNOTATED_PASTE(NLOHMANN_JSON_ANNOTATED_TO, __VA_ARGS__)) } \
|
||||
|
||||
113
tests/src/unit-annotations.cpp
Normal file
113
tests/src/unit-annotations.cpp
Normal file
@ -0,0 +1,113 @@
|
||||
#include "doctest_compatibility.h"
|
||||
|
||||
#include <nlohmann/json.hpp>
|
||||
using nlohmann::json;
|
||||
|
||||
namespace {
|
||||
class ExampleClass {
|
||||
private:
|
||||
int property1{1};
|
||||
double property2{2.5};
|
||||
std::string property3{"test"};
|
||||
std::map<std::string, int> property4{{"x", 1}, {"y", 2}};
|
||||
std::vector<double> property5{1.5, 5.4, 3.2};
|
||||
public:
|
||||
ExampleClass() = default;
|
||||
|
||||
NLOHMANN_DEFINE_TYPE_INTRUSIVE_ANNOTATED(ExampleClass, property1, "comment1",
|
||||
property2, "comment2",
|
||||
property3, "comment3",
|
||||
property4, "comment4",
|
||||
property5, "comment5");
|
||||
};
|
||||
|
||||
class AnotherExampleClass {
|
||||
private:
|
||||
int property1{11};
|
||||
double property2{25.5};
|
||||
public:
|
||||
AnotherExampleClass() = default;
|
||||
|
||||
NLOHMANN_DEFINE_TYPE_INTRUSIVE_ANNOTATED(AnotherExampleClass, property1, "comment11",
|
||||
property2, "comment22");
|
||||
};
|
||||
|
||||
class MultiLineAnnotationExampleClass {
|
||||
private:
|
||||
int property1{11};
|
||||
std::string property2{"test"};
|
||||
public:
|
||||
MultiLineAnnotationExampleClass() = default;
|
||||
|
||||
NLOHMANN_DEFINE_TYPE_INTRUSIVE_ANNOTATED(MultiLineAnnotationExampleClass, property1, "multiline\ncomment11",
|
||||
property2, "multiline\ncomment22");
|
||||
};
|
||||
}
|
||||
|
||||
TEST_CASE("annotation")
|
||||
{
|
||||
SECTION("canonical")
|
||||
{
|
||||
ExampleClass ex;
|
||||
nlohmann::json j = ex;
|
||||
const auto ex_actual_json = j.dump_annotated<decltype(ex)>(4, ' ', true);
|
||||
const auto expected_json = "{\n"
|
||||
" /* comment1 */\n"
|
||||
" \"property1\": 1,\n"
|
||||
" /* comment2 */\n"
|
||||
" \"property2\": 2.5,\n"
|
||||
" /* comment3 */\n"
|
||||
" \"property3\": \"test\",\n"
|
||||
" /* comment4 */\n"
|
||||
" \"property4\": {\n"
|
||||
" \"x\": 1,\n"
|
||||
" \"y\": 2\n"
|
||||
" },\n"
|
||||
" /* comment5 */\n"
|
||||
" \"property5\": [\n"
|
||||
" 1.5,\n"
|
||||
" 5.4,\n"
|
||||
" 3.2\n"
|
||||
" ]\n"
|
||||
"}";
|
||||
CHECK(ex_actual_json == expected_json);
|
||||
}
|
||||
SECTION("macro_does_not_pollute_global_scope")
|
||||
{
|
||||
ExampleClass ex;
|
||||
AnotherExampleClass another_ex;
|
||||
nlohmann::json j1 = ex;
|
||||
nlohmann::json j2 = another_ex;
|
||||
const auto another_ex_actual_json = j2.dump_annotated<AnotherExampleClass>(4, ' ', true);
|
||||
const auto expected_json = "{\n"
|
||||
" /* comment11 */\n"
|
||||
" \"property1\": 11,\n"
|
||||
" /* comment22 */\n"
|
||||
" \"property2\": 25.5\n"
|
||||
"}";
|
||||
CHECK(another_ex_actual_json == expected_json);
|
||||
}
|
||||
SECTION("multi_line_annotation")
|
||||
{
|
||||
MultiLineAnnotationExampleClass ex;
|
||||
nlohmann::json j = ex;
|
||||
const auto ex_actual_json = j.dump_annotated<MultiLineAnnotationExampleClass>(4, ' ', true);
|
||||
const auto expected_json = "{\n"
|
||||
" /* multiline */\n"
|
||||
" /* comment11 */\n"
|
||||
" \"property1\": 11,\n"
|
||||
" /* multiline */\n"
|
||||
" /* comment22 */\n"
|
||||
" \"property2\": \"test\"\n"
|
||||
"}";
|
||||
CHECK(ex_actual_json == expected_json);
|
||||
}
|
||||
SECTION("utf8_comment_not_ascii")
|
||||
{
|
||||
// TODO
|
||||
}
|
||||
SECTION("utf8_comment_ensure_ascii")
|
||||
{
|
||||
// TODO
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user