Commit 46e89dad authored by thebusytypist's avatar thebusytypist

Add unittests for kParserErrorTermination; Fix bugs in last merge.

parent d4da07c5
...@@ -1023,7 +1023,6 @@ private: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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) { ...@@ -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) { ...@@ -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) { ...@@ -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
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