mirror of
https://github.com/Tencent/rapidjson.git
synced 2025-10-28 03:20:15 +01:00
WIP: refactor iterative parsing.
This commit is contained in:
@@ -706,210 +706,6 @@ TEST(Reader, Parse_IStreamWrapper_StringStream) {
|
||||
EXPECT_FALSE(reader.HasParseError());
|
||||
}
|
||||
|
||||
TEST(Reader, IterativeParsing) {
|
||||
StringStream json("[1,true,false,null,\"string\",{\"array\":[1]}]");
|
||||
Reader reader;
|
||||
BaseReaderHandler<> handler;
|
||||
|
||||
Reader::IterativeParsingState r;
|
||||
|
||||
// [
|
||||
r = reader.Transit<kParseIterativeFlag>(
|
||||
Reader::IterativeParsingStartState,
|
||||
json,
|
||||
handler);
|
||||
EXPECT_FALSE(reader.HasParseError());
|
||||
EXPECT_EQ(Reader::IterativeParsingArrayInitialState, r);
|
||||
|
||||
// 1
|
||||
r = reader.Transit<kParseIterativeFlag>(
|
||||
r,
|
||||
json,
|
||||
handler);
|
||||
EXPECT_FALSE(reader.HasParseError());
|
||||
EXPECT_EQ(Reader::IterativeParsingArrayContentState, r);
|
||||
EXPECT_EQ(0, *reader.stack_.template Top<int>()); // element count
|
||||
|
||||
// ,
|
||||
r = reader.Transit<kParseIterativeFlag>(
|
||||
r,
|
||||
json,
|
||||
handler);
|
||||
EXPECT_FALSE(reader.HasParseError());
|
||||
EXPECT_EQ(Reader::IterativeParsingArrayContentState, r);
|
||||
EXPECT_EQ(1, *reader.stack_.template Top<int>()); // element count
|
||||
|
||||
// true
|
||||
r = reader.Transit<kParseIterativeFlag>(
|
||||
r,
|
||||
json,
|
||||
handler);
|
||||
EXPECT_FALSE(reader.HasParseError());
|
||||
EXPECT_EQ(Reader::IterativeParsingArrayContentState, r);
|
||||
EXPECT_EQ(1, *reader.stack_.template Top<int>()); // element count
|
||||
|
||||
// ,
|
||||
r = reader.Transit<kParseIterativeFlag>(
|
||||
r,
|
||||
json,
|
||||
handler);
|
||||
EXPECT_FALSE(reader.HasParseError());
|
||||
EXPECT_EQ(Reader::IterativeParsingArrayContentState, r);
|
||||
EXPECT_EQ(2, *reader.stack_.template Top<int>()); // element count
|
||||
|
||||
// false
|
||||
r = reader.Transit<kParseIterativeFlag>(
|
||||
r,
|
||||
json,
|
||||
handler);
|
||||
EXPECT_FALSE(reader.HasParseError());
|
||||
EXPECT_EQ(Reader::IterativeParsingArrayContentState, r);
|
||||
EXPECT_EQ(2, *reader.stack_.template Top<int>()); // element count
|
||||
|
||||
// ,
|
||||
r = reader.Transit<kParseIterativeFlag>(
|
||||
r,
|
||||
json,
|
||||
handler);
|
||||
EXPECT_FALSE(reader.HasParseError());
|
||||
EXPECT_EQ(Reader::IterativeParsingArrayContentState, r);
|
||||
EXPECT_EQ(3, *reader.stack_.template Top<int>()); // element count
|
||||
|
||||
// null
|
||||
r = reader.Transit<kParseIterativeFlag>(
|
||||
r,
|
||||
json,
|
||||
handler);
|
||||
EXPECT_FALSE(reader.HasParseError());
|
||||
EXPECT_EQ(Reader::IterativeParsingArrayContentState, r);
|
||||
EXPECT_EQ(3, *reader.stack_.template Top<int>()); // element count
|
||||
|
||||
// ,
|
||||
r = reader.Transit<kParseIterativeFlag>(
|
||||
r,
|
||||
json,
|
||||
handler);
|
||||
EXPECT_FALSE(reader.HasParseError());
|
||||
EXPECT_EQ(Reader::IterativeParsingArrayContentState, r);
|
||||
EXPECT_EQ(4, *reader.stack_.template Top<int>()); // element count
|
||||
|
||||
// "string"
|
||||
r = reader.Transit<kParseIterativeFlag>(
|
||||
r,
|
||||
json,
|
||||
handler);
|
||||
EXPECT_FALSE(reader.HasParseError());
|
||||
EXPECT_EQ(Reader::IterativeParsingArrayContentState, r);
|
||||
EXPECT_EQ(4, *reader.stack_.template Top<int>()); // element count
|
||||
|
||||
// ,
|
||||
r = reader.Transit<kParseIterativeFlag>(
|
||||
r,
|
||||
json,
|
||||
handler);
|
||||
EXPECT_FALSE(reader.HasParseError());
|
||||
EXPECT_EQ(Reader::IterativeParsingArrayContentState, r);
|
||||
EXPECT_EQ(5, *reader.stack_.template Top<int>()); // element count
|
||||
|
||||
// {
|
||||
r = reader.Transit<kParseIterativeFlag>(
|
||||
r,
|
||||
json,
|
||||
handler);
|
||||
EXPECT_FALSE(reader.HasParseError());
|
||||
EXPECT_EQ(Reader::IterativeParsingObjectInitialState, r);
|
||||
EXPECT_EQ(0, *reader.stack_.template Top<int>()); // member count
|
||||
|
||||
// "array":[
|
||||
r = reader.Transit<kParseIterativeFlag>(
|
||||
r,
|
||||
json,
|
||||
handler);
|
||||
EXPECT_FALSE(reader.HasParseError());
|
||||
EXPECT_EQ(Reader::IterativeParsingArrayInitialState, r);
|
||||
EXPECT_EQ(0, *reader.stack_.template Top<int>()); // element count
|
||||
|
||||
// 1
|
||||
r = reader.Transit<kParseIterativeFlag>(
|
||||
r,
|
||||
json,
|
||||
handler);
|
||||
EXPECT_FALSE(reader.HasParseError());
|
||||
EXPECT_EQ(Reader::IterativeParsingArrayContentState, r);
|
||||
EXPECT_EQ(0, *reader.stack_.template Top<int>()); // element count
|
||||
|
||||
// ]
|
||||
r = reader.Transit<kParseIterativeFlag>(
|
||||
r,
|
||||
json,
|
||||
handler);
|
||||
EXPECT_FALSE(reader.HasParseError());
|
||||
EXPECT_EQ(Reader::IterativeParsingObjectContentState, r);
|
||||
EXPECT_EQ(0, *reader.stack_.template Top<int>()); // member count
|
||||
|
||||
// }
|
||||
r = reader.Transit<kParseIterativeFlag>(
|
||||
r,
|
||||
json,
|
||||
handler);
|
||||
EXPECT_FALSE(reader.HasParseError());
|
||||
EXPECT_EQ(Reader::IterativeParsingArrayContentState, r);
|
||||
EXPECT_EQ(5, *reader.stack_.template Top<int>()); // element count
|
||||
|
||||
// ]
|
||||
r = reader.Transit<kParseIterativeFlag>(
|
||||
r,
|
||||
json,
|
||||
handler);
|
||||
EXPECT_FALSE(reader.HasParseError());
|
||||
EXPECT_EQ(Reader::IterativeParsingFinishState, r);
|
||||
}
|
||||
|
||||
struct CountHandler : BaseReaderHandler<> {
|
||||
void EndObject(SizeType memberCount) {
|
||||
MemberCount = memberCount;
|
||||
}
|
||||
|
||||
void EndArray(SizeType elementCount) {
|
||||
ElementCount = elementCount;
|
||||
}
|
||||
|
||||
SizeType MemberCount;
|
||||
SizeType ElementCount;
|
||||
};
|
||||
|
||||
TEST(Reader, IterativeParsing_MemberCounting) {
|
||||
StringStream json("{\"array\": []}");
|
||||
Reader reader;
|
||||
CountHandler handler;
|
||||
|
||||
reader.IterativeParse<kParseIterativeFlag>(json, handler);
|
||||
|
||||
EXPECT_FALSE(reader.HasParseError());
|
||||
EXPECT_EQ(1, handler.MemberCount);
|
||||
}
|
||||
|
||||
TEST(Reader, IterativeParsing_ElementCounting) {
|
||||
StringStream json("[{}]");
|
||||
Reader reader;
|
||||
CountHandler handler;
|
||||
|
||||
reader.IterativeParse<kParseIterativeFlag>(json, handler);
|
||||
|
||||
EXPECT_FALSE(reader.HasParseError());
|
||||
EXPECT_EQ(1, handler.ElementCount);
|
||||
}
|
||||
|
||||
TEST(Reader, IterativeParsing_AfterFinishState) {
|
||||
StringStream json("{}, {}");
|
||||
Reader reader;
|
||||
BaseReaderHandler<> handler;
|
||||
|
||||
reader.IterativeParse<kParseIterativeFlag>(json, handler);
|
||||
|
||||
EXPECT_TRUE(reader.HasParseError());
|
||||
}
|
||||
|
||||
#ifdef __GNUC__
|
||||
#pragma GCC diagnostic pop
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user