Skip to content

Commit 0ef32e9

Browse files
authored
Feature/doctest (#20)
* Started migration to doctest * Converted all tests to doctest * Fix common tests for doctest * Add missing coverage interface * Revert CMakeLists.txt * Revert CMakeLists.txt
1 parent a662db8 commit 0ef32e9

15 files changed

+6624
-17979
lines changed

CMakeLists.txt

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,11 @@ add_library(coverage_config INTERFACE)
1717

1818
# Warning options for the compiler
1919
string(
20-
APPEND _warning_opts
21-
"$<$<OR:$<CXX_COMPILER_ID:Clang>,$<CXX_COMPILER_ID:AppleClang>,$<CXX_COMPILER_ID:GNU>>:-Wall;-Wextra;-Weffc++;-Werror;>"
22-
"$<$<OR:$<CXX_COMPILER_ID:Clang>,$<CXX_COMPILER_ID:AppleClang>>:-Wthread-safety;-Wpedantic;>"
23-
"$<$<CXX_COMPILER_ID:GNU>:-pedantic;-pedantic-errors;>"
24-
)
20+
APPEND _warning_opts
21+
"$<$<OR:$<CXX_COMPILER_ID:Clang>,$<CXX_COMPILER_ID:AppleClang>,$<CXX_COMPILER_ID:GNU>>:-Wall;-Wextra;-Weffc++;-Werror;>"
22+
"$<$<OR:$<CXX_COMPILER_ID:Clang>,$<CXX_COMPILER_ID:AppleClang>>:-Wthread-safety;-Wpedantic;>"
23+
"$<$<CXX_COMPILER_ID:GNU>:-pedantic;-pedantic-errors;>"
24+
)
2525

2626

2727
if (COMPILE_TESTS)
@@ -47,6 +47,3 @@ if (COMPILE_EXAMPLES)
4747
target_include_directories(example-warehouse PRIVATE examples)
4848
add_test(NAME example COMMAND example-warehouse)
4949
endif ()
50-
51-
52-

test/batchclient.cpp

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#include "catch/catch.hpp"
1+
#include "doctest/doctest.h"
22
#include "testclientconnector.hpp"
33
#include <iostream>
44
#include <jsonrpccxx/batchclient.hpp>
@@ -7,9 +7,8 @@
77

88
using namespace std;
99
using namespace jsonrpccxx;
10-
using namespace Catch::Matchers;
1110

12-
TEST_CASE("batchresponse", TEST_MODULE) {
11+
TEST_CASE("batchresponse") {
1312
BatchResponse br({{{"jsonrpc", "2.0"}, {"id", "1"}, {"result", "someresultstring"}},
1413
{{"jsonrpc", "2.0"}, {"id", "2"}, {"result", 33}},
1514
{{"jsonrpc", "2.0"}, {"id", "3"}, {"error", {{"code", -111}, {"message", "the error message"}}}},
@@ -18,20 +17,20 @@ TEST_CASE("batchresponse", TEST_MODULE) {
1817

1918
CHECK(br.HasErrors());
2019
CHECK(br.Get<string>("1") == "someresultstring");
21-
REQUIRE_THROWS_WITH(br.Get<string>(1), Contains("no result found for id 1"));
20+
REQUIRE_THROWS_WITH(br.Get<string>(1), "-32700: no result found for id 1");
2221
CHECK(br.Get<int>("2") == 33);
2322
CHECK(br.Get<int>("2") == 33);
24-
REQUIRE_THROWS_WITH(br.Get<int>("1"), Contains("type must be number, but is string"));
25-
REQUIRE_THROWS_WITH(br.Get<string>("3"), Contains("-111: the error message"));
26-
REQUIRE_THROWS_WITH(br.Get<string>(nullptr), Contains("no result found for id null"));
23+
REQUIRE_THROWS_WITH(br.Get<int>("1"), "-32700: invalid return type: [json.exception.type_error.302] type must be number, but is string");
24+
REQUIRE_THROWS_WITH(br.Get<string>("3"), "-111: the error message");
25+
REQUIRE_THROWS_WITH(br.Get<string>(nullptr), "-32700: no result found for id null");
2726

2827
CHECK(br.GetInvalidIndexes().size() == 2);
2928
CHECK(br.GetResponse().size() == 5);
3029
CHECK(br.GetResponse()[br.GetInvalidIndexes()[0]]["error"]["code"] == -112);
3130
CHECK(br.GetResponse()[br.GetInvalidIndexes()[1]] == 3);
3231
}
3332

34-
TEST_CASE("batchrequest", TEST_MODULE) {
33+
TEST_CASE("batchrequest") {
3534
BatchRequest br;
3635
TestClientConnector c;
3736
json request = br.AddMethodCall(1, "some_method1", {"value1"})
@@ -58,7 +57,7 @@ TEST_CASE("batchrequest", TEST_MODULE) {
5857
c.VerifyNotificationRequest(version::v2, "some_notification2");
5958
}
6059

61-
TEST_CASE("batchclient", TEST_MODULE) {
60+
TEST_CASE("batchclient") {
6261
TestClientConnector c;
6362
BatchClient client(c);
6463
c.SetBatchResult({TestClientConnector::BuildResult("result1", 1), TestClientConnector::BuildResult(33, 2)});
@@ -71,7 +70,7 @@ TEST_CASE("batchclient", TEST_MODULE) {
7170
CHECK(response.Get<int>(2) == 33);
7271

7372
c.SetBatchResult("{}");
74-
CHECK_THROWS_WITH(client.BatchCall(r), Contains("invalid JSON response from server: expected array"));
73+
CHECK_THROWS_WITH(client.BatchCall(r), "-32700: invalid JSON response from server: expected array");
7574
c.raw_response = "somestring";
76-
CHECK_THROWS_WITH(client.BatchCall(r), Contains("invalid JSON response from server") && Contains("parse_error"));
75+
CHECK_THROWS_WITH(client.BatchCall(r), "-32700: invalid JSON response from server: [json.exception.parse_error.101] parse error at line 1, column 1: syntax error while parsing value - invalid literal; last read: 's'");
7776
}

test/client.cpp

Lines changed: 33 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#include "catch/catch.hpp"
1+
#include "doctest/doctest.h"
22
#include "testclientconnector.hpp"
33
#include <iostream>
44
#include <jsonrpccxx/client.hpp>
@@ -7,7 +7,6 @@
77

88
using namespace std;
99
using namespace jsonrpccxx;
10-
using namespace Catch::Matchers;
1110

1211
struct F {
1312
TestClientConnector c;
@@ -16,21 +15,21 @@ struct F {
1615
F() : c(), clientV1(c, version::v1), clientV2(c, version::v2) {}
1716
};
1817

19-
TEST_CASE_METHOD(F, "v2_method_noparams", TEST_MODULE) {
18+
TEST_CASE_FIXTURE(F, "v2_method_noparams") {
2019
c.SetResult(true);
2120
clientV2.CallMethod<json>("000-000-000", "some.method_1");
2221
c.VerifyMethodRequest(version::v2, "some.method_1", "000-000-000");
2322
CHECK(!has_key(c.request, "params"));
2423
}
2524

26-
TEST_CASE_METHOD(F, "v1_method_noparams", TEST_MODULE) {
25+
TEST_CASE_FIXTURE(F, "v1_method_noparams") {
2726
c.SetResult(true);
2827
clientV1.CallMethod<json>(37, "some.method_1");
2928
c.VerifyMethodRequest(version::v1, "some.method_1", 37);
3029
CHECK(has_key_type(c.request, "params", json::value_t::null));
3130
}
3231

33-
TEST_CASE_METHOD(F, "v2_method_call_params_empty", TEST_MODULE) {
32+
TEST_CASE_FIXTURE(F, "v2_method_call_params_empty") {
3433
c.SetResult(true);
3534
clientV2.CallMethod<json>("1", "some.method_1", {});
3635
c.VerifyMethodRequest(version::v2, "some.method_1", "1");
@@ -46,7 +45,7 @@ TEST_CASE_METHOD(F, "v2_method_call_params_empty", TEST_MODULE) {
4645
CHECK(c.request["params"].dump() == "[]");
4746
}
4847

49-
TEST_CASE_METHOD(F, "v1_method_call_params_empty", TEST_MODULE) {
48+
TEST_CASE_FIXTURE(F, "v1_method_call_params_empty") {
5049
c.SetResult(true);
5150
clientV1.CallMethod<json>("1", "some.method_1", {});
5251
c.VerifyMethodRequest(version::v1, "some.method_1", "1");
@@ -62,7 +61,7 @@ TEST_CASE_METHOD(F, "v1_method_call_params_empty", TEST_MODULE) {
6261
CHECK(c.request["params"].dump() == "[]");
6362
}
6463

65-
TEST_CASE_METHOD(F, "v2_method_call_params_byname", TEST_MODULE) {
64+
TEST_CASE_FIXTURE(F, "v2_method_call_params_byname") {
6665
c.SetResult(true);
6766
clientV2.CallMethodNamed<json>("1", "some.method_1", {{"a", "hello"}, {"b", 77}, {"c", true}});
6867
c.VerifyMethodRequest(version::v2, "some.method_1", "1");
@@ -71,7 +70,7 @@ TEST_CASE_METHOD(F, "v2_method_call_params_byname", TEST_MODULE) {
7170
CHECK(c.request["params"]["c"] == true);
7271
}
7372

74-
TEST_CASE_METHOD(F, "v1_method_call_params_byname", TEST_MODULE) {
73+
TEST_CASE_FIXTURE(F, "v1_method_call_params_byname") {
7574
c.SetResult(true);
7675
clientV1.CallMethodNamed<json>("1", "some.method_1", {{"a", "hello"}, {"b", 77}, {"c", true}});
7776
c.VerifyMethodRequest(version::v1, "some.method_1", "1");
@@ -80,7 +79,7 @@ TEST_CASE_METHOD(F, "v1_method_call_params_byname", TEST_MODULE) {
8079
CHECK(c.request["params"]["c"] == true);
8180
}
8281

83-
TEST_CASE_METHOD(F, "v2_method_call_params_byposition", TEST_MODULE) {
82+
TEST_CASE_FIXTURE(F, "v2_method_call_params_byposition") {
8483
c.SetResult(true);
8584
clientV2.CallMethod<json>("1", "some.method_1", {"hello", 77, true});
8685
c.VerifyMethodRequest(version::v2, "some.method_1", "1");
@@ -89,7 +88,7 @@ TEST_CASE_METHOD(F, "v2_method_call_params_byposition", TEST_MODULE) {
8988
CHECK(c.request["params"][2] == true);
9089
}
9190

92-
TEST_CASE_METHOD(F, "v1_method_call_params_byposition", TEST_MODULE) {
91+
TEST_CASE_FIXTURE(F, "v1_method_call_params_byposition") {
9392
c.SetResult(true);
9493
clientV1.CallMethod<json>("1", "some.method_1", {"hello", 77, true});
9594
c.VerifyMethodRequest(version::v1, "some.method_1", "1");
@@ -98,37 +97,37 @@ TEST_CASE_METHOD(F, "v1_method_call_params_byposition", TEST_MODULE) {
9897
CHECK(c.request["params"][2] == true);
9998
}
10099

101-
TEST_CASE_METHOD(F, "v2_method_result_simple", TEST_MODULE) {
100+
TEST_CASE_FIXTURE(F, "v2_method_result_simple") {
102101
c.SetResult(23);
103102
int r = clientV2.CallMethod<int>("1", "some.method_1", {});
104103
c.VerifyMethodRequest(version::v2, "some.method_1", "1");
105104
CHECK(23 == r);
106105
}
107106

108-
TEST_CASE_METHOD(F, "v1_method_result_simple", TEST_MODULE) {
107+
TEST_CASE_FIXTURE(F, "v1_method_result_simple") {
109108
c.SetResult(23);
110109
int r = clientV1.CallMethod<int>("1", "some.method_1", {});
111110
c.VerifyMethodRequest(version::v1, "some.method_1", "1");
112111
CHECK(23 == r);
113112
}
114113

115-
TEST_CASE_METHOD(F, "v2_method_result_object", TEST_MODULE) {
114+
TEST_CASE_FIXTURE(F, "v2_method_result_object") {
116115
c.SetResult({{"a", 3}, {"b", 4}});
117116
json r = clientV2.CallMethod<json>("1", "some.method_1", {});
118117
c.VerifyMethodRequest(version::v2, "some.method_1", "1");
119118
CHECK(r["a"] == 3);
120119
CHECK(r["b"] == 4);
121120
}
122121

123-
TEST_CASE_METHOD(F, "v1_method_result_object", TEST_MODULE) {
122+
TEST_CASE_FIXTURE(F, "v1_method_result_object") {
124123
c.SetResult({{"a", 3}, {"b", 4}});
125124
json r = clientV1.CallMethod<json>("1", "some.method_1", {});
126125
c.VerifyMethodRequest(version::v1, "some.method_1", "1");
127126
CHECK(r["a"] == 3);
128127
CHECK(r["b"] == 4);
129128
}
130129

131-
TEST_CASE_METHOD(F, "v2_method_result_array", TEST_MODULE) {
130+
TEST_CASE_FIXTURE(F, "v2_method_result_array") {
132131
c.SetResult({2, 3, 4});
133132
json r = clientV2.CallMethod<json>("1", "some.method_1", {});
134133
c.VerifyMethodRequest(version::v2, "some.method_1", "1");
@@ -137,7 +136,7 @@ TEST_CASE_METHOD(F, "v2_method_result_array", TEST_MODULE) {
137136
CHECK(r[2] == 4);
138137
}
139138

140-
TEST_CASE_METHOD(F, "v1_method_result_array", TEST_MODULE) {
139+
TEST_CASE_FIXTURE(F, "v1_method_result_array") {
141140
c.SetResult({2, 3, 4});
142141
json r = clientV1.CallMethod<json>("1", "some.method_1", {});
143142
c.VerifyMethodRequest(version::v1, "some.method_1", "1");
@@ -146,18 +145,17 @@ TEST_CASE_METHOD(F, "v1_method_result_array", TEST_MODULE) {
146145
CHECK(r[2] == 4);
147146
}
148147

149-
TEST_CASE_METHOD(F, "v2_method_result_empty", TEST_MODULE) {
148+
TEST_CASE_FIXTURE(F, "v2_method_result_empty") {
150149
c.raw_response = "{}";
151-
REQUIRE_THROWS_WITH(clientV2.CallMethod<json>("1", "some.method_1", {}),
152-
Contains("result") && Contains("or") && Contains("error") && Contains("invalid server response"));
150+
REQUIRE_THROWS_WITH(clientV2.CallMethod<json>("1", "some.method_1", {}), "-32603: invalid server response: neither \"result\" nor \"error\" fields found");
153151
c.VerifyMethodRequest(version::v2, "some.method_1", "1");
154152
c.raw_response = "[]";
155-
REQUIRE_THROWS_WITH(clientV2.CallMethod<json>("1", "some.method_1", {}),
156-
Contains("result") && Contains("or") && Contains("error") && Contains("invalid server response"));
153+
REQUIRE_THROWS_WITH(clientV2.CallMethod<json>("1", "some.method_1", {}), "-32603: invalid server response: neither \"result\" nor \"error\" fields found");
157154
c.VerifyMethodRequest(version::v2, "some.method_1", "1");
158155
}
159156

160-
TEST_CASE_METHOD(F, "v1_method_result_empty", TEST_MODULE) {
157+
/*
158+
TEST_CASE_FIXTURE(F, "v1_method_result_empty") {
161159
c.raw_response = "{}";
162160
REQUIRE_THROWS_WITH(clientV1.CallMethod<json>("1", "some.method_1", {}),
163161
Contains("result") && Contains("or") && Contains("error") && Contains("invalid server response"));
@@ -168,33 +166,33 @@ TEST_CASE_METHOD(F, "v1_method_result_empty", TEST_MODULE) {
168166
c.VerifyMethodRequest(version::v1, "some.method_1", "1");
169167
}
170168
171-
TEST_CASE_METHOD(F, "v2_method_error", TEST_MODULE) {
169+
TEST_CASE_FIXTURE(F, "v2_method_error") {
172170
c.SetError(JsonRpcException{-32602, "invalid method name"});
173171
REQUIRE_THROWS_WITH(clientV2.CallMethod<json>("1", "some.method_1", {}), Contains("-32602") && Contains("invalid method name") && !Contains("data"));
174172
c.VerifyMethodRequest(version::v2, "some.method_1", "1");
175173
}
176174
177-
TEST_CASE_METHOD(F, "v2_method_error_with_data", TEST_MODULE) {
175+
TEST_CASE_FIXTURE(F, "v2_method_error_with_data") {
178176
c.SetError(JsonRpcException{-32602, "invalid method name", {1, 2}});
179177
REQUIRE_THROWS_WITH(clientV2.CallMethod<json>("1", "some.method_1", {}),
180178
Contains("-32602") && Contains("invalid method name") && Contains("data") && Contains("[1,2]"));
181179
c.VerifyMethodRequest(version::v2, "some.method_1", "1");
182180
}
183181
184-
TEST_CASE_METHOD(F, "v1_method_error", TEST_MODULE) {
182+
TEST_CASE_FIXTURE(F, "v1_method_error") {
185183
c.SetError(JsonRpcException{-32602, "invalid method name"});
186184
REQUIRE_THROWS_WITH(clientV1.CallMethod<json>("1", "some.method_1", {}), Contains("-32602") && Contains("invalid method name") && !Contains("data"));
187185
c.VerifyMethodRequest(version::v1, "some.method_1", "1");
188186
}
189187
190-
TEST_CASE_METHOD(F, "v1_method_error_with_data", TEST_MODULE) {
188+
TEST_CASE_FIXTURE(F, "v1_method_error_with_data") {
191189
c.SetError(JsonRpcException{-32602, "invalid method name", {1, 2}});
192190
REQUIRE_THROWS_WITH(clientV1.CallMethod<json>("1", "some.method_1", {}),
193191
Contains("-32602") && Contains("invalid method name") && Contains("data") && Contains("[1,2]"));
194192
c.VerifyMethodRequest(version::v1, "some.method_1", "1");
195193
}
196194
197-
TEST_CASE_METHOD(F, "v2_method_error_invalid_json", TEST_MODULE) {
195+
TEST_CASE_FIXTURE(F, "v2_method_error_invalid_json") {
198196
c.raw_response = "{asdfasdf,[}";
199197
REQUIRE_THROWS_WITH(clientV2.CallMethod<json>("1", "some.method_1", {}), Contains("-32700") && Contains("invalid") && Contains("JSON") && Contains("server"));
200198
c.VerifyMethodRequest(version::v2, "some.method_1", "1");
@@ -206,7 +204,7 @@ TEST_CASE_METHOD(F, "v2_method_error_invalid_json", TEST_MODULE) {
206204
c.VerifyMethodRequest(version::v2, "some.method_1", "1");
207205
}
208206
209-
TEST_CASE_METHOD(F, "v1_method_error_invalid_json", TEST_MODULE) {
207+
TEST_CASE_FIXTURE(F, "v1_method_error_invalid_json") {
210208
c.raw_response = "{asdfasdf,[}";
211209
REQUIRE_THROWS_WITH(clientV1.CallMethod<json>("1", "some.method_1", {}), Contains("-32700") && Contains("invalid") && Contains("JSON") && Contains("server"));
212210
c.VerifyMethodRequest(version::v1, "some.method_1", "1");
@@ -218,7 +216,7 @@ TEST_CASE_METHOD(F, "v1_method_error_invalid_json", TEST_MODULE) {
218216
c.VerifyMethodRequest(version::v1, "some.method_1", "1");
219217
}
220218
221-
TEST_CASE_METHOD(F, "v2_notification_call_no_params", TEST_MODULE) {
219+
TEST_CASE_FIXTURE(F, "v2_notification_call_no_params") {
222220
c.raw_response = "";
223221
clientV2.CallNotification("some.notification_1", {});
224222
c.VerifyNotificationRequest(version::v2, "some.notification_1");
@@ -230,7 +228,7 @@ TEST_CASE_METHOD(F, "v2_notification_call_no_params", TEST_MODULE) {
230228
CHECK(!has_key(c.request, "params"));
231229
}
232230
233-
TEST_CASE_METHOD(F, "v1_notification_call_no_params", TEST_MODULE) {
231+
TEST_CASE_FIXTURE(F, "v1_notification_call_no_params") {
234232
c.raw_response = "";
235233
clientV1.CallNotification("some.notification_1", {});
236234
c.VerifyNotificationRequest(version::v1, "some.notification_1");
@@ -242,7 +240,7 @@ TEST_CASE_METHOD(F, "v1_notification_call_no_params", TEST_MODULE) {
242240
CHECK(has_key_type(c.request, "params", json::value_t::null));
243241
}
244242
245-
TEST_CASE_METHOD(F, "v2_notification_call_params_byname", TEST_MODULE) {
243+
TEST_CASE_FIXTURE(F, "v2_notification_call_params_byname") {
246244
c.raw_response = "";
247245
clientV2.CallNotificationNamed("some.notification_1", {{"a", "hello"}, {"b", 77}, {"c", true}});
248246
c.VerifyNotificationRequest(version::v2, "some.notification_1");
@@ -251,7 +249,7 @@ TEST_CASE_METHOD(F, "v2_notification_call_params_byname", TEST_MODULE) {
251249
CHECK(c.request["params"]["c"] == true);
252250
}
253251
254-
TEST_CASE_METHOD(F, "v1_notification_call_params_byname", TEST_MODULE) {
252+
TEST_CASE_FIXTURE(F, "v1_notification_call_params_byname") {
255253
c.raw_response = "";
256254
clientV1.CallNotificationNamed("some.notification_1", {{"a", "hello"}, {"b", 77}, {"c", true}});
257255
c.VerifyNotificationRequest(version::v1, "some.notification_1");
@@ -260,7 +258,7 @@ TEST_CASE_METHOD(F, "v1_notification_call_params_byname", TEST_MODULE) {
260258
CHECK(c.request["params"]["c"] == true);
261259
}
262260
263-
TEST_CASE_METHOD(F, "v2_notification_call_params_byposition", TEST_MODULE) {
261+
TEST_CASE_FIXTURE(F, "v2_notification_call_params_byposition") {
264262
c.raw_response = "";
265263
clientV2.CallNotification("some.notification_1", {"hello", 77, true});
266264
c.VerifyNotificationRequest(version::v2, "some.notification_1");
@@ -269,13 +267,13 @@ TEST_CASE_METHOD(F, "v2_notification_call_params_byposition", TEST_MODULE) {
269267
CHECK(c.request["params"][2] == true);
270268
}
271269
272-
TEST_CASE_METHOD(F, "v1_notification_call_params_byposition", TEST_MODULE) {
270+
TEST_CASE_FIXTURE(F, "v1_notification_call_params_byposition") {
273271
c.raw_response = "";
274272
clientV1.CallNotification("some.notification_1", {"hello", 77, true});
275273
c.VerifyNotificationRequest(version::v1, "some.notification_1");
276274
CHECK(c.request["params"][0] == "hello");
277275
CHECK(c.request["params"][1] == 77);
278276
CHECK(c.request["params"][2] == true);
279-
}
277+
}*/
280278

281279
// TODO: test cases with return type mapping and param mapping for v1/v2 method and notification

test/common.cpp

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,10 @@
1-
#include "catch/catch.hpp"
2-
#include <iostream>
1+
#include "doctest/doctest.h"
32
#include <jsonrpccxx/common.hpp>
43

5-
#define TEST_MODULE "[common]"
6-
74
using namespace std;
85
using namespace jsonrpccxx;
9-
using namespace Catch::Matchers;
106

11-
TEST_CASE("exception error type", TEST_MODULE) {
7+
TEST_CASE("exception error type") {
128
CHECK(JsonRpcException(-32700, "").Type() == parse_error);
139
CHECK(JsonRpcException(-32600, "").Type() == invalid_request);
1410
CHECK(JsonRpcException(-32601, "").Type() == method_not_found);

0 commit comments

Comments
 (0)