Adding tests

This commit is contained in:
marek.piotrowski 2023-07-22 15:26:08 +02:00
parent 32eedd480a
commit a0e66dbd10
2 changed files with 134 additions and 19 deletions

View File

@ -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__)) } \

View 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
}
}