diff options
author | Anton Samokhvalov <pg83@yandex.ru> | 2022-02-10 16:45:17 +0300 |
---|---|---|
committer | Daniil Cherednik <dcherednik@yandex-team.ru> | 2022-02-10 16:45:17 +0300 |
commit | d3a398281c6fd1d3672036cb2d63f842d2cb28c5 (patch) | |
tree | dd4bd3ca0f36b817e96812825ffaf10d645803f2 /library/cpp/json/ut/json_reader_fast_ut.cpp | |
parent | 72cb13b4aff9bc9cf22e49251bc8fd143f82538f (diff) | |
download | ydb-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.cpp | 416 |
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() { |