@@ -334,11 +334,16 @@ class TestCmdlineParser : public TestFixture {
334334 TEST_CASE (ruleNotSupported);
335335#endif
336336#ifdef HAVE_RULES
337- TEST_CASE (ruleFile);
337+ TEST_CASE (ruleFileMulti);
338+ TEST_CASE (ruleFileSingle);
338339 TEST_CASE (ruleFileEmpty);
339340 TEST_CASE (ruleFileMissing);
340341 TEST_CASE (ruleFileInvalid);
341342 TEST_CASE (ruleFileNoRoot);
343+ TEST_CASE (ruleFileEmptyElements1);
344+ TEST_CASE (ruleFileEmptyElements2);
345+ TEST_CASE (ruleFileUnknownElement1);
346+ TEST_CASE (ruleFileUnknownElement2);
342347#else
343348 TEST_CASE (ruleFileNotSupported);
344349#endif
@@ -2147,19 +2152,67 @@ class TestCmdlineParser : public TestFixture {
21472152#endif
21482153
21492154#ifdef HAVE_RULES
2150- void ruleFile () {
2155+ void ruleFileMulti () {
21512156 REDIRECT;
21522157 ScopedFile file (" rule.xml" ,
21532158 " <rules>\n "
21542159 " <rule>\n "
2160+ " <tokenlist>toklist1</tokenlist>\n "
21552161 " <pattern>.+</pattern>\n "
2162+ " <message>\n "
2163+ " <severity>error</severity>\n "
2164+ " <id>ruleId1</id>\n "
2165+ " <summary>ruleSummary1</summary>\n "
2166+ " </message>\n "
2167+ " </rule>\n "
2168+ " <rule>\n "
2169+ " <tokenlist>toklist2</tokenlist>\n "
2170+ " <pattern>.*</pattern>\n "
2171+ " <message>\n "
2172+ " <severity>warning</severity>\n "
2173+ " <id>ruleId2</id>\n "
2174+ " <summary>ruleSummary2</summary>\n "
2175+ " </message>\n "
21562176 " </rule>\n "
21572177 " </rules>" );
21582178 const char * const argv[] = {" cppcheck" , " --rule-file=rule.xml" , " file.cpp" };
21592179 ASSERT_EQUALS_ENUM (CmdLineParser::Result::Success, parser->parseFromArgs (3 , argv));
2180+ ASSERT_EQUALS (2 , settings->rules .size ());
2181+ auto it = settings->rules .cbegin ();
2182+ ASSERT_EQUALS (" toklist1" , it->tokenlist );
2183+ ASSERT_EQUALS (" .+" , it->pattern );
2184+ ASSERT_EQUALS_ENUM (Severity::error, it->severity );
2185+ ASSERT_EQUALS (" ruleId1" , it->id );
2186+ ASSERT_EQUALS (" ruleSummary1" , it->summary );
2187+ ++it;
2188+ ASSERT_EQUALS (" toklist2" , it->tokenlist );
2189+ ASSERT_EQUALS (" .*" , it->pattern );
2190+ ASSERT_EQUALS_ENUM (Severity::warning, it->severity );
2191+ ASSERT_EQUALS (" ruleId2" , it->id );
2192+ ASSERT_EQUALS (" ruleSummary2" , it->summary );
2193+ }
2194+
2195+ void ruleFileSingle () {
2196+ REDIRECT;
2197+ ScopedFile file (" rule.xml" ,
2198+ " <rule>\n "
2199+ " <tokenlist>toklist</tokenlist>\n "
2200+ " <pattern>.+</pattern>\n "
2201+ " <message>\n "
2202+ " <severity>error</severity>\n "
2203+ " <id>ruleId</id>\n "
2204+ " <summary>ruleSummary</summary>\n "
2205+ " </message>\n "
2206+ " </rule>\n " );
2207+ const char * const argv[] = {" cppcheck" , " --rule-file=rule.xml" , " file.cpp" };
2208+ ASSERT_EQUALS_ENUM (CmdLineParser::Result::Success, parser->parseFromArgs (3 , argv));
21602209 ASSERT_EQUALS (1 , settings->rules .size ());
21612210 auto it = settings->rules .cbegin ();
2211+ ASSERT_EQUALS (" toklist" , it->tokenlist );
21622212 ASSERT_EQUALS (" .+" , it->pattern );
2213+ ASSERT_EQUALS_ENUM (Severity::error, it->severity );
2214+ ASSERT_EQUALS (" ruleId" , it->id );
2215+ ASSERT_EQUALS (" ruleSummary" , it->summary );
21632216 }
21642217
21652218 void ruleFileEmpty () {
@@ -2189,6 +2242,63 @@ class TestCmdlineParser : public TestFixture {
21892242 ScopedFile file (" rule.xml" , " <?xml version=\" 1.0\" ?>" );
21902243 const char * const argv[] = {" cppcheck" , " --rule-file=rule.xml" , " file.cpp" };
21912244 ASSERT_EQUALS_ENUM (CmdLineParser::Result::Success, parser->parseFromArgs (3 , argv));
2245+ ASSERT_EQUALS (0 , settings->rules .size ());
2246+ }
2247+
2248+ void ruleFileEmptyElements1 () {
2249+ REDIRECT;
2250+ ScopedFile file (" rule.xml" ,
2251+ " <rule>"
2252+ " <tokenlist/>"
2253+ " <pattern/>"
2254+ " <message/>"
2255+ " </rule>"
2256+ );
2257+ const char * const argv[] = {" cppcheck" , " --rule-file=rule.xml" , " file.cpp" };
2258+ ASSERT_EQUALS_ENUM (CmdLineParser::Result::Fail, parser->parseFromArgs (3 , argv)); // do not crash
2259+ ASSERT_EQUALS (" cppcheck: error: unable to load rule-file 'rule.xml' - a rule is lacking a pattern.\n " , logger->str ());
2260+ }
2261+
2262+ void ruleFileEmptyElements2 () {
2263+ REDIRECT;
2264+ ScopedFile file (" rule.xml" ,
2265+ " <rule>"
2266+ " <message>"
2267+ " <severity/>"
2268+ " <id/>"
2269+ " <summary/>"
2270+ " </message>"
2271+ " </rule>"
2272+ );
2273+ const char * const argv[] = {" cppcheck" , " --rule-file=rule.xml" , " file.cpp" };
2274+ ASSERT_EQUALS_ENUM (CmdLineParser::Result::Fail, parser->parseFromArgs (3 , argv)); // do not crash
2275+ ASSERT_EQUALS (" cppcheck: error: unable to load rule-file 'rule.xml' - a rule is lacking a pattern.\n " , logger->str ());
2276+ }
2277+
2278+ void ruleFileUnknownElement1 () {
2279+ REDIRECT;
2280+ ScopedFile file (" rule.xml" ,
2281+ " <rule>"
2282+ " <messages/>"
2283+ " </rule>"
2284+ );
2285+ const char * const argv[] = {" cppcheck" , " --rule-file=rule.xml" , " file.cpp" };
2286+ ASSERT_EQUALS_ENUM (CmdLineParser::Result::Fail, parser->parseFromArgs (3 , argv));
2287+ ASSERT_EQUALS (" cppcheck: error: unable to load rule-file 'rule.xml' - unknown element 'messages' encountered in 'rule'.\n " , logger->str ());
2288+ }
2289+
2290+ void ruleFileUnknownElement2 () {
2291+ REDIRECT;
2292+ ScopedFile file (" rule.xml" ,
2293+ " <rule>"
2294+ " <message>"
2295+ " <pattern/>"
2296+ " </message>"
2297+ " </rule>"
2298+ );
2299+ const char * const argv[] = {" cppcheck" , " --rule-file=rule.xml" , " file.cpp" };
2300+ ASSERT_EQUALS_ENUM (CmdLineParser::Result::Fail, parser->parseFromArgs (3 , argv));
2301+ ASSERT_EQUALS (" cppcheck: error: unable to load rule-file 'rule.xml' - unknown element 'pattern' encountered in 'message'.\n " , logger->str ());
21922302 }
21932303#else
21942304 void ruleFileNotSupported () {
0 commit comments