File indexing completed on 2024-05-12 04:39:22

0001 /*
0002     SPDX-FileCopyrightText: 2018 Friedrich W. H. Kossebau <kossebau@kde.org>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "test_checkgroup.h"
0008 
0009 // SUT
0010 #include "config/checkgroup.h"
0011 // Qt
0012 #include <QTest>
0013 #include <QStandardPaths>
0014 
0015 struct CheckGroupData
0016 {
0017     QString prefix;
0018     QStringList checkNames;
0019 
0020     QVector<CheckGroupData> subGroups;
0021 };
0022 Q_DECLARE_METATYPE(CheckGroupData)
0023 
0024 void TestCheckGroup::initTestCase()
0025 {
0026     QStandardPaths::setTestModeEnabled(true);
0027 }
0028 
0029 void TestCheckGroup::testFromPlainList_data()
0030 {
0031     QTest::addColumn<QStringList>("plainList");
0032     QTest::addColumn<CheckGroupData>("group");
0033 
0034     QTest::newRow("empty")
0035         << QStringList()
0036         << CheckGroupData{};
0037     QTest::newRow("fooandbarlevel1")
0038         << QStringList{"foo-one", "foo-two", "foo-two-and-half", "bar-one", "bar-two-something", "more"}
0039         << CheckGroupData{"", {"more"}, {
0040               {"foo-", {"foo-one", "foo-two", "foo-two-and-half"}, {}},
0041               {"bar-", {"bar-one", "bar-two-something"}, {}}
0042            }};
0043     QTest::newRow("fooandbarlevel2")
0044         << QStringList{"foo-one-two", "foo-one-three", "foo-a.two", "foo-a.three", "bar-no-way", "bar-no-sense"}
0045         << CheckGroupData{"", {}, {
0046               {"foo-", {}, {
0047                   {"foo-one-", {"foo-one-two", "foo-one-three"}, {}},
0048                   {"foo-a.", {"foo-a.two", "foo-a.three"}, {}},
0049               }},
0050               {"bar-", {}, {
0051                   {"bar-no-", {"bar-no-way", "bar-no-sense"}, {}}
0052               }}
0053            }};
0054 }
0055 
0056 void TestCheckGroup::doTestResult(const ClangTidy::CheckGroup* actualValue, const CheckGroupData& expectedValue)
0057 {
0058     QCOMPARE(actualValue->prefix(), expectedValue.prefix);
0059 
0060     if (actualValue->checkNames() != expectedValue.checkNames) {
0061         qDebug() << "For checkgroup" << actualValue->prefix();
0062         qDebug() << "Actual checknames:  " << actualValue->checkNames();
0063         qDebug() << "Expected checknames:" << expectedValue.checkNames;
0064     }
0065     QCOMPARE(actualValue->checkNames(), expectedValue.checkNames);
0066 
0067     QCOMPARE(actualValue->subGroups().size(), expectedValue.subGroups.size());
0068 
0069     for (int i = 0; i < expectedValue.subGroups.size(); ++i) {
0070         const auto* actualSubGroup = actualValue->subGroups()[i];
0071         QCOMPARE(actualSubGroup->superGroup(), actualValue);
0072         doTestResult(actualSubGroup, expectedValue.subGroups[i]);
0073     }
0074 }
0075 
0076 void TestCheckGroup::testFromPlainList()
0077 {
0078     QFETCH(QStringList, plainList);
0079     QFETCH(CheckGroupData, group);
0080 
0081     const ClangTidy::CheckGroup* checkGroup = ClangTidy::CheckGroup::fromPlainList(plainList);
0082 
0083     doTestResult(checkGroup, group);
0084 
0085     delete checkGroup;
0086 }
0087 
0088 
0089 struct CheckStateGroupData
0090 {
0091     int enabledChecksCount;
0092     bool hasSubGroupWithExplicitEnabledState;
0093 
0094     QVector<CheckStateGroupData> subGroups;
0095 };
0096 Q_DECLARE_METATYPE(CheckStateGroupData)
0097 
0098 void TestCheckGroup::testSetEnabledChecks_data()
0099 {
0100     QTest::addColumn<QStringList>("input");
0101     QTest::addColumn<QStringList>("result");
0102     QTest::addColumn<CheckStateGroupData>("group");
0103 
0104     QTest::newRow("empty")
0105         << QStringList()
0106         << QStringList{"-*"}
0107         << CheckStateGroupData{0, false, {
0108             {0, false, { // foo-
0109                 {0, false, {}}, // foo-one-
0110                 {0, false, {}}, // foo-a.
0111             }},
0112             {0, false, { // bar-
0113                 {0, false, {}}, // bar-mo-
0114             }},
0115         }};
0116 
0117     QTest::newRow("all")
0118         << QStringList{"*"}
0119         << QStringList{"*"}
0120         << CheckStateGroupData{7, false, {
0121             {5, false, { // foo-
0122                 {2, false, {}}, // foo-one-
0123                 {2, false, {}}, // foo-a.
0124             }},
0125             {2, false, { // bar-
0126                 {2, false, {}}, // bar-mo-
0127             }},
0128         }};
0129 
0130     QTest::newRow("all-not-foo")
0131         << QStringList{"*", "-foo-*"}
0132         << QStringList{"*", "-foo-*"}
0133         << CheckStateGroupData{2, true, {
0134             {0, false, { // foo-
0135                 {0, false, {}}, // foo-one-
0136                 {0, false, {}}, // foo-a.
0137             }},
0138             {2, false, { // bar-
0139                 {2, false, {}}, // bar-mo-
0140             }},
0141         }};
0142 
0143     QTest::newRow("all-not-foo-but-foo-a")
0144         << QStringList{"*", "-foo-*", "foo-a.*"}
0145         << QStringList{"*", "-foo-*", "foo-a.*"}
0146         << CheckStateGroupData{4, true, {
0147             {2, true, { // foo-
0148                 {0, false, {}}, // foo-one-
0149                 {2, false, {}}, // foo-a.
0150             }},
0151             {2, false, { // bar-
0152                 {2, false, {}}, // bar-mo-
0153             }},
0154         }};
0155 
0156     QTest::newRow("all-not-foo-but-foo-a.two")
0157         << QStringList{"*", "-foo-*", "foo-a.two"}
0158         << QStringList{"*", "-foo-*", "foo-a.two"}
0159         << CheckStateGroupData{3, true, {
0160             {1, true, { // foo-
0161                 {0, false, {}}, // foo-one-
0162                 {1, true, {}}, // foo-a.
0163             }},
0164             {2, false, { // bar-
0165                 {2, false, {}}, // bar-mo-
0166             }},
0167         }};
0168 
0169     QTest::newRow("nothing-but-foo-one-three")
0170         << QStringList{"-*", "foo-one-three"}
0171         << QStringList{"-*", "foo-one-three"}
0172         << CheckStateGroupData{1, true, {
0173             {1, true, { // foo-
0174                 {1, true, {}}, // foo-one-
0175                 {0, false, {}}, // foo-a.
0176             }},
0177             {0, false, { // bar-
0178                 {0, false, {}}, // bar-mo-
0179             }},
0180         }};
0181 }
0182 
0183 void TestCheckGroup::doTestResult(const ClangTidy::CheckGroup* actualValue, const CheckStateGroupData& expectedValue)
0184 {
0185     if ((actualValue->enabledChecksCount() != expectedValue.enabledChecksCount) ||
0186         (actualValue->hasSubGroupWithExplicitEnabledState() != expectedValue.hasSubGroupWithExplicitEnabledState)) {
0187         qDebug() << "For checkgroup" << actualValue->prefix();
0188         qDebug() << "Actual enabledChecksCount:" << actualValue->enabledChecksCount()
0189                  << "hasSubGroupWithExplicitEnabledState: " << actualValue->hasSubGroupWithExplicitEnabledState();
0190         qDebug() << "Expected enabledChecksCount:" << expectedValue.enabledChecksCount
0191                  << "hasSubGroupWithExplicitEnabledState: " << expectedValue.hasSubGroupWithExplicitEnabledState;
0192     }
0193 
0194     QCOMPARE(actualValue->enabledChecksCount(), expectedValue.enabledChecksCount);
0195     QCOMPARE(actualValue->hasSubGroupWithExplicitEnabledState(), expectedValue.hasSubGroupWithExplicitEnabledState);
0196 
0197     QCOMPARE(actualValue->subGroups().size(), expectedValue.subGroups.size());
0198 
0199     for (int i = 0; i < expectedValue.subGroups.size(); ++i) {
0200         const auto* actualSubGroup = actualValue->subGroups()[i];
0201         doTestResult(actualSubGroup, expectedValue.subGroups[i]);
0202     }
0203 }
0204 
0205 void TestCheckGroup::testSetEnabledChecks()
0206 {
0207     QFETCH(QStringList, input);
0208     QFETCH(QStringList, result);
0209     QFETCH(CheckStateGroupData, group);
0210 
0211     ClangTidy::CheckGroup* checkGroup = ClangTidy::CheckGroup::fromPlainList({
0212         "foo-one-two",
0213         "foo-one-three",
0214         "foo-a.two",
0215         "foo-a.three",
0216         "foo-b",
0217         "bar-no-way",
0218         "bar-no-sense"});
0219 
0220     checkGroup->setEnabledChecks(input);
0221 
0222     QCOMPARE(checkGroup->enabledChecksRules(), result);
0223 
0224     doTestResult(checkGroup, group);
0225 
0226     delete checkGroup;
0227 }
0228 
0229 
0230 QTEST_GUILESS_MAIN(TestCheckGroup)
0231 
0232 #include "moc_test_checkgroup.cpp"