Commit 6b0df217 authored by thebusytypist's avatar thebusytypist

WIP: refactor iterative parsing.

parent ebb9a250
This diff is collapsed.
......@@ -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
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment