aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp/json/ut/json_reader_fast_ut.cpp
diff options
context:
space:
mode:
authorAnton Samokhvalov <pg83@yandex.ru>2022-02-10 16:45:17 +0300
committerDaniil Cherednik <dcherednik@yandex-team.ru>2022-02-10 16:45:17 +0300
commitd3a398281c6fd1d3672036cb2d63f842d2cb28c5 (patch)
treedd4bd3ca0f36b817e96812825ffaf10d645803f2 /library/cpp/json/ut/json_reader_fast_ut.cpp
parent72cb13b4aff9bc9cf22e49251bc8fd143f82538f (diff)
downloadydb-d3a398281c6fd1d3672036cb2d63f842d2cb28c5.tar.gz
Restoring authorship annotation for Anton Samokhvalov <pg83@yandex.ru>. Commit 2 of 2.
Diffstat (limited to 'library/cpp/json/ut/json_reader_fast_ut.cpp')
-rw-r--r--library/cpp/json/ut/json_reader_fast_ut.cpp416
1 files changed, 208 insertions, 208 deletions
diff --git a/library/cpp/json/ut/json_reader_fast_ut.cpp b/library/cpp/json/ut/json_reader_fast_ut.cpp
index 4670975356..60dffc91c7 100644
--- a/library/cpp/json/ut/json_reader_fast_ut.cpp
+++ b/library/cpp/json/ut/json_reader_fast_ut.cpp
@@ -7,176 +7,176 @@
#include <util/string/printf.h>
namespace NJson {
- namespace NTest {
- enum ETestEvent {
- E_NO_EVENT = 0,
- E_ERROR = 1,
- E_DICT_OPEN,
- E_DICT_CLOSE,
- E_ARR_OPEN,
- E_ARR_CLOSE,
- E_NULL,
- E_BOOL,
- E_FLT,
- E_INT,
- E_LONG_LONG,
- E_STR,
- E_KEY
- };
-
- struct TEvent {
- ETestEvent Type = E_NO_EVENT;
-
- i64 INum = 0;
- double DNum = 0;
- TString Str;
-
- TEvent(ETestEvent e = E_NO_EVENT)
- : Type(e)
- {
- }
-
- TEvent(double v, ETestEvent e)
- : Type(e)
- , DNum(v)
- {
- }
-
- TEvent(i64 v, ETestEvent e)
- : Type(e)
- , INum(v)
- {
- }
-
- TEvent(TStringBuf t, ETestEvent e)
- : Type(e)
- , Str(NEscJ::EscapeJ<true, false>(t))
- {
- }
-
- TString ToString() const {
- switch (Type) {
- default:
- return "YOUFAILED";
- case E_ERROR:
+ namespace NTest {
+ enum ETestEvent {
+ E_NO_EVENT = 0,
+ E_ERROR = 1,
+ E_DICT_OPEN,
+ E_DICT_CLOSE,
+ E_ARR_OPEN,
+ E_ARR_CLOSE,
+ E_NULL,
+ E_BOOL,
+ E_FLT,
+ E_INT,
+ E_LONG_LONG,
+ E_STR,
+ E_KEY
+ };
+
+ struct TEvent {
+ ETestEvent Type = E_NO_EVENT;
+
+ i64 INum = 0;
+ double DNum = 0;
+ TString Str;
+
+ TEvent(ETestEvent e = E_NO_EVENT)
+ : Type(e)
+ {
+ }
+
+ TEvent(double v, ETestEvent e)
+ : Type(e)
+ , DNum(v)
+ {
+ }
+
+ TEvent(i64 v, ETestEvent e)
+ : Type(e)
+ , INum(v)
+ {
+ }
+
+ TEvent(TStringBuf t, ETestEvent e)
+ : Type(e)
+ , Str(NEscJ::EscapeJ<true, false>(t))
+ {
+ }
+
+ TString ToString() const {
+ switch (Type) {
+ default:
+ return "YOUFAILED";
+ case E_ERROR:
return Sprintf("error: %s", Str.data());
- case E_DICT_OPEN:
- return "{";
- case E_DICT_CLOSE:
- return "}";
- case E_ARR_OPEN:
- return "[";
- case E_ARR_CLOSE:
- return "]";
- case E_NULL:
- return "null";
- case E_BOOL:
- return INum ? "true" : "false";
- case E_INT:
- return ::ToString(INum);
- case E_FLT:
- return ::ToString(DNum);
- case E_STR:
+ case E_DICT_OPEN:
+ return "{";
+ case E_DICT_CLOSE:
+ return "}";
+ case E_ARR_OPEN:
+ return "[";
+ case E_ARR_CLOSE:
+ return "]";
+ case E_NULL:
+ return "null";
+ case E_BOOL:
+ return INum ? "true" : "false";
+ case E_INT:
+ return ::ToString(INum);
+ case E_FLT:
+ return ::ToString(DNum);
+ case E_STR:
return Sprintf("%s", Str.data());
- case E_KEY:
+ case E_KEY:
return Sprintf("key: %s", Str.data());
- }
- }
- };
-
- using TEvents = TVector<TEvent>;
-
- struct TTestHandler : TJsonCallbacks {
- TEvents Events;
-
- bool OnOpenMap() override {
- Events.push_back(E_DICT_OPEN);
- return true;
- }
-
- bool OnCloseMap() override {
- Events.push_back(E_DICT_CLOSE);
- return true;
- }
-
- bool OnOpenArray() override {
- Events.push_back(E_ARR_OPEN);
- return true;
- }
-
- bool OnCloseArray() override {
- Events.push_back(E_ARR_CLOSE);
- return true;
- }
-
- bool OnNull() override {
- Events.push_back(E_NULL);
- return true;
- }
-
- bool OnBoolean(bool v) override {
- Events.push_back(TEvent((i64)v, E_BOOL));
- return true;
- }
-
- bool OnInteger(long long v) override {
- Events.push_back(TEvent((i64)v, E_INT));
- return true;
- }
-
- bool OnUInteger(unsigned long long v) override {
- return OnInteger(v);
- }
-
- bool OnDouble(double v) override {
- Events.push_back(TEvent(v, E_FLT));
- return true;
- }
-
- bool OnString(const TStringBuf& v) override {
- Events.push_back(TEvent(v, E_STR));
- return true;
- }
-
- bool OnMapKey(const TStringBuf& v) override {
- Events.push_back(TEvent(v, E_KEY));
- return true;
- }
-
- void OnError(size_t, TStringBuf token) override {
- Events.push_back(TEvent(token, E_ERROR));
- }
-
- void Assert(const TEvents& e, TString str) {
- try {
- UNIT_ASSERT_VALUES_EQUAL_C(e.size(), Events.size(), str);
-
- for (ui32 i = 0, sz = e.size(); i < sz; ++i) {
+ }
+ }
+ };
+
+ using TEvents = TVector<TEvent>;
+
+ struct TTestHandler : TJsonCallbacks {
+ TEvents Events;
+
+ bool OnOpenMap() override {
+ Events.push_back(E_DICT_OPEN);
+ return true;
+ }
+
+ bool OnCloseMap() override {
+ Events.push_back(E_DICT_CLOSE);
+ return true;
+ }
+
+ bool OnOpenArray() override {
+ Events.push_back(E_ARR_OPEN);
+ return true;
+ }
+
+ bool OnCloseArray() override {
+ Events.push_back(E_ARR_CLOSE);
+ return true;
+ }
+
+ bool OnNull() override {
+ Events.push_back(E_NULL);
+ return true;
+ }
+
+ bool OnBoolean(bool v) override {
+ Events.push_back(TEvent((i64)v, E_BOOL));
+ return true;
+ }
+
+ bool OnInteger(long long v) override {
+ Events.push_back(TEvent((i64)v, E_INT));
+ return true;
+ }
+
+ bool OnUInteger(unsigned long long v) override {
+ return OnInteger(v);
+ }
+
+ bool OnDouble(double v) override {
+ Events.push_back(TEvent(v, E_FLT));
+ return true;
+ }
+
+ bool OnString(const TStringBuf& v) override {
+ Events.push_back(TEvent(v, E_STR));
+ return true;
+ }
+
+ bool OnMapKey(const TStringBuf& v) override {
+ Events.push_back(TEvent(v, E_KEY));
+ return true;
+ }
+
+ void OnError(size_t, TStringBuf token) override {
+ Events.push_back(TEvent(token, E_ERROR));
+ }
+
+ void Assert(const TEvents& e, TString str) {
+ try {
+ UNIT_ASSERT_VALUES_EQUAL_C(e.size(), Events.size(), str);
+
+ for (ui32 i = 0, sz = e.size(); i < sz; ++i) {
UNIT_ASSERT_VALUES_EQUAL_C((int)e[i].Type, (int)Events[i].Type, Sprintf("'%s' %u", str.data(), i));
UNIT_ASSERT_VALUES_EQUAL_C(e[i].INum, Events[i].INum, Sprintf("'%s' %u", str.data(), i));
UNIT_ASSERT_VALUES_EQUAL_C(e[i].DNum, Events[i].DNum, Sprintf("'%s' %u", str.data(), i));
UNIT_ASSERT_VALUES_EQUAL_C(e[i].Str, Events[i].Str, Sprintf("'%s' %u", str.data(), i));
- }
- } catch (const yexception&) {
- Clog << "Exception at '" << str << "'" << Endl;
- for (const auto& event : Events) {
- Clog << event.ToString() << Endl;
- }
-
- throw;
- }
+ }
+ } catch (const yexception&) {
+ Clog << "Exception at '" << str << "'" << Endl;
+ for (const auto& event : Events) {
+ Clog << event.ToString() << Endl;
+ }
+
+ throw;
+ }
}
- };
+ };
}
}
-class TFastJsonTest: public TTestBase {
- UNIT_TEST_SUITE(TFastJsonTest)
+class TFastJsonTest: public TTestBase {
+ UNIT_TEST_SUITE(TFastJsonTest)
UNIT_TEST(TestParse)
UNIT_TEST(TestReadJsonFastTree)
UNIT_TEST(TestNoInlineComment)
- UNIT_TEST_SUITE_END();
-
+ UNIT_TEST_SUITE_END();
+
public:
template <bool accept>
void DoTestParse(TStringBuf json, ui32 amount, ...) {
@@ -188,45 +188,45 @@ public:
ETestEvent e = (ETestEvent)va_arg(vl, int);
switch ((int)e) {
- case E_NO_EVENT:
- case E_DICT_OPEN:
- case E_DICT_CLOSE:
- case E_ARR_OPEN:
- case E_ARR_CLOSE:
- case E_NULL:
- evs.push_back(e);
- break;
- case E_BOOL: {
- bool v = va_arg(vl, int);
- evs.push_back(TEvent((i64)v, E_BOOL));
- break;
- }
- case E_INT: {
- i64 i = va_arg(vl, int);
- evs.push_back(TEvent(i, E_INT));
- break;
- }
- case E_LONG_LONG: {
- i64 i = va_arg(vl, long long);
- evs.push_back(TEvent(i, E_INT));
- break;
- }
- case E_FLT: {
- double f = va_arg(vl, double);
- evs.push_back(TEvent(f, E_FLT));
- break;
- }
- case E_STR: {
- const char* s = va_arg(vl, const char*);
- evs.push_back(TEvent(TStringBuf(s), E_STR));
- break;
- }
- case E_KEY:
- case E_ERROR: {
- const char* s = va_arg(vl, const char*);
- evs.push_back(TEvent(TStringBuf(s), e));
- break;
- }
+ case E_NO_EVENT:
+ case E_DICT_OPEN:
+ case E_DICT_CLOSE:
+ case E_ARR_OPEN:
+ case E_ARR_CLOSE:
+ case E_NULL:
+ evs.push_back(e);
+ break;
+ case E_BOOL: {
+ bool v = va_arg(vl, int);
+ evs.push_back(TEvent((i64)v, E_BOOL));
+ break;
+ }
+ case E_INT: {
+ i64 i = va_arg(vl, int);
+ evs.push_back(TEvent(i, E_INT));
+ break;
+ }
+ case E_LONG_LONG: {
+ i64 i = va_arg(vl, long long);
+ evs.push_back(TEvent(i, E_INT));
+ break;
+ }
+ case E_FLT: {
+ double f = va_arg(vl, double);
+ evs.push_back(TEvent(f, E_FLT));
+ break;
+ }
+ case E_STR: {
+ const char* s = va_arg(vl, const char*);
+ evs.push_back(TEvent(TStringBuf(s), E_STR));
+ break;
+ }
+ case E_KEY:
+ case E_ERROR: {
+ const char* s = va_arg(vl, const char*);
+ evs.push_back(TEvent(TStringBuf(s), e));
+ break;
+ }
}
}
va_end(vl);
@@ -258,25 +258,25 @@ public:
DoTestParse<false>("[a,,b]", 3, E_ARR_OPEN, E_STR, "a", E_ERROR, "invalid syntax at token: ','");
DoTestParse<true>("{ k : v }", 4, E_DICT_OPEN, E_KEY, "k", E_STR, "v", E_DICT_CLOSE);
DoTestParse<true>("{a:'\\b'/*comment*/, k /*comment*/\n : v }", 6, E_DICT_OPEN, E_KEY, "a", E_STR, "\b", E_KEY, "k", E_STR, "v", E_DICT_CLOSE);
- DoTestParse<true>("{a:.15, k : v }", 6, E_DICT_OPEN, E_KEY, "a", E_FLT, .15, E_KEY, "k", E_STR, "v", E_DICT_CLOSE);
- DoTestParse<true>("[ a, -.1e+5, 1E-7]", 5, E_ARR_OPEN, E_STR, "a", E_FLT, -.1e+5, E_FLT, 1e-7, E_ARR_CLOSE);
+ DoTestParse<true>("{a:.15, k : v }", 6, E_DICT_OPEN, E_KEY, "a", E_FLT, .15, E_KEY, "k", E_STR, "v", E_DICT_CLOSE);
+ DoTestParse<true>("[ a, -.1e+5, 1E-7]", 5, E_ARR_OPEN, E_STR, "a", E_FLT, -.1e+5, E_FLT, 1e-7, E_ARR_CLOSE);
DoTestParse<true>("{}", 2, E_DICT_OPEN, E_DICT_CLOSE);
- DoTestParse<true>("{ a : x, b : [ c, d, ] }", 9, E_DICT_OPEN, E_KEY, "a", E_STR, "x", E_KEY, "b", E_ARR_OPEN, E_STR, "c", E_STR, "d", E_ARR_CLOSE, E_DICT_CLOSE);
- DoTestParse<false>("{ a : x, b : [ c, d,, ] }", 8, E_DICT_OPEN, E_KEY, "a", E_STR, "x", E_KEY, "b", E_ARR_OPEN, E_STR, "c", E_STR, "d", E_ERROR, "invalid syntax at token: ','");
- // DoTestParse<false>("{ a : x : y }", 4, E_DICT_OPEN
- // , E_KEY, "a", E_STR, "x"
- // , E_ERROR
- // , ":");
- // DoTestParse<false>("{queries:{ref:[]},{nonref:[]}}", 8, E_DICT_OPEN
- // , E_KEY, "queries", E_DICT_OPEN
- // , E_KEY, "ref", E_ARR_OPEN, E_ARR_CLOSE
- // , E_DICT_CLOSE, E_ERROR, "");
+ DoTestParse<true>("{ a : x, b : [ c, d, ] }", 9, E_DICT_OPEN, E_KEY, "a", E_STR, "x", E_KEY, "b", E_ARR_OPEN, E_STR, "c", E_STR, "d", E_ARR_CLOSE, E_DICT_CLOSE);
+ DoTestParse<false>("{ a : x, b : [ c, d,, ] }", 8, E_DICT_OPEN, E_KEY, "a", E_STR, "x", E_KEY, "b", E_ARR_OPEN, E_STR, "c", E_STR, "d", E_ERROR, "invalid syntax at token: ','");
+ // DoTestParse<false>("{ a : x : y }", 4, E_DICT_OPEN
+ // , E_KEY, "a", E_STR, "x"
+ // , E_ERROR
+ // , ":");
+ // DoTestParse<false>("{queries:{ref:[]},{nonref:[]}}", 8, E_DICT_OPEN
+ // , E_KEY, "queries", E_DICT_OPEN
+ // , E_KEY, "ref", E_ARR_OPEN, E_ARR_CLOSE
+ // , E_DICT_CLOSE, E_ERROR, "");
DoTestParse<true>("'100x00'", 1, E_STR, "100x00");
DoTestParse<true>("-1", 1, E_INT, -1);
DoTestParse<true>("-9223372036854775808", 1, E_LONG_LONG, (long long)Min<i64>());
DoTestParse<false>("100x00", 1, E_ERROR, "invalid syntax at token: '100x'");
DoTestParse<false>("100 200", 2, E_INT, 100, E_ERROR, "invalid syntax at token: '200'");
- DoTestParse<true>("{g:{x:{a:{b:c,e:f},q:{x:y}},y:fff}}", 22, E_DICT_OPEN, E_KEY, "g", E_DICT_OPEN, E_KEY, "x", E_DICT_OPEN, E_KEY, "a", E_DICT_OPEN, E_KEY, "b", E_STR, "c", E_KEY, "e", E_STR, "f", E_DICT_CLOSE, E_KEY, "q", E_DICT_OPEN, E_KEY, "x", E_STR, "y", E_DICT_CLOSE, E_DICT_CLOSE, E_KEY, "y", E_STR, "fff", E_DICT_CLOSE, E_DICT_CLOSE);
+ DoTestParse<true>("{g:{x:{a:{b:c,e:f},q:{x:y}},y:fff}}", 22, E_DICT_OPEN, E_KEY, "g", E_DICT_OPEN, E_KEY, "x", E_DICT_OPEN, E_KEY, "a", E_DICT_OPEN, E_KEY, "b", E_STR, "c", E_KEY, "e", E_STR, "f", E_DICT_CLOSE, E_KEY, "q", E_DICT_OPEN, E_KEY, "x", E_STR, "y", E_DICT_CLOSE, E_DICT_CLOSE, E_KEY, "y", E_STR, "fff", E_DICT_CLOSE, E_DICT_CLOSE);
}
void TestReadJsonFastTree() {