TEST(Reader, IterativeParsing_ShortCircuit) { { HandlerTerminateAtStartObject handler; Reader reader; StringStream is("[1, {}]"); ParseResult r = reader.Parse<kParseIterativeFlag>(is, handler); EXPECT_TRUE(reader.HasParseError()); EXPECT_EQ(kParseErrorTermination, r.Code()); EXPECT_EQ(4u, r.Offset()); } { HandlerTerminateAtStartArray handler; Reader reader; StringStream is("{\"a\": []}"); ParseResult r = reader.Parse<kParseIterativeFlag>(is, handler); EXPECT_TRUE(reader.HasParseError()); EXPECT_EQ(kParseErrorTermination, r.Code()); EXPECT_EQ(6u, r.Offset()); } { HandlerTerminateAtEndObject handler; Reader reader; StringStream is("[1, {}]"); ParseResult r = reader.Parse<kParseIterativeFlag>(is, handler); EXPECT_TRUE(reader.HasParseError()); EXPECT_EQ(kParseErrorTermination, r.Code()); EXPECT_EQ(5u, r.Offset()); } { HandlerTerminateAtEndArray handler; Reader reader; StringStream is("{\"a\": []}"); ParseResult r = reader.Parse<kParseIterativeFlag>(is, handler); EXPECT_TRUE(reader.HasParseError()); EXPECT_EQ(kParseErrorTermination, r.Code()); EXPECT_EQ(7u, r.Offset()); } }
TEST(Reader, IterativeParsing_Count) { { StringStream is("[{}, {\"k\": 1}, [1], []]"); Reader reader; IterativeParsingReaderHandler<> handler; ParseResult r = reader.Parse<kParseIterativeFlag>(is, handler); EXPECT_FALSE(r.IsError()); EXPECT_FALSE(reader.HasParseError()); int e[] = { handler.LOG_STARTARRAY, handler.LOG_STARTOBJECT, handler.LOG_ENDOBJECT, 0, handler.LOG_STARTOBJECT, handler.LOG_KEY, handler.LOG_INT, handler.LOG_ENDOBJECT, 1, handler.LOG_STARTARRAY, handler.LOG_INT, handler.LOG_ENDARRAY, 1, handler.LOG_STARTARRAY, handler.LOG_ENDARRAY, 0, handler.LOG_ENDARRAY, 4 }; EXPECT_EQ(sizeof(e) / sizeof(int), handler.LogCount); for (size_t i = 0; i < handler.LogCount; ++i) { EXPECT_EQ(e[i], handler.Logs[i]) << "i = " << i; } } }
TEST(Reader, Parse_IStreamWrapper_StringStream) { const char* json = "[1,2,3,4]"; std::stringstream ss(json); IStreamWrapper is(ss); Reader reader; ParseArrayHandler<4> h; reader.Parse(is, h); EXPECT_FALSE(reader.HasParseError()); }
TEST_F(RapidJson, SIMD_SUFFIX(ReaderParseIterativePull_DummyHandler)) { for (size_t i = 0; i < kTrialCount; i++) { StringStream s(json_); BaseReaderHandler<> h; Reader reader; reader.IterativeParseInit(); while (!reader.IterativeParseComplete()) { if (!reader.IterativeParseNext<kParseDefaultFlags>(s, h)) break; } EXPECT_FALSE(reader.HasParseError()); } }
TEST_F(RapidJson, SIMD_SUFFIX(ReaderParseIterativePullInsitu_DummyHandler)) { for (size_t i = 0; i < kTrialCount; i++) { memcpy(temp_, json_, length_ + 1); InsituStringStream s(temp_); BaseReaderHandler<> h; Reader reader; reader.IterativeParseInit(); while (!reader.IterativeParseComplete()) { if (!reader.IterativeParseNext<kParseDefaultFlags|kParseInsituFlag>(s, h)) break; } EXPECT_FALSE(reader.HasParseError()); } }
TEST(Reader, IterativeParsing_General) { { StringStream is("[1, {\"k\": [1, 2]}, null, false, true, \"string\", 1.2]"); Reader reader; IterativeParsingReaderHandler<> handler; ParseResult r = reader.Parse<kParseIterativeFlag>(is, handler); EXPECT_FALSE(r.IsError()); EXPECT_FALSE(reader.HasParseError()); int e[] = { handler.LOG_STARTARRAY, handler.LOG_INT, handler.LOG_STARTOBJECT, handler.LOG_KEY, handler.LOG_STARTARRAY, handler.LOG_INT, handler.LOG_INT, handler.LOG_ENDARRAY, 2, handler.LOG_ENDOBJECT, 1, handler.LOG_NULL, handler.LOG_BOOL, handler.LOG_BOOL, handler.LOG_STRING, handler.LOG_DOUBLE, handler.LOG_ENDARRAY, 7 }; EXPECT_EQ(sizeof(e) / sizeof(int), handler.LogCount); for (size_t i = 0; i < handler.LogCount; ++i) { EXPECT_EQ(e[i], handler.Logs[i]) << "i = " << i; } } }