diff --git a/Makefile b/Makefile index 22cff7582a6..a3a7b806fa8 100644 --- a/Makefile +++ b/Makefile @@ -688,7 +688,7 @@ frontend/frontend.o: frontend/frontend.cpp frontend/frontend.h lib/addoninfo.h l cli/cmdlineparser.o: cli/cmdlineparser.cpp cli/cmdlinelogger.h cli/cmdlineparser.h cli/filelister.h externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/importproject.h lib/library.h lib/mathlib.h lib/path.h lib/pathmatch.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/timer.h lib/utils.h lib/xml.h $(CXX) ${INCLUDE_FOR_CLI} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ cli/cmdlineparser.cpp -cli/cppcheckexecutor.o: cli/cppcheckexecutor.cpp cli/cmdlinelogger.h cli/cmdlineparser.h cli/cppcheckexecutor.h cli/executor.h cli/processexecutor.h cli/sehwrapper.h cli/signalhandler.h cli/singleexecutor.h cli/threadexecutor.h externals/picojson/picojson.h lib/addoninfo.h lib/analyzerinfo.h lib/check.h lib/checkers.h lib/checkersreport.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/json.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/sarifreport.h lib/settings.h lib/standards.h lib/suppressions.h lib/utils.h +cli/cppcheckexecutor.o: cli/cppcheckexecutor.cpp cli/cmdlinelogger.h cli/cmdlineparser.h cli/cppcheckexecutor.h cli/executor.h cli/processexecutor.h cli/sehwrapper.h cli/signalhandler.h cli/singleexecutor.h cli/threadexecutor.h externals/picojson/picojson.h lib/addoninfo.h lib/analyzerinfo.h lib/check.h lib/checkers.h lib/checkersreport.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/json.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/sarifreport.h lib/settings.h lib/standards.h lib/suppressions.h lib/timer.h lib/utils.h $(CXX) ${INCLUDE_FOR_CLI} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ cli/cppcheckexecutor.cpp cli/executor.o: cli/executor.cpp cli/executor.h lib/addoninfo.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/utils.h diff --git a/cli/cmdlineparser.cpp b/cli/cmdlineparser.cpp index b9006711ce1..d7b8c260128 100644 --- a/cli/cmdlineparser.cpp +++ b/cli/cmdlineparser.cpp @@ -1393,17 +1393,17 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a else if (std::strncmp(argv[i], "--showtime=", 11) == 0) { const std::string showtimeMode = argv[i] + 11; if (showtimeMode == "file") - mSettings.showtime = SHOWTIME_MODES::SHOWTIME_FILE; + mSettings.showtime = ShowTime::FILE; else if (showtimeMode == "file-total") - mSettings.showtime = SHOWTIME_MODES::SHOWTIME_FILE_TOTAL; + mSettings.showtime = ShowTime::FILE_TOTAL; else if (showtimeMode == "summary") - mSettings.showtime = SHOWTIME_MODES::SHOWTIME_SUMMARY; + mSettings.showtime = ShowTime::SUMMARY; else if (showtimeMode == "top5_file") - mSettings.showtime = SHOWTIME_MODES::SHOWTIME_TOP5_FILE; + mSettings.showtime = ShowTime::TOP5_FILE; else if (showtimeMode == "top5_summary") - mSettings.showtime = SHOWTIME_MODES::SHOWTIME_TOP5_SUMMARY; + mSettings.showtime = ShowTime::TOP5_SUMMARY; else if (showtimeMode == "none") - mSettings.showtime = SHOWTIME_MODES::SHOWTIME_NONE; + mSettings.showtime = ShowTime::NONE; else if (showtimeMode.empty()) { mLogger.printError("no mode provided for --showtime"); return Result::Fail; diff --git a/cli/cppcheckexecutor.cpp b/cli/cppcheckexecutor.cpp index acac0b5f8cd..cbe519078f7 100644 --- a/cli/cppcheckexecutor.cpp +++ b/cli/cppcheckexecutor.cpp @@ -38,6 +38,7 @@ #include "settings.h" #include "singleexecutor.h" #include "suppressions.h" +#include "timer.h" #include "utils.h" #if defined(HAS_THREADING_MODEL_THREAD) @@ -270,6 +271,8 @@ int CppCheckExecutor::check(int argc, const char* const argv[]) return EXIT_SUCCESS; } + Timer realTimeClock("", settings.showtime, nullptr, Timer::Type::OVERALL); + settings.loadSummaries(); mFiles = parser.getFiles(); diff --git a/cli/processexecutor.cpp b/cli/processexecutor.cpp index 8d25bf3803c..7efd4106db1 100644 --- a/cli/processexecutor.cpp +++ b/cli/processexecutor.cpp @@ -450,7 +450,7 @@ unsigned int ProcessExecutor::check() } // TODO: wee need to get the timing information from the subprocess - if (mSettings.showtime == SHOWTIME_MODES::SHOWTIME_SUMMARY || mSettings.showtime == SHOWTIME_MODES::SHOWTIME_TOP5_SUMMARY) + if (mSettings.showtime == ShowTime::SUMMARY || mSettings.showtime == ShowTime::TOP5_SUMMARY) CppCheck::printTimerResults(mSettings.showtime); return result; diff --git a/cli/singleexecutor.cpp b/cli/singleexecutor.cpp index 5d7e4a83f9d..54cab1cb8d8 100644 --- a/cli/singleexecutor.cpp +++ b/cli/singleexecutor.cpp @@ -70,7 +70,7 @@ unsigned int SingleExecutor::check() if (mCppcheck.analyseWholeProgram()) result++; - if (mSettings.showtime == SHOWTIME_MODES::SHOWTIME_SUMMARY || mSettings.showtime == SHOWTIME_MODES::SHOWTIME_TOP5_SUMMARY) + if (mSettings.showtime == ShowTime::SUMMARY || mSettings.showtime == ShowTime::TOP5_SUMMARY) CppCheck::printTimerResults(mSettings.showtime); return result; diff --git a/cli/threadexecutor.cpp b/cli/threadexecutor.cpp index 75b1a4524c6..b1bc75731ff 100644 --- a/cli/threadexecutor.cpp +++ b/cli/threadexecutor.cpp @@ -214,7 +214,7 @@ unsigned int ThreadExecutor::check() return v + f.get(); }); - if (mSettings.showtime == SHOWTIME_MODES::SHOWTIME_SUMMARY || mSettings.showtime == SHOWTIME_MODES::SHOWTIME_TOP5_SUMMARY) + if (mSettings.showtime == ShowTime::SUMMARY || mSettings.showtime == ShowTime::TOP5_SUMMARY) CppCheck::printTimerResults(mSettings.showtime); return result; diff --git a/lib/cppcheck.cpp b/lib/cppcheck.cpp index 2048d6f8098..78e202cd09b 100644 --- a/lib/cppcheck.cpp +++ b/lib/cppcheck.cpp @@ -895,7 +895,7 @@ unsigned int CppCheck::checkInternal(const FileWithDetails& file, const std::str if (Settings::terminated()) return mLogger->exitcode(); - const Timer fileTotalTimer(mSettings.showtime == SHOWTIME_MODES::SHOWTIME_FILE_TOTAL, file.spath()); + const Timer fileTotalTimer{file.spath(), mSettings.showtime, nullptr, Timer::Type::FILE}; if (!mSettings.quiet) { std::string fixedpath = Path::toNativeSeparators(file.spath()); @@ -1155,7 +1155,7 @@ unsigned int CppCheck::checkInternal(const FileWithDetails& file, const std::str Tokenizer tokenizer(std::move(tokenlist), mErrorLogger); try { - if (mSettings.showtime != SHOWTIME_MODES::SHOWTIME_NONE) + if (mSettings.showtime != ShowTime::NONE) tokenizer.setTimerResults(&s_timerResults); tokenizer.setDirectives(directives); // TODO: how to avoid repeated copies? @@ -1311,7 +1311,7 @@ unsigned int CppCheck::checkInternal(const FileWithDetails& file, const std::str // TODO: clear earlier? mLogger->clear(); - if (mSettings.showtime == SHOWTIME_MODES::SHOWTIME_FILE || mSettings.showtime == SHOWTIME_MODES::SHOWTIME_TOP5_FILE) + if (mSettings.showtime == ShowTime::FILE || mSettings.showtime == ShowTime::TOP5_FILE) printTimerResults(mSettings.showtime); return mLogger->exitcode(); @@ -1505,7 +1505,9 @@ void CppCheck::executeAddons(const std::string& dumpFile, const FileWithDetails& { if (!dumpFile.empty()) { std::vector f{dumpFile}; - executeAddons(f, file.spath()); + Timer::run("CppCheck::executeAddons", mSettings.showtime, &s_timerResults, [&]() { + executeAddons(f, file.spath()); + }); } } @@ -1934,7 +1936,7 @@ void CppCheck::resetTimerResults() s_timerResults.reset(); } -void CppCheck::printTimerResults(SHOWTIME_MODES mode) +void CppCheck::printTimerResults(ShowTime mode) { s_timerResults.showResults(mode); } diff --git a/lib/cppcheck.h b/lib/cppcheck.h index 9108ac28430..c23309f03d7 100644 --- a/lib/cppcheck.h +++ b/lib/cppcheck.h @@ -33,7 +33,7 @@ #include class TokenList; -enum class SHOWTIME_MODES : std::uint8_t; +enum class ShowTime : std::uint8_t; struct FileSettings; class CheckUnusedFunctions; class Tokenizer; @@ -143,7 +143,7 @@ class CPPCHECKLIB CppCheck { unsigned int analyseWholeProgram(const std::string &buildDir, const std::list &files, const std::list& fileSettings, const std::string& ctuInfo); static void resetTimerResults(); - static void printTimerResults(SHOWTIME_MODES mode); + static void printTimerResults(ShowTime mode); private: void purgedConfigurationMessage(const std::string &file, const std::string& configuration); diff --git a/lib/settings.h b/lib/settings.h index 7e70adfdd32..4582fa54932 100644 --- a/lib/settings.h +++ b/lib/settings.h @@ -51,7 +51,7 @@ class Regex; #endif struct Suppressions; -enum class SHOWTIME_MODES : std::uint8_t; +enum class ShowTime : std::uint8_t; namespace ValueFlow { class Value; } @@ -410,7 +410,7 @@ class CPPCHECKLIB WARN_UNUSED Settings { SimpleEnableGroup checks; /** @brief show timing information (--showtime=file|summary|top5) */ - SHOWTIME_MODES showtime{}; + ShowTime showtime{}; /** Struct contains standards settings */ Standards standards; diff --git a/lib/timer.cpp b/lib/timer.cpp index 4b1f07d5de3..5d64258be35 100644 --- a/lib/timer.cpp +++ b/lib/timer.cpp @@ -29,7 +29,7 @@ namespace { using dataElementType = std::pair; bool more_second_sec(const dataElementType& lhs, const dataElementType& rhs) { - return lhs.second.seconds() > rhs.second.seconds(); + return lhs.second.getSeconds() > rhs.second.getSeconds(); } // TODO: remove and print through (synchronized) ErrorLogger instead @@ -38,12 +38,10 @@ namespace { // TODO: this does not include any file context when SHOWTIME_FILE thus rendering it useless - should we include the logging with the progress logging? // that could also get rid of the broader locking -void TimerResults::showResults(SHOWTIME_MODES mode) const +void TimerResults::showResults(ShowTime mode) const { - if (mode == SHOWTIME_MODES::SHOWTIME_NONE || mode == SHOWTIME_MODES::SHOWTIME_FILE_TOTAL) + if (mode == ShowTime::NONE || mode == ShowTime::FILE_TOTAL) return; - - TimerResultsData overallData; std::vector data; { @@ -61,38 +59,20 @@ void TimerResults::showResults(SHOWTIME_MODES mode) const size_t ordinal = 1; // maybe it would be nice to have an ordinal in output later! for (auto iter=data.cbegin(); iter!=data.cend(); ++iter) { - const double sec = iter->second.seconds(); + const double sec = iter->second.getSeconds().count(); const double secAverage = sec / static_cast(iter->second.mNumberOfResults); - bool hasParent = false; - { - // Do not use valueFlow.. in "Overall time" because those are included in Tokenizer already - if (startsWith(iter->first,"valueFlow")) - hasParent = true; - - // Do not use inner timers in "Overall time" - const std::string::size_type pos = iter->first.rfind("::"); - if (pos != std::string::npos) - hasParent = std::any_of(data.cbegin(), data.cend(), [iter,pos](const dataElementType& d) { - return d.first.size() == pos && iter->first.compare(0, d.first.size(), d.first) == 0; - }); - } - if (!hasParent) - overallData.mClocks += iter->second.mClocks; - if ((mode != SHOWTIME_MODES::SHOWTIME_TOP5_FILE && mode != SHOWTIME_MODES::SHOWTIME_TOP5_SUMMARY) || (ordinal<=5)) { + if ((mode != ShowTime::TOP5_FILE && mode != ShowTime::TOP5_SUMMARY) || (ordinal<=5)) { std::cout << iter->first << ": " << sec << "s (avg. " << secAverage << "s - " << iter->second.mNumberOfResults << " result(s))" << std::endl; } ++ordinal; } - - const double secOverall = overallData.seconds(); - std::cout << "Overall time: " << secOverall << "s" << std::endl; } -void TimerResults::addResults(const std::string& str, std::clock_t clocks) +void TimerResults::addResults(const std::string& str, std::chrono::milliseconds duration) { std::lock_guard l(mResultsSync); - mResults[str].mClocks += clocks; + mResults[str].mDuration += duration; mResults[str].mNumberOfResults++; } @@ -102,17 +82,12 @@ void TimerResults::reset() mResults.clear(); } -Timer::Timer(std::string str, SHOWTIME_MODES showtimeMode, TimerResultsIntf* timerResults) - : mStr(std::move(str)) - , mTimerResults(timerResults) - , mStart(std::clock()) - , mShowTimeMode(showtimeMode) - , mStopped(showtimeMode == SHOWTIME_MODES::SHOWTIME_NONE || showtimeMode == SHOWTIME_MODES::SHOWTIME_FILE_TOTAL) -{} - -Timer::Timer(bool fileTotal, std::string filename) - : mStr(std::move(filename)) - , mStopped(!fileTotal) +Timer::Timer(std::string str, ShowTime showtimeMode, TimerResultsIntf* timerResults, Type type) + : mName(std::move(str)) + , mMode(showtimeMode) + , mType(type) + , mStart(Clock::now()) + , mResults(timerResults) {} Timer::~Timer() @@ -122,23 +97,49 @@ Timer::~Timer() void Timer::stop() { - if ((mShowTimeMode != SHOWTIME_MODES::SHOWTIME_NONE) && !mStopped) { - const std::clock_t end = std::clock(); - const std::clock_t diff = end - mStart; - - if (mShowTimeMode == SHOWTIME_MODES::SHOWTIME_FILE) { - const double sec = static_cast(diff) / CLOCKS_PER_SEC; - std::lock_guard l(stdCoutLock); - std::cout << mStr << ": " << sec << "s" << std::endl; - } else if (mShowTimeMode == SHOWTIME_MODES::SHOWTIME_FILE_TOTAL) { - const double sec = static_cast(diff) / CLOCKS_PER_SEC; + if (mMode == ShowTime::NONE) + return; + if (mType == Type::OVERALL && mMode != ShowTime::TOP5_SUMMARY && mMode != ShowTime::SUMMARY) { + mMode = ShowTime::NONE; + return; + } + if (mType == Type::FILE && mMode != ShowTime::TOP5_FILE && mMode != ShowTime::FILE && mMode != ShowTime::FILE_TOTAL) { + mMode = ShowTime::NONE; + return; + } + if (mStart != TimePoint{}) { + auto diff = std::chrono::duration_cast(Clock::now() - mStart); + if (!mResults) { std::lock_guard l(stdCoutLock); - std::cout << "Check time: " << mStr << ": " << sec << "s" << std::endl; + std::cout << (mType == Type::OVERALL ? "Overall time: " : "Check time: " + mName + ": ") << TimerResultsData::durationToString(diff) << std::endl; } else { - if (mTimerResults) - mTimerResults->addResults(mStr, diff); + mResults->addResults(mName, diff); } } + mMode = ShowTime::NONE; // prevent multiple stops +} - mStopped = true; +std::string TimerResultsData::durationToString(std::chrono::milliseconds duration) +{ + // Extract hours + auto hours = std::chrono::duration_cast(duration); + duration -= hours; // Subtract the extracted hours + + // Extract minutes + auto minutes = std::chrono::duration_cast(duration); + duration -= minutes; // Subtract the extracted minutes + + // Extract seconds + std::chrono::duration seconds = std::chrono::duration_cast>(duration); + + std::string ellapsedTime; + if (hours.count() > 0) + ellapsedTime += std::to_string(hours.count()) + "h "; + if (minutes.count() > 0) + ellapsedTime += std::to_string(minutes.count()) + "m "; + std::string secondsStr{std::to_string(seconds.count())}; + auto pos = secondsStr.find_first_of('.'); + if (pos != std::string::npos && (pos + 4) < secondsStr.size()) + secondsStr.resize(pos + 4); // keep three decimal + return (ellapsedTime + secondsStr + "s"); } diff --git a/lib/timer.h b/lib/timer.h index d2603d4eb55..ae686b7b3e7 100644 --- a/lib/timer.h +++ b/lib/timer.h @@ -22,6 +22,7 @@ #include "config.h" +#include #include #include #include @@ -30,38 +31,39 @@ #include #include -enum class SHOWTIME_MODES : std::uint8_t { - SHOWTIME_NONE, - SHOWTIME_FILE, - SHOWTIME_FILE_TOTAL, - SHOWTIME_SUMMARY, - SHOWTIME_TOP5_SUMMARY, - SHOWTIME_TOP5_FILE +enum class ShowTime : std::uint8_t { + NONE, + FILE, + FILE_TOTAL, + SUMMARY, + TOP5_SUMMARY, + TOP5_FILE }; class CPPCHECKLIB TimerResultsIntf { public: virtual ~TimerResultsIntf() = default; - virtual void addResults(const std::string& str, std::clock_t clocks) = 0; + virtual void addResults(const std::string& timerName, std::chrono::milliseconds duation) = 0; }; struct TimerResultsData { - std::clock_t mClocks{}; + std::chrono::milliseconds mDuration; long mNumberOfResults{}; - double seconds() const { - const double ret = static_cast(static_cast(mClocks)) / static_cast(CLOCKS_PER_SEC); - return ret; + std::chrono::duration getSeconds() const { + return std::chrono::duration_cast>(mDuration); } + + static std::string durationToString(std::chrono::milliseconds duration); }; class CPPCHECKLIB TimerResults : public TimerResultsIntf { public: TimerResults() = default; - void showResults(SHOWTIME_MODES mode) const; - void addResults(const std::string& str, std::clock_t clocks) override; + void showResults(ShowTime mode) const; + void addResults(const std::string& str, std::chrono::milliseconds duration) override; void reset(); @@ -72,8 +74,16 @@ class CPPCHECKLIB TimerResults : public TimerResultsIntf { class CPPCHECKLIB Timer { public: - Timer(std::string str, SHOWTIME_MODES showtimeMode, TimerResultsIntf* timerResults = nullptr); - Timer(bool fileTotal, std::string filename); + using Clock = std::chrono::high_resolution_clock; + using TimePoint = std::chrono::time_point; + + enum class Type : std::uint8_t { + FILE, + OVERALL, + OTHER + }; + + Timer(std::string str, ShowTime showtimeMode, TimerResultsIntf* timerResults = nullptr, Type type = Type::OTHER); ~Timer(); Timer(const Timer&) = delete; @@ -81,17 +91,18 @@ class CPPCHECKLIB Timer { void stop(); - static void run(std::string str, SHOWTIME_MODES showtimeMode, TimerResultsIntf* timerResults, const std::function& f) { + static void run(std::string str, ShowTime showtimeMode, TimerResultsIntf* timerResults, const std::function& f) { Timer t(std::move(str), showtimeMode, timerResults); f(); } private: - const std::string mStr; - TimerResultsIntf* mTimerResults{}; - std::clock_t mStart = std::clock(); - const SHOWTIME_MODES mShowTimeMode = SHOWTIME_MODES::SHOWTIME_FILE_TOTAL; - bool mStopped{}; + const std::string mName; + ShowTime mMode{}; + Type mType{}; + TimePoint mStart; + TimerResultsIntf* mResults{}; }; + //--------------------------------------------------------------------------- #endif // timerH diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 506568d1a3b..b791c4b508f 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -3405,7 +3405,7 @@ bool Tokenizer::simplifyTokens1(const std::string &configuration, int fileIndex) return false; } - const SHOWTIME_MODES showTime = mTimerResults ? mSettings.showtime : SHOWTIME_MODES::SHOWTIME_NONE; + const ShowTime showTime = mTimerResults ? mSettings.showtime : ShowTime::NONE; Timer::run("Tokenizer::simplifyTokens1::createAst", showTime, mTimerResults, [&]() { list.createAst(); @@ -5624,7 +5624,7 @@ bool Tokenizer::simplifyTokenList1(const char FileName[]) validate(); - const SHOWTIME_MODES showTime = mTimerResults ? mSettings.showtime : SHOWTIME_MODES::SHOWTIME_NONE; + const ShowTime showTime = mTimerResults ? mSettings.showtime : ShowTime::NONE; // Bail out if code is garbage Timer::run("Tokenizer::simplifyTokens1::simplifyTokenList1::findGarbageCode", showTime, mTimerResults, [&]() { diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index 1f725673874..a039fea47f0 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -112,7 +112,6 @@ #include #include #include -#include #include #include #include diff --git a/test/cli/other_test.py b/test/cli/other_test.py index 3f4a66a13a9..2f1c5092b3c 100644 --- a/test/cli/other_test.py +++ b/test/cli/other_test.py @@ -919,7 +919,6 @@ def test_showtime_top5_file(tmpdir): assert lines[i].endswith(' - 2 result(s))') else: assert lines[i].endswith(' result(s))') - assert lines[6].startswith('Overall time:') assert stderr == '' diff --git a/test/testcmdlineparser.cpp b/test/testcmdlineparser.cpp index 9a1fb64279e..2902424b52d 100644 --- a/test/testcmdlineparser.cpp +++ b/test/testcmdlineparser.cpp @@ -2096,21 +2096,21 @@ class TestCmdlineParser : public TestFixture { REDIRECT; const char * const argv[] = {"cppcheck", "--showtime=summary", "file.cpp"}; ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parseFromArgs(argv)); - ASSERT(settings->showtime == SHOWTIME_MODES::SHOWTIME_SUMMARY); + ASSERT(settings->showtime == ShowTime::SUMMARY); } void showtimeFile() { REDIRECT; const char * const argv[] = {"cppcheck", "--showtime=file", "file.cpp"}; ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parseFromArgs(argv)); - ASSERT(settings->showtime == SHOWTIME_MODES::SHOWTIME_FILE); + ASSERT(settings->showtime == ShowTime::FILE); } void showtimeFileTotal() { REDIRECT; const char * const argv[] = {"cppcheck", "--showtime=file-total", "file.cpp"}; ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parseFromArgs(argv)); - ASSERT(settings->showtime == SHOWTIME_MODES::SHOWTIME_FILE_TOTAL); + ASSERT(settings->showtime == ShowTime::FILE_TOTAL); } void showtimeTop5() { @@ -2124,21 +2124,21 @@ class TestCmdlineParser : public TestFixture { REDIRECT; const char * const argv[] = {"cppcheck", "--showtime=top5_file", "file.cpp"}; ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parseFromArgs(argv)); - ASSERT(settings->showtime == SHOWTIME_MODES::SHOWTIME_TOP5_FILE); + ASSERT(settings->showtime == ShowTime::TOP5_FILE); } void showtimeTop5Summary() { REDIRECT; const char * const argv[] = {"cppcheck", "--showtime=top5_summary", "file.cpp"}; ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parseFromArgs(argv)); - ASSERT(settings->showtime == SHOWTIME_MODES::SHOWTIME_TOP5_SUMMARY); + ASSERT(settings->showtime == ShowTime::TOP5_SUMMARY); } void showtimeNone() { REDIRECT; const char * const argv[] = {"cppcheck", "--showtime=none", "file.cpp"}; ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parseFromArgs(argv)); - ASSERT(settings->showtime == SHOWTIME_MODES::SHOWTIME_NONE); + ASSERT(settings->showtime == ShowTime::NONE); } void showtimeEmpty() { diff --git a/test/testprocessexecutor.cpp b/test/testprocessexecutor.cpp index c0c19ae2b1f..51480619dc2 100644 --- a/test/testprocessexecutor.cpp +++ b/test/testprocessexecutor.cpp @@ -52,7 +52,7 @@ class TestProcessExecutorBase : public TestFixture { struct CheckOptions { bool quiet = true; - SHOWTIME_MODES showtime = SHOWTIME_MODES::SHOWTIME_NONE; + ShowTime showtime = ShowTime::NONE; const char* plistOutput = nullptr; std::vector filesList; }; @@ -164,7 +164,7 @@ class TestProcessExecutorBase : public TestFixture { "void f()\n" "{\n" " (void)(*((int*)0));\n" - "}", dinit(CheckOptions, $.showtime = SHOWTIME_MODES::SHOWTIME_SUMMARY)); + "}", dinit(CheckOptions, $.showtime = ShowTime::SUMMARY)); // we are not interested in the results - so just consume them ignore_errout(); } @@ -233,7 +233,7 @@ class TestProcessExecutorBase : public TestFixture { check(2, 2, 0, "int main() {}", dinit(CheckOptions, - $.showtime = SHOWTIME_MODES::SHOWTIME_TOP5_FILE)); + $.showtime = ShowTime::TOP5_FILE)); // for each file: top5 results + overall + empty line const std::string output_s = GET_REDIRECT_OUTPUT; // for each file: top5 results + overall + empty line @@ -245,10 +245,10 @@ class TestProcessExecutorBase : public TestFixture { check(2, 2, 0, "int main() {}", dinit(CheckOptions, - $.showtime = SHOWTIME_MODES::SHOWTIME_TOP5_SUMMARY)); + $.showtime = ShowTime::TOP5_SUMMARY)); const std::string output_s = GET_REDIRECT_OUTPUT; // once: top5 results + overall + empty line - TODO_ASSERT_EQUALS(5 + 1 + 1, 2, cppcheck::count_all_of(output_s, '\n')); + TODO_ASSERT_EQUALS(5 + 1 + 1, 1, cppcheck::count_all_of(output_s, '\n')); // should only report the top5 once ASSERT(output_s.find("1 result(s)") == std::string::npos); TODO_ASSERT(output_s.find("2 result(s)") != std::string::npos); @@ -259,7 +259,7 @@ class TestProcessExecutorBase : public TestFixture { check(2, 2, 0, "int main() {}", dinit(CheckOptions, - $.showtime = SHOWTIME_MODES::SHOWTIME_FILE)); + $.showtime = ShowTime::FILE)); const std::string output_s = GET_REDIRECT_OUTPUT; TODO_ASSERT_EQUALS(2, 0, cppcheck::count_all_of(output_s, "Overall time:")); } @@ -269,7 +269,7 @@ class TestProcessExecutorBase : public TestFixture { check(2, 2, 0, "int main() {}", dinit(CheckOptions, - $.showtime = SHOWTIME_MODES::SHOWTIME_SUMMARY)); + $.showtime = ShowTime::SUMMARY)); const std::string output_s = GET_REDIRECT_OUTPUT; // should only report the actual summary once ASSERT(output_s.find("1 result(s)") == std::string::npos); @@ -281,7 +281,7 @@ class TestProcessExecutorBase : public TestFixture { check(2, 2, 0, "int main() {}", dinit(CheckOptions, - $.showtime = SHOWTIME_MODES::SHOWTIME_FILE_TOTAL)); + $.showtime = ShowTime::FILE_TOTAL)); const std::string output_s = GET_REDIRECT_OUTPUT; TODO_ASSERT(output_s.find("Check time: " + fprefix() + "_1.c: ") != std::string::npos); TODO_ASSERT(output_s.find("Check time: " + fprefix() + "_2.c: ") != std::string::npos); diff --git a/test/testsingleexecutor.cpp b/test/testsingleexecutor.cpp index 4f0665ff12e..feb760e5381 100644 --- a/test/testsingleexecutor.cpp +++ b/test/testsingleexecutor.cpp @@ -61,7 +61,7 @@ class TestSingleExecutorBase : public TestFixture { struct CheckOptions { bool quiet = true; - SHOWTIME_MODES showtime = SHOWTIME_MODES::SHOWTIME_NONE; + ShowTime showtime = ShowTime::NONE; const char* plistOutput = nullptr; std::vector filesList; }; @@ -166,7 +166,7 @@ class TestSingleExecutorBase : public TestFixture { "void f()\n" "{\n" " (void)(*((int*)0));\n" - "}", dinit(CheckOptions, $.showtime = SHOWTIME_MODES::SHOWTIME_SUMMARY)); + "}", dinit(CheckOptions, $.showtime = ShowTime::SUMMARY)); // we are not interested in the results - so just consume them ignore_errout(); } @@ -240,9 +240,9 @@ class TestSingleExecutorBase : public TestFixture { check(2, 0, "int main() {}", dinit(CheckOptions, - $.showtime = SHOWTIME_MODES::SHOWTIME_TOP5_FILE)); + $.showtime = ShowTime::TOP5_FILE)); const std::string output_s = GET_REDIRECT_OUTPUT; - // for each file: top5 results + overall + empty line + // for each file: top5 results + overall + total ASSERT_EQUALS((5 + 1 + 1) * 2LL, cppcheck::count_all_of(output_s, '\n')); } @@ -251,10 +251,10 @@ class TestSingleExecutorBase : public TestFixture { check(2, 0, "int main() {}", dinit(CheckOptions, - $.showtime = SHOWTIME_MODES::SHOWTIME_TOP5_SUMMARY)); + $.showtime = ShowTime::TOP5_SUMMARY)); const std::string output_s = GET_REDIRECT_OUTPUT; - // once: top5 results + overall + empty line - ASSERT_EQUALS(5 + 1 + 1, cppcheck::count_all_of(output_s, '\n')); + // once: top5 results + newline + ASSERT_EQUALS(5 + 1, cppcheck::count_all_of(output_s, '\n')); // should only report the top5 once ASSERT(output_s.find("1 result(s)") == std::string::npos); ASSERT(output_s.find("2 result(s)") != std::string::npos); @@ -265,9 +265,9 @@ class TestSingleExecutorBase : public TestFixture { check(2, 0, "int main() {}", dinit(CheckOptions, - $.showtime = SHOWTIME_MODES::SHOWTIME_FILE)); + $.showtime = ShowTime::FILE)); const std::string output_s = GET_REDIRECT_OUTPUT; - ASSERT_EQUALS(2, cppcheck::count_all_of(output_s, "Overall time:")); + ASSERT_EQUALS(0, cppcheck::count_all_of(output_s, "Overall time:")); } void showtime_summary() { @@ -275,7 +275,7 @@ class TestSingleExecutorBase : public TestFixture { check(2, 0, "int main() {}", dinit(CheckOptions, - $.showtime = SHOWTIME_MODES::SHOWTIME_SUMMARY)); + $.showtime = ShowTime::SUMMARY)); const std::string output_s = GET_REDIRECT_OUTPUT; // should only report the actual summary once ASSERT(output_s.find("1 result(s)") == std::string::npos); @@ -287,7 +287,7 @@ class TestSingleExecutorBase : public TestFixture { check(2, 0, "int main() {}", dinit(CheckOptions, - $.showtime = SHOWTIME_MODES::SHOWTIME_FILE_TOTAL)); + $.showtime = ShowTime::FILE_TOTAL)); const std::string output_s = GET_REDIRECT_OUTPUT; ASSERT(output_s.find("Check time: " + fprefix() + "_" + zpad3(1) + ".c: ") != std::string::npos); ASSERT(output_s.find("Check time: " + fprefix() + "_" + zpad3(2) + ".c: ") != std::string::npos); diff --git a/test/testthreadexecutor.cpp b/test/testthreadexecutor.cpp index ad260727d01..bb03c6a514c 100644 --- a/test/testthreadexecutor.cpp +++ b/test/testthreadexecutor.cpp @@ -52,7 +52,7 @@ class TestThreadExecutorBase : public TestFixture { struct CheckOptions { bool quiet = true; - SHOWTIME_MODES showtime = SHOWTIME_MODES::SHOWTIME_NONE; + ShowTime showtime = ShowTime::NONE; const char* plistOutput = nullptr; std::vector filesList; }; @@ -163,7 +163,7 @@ class TestThreadExecutorBase : public TestFixture { "void f()\n" "{\n" " (void)(*((int*)0));\n" - "}", dinit(CheckOptions, $.showtime = SHOWTIME_MODES::SHOWTIME_SUMMARY)); + "}", dinit(CheckOptions, $.showtime = ShowTime::SUMMARY)); // we are not interested in the results - so just consume them ignore_errout(); } @@ -232,10 +232,9 @@ class TestThreadExecutorBase : public TestFixture { check(2, 2, 0, "int main() {}", dinit(CheckOptions, - $.showtime = SHOWTIME_MODES::SHOWTIME_TOP5_FILE)); - // for each file: top5 results + overall + empty line + $.showtime = ShowTime::TOP5_FILE)); const std::string output_s = GET_REDIRECT_OUTPUT; - // for each file: top5 results + overall + empty line + // for each file: top5 results + newline + overall ASSERT_EQUALS((5 + 1 + 1) * 2LL, cppcheck::count_all_of(output_s, '\n')); } @@ -244,10 +243,10 @@ class TestThreadExecutorBase : public TestFixture { check(2, 2, 0, "int main() {}", dinit(CheckOptions, - $.showtime = SHOWTIME_MODES::SHOWTIME_TOP5_SUMMARY)); + $.showtime = ShowTime::TOP5_SUMMARY)); const std::string output_s = GET_REDIRECT_OUTPUT; - // once: top5 results + overall + empty line - ASSERT_EQUALS(5 + 1 + 1, cppcheck::count_all_of(output_s, '\n')); + // once: top5 results + newline + ASSERT_EQUALS(5 + 1, cppcheck::count_all_of(output_s, '\n')); // should only report the top5 once ASSERT(output_s.find("1 result(s)") == std::string::npos); ASSERT(output_s.find("2 result(s)") != std::string::npos); @@ -258,9 +257,9 @@ class TestThreadExecutorBase : public TestFixture { check(2, 2, 0, "int main() {}", dinit(CheckOptions, - $.showtime = SHOWTIME_MODES::SHOWTIME_FILE)); + $.showtime = ShowTime::FILE)); const std::string output_s = GET_REDIRECT_OUTPUT; - ASSERT_EQUALS(2, cppcheck::count_all_of(output_s, "Overall time:")); + ASSERT_EQUALS(0, cppcheck::count_all_of(output_s, "Overall time:")); } void showtime_summary() { @@ -268,7 +267,7 @@ class TestThreadExecutorBase : public TestFixture { check(2, 2, 0, "int main() {}", dinit(CheckOptions, - $.showtime = SHOWTIME_MODES::SHOWTIME_SUMMARY)); + $.showtime = ShowTime::SUMMARY)); const std::string output_s = GET_REDIRECT_OUTPUT; // should only report the actual summary once ASSERT(output_s.find("1 result(s)") == std::string::npos); @@ -280,7 +279,7 @@ class TestThreadExecutorBase : public TestFixture { check(2, 2, 0, "int main() {}", dinit(CheckOptions, - $.showtime = SHOWTIME_MODES::SHOWTIME_FILE_TOTAL)); + $.showtime = ShowTime::FILE_TOTAL)); const std::string output_s = GET_REDIRECT_OUTPUT; ASSERT(output_s.find("Check time: " + fprefix() + "_1.c: ") != std::string::npos); ASSERT(output_s.find("Check time: " + fprefix() + "_2.c: ") != std::string::npos); diff --git a/test/testtimer.cpp b/test/testtimer.cpp index 00b3b810bbc..c9bc570863b 100644 --- a/test/testtimer.cpp +++ b/test/testtimer.cpp @@ -34,11 +34,10 @@ class TestTimer : public TestFixture { void result() const { TimerResultsData t1; - t1.mClocks = ~static_cast(0); - ASSERT(t1.seconds() > 100.0); + t1.mDuration = std::chrono::milliseconds{1234}; + ASSERT(t1.getSeconds().count() > 1.233 && t1.getSeconds().count() < 1.235); - t1.mClocks = CLOCKS_PER_SEC * 5 / 2; - ASSERT(std::fabs(t1.seconds()-2.5) < 0.01); + // TODO : more tests } };