@@ -255,11 +255,16 @@ class TestCmdlineParser : public TestFixture {
255255 TEST_CASE (errorlistverbose1);
256256 TEST_CASE (errorlistverbose2);
257257 TEST_CASE (ignorepathsnopath);
258+ #if defined(USE_WINDOWS_SEH) || defined(USE_UNIX_SIGNAL_HANDLING)
258259 TEST_CASE (exceptionhandling);
259260 TEST_CASE (exceptionhandling2);
260261 TEST_CASE (exceptionhandling3);
261262 TEST_CASE (exceptionhandlingInvalid);
262263 TEST_CASE (exceptionhandlingInvalid2);
264+ #else
265+ TEST_CASE (exceptionhandlingNotSupported);
266+ TEST_CASE (exceptionhandlingNotSupported2);
267+ #endif
263268 TEST_CASE (clang);
264269 TEST_CASE (clang2);
265270 TEST_CASE (clangInvalid);
@@ -275,6 +280,8 @@ class TestCmdlineParser : public TestFixture {
275280 TEST_CASE (loadAverage);
276281 TEST_CASE (loadAverage2);
277282 TEST_CASE (loadAverageInvalid);
283+ #else
284+ TEST_CASE (loadAverageNotSupported);
278285#endif
279286 TEST_CASE (maxCtuDepth);
280287 TEST_CASE (maxCtuDepthInvalid);
@@ -297,6 +304,19 @@ class TestCmdlineParser : public TestFixture {
297304 TEST_CASE (projectMissing);
298305 TEST_CASE (projectNoPaths);
299306 TEST_CASE (addon);
307+ #ifdef HAVE_RULES
308+ TEST_CASE (rule);
309+ #else
310+ TEST_CASE (ruleNotSupported);
311+ #endif
312+ #ifdef HAVE_RULES
313+ TEST_CASE (ruleFile);
314+ TEST_CASE (ruleFileEmpty);
315+ TEST_CASE (ruleFileMissing);
316+ TEST_CASE (ruleFileInvalid);
317+ #else
318+ TEST_CASE (ruleFileNotSupported);
319+ #endif
300320
301321 TEST_CASE (ignorepaths1);
302322 TEST_CASE (ignorepaths2);
@@ -1703,6 +1723,7 @@ class TestCmdlineParser : public TestFixture {
17031723 ASSERT_EQUALS (" cppcheck: error: argument to '-i' is missing.\n " , logger->str ());
17041724 }
17051725
1726+ #if defined(USE_WINDOWS_SEH) || defined(USE_UNIX_SIGNAL_HANDLING)
17061727 void exceptionhandling () {
17071728 REDIRECT;
17081729 const char * const argv[] = {" cppcheck" , " --exception-handling" , " file.cpp" };
@@ -1749,6 +1770,21 @@ class TestCmdlineParser : public TestFixture {
17491770 ASSERT_EQUALS (false , parser->parseFromArgs (2 , argv));
17501771 ASSERT_EQUALS (" cppcheck: error: unrecognized command line option: \" --exception-handling-foo\" .\n " , logger->str ());
17511772 }
1773+ #else
1774+ void exceptionhandlingNotSupported () {
1775+ REDIRECT;
1776+ const char * const argv[] = {" cppcheck" , " --exception-handling" , " file.cpp" };
1777+ ASSERT (!parser->parseFromArgs (3 , argv));
1778+ ASSERT_EQUALS (" cppcheck: error: Option --exception-handling is not supported since Cppcheck has not been built with any exception handling enabled.\n " , logger->str ());
1779+ }
1780+
1781+ void exceptionhandlingNotSupported2 () {
1782+ REDIRECT;
1783+ const char * const argv[] = {" cppcheck" , " --exception-handling=stderr" , " file.cpp" };
1784+ ASSERT (!parser->parseFromArgs (3 , argv));
1785+ ASSERT_EQUALS (" cppcheck: error: Option --exception-handling is not supported since Cppcheck has not been built with any exception handling enabled.\n " , logger->str ());
1786+ }
1787+ #endif
17521788
17531789 void clang () {
17541790 REDIRECT;
@@ -1866,6 +1902,13 @@ class TestCmdlineParser : public TestFixture {
18661902 ASSERT (!parser->parseFromArgs (4 , argv));
18671903 ASSERT_EQUALS (" cppcheck: error: argument to '-l' is not valid - not an integer.\n " , logger->str ());
18681904 }
1905+ #else
1906+ void loadAverageNotSupported () {
1907+ REDIRECT;
1908+ const char * const argv[] = {" cppcheck" , " -l" , " 12" , " file.cpp" };
1909+ ASSERT (!parser->parseFromArgs (4 , argv));
1910+ ASSERT_EQUALS (" cppcheck: error: Option -l cannot be used as Cppcheck has not been built with fork threading model.\n " , logger->str ());
1911+ }
18691912#endif
18701913
18711914 void maxCtuDepth () {
@@ -2026,6 +2069,72 @@ class TestCmdlineParser : public TestFixture {
20262069 ASSERT_EQUALS (" " , GET_REDIRECT_OUTPUT);
20272070 }
20282071
2072+ #ifdef HAVE_RULES
2073+ void rule () {
2074+ REDIRECT;
2075+ const char * const argv[] = {" cppcheck" , " --rule=.+" , " file.cpp" };
2076+ ASSERT (parser->parseFromArgs (3 , argv));
2077+ ASSERT_EQUALS (1 , settings->rules .size ());
2078+ auto it = settings->rules .cbegin ();
2079+ ASSERT_EQUALS (" .+" , it->pattern );
2080+ ASSERT_EQUALS (" " , logger->str ());
2081+ }
2082+ #else
2083+ void ruleNotSupported () {
2084+ REDIRECT;
2085+ const char * const argv[] = {" cppcheck" , " --rule=.+" , " file.cpp" };
2086+ ASSERT (!parser->parseFromArgs (3 , argv));
2087+ ASSERT_EQUALS (" cppcheck: error: Option --rule cannot be used as Cppcheck has not been built with rules support.\n " , logger->str ());
2088+ }
2089+ #endif
2090+
2091+ #ifdef HAVE_RULES
2092+ void ruleFile () {
2093+ REDIRECT;
2094+ ScopedFile file (" rule.xml" ,
2095+ " <rules>\n "
2096+ " <rule>\n "
2097+ " <pattern>.+</pattern>\n "
2098+ " </rule>\n "
2099+ " </rules>" );
2100+ const char * const argv[] = {" cppcheck" , " --rule-file=rule.xml" , " file.cpp" };
2101+ ASSERT (parser->parseFromArgs (3 , argv));
2102+ ASSERT_EQUALS (1 , settings->rules .size ());
2103+ auto it = settings->rules .cbegin ();
2104+ ASSERT_EQUALS (" .+" , it->pattern );
2105+ ASSERT_EQUALS (" " , logger->str ());
2106+ }
2107+
2108+ void ruleFileEmpty () {
2109+ REDIRECT;
2110+ const char * const argv[] = {" cppcheck" , " --rule-file=" , " file.cpp" };
2111+ ASSERT (!parser->parseFromArgs (3 , argv));
2112+ ASSERT_EQUALS (" cppcheck: error: unable to load rule-file '' (XML_ERROR_FILE_NOT_FOUND).\n " , logger->str ());
2113+ }
2114+
2115+ void ruleFileMissing () {
2116+ REDIRECT;
2117+ const char * const argv[] = {" cppcheck" , " --rule-file=rule.xml" , " file.cpp" };
2118+ ASSERT (!parser->parseFromArgs (3 , argv));
2119+ ASSERT_EQUALS (" cppcheck: error: unable to load rule-file 'rule.xml' (XML_ERROR_FILE_NOT_FOUND).\n " , logger->str ());
2120+ }
2121+
2122+ void ruleFileInvalid () {
2123+ REDIRECT;
2124+ ScopedFile file (" rule.xml" , " " );
2125+ const char * const argv[] = {" cppcheck" , " --rule-file=rule.xml" , " file.cpp" };
2126+ ASSERT (!parser->parseFromArgs (3 , argv));
2127+ ASSERT_EQUALS (" cppcheck: error: unable to load rule-file 'rule.xml' (XML_ERROR_EMPTY_DOCUMENT).\n " , logger->str ());
2128+ }
2129+ #else
2130+ void ruleFileNotSupported () {
2131+ REDIRECT;
2132+ const char * const argv[] = {" cppcheck" , " --rule-file=rule.xml" , " file.cpp" };
2133+ ASSERT (!parser->parseFromArgs (3 , argv));
2134+ ASSERT_EQUALS (" cppcheck: error: Option --rule-file cannot be used as Cppcheck has not been built with rules support.\n " , logger->str ());
2135+ }
2136+ #endif
2137+
20292138 void ignorepaths1 () {
20302139 REDIRECT;
20312140 const char * const argv[] = {" cppcheck" , " -isrc" , " file.cpp" };
0 commit comments