mirror of
https://github.com/Tencent/rapidjson.git
synced 2025-10-28 03:20:15 +01:00
Try to resolve issue #35: implement iterative parsing.
This commit is contained in:
@@ -650,7 +650,7 @@ struct StreamTraits<CustomStringStream<Encoding> > {
|
||||
enum { copyOptimization = 1 };
|
||||
};
|
||||
|
||||
} // namespace rapdijson
|
||||
} // namespace rapidjson
|
||||
#endif
|
||||
|
||||
TEST(Reader, CustomStringStream) {
|
||||
@@ -706,6 +706,200 @@ TEST(Reader, Parse_IStreamWrapper_StringStream) {
|
||||
EXPECT_FALSE(reader.HasParseError());
|
||||
}
|
||||
|
||||
TEST(Reader, NonRecursiveParsing) {
|
||||
StringStream json("[1,true,false,null,\"string\",{\"array\":[1]}]");
|
||||
Reader reader;
|
||||
BaseReaderHandler<> handler;
|
||||
|
||||
Reader::NonRecursiveParsingState r;
|
||||
|
||||
// [
|
||||
r = reader.Transit<kParseNonRecursiveFlag>(
|
||||
Reader::NonRecursiveParsingStartState,
|
||||
json,
|
||||
handler);
|
||||
EXPECT_FALSE(reader.HasParseError());
|
||||
EXPECT_EQ(Reader::NonRecursiveParsingArrayInitialState, r);
|
||||
|
||||
// 1
|
||||
r = reader.Transit<kParseNonRecursiveFlag>(
|
||||
r,
|
||||
json,
|
||||
handler);
|
||||
EXPECT_FALSE(reader.HasParseError());
|
||||
EXPECT_EQ(Reader::NonRecursiveParsingArrayContentState, r);
|
||||
EXPECT_EQ(0, *reader.stack_.template Top<int>()); // element count
|
||||
|
||||
// ,
|
||||
r = reader.Transit<kParseNonRecursiveFlag>(
|
||||
r,
|
||||
json,
|
||||
handler);
|
||||
EXPECT_FALSE(reader.HasParseError());
|
||||
EXPECT_EQ(Reader::NonRecursiveParsingArrayContentState, r);
|
||||
EXPECT_EQ(1, *reader.stack_.template Top<int>()); // element count
|
||||
|
||||
// true
|
||||
r = reader.Transit<kParseNonRecursiveFlag>(
|
||||
r,
|
||||
json,
|
||||
handler);
|
||||
EXPECT_FALSE(reader.HasParseError());
|
||||
EXPECT_EQ(Reader::NonRecursiveParsingArrayContentState, r);
|
||||
EXPECT_EQ(1, *reader.stack_.template Top<int>()); // element count
|
||||
|
||||
// ,
|
||||
r = reader.Transit<kParseNonRecursiveFlag>(
|
||||
r,
|
||||
json,
|
||||
handler);
|
||||
EXPECT_FALSE(reader.HasParseError());
|
||||
EXPECT_EQ(Reader::NonRecursiveParsingArrayContentState, r);
|
||||
EXPECT_EQ(2, *reader.stack_.template Top<int>()); // element count
|
||||
|
||||
// false
|
||||
r = reader.Transit<kParseNonRecursiveFlag>(
|
||||
r,
|
||||
json,
|
||||
handler);
|
||||
EXPECT_FALSE(reader.HasParseError());
|
||||
EXPECT_EQ(Reader::NonRecursiveParsingArrayContentState, r);
|
||||
EXPECT_EQ(2, *reader.stack_.template Top<int>()); // element count
|
||||
|
||||
// ,
|
||||
r = reader.Transit<kParseNonRecursiveFlag>(
|
||||
r,
|
||||
json,
|
||||
handler);
|
||||
EXPECT_FALSE(reader.HasParseError());
|
||||
EXPECT_EQ(Reader::NonRecursiveParsingArrayContentState, r);
|
||||
EXPECT_EQ(3, *reader.stack_.template Top<int>()); // element count
|
||||
|
||||
// null
|
||||
r = reader.Transit<kParseNonRecursiveFlag>(
|
||||
r,
|
||||
json,
|
||||
handler);
|
||||
EXPECT_FALSE(reader.HasParseError());
|
||||
EXPECT_EQ(Reader::NonRecursiveParsingArrayContentState, r);
|
||||
EXPECT_EQ(3, *reader.stack_.template Top<int>()); // element count
|
||||
|
||||
// ,
|
||||
r = reader.Transit<kParseNonRecursiveFlag>(
|
||||
r,
|
||||
json,
|
||||
handler);
|
||||
EXPECT_FALSE(reader.HasParseError());
|
||||
EXPECT_EQ(Reader::NonRecursiveParsingArrayContentState, r);
|
||||
EXPECT_EQ(4, *reader.stack_.template Top<int>()); // element count
|
||||
|
||||
// "string"
|
||||
r = reader.Transit<kParseNonRecursiveFlag>(
|
||||
r,
|
||||
json,
|
||||
handler);
|
||||
EXPECT_FALSE(reader.HasParseError());
|
||||
EXPECT_EQ(Reader::NonRecursiveParsingArrayContentState, r);
|
||||
EXPECT_EQ(4, *reader.stack_.template Top<int>()); // element count
|
||||
|
||||
// ,
|
||||
r = reader.Transit<kParseNonRecursiveFlag>(
|
||||
r,
|
||||
json,
|
||||
handler);
|
||||
EXPECT_FALSE(reader.HasParseError());
|
||||
EXPECT_EQ(Reader::NonRecursiveParsingArrayContentState, r);
|
||||
EXPECT_EQ(5, *reader.stack_.template Top<int>()); // element count
|
||||
|
||||
// {
|
||||
r = reader.Transit<kParseNonRecursiveFlag>(
|
||||
r,
|
||||
json,
|
||||
handler);
|
||||
EXPECT_FALSE(reader.HasParseError());
|
||||
EXPECT_EQ(Reader::NonRecursiveParsingObjectInitialState, r);
|
||||
EXPECT_EQ(0, *reader.stack_.template Top<int>()); // member count
|
||||
|
||||
// "array":[
|
||||
r = reader.Transit<kParseNonRecursiveFlag>(
|
||||
r,
|
||||
json,
|
||||
handler);
|
||||
EXPECT_FALSE(reader.HasParseError());
|
||||
EXPECT_EQ(Reader::NonRecursiveParsingArrayInitialState, r);
|
||||
EXPECT_EQ(0, *reader.stack_.template Top<int>()); // element count
|
||||
|
||||
// 1
|
||||
r = reader.Transit<kParseNonRecursiveFlag>(
|
||||
r,
|
||||
json,
|
||||
handler);
|
||||
EXPECT_FALSE(reader.HasParseError());
|
||||
EXPECT_EQ(Reader::NonRecursiveParsingArrayContentState, r);
|
||||
EXPECT_EQ(0, *reader.stack_.template Top<int>()); // element count
|
||||
|
||||
// ]
|
||||
r = reader.Transit<kParseNonRecursiveFlag>(
|
||||
r,
|
||||
json,
|
||||
handler);
|
||||
EXPECT_FALSE(reader.HasParseError());
|
||||
EXPECT_EQ(Reader::NonRecursiveParsingObjectContentState, r);
|
||||
EXPECT_EQ(0, *reader.stack_.template Top<int>()); // member count
|
||||
|
||||
// }
|
||||
r = reader.Transit<kParseNonRecursiveFlag>(
|
||||
r,
|
||||
json,
|
||||
handler);
|
||||
EXPECT_FALSE(reader.HasParseError());
|
||||
EXPECT_EQ(Reader::NonRecursiveParsingArrayContentState, r);
|
||||
EXPECT_EQ(5, *reader.stack_.template Top<int>()); // element count
|
||||
|
||||
// ]
|
||||
r = reader.Transit<kParseNonRecursiveFlag>(
|
||||
r,
|
||||
json,
|
||||
handler);
|
||||
EXPECT_FALSE(reader.HasParseError());
|
||||
EXPECT_EQ(Reader::NonRecursiveParsingFinishState, r);
|
||||
}
|
||||
|
||||
struct CountHandler : BaseReaderHandler<> {
|
||||
void EndObject(SizeType memberCount) {
|
||||
MemberCount = memberCount;
|
||||
}
|
||||
|
||||
void EndArray(SizeType elementCount) {
|
||||
ElementCount = elementCount;
|
||||
}
|
||||
|
||||
SizeType MemberCount;
|
||||
SizeType ElementCount;
|
||||
};
|
||||
|
||||
TEST(Reader, NonRecursiveParsing_MemberCounting) {
|
||||
StringStream json("{\"array\": []}");
|
||||
Reader reader;
|
||||
CountHandler handler;
|
||||
|
||||
reader.NonRecursiveParse<kParseNonRecursiveFlag>(json, handler);
|
||||
|
||||
EXPECT_FALSE(reader.HasParseError());
|
||||
EXPECT_EQ(1, handler.MemberCount);
|
||||
}
|
||||
|
||||
TEST(Reader, NonRecursiveParsing_ElementCounting) {
|
||||
StringStream json("[{}]");
|
||||
Reader reader;
|
||||
CountHandler handler;
|
||||
|
||||
reader.NonRecursiveParse<kParseNonRecursiveFlag>(json, handler);
|
||||
|
||||
EXPECT_FALSE(reader.HasParseError());
|
||||
EXPECT_EQ(1, handler.ElementCount);
|
||||
}
|
||||
|
||||
#ifdef __GNUC__
|
||||
#pragma GCC diagnostic pop
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user