From 336f54def454e83ac34a946dcda448615a6453d8 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Mon, 24 Jul 2017 12:53:12 +0200 Subject: [PATCH] CMake: Fix progress calculation in server-mode Add unit test to make sure this stays fixed. Task-number: QTCREATORBUG-18624 Change-Id: Ieeb41982418481223d9ebf8f5c6ec4b3b78bfe00 Reviewed-by: Tim Jenssen Reviewed-by: Eike Ziller --- .../cmakeprojectmanager/cmakeprojectplugin.h | 3 + .../cmakeprojectmanager/servermodereader.cpp | 67 ++++++++++++++++++- .../cmakeprojectmanager/servermodereader.h | 8 +++ 3 files changed, 76 insertions(+), 2 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectplugin.h b/src/plugins/cmakeprojectmanager/cmakeprojectplugin.h index 99c63d10e11..de3112184a0 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprojectplugin.h +++ b/src/plugins/cmakeprojectmanager/cmakeprojectplugin.h @@ -61,6 +61,9 @@ private slots: void testCMakeProjectImporterToolChain_data(); void testCMakeProjectImporterToolChain(); + + void testServerModeReaderProgress_data(); + void testServerModeReaderProgress(); #endif private: diff --git a/src/plugins/cmakeprojectmanager/servermodereader.cpp b/src/plugins/cmakeprojectmanager/servermodereader.cpp index e366d4f6ecc..8ce3efe9c34 100644 --- a/src/plugins/cmakeprojectmanager/servermodereader.cpp +++ b/src/plugins/cmakeprojectmanager/servermodereader.cpp @@ -406,8 +406,7 @@ void ServerModeReader::handleProgress(int min, int cur, int max, const QString & if (!m_future) return; - int progress = m_progressStepMinimum - + (((max - min) / (cur - min)) * (m_progressStepMaximum - m_progressStepMinimum)); + const int progress = calculateProgress(m_progressStepMinimum, min, cur, max, m_progressStepMaximum); m_future->setProgressValue(progress); } @@ -419,6 +418,14 @@ void ServerModeReader::handleSignal(const QString &signal, const QVariantMap &da emit dirty(); } +int ServerModeReader::calculateProgress(const int minRange, const int min, const int cur, const int max, const int maxRange) +{ + if (minRange == maxRange || min == max) + return minRange; + const int clampedCur = std::min(std::max(cur, min), max); + return minRange + ((clampedCur - min) / (max - min)) * (maxRange - minRange); +} + void ServerModeReader::extractCodeModelData(const QVariantMap &data) { const QVariantList configs = data.value("configurations").toList(); @@ -771,3 +778,59 @@ void ServerModeReader::addHeaderNodes(ProjectNode *root, const QList } // namespace Internal } // namespace CMakeProjectManager + +#if defined(WITH_TESTS) + +#include "cmakeprojectplugin.h" +#include + +namespace CMakeProjectManager { +namespace Internal { + +void CMakeProjectPlugin::testServerModeReaderProgress_data() +{ + QTest::addColumn("minRange"); + QTest::addColumn("min"); + QTest::addColumn("cur"); + QTest::addColumn("max"); + QTest::addColumn("maxRange"); + QTest::addColumn("expected"); + + QTest::newRow("empty range") << 100 << 10 << 11 << 20 << 100 << 100; + QTest::newRow("one range (low)") << 0 << 10 << 11 << 20 << 1 << 0; + QTest::newRow("one range (high)") << 20 << 10 << 19 << 20 << 20 << 20; + QTest::newRow("large range") << 30 << 10 << 11 << 20 << 100000 << 30; + + QTest::newRow("empty progress") << -5 << 10 << 10 << 10 << 99995 << -5; + QTest::newRow("one progress (low)") << 42 << 10 << 10 << 11 << 100042 << 42; + QTest::newRow("one progress (high)") << 0 << 10 << 11 << 11 << 100000 << 100000; + QTest::newRow("large progress") << 0 << 10 << 10 << 11 << 100000 << 0; + + QTest::newRow("cur too low") << 0 << 10 << 9 << 100 << 100000 << 0; + QTest::newRow("cur too high") << 0 << 10 << 101 << 100 << 100000 << 100000; + QTest::newRow("cur much too low") << 0 << 10 << -1000 << 100 << 100000 << 0; + QTest::newRow("cur much too high") << 0 << 10 << 1110000 << 100 << 100000 << 100000; +} + +void CMakeProjectPlugin::testServerModeReaderProgress() +{ + QFETCH(int, minRange); + QFETCH(int, min); + QFETCH(int, cur); + QFETCH(int, max); + QFETCH(int, maxRange); + QFETCH(int, expected); + + ServerModeReader reader; + const int r = reader.calculateProgress(minRange, min, cur, max, maxRange); + + QCOMPARE(r, expected); + + QVERIFY(r <= maxRange); + QVERIFY(r >= minRange); +} + +} // namespace Internal +} // namespace CMakeProjectManager + +#endif diff --git a/src/plugins/cmakeprojectmanager/servermodereader.h b/src/plugins/cmakeprojectmanager/servermodereader.h index 4265d9627c3..461bc00e05e 100644 --- a/src/plugins/cmakeprojectmanager/servermodereader.h +++ b/src/plugins/cmakeprojectmanager/servermodereader.h @@ -67,6 +67,10 @@ private: void handleProgress(int min, int cur, int max, const QString &inReplyTo); void handleSignal(const QString &signal, const QVariantMap &data); + int calculateProgress(const int minRange, const int min, + const int cur, + const int max, const int maxRange); + struct Target; struct Project; @@ -151,6 +155,10 @@ private: QList m_fileGroups; CMakeParser m_parser; + +#if defined(WITH_TESTS) + friend class CMakeProjectPlugin; +#endif }; } // namespace Internal