diff --git a/cli/cmdlineparser.cpp b/cli/cmdlineparser.cpp index 2e4434499..89f1e50bd 100644 --- a/cli/cmdlineparser.cpp +++ b/cli/cmdlineparser.cpp @@ -370,8 +370,13 @@ bool CmdLineParser::ParseFromArgs(int argc, const char* const argv[]) } - if (argc <= 1 || _showHelp) + if (argc <= 1) + _showHelp = true; + + if (_showHelp) + { PrintHelp(); + } else if (_pathnames.empty()) { std::cout << "cppcheck: No C or C++ source files found."; diff --git a/cli/cmdlineparser.h b/cli/cmdlineparser.h index 86de1ea92..7a02a1475 100644 --- a/cli/cmdlineparser.h +++ b/cli/cmdlineparser.h @@ -76,6 +76,14 @@ public: return _pathnames; } + /** + * Return if help is shown to user. + */ + bool GetShowHelp() const + { + return _showHelp; + } + protected: /** diff --git a/test/test.vcproj b/test/test.vcproj index c7c61cc27..c3f4a000c 100755 --- a/test/test.vcproj +++ b/test/test.vcproj @@ -44,7 +44,7 @@ + + @@ -274,6 +278,10 @@ RelativePath="testclass.cpp" > + + @@ -428,6 +436,10 @@ RelativePath="..\lib\classinfo.h" > + + diff --git a/test/test.vcxproj b/test/test.vcxproj index 87f5a0172..1a47aa819 100644 --- a/test/test.vcxproj +++ b/test/test.vcxproj @@ -57,7 +57,7 @@ Disabled - ..\lib;%(AdditionalIncludeDirectories) + ..\lib;..\cli;%(AdditionalIncludeDirectories) _DEBUG;WIN32;UNIT_TESTING;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebug @@ -94,7 +94,7 @@ MaxSpeed true true - ..\lib;%(AdditionalIncludeDirectories) + ..\lib;..\cli;%(AdditionalIncludeDirectories) NDEBUG;WIN32;UNIT_TESTING;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) MultiThreaded false @@ -120,6 +120,7 @@ + @@ -144,6 +145,7 @@ + @@ -169,6 +171,7 @@ + diff --git a/test/test.vcxproj.filters b/test/test.vcxproj.filters index ff7a82552..ed3d431ea 100644 --- a/test/test.vcxproj.filters +++ b/test/test.vcxproj.filters @@ -152,6 +152,12 @@ Source Files + + Source Files + + + Source Files + @@ -226,5 +232,8 @@ Header Files + + Header Files + \ No newline at end of file diff --git a/test/testcmdlineparser.cpp b/test/testcmdlineparser.cpp new file mode 100644 index 000000000..a1abdbd50 --- /dev/null +++ b/test/testcmdlineparser.cpp @@ -0,0 +1,118 @@ +/* + * Cppcheck - A tool for static C/C++ code analysis + * Copyright (C) 2007-2010 Daniel Marjamäki and Cppcheck team. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include +#include "testsuite.h" +#include "cmdlineparser.h" +#include "settings.h" + +extern std::ostringstream errout; +extern std::ostringstream output; + +class RedirectInputOutput +{ +public: + RedirectInputOutput() + { + // flush all old output + std::cout.flush(); + std::cerr.flush(); + + _oldCout = std::cout.rdbuf(); // back up cout's streambuf + _oldCerr = std::cerr.rdbuf(); // back up cerr's streambuf + + std::cout.rdbuf(_out.rdbuf()); // assign streambuf to cout + std::cerr.rdbuf(_err.rdbuf()); // assign streambuf to cerr + } + + ~RedirectInputOutput() + { + std::cout.rdbuf(_oldCout); // restore cout's original streambuf + std::cerr.rdbuf(_oldCerr); // restore cerrs's original streambuf + + errout << _err.str(); + output << _out.str(); + } + +private: + std::stringstream _out; + std::stringstream _err; + std::streambuf* _oldCout; + std::streambuf *_oldCerr; +}; + +#define REDIRECT RedirectInputOutput redir; + +class TestCmdlineParser : public TestFixture +{ +public: + TestCmdlineParser() : TestFixture("TestCmdlineParser") + { } + +private: + + void run() + { + TEST_CASE(nooptions); + TEST_CASE(helpshort); + TEST_CASE(helplong); + TEST_CASE(showversion); + } + + void nooptions() + { + REDIRECT; + const char *argv[] = {"cppcheck"}; + Settings settings; + CmdLineParser parser(&settings); + ASSERT(parser.ParseFromArgs(1, argv)); + ASSERT_EQUALS(true, parser.GetShowHelp()); + } + + void helpshort() + { + REDIRECT; + const char *argv[] = {"cppcheck", "-h"}; + Settings settings; + CmdLineParser parser(&settings); + ASSERT(parser.ParseFromArgs(2, argv)); + ASSERT_EQUALS(true, parser.GetShowHelp()); + } + + void helplong() + { + REDIRECT; + const char *argv[] = {"cppcheck", "--help"}; + Settings settings; + CmdLineParser parser(&settings); + ASSERT(parser.ParseFromArgs(2, argv)); + ASSERT_EQUALS(true, parser.GetShowHelp()); + } + + void showversion() + { + REDIRECT; + const char *argv[] = {"cppcheck", "--version"}; + Settings settings; + CmdLineParser parser(&settings); + ASSERT(parser.ParseFromArgs(2, argv)); + ASSERT_EQUALS(true, parser.GetShowVersion()); + } +}; + +REGISTER_TEST(TestCmdlineParser)