Commit e357f559 authored by Tomek Mrugalski's avatar Tomek Mrugalski 🛰
Browse files

[5017] Parser unit-tests cleanup:

 - removed almost redundant functions
 - added comments
parent eabcd010
......@@ -16,17 +16,33 @@ using namespace std;
namespace {
/// @brief compares two JSON trees
///
/// If differences are discovered, gtest failure is reported (using EXPECT_EQ)
///
/// @param a first to be compared
/// @param b second to be compared
void compareJSON(ConstElementPtr a, ConstElementPtr b) {
ASSERT_TRUE(a);
ASSERT_TRUE(b);
EXPECT_EQ(a->str(), b->str());
}
void testParser(const std::string& txt, Parser4Context::ParserType parser_type) {
ElementPtr reference_json;
/// @brief Tests if the input string can be parsed with specific parser
///
/// The input text will be passed to bison parser of specified type.
/// Then the same input text is passed to legacy JSON parser and outputs
/// from both parsers are compared. The legacy comparison can be disabled,
/// if the feature tested is not supported by the old parser (e.g.
/// new comment styles)
///
/// @param txt text to be compared
/// @param parser_type bison parser type to be instantiated
/// @param compare whether to compare the output with legacy JSON parser
void testParser(const std::string& txt, Parser4Context::ParserType parser_type,
bool compare = true) {
ConstElementPtr test_json;
ASSERT_NO_THROW(reference_json = Element::fromJSON(txt, true));
ASSERT_NO_THROW({
try {
Parser4Context ctx;
......@@ -38,29 +54,16 @@ void testParser(const std::string& txt, Parser4Context::ParserType parser_type)
});
if (!compare) {
return;
};
// Now compare if both representations are the same.
ElementPtr reference_json;
ASSERT_NO_THROW(reference_json = Element::fromJSON(txt, true));
compareJSON(reference_json, test_json);
}
void testParser2(const std::string& txt, Parser4Context::ParserType parser_type) {
ConstElementPtr test_json;
ASSERT_NO_THROW({
try {
Parser4Context ctx;
test_json = ctx.parseString(txt, parser_type);
} catch (const std::exception &e) {
cout << "EXCEPTION: " << e.what() << endl;
throw;
}
});
/// @todo: Implement actual validation here. since the original
/// Element::fromJSON does not support several comment types, we don't
/// have anything to compare with.
/// std::cout << "Original text:" << txt << endl;
/// std::cout << "Parsed text :" << test_json->str() << endl;
}
TEST(ParserTest, mapInMap) {
string txt = "{ \"xyzzy\": { \"foo\": 123, \"baz\": 456 } }";
testParser(txt, Parser4Context::PARSER_JSON);
......@@ -140,7 +143,7 @@ TEST(ParserTest, bashComments) {
" \"interface\": \"eth0\""
" } ],"
"\"valid-lifetime\": 4000 } }";
testParser(txt, Parser4Context::PARSER_DHCP4);
testParser(txt, Parser4Context::PARSER_DHCP4, false);
}
TEST(ParserTest, cComments) {
......@@ -155,7 +158,7 @@ TEST(ParserTest, cComments) {
" \"interface\": \"eth0\""
" } ],"
"\"valid-lifetime\": 4000 } }";
testParser2(txt, Parser4Context::PARSER_DHCP4);
testParser(txt, Parser4Context::PARSER_DHCP4, false);
}
TEST(ParserTest, bashCommentsInline) {
......@@ -170,7 +173,7 @@ TEST(ParserTest, bashCommentsInline) {
" \"interface\": \"eth0\""
" } ],"
"\"valid-lifetime\": 4000 } }";
testParser2(txt, Parser4Context::PARSER_DHCP4);
testParser(txt, Parser4Context::PARSER_DHCP4, false);
}
TEST(ParserTest, multilineComments) {
......@@ -187,7 +190,7 @@ TEST(ParserTest, multilineComments) {
" \"interface\": \"eth0\""
" } ],"
"\"valid-lifetime\": 4000 } }";
testParser2(txt, Parser4Context::PARSER_DHCP4);
testParser(txt, Parser4Context::PARSER_DHCP4, false);
}
/// @brief removes comments from a JSON file
......@@ -267,6 +270,14 @@ std::string decommentJSONfile(const std::string& input_file) {
return (outfile);
}
/// @brief Loads specified example config file
///
/// This test loads specified example file twice: first, using the legacy
/// JSON file and then second time using bison parser. Two created Element
/// trees are then compared. The input is decommented before it is passed
/// to legacy parser (as its support for comments is very limited).
///
/// @param fname name of the file to be loaded
void testFile(const std::string& fname) {
ElementPtr reference_json;
ConstElementPtr test_json;
......@@ -294,8 +305,6 @@ void testFile(const std::string& fname) {
ASSERT_TRUE(test_json);
compareJSON(reference_json, test_json);
}
// This test loads all available existing files. Each config is loaded
......
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