diff --git a/src/json/json_parser.h b/src/json/json_parser.h index d3d28aa6fa2..d3155f9e337 100644 --- a/src/json/json_parser.h +++ b/src/json/json_parser.h @@ -17,6 +17,7 @@ Author: Daniel Kroening, kroening@kroening.com #include int yyjsonparse(); +void yyjsonrestart(FILE *input_file); class json_parsert:public parsert { @@ -46,6 +47,7 @@ class json_parsert:public parsert virtual void clear() override { stack=stackt(); + yyjsonrestart(nullptr); } }; diff --git a/unit/json/invalid.json b/unit/json/invalid.json new file mode 100644 index 00000000000..257cc5642cb --- /dev/null +++ b/unit/json/invalid.json @@ -0,0 +1 @@ +foo diff --git a/unit/json/json_parser.cpp b/unit/json/json_parser.cpp new file mode 100644 index 00000000000..0ab1d73bfc4 --- /dev/null +++ b/unit/json/json_parser.cpp @@ -0,0 +1,69 @@ +/*******************************************************************\ + + Module: Example Catch Tests + + Author: Diffblue Ltd. + +\*******************************************************************/ + +#include +#include + +SCENARIO("Loading JSON files") +{ + null_message_handlert message_handler; + GIVEN("A invalid JSON file and a valid JSON file") + { + const std::string valid_json_path = "./json/valid.json"; + const std::string invalid_json_path = "./json/invalid.json"; + + WHEN("Loading the invalid JSON file") + { + jsont invalid_json; + const auto invalid_parse_error = + parse_json(invalid_json_path, message_handler, invalid_json); + THEN("An error state should be returned") + { + REQUIRE(invalid_parse_error); + REQUIRE(invalid_json.is_null()); + AND_WHEN("Loading the valid JSON file") + { + jsont valid_json; + const auto valid_parse_error = + parse_json(valid_json_path, message_handler, valid_json); + THEN("The JSON file should be parsed correctly") + { + REQUIRE_FALSE(valid_parse_error); + REQUIRE(valid_json.is_object()); + REQUIRE(valid_json.object.find("hello") != valid_json.object.end()); + REQUIRE(valid_json.object["hello"].value == "world"); + } + } + } + } + WHEN("Loading the valid JSON file") + { + jsont valid_json; + const auto valid_parse_error = + parse_json(valid_json_path, message_handler, valid_json); + THEN("The JSON file should be parsed correctly") + { + REQUIRE_FALSE(valid_parse_error); + REQUIRE(valid_json.is_object()); + REQUIRE(valid_json.object.find("hello") != valid_json.object.end()); + REQUIRE(valid_json.object["hello"].value == "world"); + AND_WHEN("Loading the invalid JSON file") + { + jsont invalid_json; + const auto invalid_parse_error = + parse_json(invalid_json_path, message_handler, invalid_json); + THEN("An error state should be returned") + { + REQUIRE(invalid_parse_error); + REQUIRE(invalid_json.is_null()); + } + } + } + } + } +} diff --git a/unit/json/valid.json b/unit/json/valid.json new file mode 100644 index 00000000000..f2a886f39de --- /dev/null +++ b/unit/json/valid.json @@ -0,0 +1,3 @@ +{ + "hello": "world" +}