Merge pull request #302 from thebusytypist/issue298_coverage
Improve code coverage for iterative parsing
This commit is contained in:
commit
fa32ec8991
@ -1227,14 +1227,9 @@ private:
|
|||||||
// May return a new state on state pop.
|
// May return a new state on state pop.
|
||||||
template <unsigned parseFlags, typename InputStream, typename Handler>
|
template <unsigned parseFlags, typename InputStream, typename Handler>
|
||||||
RAPIDJSON_FORCEINLINE IterativeParsingState Transit(IterativeParsingState src, Token token, IterativeParsingState dst, InputStream& is, Handler& handler) {
|
RAPIDJSON_FORCEINLINE IterativeParsingState Transit(IterativeParsingState src, Token token, IterativeParsingState dst, InputStream& is, Handler& handler) {
|
||||||
|
(void)token;
|
||||||
|
|
||||||
switch (dst) {
|
switch (dst) {
|
||||||
case IterativeParsingStartState:
|
|
||||||
RAPIDJSON_ASSERT(false);
|
|
||||||
return IterativeParsingErrorState;
|
|
||||||
|
|
||||||
case IterativeParsingFinishState:
|
|
||||||
return dst;
|
|
||||||
|
|
||||||
case IterativeParsingErrorState:
|
case IterativeParsingErrorState:
|
||||||
return dst;
|
return dst;
|
||||||
|
|
||||||
@ -1273,12 +1268,9 @@ private:
|
|||||||
return dst;
|
return dst;
|
||||||
|
|
||||||
case IterativeParsingKeyValueDelimiterState:
|
case IterativeParsingKeyValueDelimiterState:
|
||||||
if (token == ColonToken) {
|
RAPIDJSON_ASSERT(token == ColonToken);
|
||||||
is.Take();
|
is.Take();
|
||||||
return dst;
|
return dst;
|
||||||
}
|
|
||||||
else
|
|
||||||
return IterativeParsingErrorState;
|
|
||||||
|
|
||||||
case IterativeParsingMemberValueState:
|
case IterativeParsingMemberValueState:
|
||||||
// Must be non-compound value. Or it would be ObjectInitial or ArrayInitial state.
|
// Must be non-compound value. Or it would be ObjectInitial or ArrayInitial state.
|
||||||
@ -1353,17 +1345,25 @@ private:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
case IterativeParsingValueState:
|
default:
|
||||||
|
// This branch is for IterativeParsingValueState actually.
|
||||||
|
// Use `default:` rather than
|
||||||
|
// `case IterativeParsingValueState:` is for code coverage.
|
||||||
|
|
||||||
|
// The IterativeParsingStartState is not enumerated in this switch-case.
|
||||||
|
// It is impossible for that case. And it can be caught by following assertion.
|
||||||
|
|
||||||
|
// The IterativeParsingFinishState is not enumerated in this switch-case either.
|
||||||
|
// It is a "derivative" state which cannot triggered from Predict() directly.
|
||||||
|
// Therefore it cannot happen here. And it can be caught by following assertion.
|
||||||
|
RAPIDJSON_ASSERT(dst == IterativeParsingValueState);
|
||||||
|
|
||||||
// Must be non-compound value. Or it would be ObjectInitial or ArrayInitial state.
|
// Must be non-compound value. Or it would be ObjectInitial or ArrayInitial state.
|
||||||
ParseValue<parseFlags>(is, handler);
|
ParseValue<parseFlags>(is, handler);
|
||||||
if (HasParseError()) {
|
if (HasParseError()) {
|
||||||
return IterativeParsingErrorState;
|
return IterativeParsingErrorState;
|
||||||
}
|
}
|
||||||
return IterativeParsingFinishState;
|
return IterativeParsingFinishState;
|
||||||
|
|
||||||
default:
|
|
||||||
RAPIDJSON_ASSERT(false);
|
|
||||||
return IterativeParsingErrorState;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1053,6 +1053,17 @@ TEST(Reader, IterativeParsing_ErrorHandling) {
|
|||||||
TESTERRORHANDLING("{\"a\"}", kParseErrorObjectMissColon, 4u);
|
TESTERRORHANDLING("{\"a\"}", kParseErrorObjectMissColon, 4u);
|
||||||
TESTERRORHANDLING("{\"a\": 1", kParseErrorObjectMissCommaOrCurlyBracket, 7u);
|
TESTERRORHANDLING("{\"a\": 1", kParseErrorObjectMissCommaOrCurlyBracket, 7u);
|
||||||
TESTERRORHANDLING("[1 2 3]", kParseErrorArrayMissCommaOrSquareBracket, 3u);
|
TESTERRORHANDLING("[1 2 3]", kParseErrorArrayMissCommaOrSquareBracket, 3u);
|
||||||
|
TESTERRORHANDLING("{\"a: 1", kParseErrorStringMissQuotationMark, 5u);
|
||||||
|
|
||||||
|
// Any JSON value can be a valid root element in RFC7159.
|
||||||
|
TESTERRORHANDLING("\"ab", kParseErrorStringMissQuotationMark, 2u);
|
||||||
|
TESTERRORHANDLING("truE", kParseErrorValueInvalid, 3u);
|
||||||
|
TESTERRORHANDLING("False", kParseErrorValueInvalid, 0u);
|
||||||
|
TESTERRORHANDLING("true, false", kParseErrorDocumentRootNotSingular, 4u);
|
||||||
|
TESTERRORHANDLING("false, false", kParseErrorDocumentRootNotSingular, 5u);
|
||||||
|
TESTERRORHANDLING("nulL", kParseErrorValueInvalid, 3u);
|
||||||
|
TESTERRORHANDLING("null , null", kParseErrorDocumentRootNotSingular, 5u);
|
||||||
|
TESTERRORHANDLING("1a", kParseErrorDocumentRootNotSingular, 1u);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Encoding = UTF8<> >
|
template<typename Encoding = UTF8<> >
|
||||||
|
Loading…
x
Reference in New Issue
Block a user