Skip to content

Commit

Permalink
Add unit tests + minor fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
relatko committed Oct 10, 2022
1 parent 72af007 commit 18a0122
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 9 deletions.
15 changes: 8 additions & 7 deletions app/src/parser.c
Original file line number Diff line number Diff line change
Expand Up @@ -231,7 +231,7 @@ parser_error_t parser_printArgumentArray(const flow_argument_list_t *v, uint8_t
CHECK_PARSER_ERR(json_matchKeyValue(&parsedJson, 0, (char *) "Array", JSMN_ARRAY, &internalTokenElementIdx));
uint16_t arrayTokenCount;
CHECK_PARSER_ERR(array_get_element_count(&parsedJson, internalTokenElementIdx, &arrayTokenCount));
if (arrayIndex >= arrayTokenCount) {
if (arrayTokenCount >= MAX_JSON_ARRAY_TOKEN_COUNT || arrayIndex >= arrayTokenCount) {
return PARSER_UNEXPECTED_NUMBER_ITEMS;
}

Expand Down Expand Up @@ -277,7 +277,7 @@ parser_error_t parser_printArgumentOptionalArray(const flow_argument_list_t *v,
else {
uint16_t arrayTokenCount;
CHECK_PARSER_ERR(array_get_element_count(&parsedJson, internalTokenElementIdx, &arrayTokenCount));
if (arrayIndex >= arrayTokenCount) {
if (arrayTokenCount >= MAX_JSON_ARRAY_TOKEN_COUNT || arrayIndex >= arrayTokenCount) {
return PARSER_UNEXPECTED_NUMBER_ITEMS;
}

Expand All @@ -302,11 +302,11 @@ parser_error_t parser_printArgumentOptionalArray(const flow_argument_list_t *v,
#define FLAG_IS_OPTIONAL_NOT_NONE 0x2000
#define FLAG_IS_ARRAY 0x4000
#define FLAGS_FURTHER_SCREENS 0x0FFF
// jsonToken points to things that is going to be displayed:
// JSMN_ARRAY if it is an array or optional array,
// jsonToken points to thing that is going to be displayed:
// JSMN_ARRAY that contains actual array if it is an array or optional array,
// root JSMN_OBJECT it is optional none or non-optional scalar argument
// nested JSMN_OBJECT for optional scalar arguments
// The function validates json till jsonToken (excluded) but guarantees jsonToken type
// The function validates json till jsonToken (excluded) but guarantees jsonToken type
parser_error_t parser_printArbitraryPrepareToDisplay(const flow_argument_list_t *v, uint8_t argIndex,
uint16_t *flags, uint16_t *jsonToken) {
if (argIndex >= v->argCount) {
Expand All @@ -328,8 +328,8 @@ parser_error_t parser_printArbitraryPrepareToDisplay(const flow_argument_list_t
case JSMN_ARRAY: //array
CHECK_PARSER_ERR(json_matchToken(&parsedJson, keyTokenElementIdx, "Array"));
CHECK_PARSER_ERR(array_get_element_count(&parsedJson, valueTokenElementIdx, flags));
STATIC_ASSERT(FLAGS_FURTHER_SCREENS > MAX_METADATA_MAX_ARRAY_ITEMS, "Flags for further screens too small");
if (*flags > MAX_METADATA_MAX_ARRAY_ITEMS) {
STATIC_ASSERT(FLAGS_FURTHER_SCREENS > MAX_JSON_ARRAY_TOKEN_COUNT, "Flags for further screens too small");
if (*flags > MAX_JSON_ARRAY_TOKEN_COUNT) {
return PARSER_TOO_MANY_ARGUMENTS;
}
*flags = (*flags & FLAGS_FURTHER_SCREENS) | FLAG_IS_ARRAY;
Expand All @@ -344,6 +344,7 @@ parser_error_t parser_printArbitraryPrepareToDisplay(const flow_argument_list_t
*jsonToken = 0;
return PARSER_OK;
case JSMN_OBJECT: //optional not null
CHECK_PARSER_ERR(json_matchToken(&parsedJson, keyTokenElementIdx, "Optional"));
CHECK_PARSER_ERR(json_matchArbitraryKeyValue(&parsedJson, baseValueTokenIndex, &valueJsonType,
&keyTokenElementIdx, &valueTokenElementIdx));
switch (valueJsonType) {
Expand Down
2 changes: 1 addition & 1 deletion app/src/parser_impl.c
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ const char *parser_getErrorDescription(parser_error_t err) {
case PARSER_METADATA_ERROR:
return "Metadata unknown error";
case PARSER_TOO_MANY_ARGUMENTS:
return "Metadata too many arguments";
return "Too many arguments";
default:
return "Unrecognized error code";
}
Expand Down
34 changes: 33 additions & 1 deletion tests/parser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -258,6 +258,12 @@ TEST(parser, printArbitraryPrepareToDisplay) {
EXPECT_THAT(err, PARSER_OK);
EXPECT_THAT(jsonToken, 4);
EXPECT_THAT(flags, 0x4000 | 0x0002);

const auto token = "{\"type\":\"Optional\",\"value\":}";
parser_context_t context = {(const uint8_t *)token, (uint16_t)(strlen(token)), 0};
flow_argument_list_t arg_list2 = {{},{context}, 1};
err = parser_printArbitraryPrepareToDisplay(&arg_list2, 0, &flags, &jsonToken);
EXPECT_THAT(err, PARSER_JSON_INVALID_TOKEN_IDX);
}

TEST(parser, parser_printArbitraryArgumentFirstScreen) {
Expand Down Expand Up @@ -302,11 +308,22 @@ TEST(parser, parser_printArbitraryArgumentFirstScreen) {
EXPECT_STREQ(outValBuf, "545.77");

pageCountVar = 0;
err = parser_printArbitraryArgumentFirstScreen(&arg_list, 5, 0x4000 | 0x0002, 8,
err = parser_printArbitraryArgumentFirstScreen(&arg_list, 5, 0x4000 | 0x0002, 4,
outKeyBuf, 40, outValBuf, 40, 0, &pageCountVar);
EXPECT_THAT(err, PARSER_OK);
EXPECT_STREQ(outKeyBuf, "6: Array");
EXPECT_STREQ(outValBuf, "Length: 2");

pageCountVar = 0;
err = parser_printArbitraryArgumentFirstScreen(&arg_list, 5, 0x0002, 4,
outKeyBuf, 40, outValBuf, 40, 0, &pageCountVar);
EXPECT_THAT(err, PARSER_UNEXPECTED_TYPE);

pageCountVar = 0;
err = parser_printArbitraryArgumentFirstScreen(&arg_list, 1, 0x0002, 0,
outKeyBuf, 40, outValBuf, 40, 0, &pageCountVar);
EXPECT_THAT(err, PARSER_JSON_INVALID);

}


Expand All @@ -321,4 +338,19 @@ TEST(parser, parser_printArbitraryArrayElements) {
EXPECT_STREQ(outKeyBuf, "4: String 2");
EXPECT_STREQ(outValBuf, "84b1ecad1512a64e65e020164");
EXPECT_THAT(pageCountVar, 4);

pageCountVar = 0;
err = parser_printArbitraryArrayElements(&arg_list, 5, 0, 8,
outKeyBuf, 40, outValBuf, 40, 3, &pageCountVar);
EXPECT_THAT(err, PARSER_JSON_INVALID_TOKEN_IDX);

pageCountVar = 0;
err = parser_printArbitraryArrayElements(&arg_list, 5, 2, 4,
outKeyBuf, 40, outValBuf, 40, 3, &pageCountVar);
EXPECT_THAT(err, PARSER_JSON_INVALID_TOKEN_IDX);

pageCountVar = 0;
err = parser_printArbitraryArrayElements(&arg_list, 4, 0, 0,
outKeyBuf, 40, outValBuf, 40, 3, &pageCountVar);
EXPECT_THAT(err, PARSER_JSON_INVALID_TOKEN_IDX);
}

0 comments on commit 18a0122

Please sign in to comment.