mirror of
https://github.com/Tencent/rapidjson.git
synced 2025-03-10 03:29:59 +01:00
Add unittests for kParserErrorTermination; Fix bugs in last merge.
This commit is contained in:
parent
d4da07c5fb
commit
46e89dad0d
@ -1023,7 +1023,6 @@ private:
|
|||||||
return IterativeParsingErrorState;
|
return IterativeParsingErrorState;
|
||||||
|
|
||||||
case IterativeParsingFinishState:
|
case IterativeParsingFinishState:
|
||||||
is.Take();
|
|
||||||
return dst;
|
return dst;
|
||||||
|
|
||||||
case IterativeParsingErrorState:
|
case IterativeParsingErrorState:
|
||||||
@ -1031,7 +1030,6 @@ private:
|
|||||||
|
|
||||||
case IterativeParsingObjectInitialState:
|
case IterativeParsingObjectInitialState:
|
||||||
case IterativeParsingArrayInitialState:
|
case IterativeParsingArrayInitialState:
|
||||||
is.Take();
|
|
||||||
// Push the state(Element or MemeberValue) if we are nested in another array or value of member.
|
// Push the state(Element or MemeberValue) if we are nested in another array or value of member.
|
||||||
// In this way we can get the correct state on ObjectFinish or ArrayFinish by frame pop.
|
// In this way we can get the correct state on ObjectFinish or ArrayFinish by frame pop.
|
||||||
n = src;
|
n = src;
|
||||||
@ -1053,8 +1051,10 @@ private:
|
|||||||
RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorTermination, is.Tell());
|
RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorTermination, is.Tell());
|
||||||
return IterativeParsingErrorState;
|
return IterativeParsingErrorState;
|
||||||
}
|
}
|
||||||
else
|
else {
|
||||||
|
is.Take();
|
||||||
return dst;
|
return dst;
|
||||||
|
}
|
||||||
|
|
||||||
case IterativeParsingMemberKeyState:
|
case IterativeParsingMemberKeyState:
|
||||||
ParseString<parseFlags>(is, handler);
|
ParseString<parseFlags>(is, handler);
|
||||||
@ -1095,7 +1095,6 @@ private:
|
|||||||
return dst;
|
return dst;
|
||||||
|
|
||||||
case IterativeParsingObjectFinishState:
|
case IterativeParsingObjectFinishState:
|
||||||
is.Take();
|
|
||||||
// Get member count.
|
// Get member count.
|
||||||
c = *stack_.template Pop<int>(1);
|
c = *stack_.template Pop<int>(1);
|
||||||
// If the object is not empty, count the last member.
|
// If the object is not empty, count the last member.
|
||||||
@ -1113,11 +1112,12 @@ private:
|
|||||||
RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorTermination, is.Tell());
|
RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorTermination, is.Tell());
|
||||||
return IterativeParsingErrorState;
|
return IterativeParsingErrorState;
|
||||||
}
|
}
|
||||||
else
|
else {
|
||||||
|
is.Take();
|
||||||
return n;
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
case IterativeParsingArrayFinishState:
|
case IterativeParsingArrayFinishState:
|
||||||
is.Take();
|
|
||||||
// Get element count.
|
// Get element count.
|
||||||
c = *stack_.template Pop<int>(1);
|
c = *stack_.template Pop<int>(1);
|
||||||
// If the array is not empty, count the last element.
|
// If the array is not empty, count the last element.
|
||||||
@ -1135,8 +1135,10 @@ private:
|
|||||||
RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorTermination, is.Tell());
|
RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorTermination, is.Tell());
|
||||||
return IterativeParsingErrorState;
|
return IterativeParsingErrorState;
|
||||||
}
|
}
|
||||||
else
|
else {
|
||||||
|
is.Take();
|
||||||
return n;
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
RAPIDJSON_ASSERT(false);
|
RAPIDJSON_ASSERT(false);
|
||||||
|
@ -707,7 +707,7 @@ TEST(Reader, Parse_IStreamWrapper_StringStream) {
|
|||||||
EXPECT_FALSE(reader.HasParseError());
|
EXPECT_FALSE(reader.HasParseError());
|
||||||
}
|
}
|
||||||
|
|
||||||
#define TESTERRORHANDLING(text, errorCode)\
|
#define TESTERRORHANDLING(text, errorCode, offset)\
|
||||||
{\
|
{\
|
||||||
StringStream json(text);\
|
StringStream json(text);\
|
||||||
BaseReaderHandler<> handler;\
|
BaseReaderHandler<> handler;\
|
||||||
@ -715,20 +715,21 @@ TEST(Reader, Parse_IStreamWrapper_StringStream) {
|
|||||||
reader.IterativeParse<kParseDefaultFlags>(json, handler);\
|
reader.IterativeParse<kParseDefaultFlags>(json, handler);\
|
||||||
EXPECT_TRUE(reader.HasParseError());\
|
EXPECT_TRUE(reader.HasParseError());\
|
||||||
EXPECT_EQ(errorCode, reader.GetParseErrorCode());\
|
EXPECT_EQ(errorCode, reader.GetParseErrorCode());\
|
||||||
|
EXPECT_EQ(offset, reader.GetErrorOffset());\
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(Reader, IterativeParsing_ErrorHandling) {
|
TEST(Reader, IterativeParsing_ErrorHandling) {
|
||||||
TESTERRORHANDLING("{\"a\": a}", kParseErrorValueInvalid);
|
TESTERRORHANDLING("{\"a\": a}", kParseErrorValueInvalid, 6);
|
||||||
|
|
||||||
TESTERRORHANDLING("", kParseErrorDocumentEmpty);
|
TESTERRORHANDLING("", kParseErrorDocumentEmpty, 0);
|
||||||
TESTERRORHANDLING("1", kParseErrorDocumentRootNotObjectOrArray);
|
TESTERRORHANDLING("1", kParseErrorDocumentRootNotObjectOrArray, 0);
|
||||||
TESTERRORHANDLING("{}{}", kParseErrorDocumentRootNotSingular);
|
TESTERRORHANDLING("{}{}", kParseErrorDocumentRootNotSingular, 2);
|
||||||
|
|
||||||
TESTERRORHANDLING("{1}", kParseErrorObjectMissName);
|
TESTERRORHANDLING("{1}", kParseErrorObjectMissName, 1);
|
||||||
TESTERRORHANDLING("{\"a\", 1}", kParseErrorObjectMissColon);
|
TESTERRORHANDLING("{\"a\", 1}", kParseErrorObjectMissColon, 4);
|
||||||
TESTERRORHANDLING("{\"a\"}", kParseErrorObjectMissColon);
|
TESTERRORHANDLING("{\"a\"}", kParseErrorObjectMissColon, 4);
|
||||||
TESTERRORHANDLING("{\"a\": 1", kParseErrorObjectMissCommaOrCurlyBracket);
|
TESTERRORHANDLING("{\"a\": 1", kParseErrorObjectMissCommaOrCurlyBracket, 7);
|
||||||
TESTERRORHANDLING("[1 2 3]", kParseErrorArrayMissCommaOrSquareBracket);
|
TESTERRORHANDLING("[1 2 3]", kParseErrorArrayMissCommaOrSquareBracket, 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test iterative parsing.
|
// Test iterative parsing.
|
||||||
@ -1220,6 +1221,73 @@ TEST(Reader, IterativeParsing_StateTransition_ElementDelimiter) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Test iterative parsing on kParseErrorTermination.
|
||||||
|
struct HandlerTerminateAtStartObject : public IterativeParsingReaderHandler<> {
|
||||||
|
bool StartObject() { return false; }
|
||||||
|
};
|
||||||
|
|
||||||
|
struct HandlerTerminateAtStartArray : public IterativeParsingReaderHandler<> {
|
||||||
|
bool StartArray() { return false; }
|
||||||
|
};
|
||||||
|
|
||||||
|
struct HandlerTerminateAtEndObject : public IterativeParsingReaderHandler<> {
|
||||||
|
bool EndObject(SizeType) { return false; }
|
||||||
|
};
|
||||||
|
|
||||||
|
struct HandlerTerminateAtEndArray : public IterativeParsingReaderHandler<> {
|
||||||
|
bool EndArray(SizeType) { return false; }
|
||||||
|
};
|
||||||
|
|
||||||
|
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(4, 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(6, 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(5, 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(7, r.Offset());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef __GNUC__
|
#ifdef __GNUC__
|
||||||
RAPIDJSON_DIAG_POP
|
RAPIDJSON_DIAG_POP
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user