5#define MCHECK(MSG, ...) do { if (!strstr (MSG.c_str(), "\"error\":")) break; fprintf (stderr, "%s:%d: ERROR: %s\n", __FILE__, __LINE__, MSG.c_str()); return __VA_ARGS__; } while (0)
39 void dummy0 () {
printf (
"dummy0: NOP\n"); }
40 bool dummy1 (
bool b,
KVInts kvi) {
printf (
"dummy1: b=%s kvi=%zd\n", b ?
"true" :
"false", kvi.size());
return b; }
42 size_t dummy3 (
Derived &d,
KVFloats kvf)
const {
printf (
"dummy3: Derived=%p this=%p kvf=%zd\n", &d,
this, kvf.size());
return size_t (&d); }
43 bool dummy4 (
float f,
std::string s,
long l) {
printf (
"dummy4: this=%s %f '%s' %ld\n", name_.
c_str(), f, s.
c_str(), l);
return 1; }
44 void dummy5 (
const char *c,
double d,
Pair p) {
printf (
"dummy5: this=%s %d '%s' %f\n", name_.
c_str(), p.first, c, d); }
46 Derived* dummy7 () {
return NULL; }
47 Derived& dummy8 () {
return *dummy7(); }
48 Derived dummy9 () {
return dummy8(); }
50 signed a4 = -4,
float a5 = -0.5,
const char *a6 =
"a6",
double a7 = 0.7,
51 size_t a8 = 8,
Copyable *a9 =
nullptr,
53 template<
class C>
static void
56 c.set_d (
"defaults", &Derived::defaults, {
58 signed (-4),
float (-0.5),
"a6", 1e-70,
66json_objectid (
const Jsonipc::JsonValue &value)
70 auto it = value.FindMember (
"$id");
71 if (it != value.MemberEnd())
72 return Jsonipc::from_json<size_t> (it->value);
78parse_result (
size_t id,
const std::string json_reply)
80 rapidjson::Document document;
81 document.Parse<Jsonipc::rapidjson_parse_flags> (json_reply.
data(), json_reply.
size());
82 if (!document.HasParseError())
85 const Jsonipc::JsonValue *result = NULL;
86 for (
const auto &m : document.GetObject())
88 id_ = Jsonipc::from_json<
size_t> (m.value, 0);
89 else if (m.name ==
"result")
91 if (id_ ==
id && result)
92 return Jsonipc::from_json<R> (*result);
98test_jsonipc (
bool dispatcher_shell,
bool printer)
100 using namespace Jsonipc;
103 rapidjson::Document doc;
104 auto &a = doc.GetAllocator();
107 JSONIPC_ASSERT_RETURN (
false == from_json<bool> (JsonValue()));
108 JSONIPC_ASSERT_RETURN (
true == from_json<bool> (JsonValue (
true)));
109 JSONIPC_ASSERT_RETURN (
true == from_json<bool> (JsonValue(),
true));
110 JSONIPC_ASSERT_RETURN (
false == from_json<bool> (JsonValue(),
false));
111 JSONIPC_ASSERT_RETURN (from_json<bool> (to_json (
true, a)) ==
true);
112 JSONIPC_ASSERT_RETURN (from_json<bool> (to_json (
false, a)) ==
false);
113 JSONIPC_ASSERT_RETURN (from_json<size_t> (to_json (1337, a)) == 1337);
114 JSONIPC_ASSERT_RETURN (from_json<ssize_t> (to_json (-1337, a)) == -1337);
115 JSONIPC_ASSERT_RETURN (from_json<float> (to_json (-0.5, a)) == -0.5);
116 JSONIPC_ASSERT_RETURN (from_json<double> (to_json (1e20, a)) == 1e20);
117 JSONIPC_ASSERT_RETURN (from_json<const char*> (to_json (
"Om", a)) ==
std::string (
"Om"));
118 JSONIPC_ASSERT_RETURN (from_json<std::string> (to_json (
std::string (
"Ah"), a)) ==
"Ah");
119 JSONIPC_ASSERT_RETURN (strcmp (
"HUM", from_json<const char*> (to_json ((
const char*)
"HUM", a))) == 0);
124 .set (ErrorType::NONE,
"NONE")
125 .set (ErrorType::INVALID,
"INVALID")
126 .set (ErrorType::FATAL,
"FATAL")
131 .
set (
"need_copyablep", &Base::need_copyablep)
137 .
set (
"i", &Copyable::i)
138 .
set (
"f", &Copyable::f)
139 .
set (
"hello", &Copyable::hello)
145 .set (
"dummy0", &Derived::dummy0)
146 .set (
"dummy1", &Derived::dummy1)
147 .set (
"dummy2", &Derived::dummy2)
148 .set (
"dummy3", &Derived::dummy3)
149 .set (
"dummy4", &Derived::dummy4)
150 .set (
"dummy5", &Derived::dummy5)
151 .set (
"dummy6", &Derived::dummy6)
152 .set (
"dummy7", &Derived::dummy7)
153 .set (
"dummy8", &Derived::dummy8)
154 .set (
"dummy9", &Derived::dummy9)
155 .set (
"randomize", &Derived::randomize)
157 Derived::set_dflt (class_Derived);
161 Scope temporary_scope (imap);
166 JSONIPC_ASSERT_RETURN (to_json (obja, a) == to_json (obja, a));
167 JSONIPC_ASSERT_RETURN (&obja == from_json<Derived*> (to_json (obja, a)));
168 JSONIPC_ASSERT_RETURN (ptrdiff_t (&
static_cast<Base&
> (obja)) == ptrdiff_t (&obja));
169 JSONIPC_ASSERT_RETURN (ptrdiff_t (&
static_cast<Base2&
> (obja)) > ptrdiff_t (&obja));
171 JSONIPC_ASSERT_RETURN (&obja == from_json<Base*> (to_json (obja, a)));
172 JSONIPC_ASSERT_RETURN (from_json<Base2*> (to_json (obja, a)) == &
static_cast<Base2&
> (obja));
175 JSONIPC_ASSERT_RETURN (&obja != &objb);
178 JSONIPC_ASSERT_RETURN (ptrdiff_t (&
static_cast<Base&
> (objb)) == ptrdiff_t (&objb));
179 JSONIPC_ASSERT_RETURN (ptrdiff_t (&
static_cast<Base2&
> (objb)) > ptrdiff_t (&objb));
182 JSONIPC_ASSERT_RETURN (to_json (obja, a) != to_json (objb, a));
185 JSONIPC_ASSERT_RETURN (&objc == &from_json<Derived&> (to_json (objc, a)));
186 JSONIPC_ASSERT_RETURN (&objc == &from_json<Base&> (to_json (objc, a)));
187 JSONIPC_ASSERT_RETURN (&objc == &from_json<Base2&> (to_json (objc, a)));
188 JSONIPC_ASSERT_RETURN (to_json (objb, a) != to_json (objc, a));
189 JSONIPC_ASSERT_RETURN (to_json (objc, a) == to_json (objc, a));
190 const JsonValue jva = to_json (obja, a);
191 const JsonValue jvb = to_json (objb, a);
192 const JsonValue jvc = to_json (objc, a);
193 JSONIPC_ASSERT_RETURN (from_json<Derived*> (jva) == &obja);
194 JSONIPC_ASSERT_RETURN (&from_json<Derived> (jvb) == &objb);
195 JSONIPC_ASSERT_RETURN (&from_json<Derived&> (jvc) == &objc);
200 JsonValue jvc1 = to_json (c1, a);
201 Copyable c2 = from_json<Copyable&> (jvc1);
202 JSONIPC_ASSERT_RETURN (c1.i == c2.i && c1.f == c2.f && c1.hello == c2.hello);
208 JsonValue jvd1 = to_json (d1, a);
209 const size_t d1id = json_objectid (jvd1);
210 JSONIPC_ASSERT_RETURN (d1id == 4);
211 result = dispatcher.dispatch_message (R
"( {"id":123,"method":"randomize","params":[{"$id":4}]} )");
214 const Copyable *c3 = parse_result<Copyable*> (123, result);
215 JSONIPC_ASSERT_RETURN (c3 && (c3->i != c0.i || c3->f != c0.f));
216 result = dispatcher.dispatch_message (R
"( {"id":123,"method":"need_copyablep","params":[{"$id":4},{}]} )");
218 result = dispatcher.dispatch_message (R"( {"id":444,"method":"randomize","params":[{"$id":4}]} )");
220 const Copyable *c4 = parse_result<Copyable*> (444, result);
221 JSONIPC_ASSERT_RETURN (c4 && (c4->i != c3->i || c4->f != c3->f));
222 result = dispatcher.dispatch_message (R
"( {"id":111,"method":"randomize","params":[{"$id":4}]} )");
224 const Copyable *c5 = parse_result<Copyable*> (111, result);
225 JSONIPC_ASSERT_RETURN (c5 && (c5->i != c4->i || c5->f != c4->f));
227 if (printer && Jsonipc::g_binding_printer) {
228 dprintf (1,
"%s\n", Jsonipc::g_binding_printer->finish().c_str());
232 if (dispatcher_shell)
241 forget_json_id (json_objectid (jva));
242 JSONIPC_ASSERT_RETURN (from_json<Derived*> (jva) ==
nullptr);
243 forget_json_id (json_objectid (jvb));
244 JSONIPC_ASSERT_RETURN (from_json<Derived*> (jvb) == (
Derived*)
nullptr);
245 forget_json_id (json_objectid (jvc));
246 JSONIPC_ASSERT_RETURN (from_json<Derived*> (jvc) == (
Derived*)
nullptr);
248 printf (
" OK %s\n", __func__);
253main (
int argc,
char *argv[])
255 const bool dispatcher_shell = argc > 1 && 0 ==
strcmp (argv[1],
"--shell");
256 const bool printer = argc > 1 && 0 ==
strcmp (argv[1],
"--print");
257 test_jsonipc (dispatcher_shell, printer);
Keep track of temporary instances during IpcDispatcher::dispatch_message().
Class & set(const char *name, const F &method)
Add a member function pointer.
Jsonipc wrapper type for objects that support field-wise serialization to/from JSON.
Serializable & set(const char *name, A attribute)
Add a member object pointer.