Skip to content

Commit a500129

Browse files
committed
test
1 parent 99186c8 commit a500129

6 files changed

Lines changed: 180 additions & 35 deletions

File tree

‎gui/test/filelist/testfilelist.cpp‎

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,4 +184,39 @@ void TestFileList::filterFiles5() const
184184
QVERIFY(!files.contains(base + "/dir1/dir11/foo11.cpp"));
185185
}
186186

187+
void TestFileList::unmatchedExcludes1() const
188+
{
189+
FileList list;
190+
QStringList filters;
191+
filters << "foo1.cpp" << "foo3.cc";
192+
list.addExcludeList(filters);
193+
list.addDirectory(QString(SRCDIR) + "/../data/files");
194+
QVERIFY(list.getUnmatchedExcludes().isEmpty());
195+
}
196+
197+
void TestFileList::unmatchedExcludes2() const
198+
{
199+
FileList list;
200+
QStringList filters;
201+
filters << "foo1.cpp" << "bar.cpp" << "dir3/";
202+
list.addExcludeList(filters);
203+
list.addDirectory(QString(SRCDIR) + "/../data/files", true);
204+
const QStringList unmatched = list.getUnmatchedExcludes();
205+
QCOMPARE(unmatched.size(), 2);
206+
QCOMPARE(unmatched[0], QString("bar.cpp"));
207+
QCOMPARE(unmatched[1], QString("dir3/"));
208+
// unmatched excludes does not affect the file list
209+
QCOMPARE(list.getFileList().size(), 9);
210+
}
211+
212+
void TestFileList::unmatchedExcludes3() const
213+
{
214+
FileList list;
215+
QStringList filters;
216+
filters << "dir1/";
217+
list.addExcludeList(filters);
218+
list.addDirectory(QString(SRCDIR) + "/../data/files", true);
219+
QVERIFY(list.getUnmatchedExcludes().isEmpty());
220+
}
221+
187222
QTEST_MAIN(TestFileList)

‎gui/test/filelist/testfilelist.h‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,7 @@ private slots:
3333
void filterFiles3() const;
3434
void filterFiles4() const;
3535
void filterFiles5() const;
36+
void unmatchedExcludes1() const;
37+
void unmatchedExcludes2() const;
38+
void unmatchedExcludes3() const;
3639
};

‎lib/importproject.cpp‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,7 @@ std::vector<std::string> ImportProject::ignorePaths(const std::vector<std::strin
203203
else
204204
++it;
205205
}
206+
return matcher.unmatched();
206207
}
207208

208209
void ImportProject::ignoreOtherConfigs(const std::string &cfg)

‎test/testcmdlineparser.cpp‎

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -519,6 +519,11 @@ class TestCmdlineParser : public TestFixture {
519519
TEST_CASE(ignorefilepaths7);
520520
TEST_CASE(ignorefilepaths8);
521521
TEST_CASE(ignorefilepaths9);
522+
TEST_CASE(ignoreUnused1);
523+
TEST_CASE(ignoreUnused2);
524+
TEST_CASE(ignoreUsed);
525+
TEST_CASE(ignoreUnusedProject);
526+
TEST_CASE(ignoreUsedProject);
522527

523528
TEST_CASE(nonexistentpath);
524529

@@ -3649,6 +3654,56 @@ class TestCmdlineParser : public TestFixture {
36493654
ASSERT_EQUALS("cppcheck: error: could not find or open any of the paths given.\ncppcheck: Maybe all paths were ignored?\n", logger->str());
36503655
}
36513656

3657+
void ignoreUnused1() {
3658+
REDIRECT;
3659+
ScopedFile file("file.cpp", "");
3660+
const char * const argv[] = {"cppcheck", "-ifoo.cpp", "file.cpp"};
3661+
ASSERT(!fillSettingsFromArgs(argv));
3662+
ASSERT_EQUALS("cppcheck: error: unused ignore/exclude path 'foo.cpp' to hide warnings in certain files use suppressions instead.\n", logger->str());
3663+
}
3664+
3665+
void ignoreUnused2() {
3666+
REDIRECT;
3667+
ScopedFile file1("file1.cpp", "");
3668+
ScopedFile file2("file2.cpp", "");
3669+
const char * const argv[] = {"cppcheck", "-ifile1.cpp", "-ifoo.cpp", "file1.cpp", "file2.cpp"};
3670+
ASSERT(!fillSettingsFromArgs(argv));
3671+
ASSERT_EQUALS("cppcheck: error: unused ignore/exclude path 'foo.cpp' to hide warnings in certain files use suppressions instead.\n", logger->str());
3672+
}
3673+
3674+
void ignoreUsed() {
3675+
REDIRECT;
3676+
ScopedFile file1("file1.cpp", "");
3677+
ScopedFile file2("file2.cpp", "");
3678+
const char * const argv[] = {"cppcheck", "-ifile1.cpp", "file1.cpp", "file2.cpp"};
3679+
ASSERT(fillSettingsFromArgs(argv));
3680+
ASSERT_EQUALS("", logger->str());
3681+
ASSERT_EQUALS(1, parser->getFiles().size());
3682+
ASSERT_EQUALS("file2.cpp", parser->getFiles().cbegin()->path());
3683+
}
3684+
3685+
void ignoreUnusedProject() {
3686+
REDIRECT;
3687+
ScopedFile file("compile_commands.json",
3688+
R"([{"directory": "/tmp", "command": "gcc -c file1.c", "file": "file1.c"},
3689+
{"directory": "/tmp", "command": "gcc -c file2.c", "file": "file2.c"}])");
3690+
const char * const argv[] = {"cppcheck", "--project=compile_commands.json", "-ifile1.c", "-ifoo.c"};
3691+
ASSERT_EQUALS_ENUM(CmdLineParser::Result::Fail, parseFromArgs(argv));
3692+
ASSERT_EQUALS("cppcheck: error: unused ignore/exclude path 'foo.c' to hide warnings in certain files use suppressions instead.\n", logger->str());
3693+
}
3694+
3695+
void ignoreUsedProject() {
3696+
REDIRECT;
3697+
ScopedFile file("compile_commands.json",
3698+
R"([{"directory": "/tmp", "command": "gcc -c file1.c", "file": "file1.c"},
3699+
{"directory": "/tmp", "command": "gcc -c file2.c", "file": "file2.c"}])");
3700+
const char * const argv[] = {"cppcheck", "--project=compile_commands.json", "-ifile1.c"};
3701+
ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parseFromArgs(argv));
3702+
ASSERT_EQUALS("", logger->str());
3703+
ASSERT_EQUALS(1, parser->getFileSettings().size());
3704+
ASSERT_EQUALS("/tmp/file2.c", parser->getFileSettings().cbegin()->filename());
3705+
}
3706+
36523707
void nonexistentpath() {
36533708
REDIRECT;
36543709
const char * const argv[] = {"cppcheck", "file.cpp"};

‎test/testfilelister.cpp‎

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,8 @@ class TestFileLister : public TestFixture {
6060

6161
// Recursively add add files..
6262
std::list<FileWithDetails> files;
63-
std::string err = FileLister::recursiveAddFiles(files, adddir, {}, PathMatch());
63+
PathMatch ignored;
64+
std::string err = FileLister::recursiveAddFiles(files, adddir, {}, ignored);
6465
ASSERT_EQUALS("", err);
6566

6667
ASSERT(!files.empty());
@@ -106,7 +107,8 @@ class TestFileLister : public TestFixture {
106107

107108
void recursiveAddFilesEmptyPath() const {
108109
std::list<FileWithDetails> files;
109-
const std::string err = FileLister::recursiveAddFiles(files, "", {}, PathMatch());
110+
PathMatch ignored;
111+
const std::string err = FileLister::recursiveAddFiles(files, "", {}, ignored);
110112
ASSERT_EQUALS("no path specified", err);
111113
}
112114

@@ -124,7 +126,8 @@ class TestFileLister : public TestFixture {
124126
const std::string basedir = findBaseDir();
125127

126128
std::list<FileWithDetails> files;
127-
std::string err = FileLister::recursiveAddFiles(files, basedir + "lib/token.cpp", {}, PathMatch());
129+
PathMatch ignored;
130+
std::string err = FileLister::recursiveAddFiles(files, basedir + "lib/token.cpp", {}, ignored);
128131
ASSERT_EQUALS("", err);
129132
ASSERT_EQUALS(1, files.size());
130133
ASSERT_EQUALS(basedir + "lib/token.cpp", files.begin()->path());
@@ -157,27 +160,32 @@ class TestFileLister : public TestFixture {
157160

158161
{
159162
const std::string addfile = Path::join(Path::join(adddir, "cli"), "main.cpp");
160-
const std::string err = FileLister::addFiles(files, addfile, {}, true,PathMatch());
163+
PathMatch ignored;
164+
const std::string err = FileLister::addFiles(files, addfile, {}, true, ignored);
161165
ASSERT_EQUALS("", err);
162166
}
163167
{
164168
const std::string addfile = Path::join(Path::join(adddir, "lib"), "token.cpp");
165-
const std::string err = FileLister::addFiles(files, addfile, {}, true,PathMatch());
169+
PathMatch ignored;
170+
const std::string err = FileLister::addFiles(files, addfile, {}, true, ignored);
166171
ASSERT_EQUALS("", err);
167172
}
168173
{
169174
const std::string addfile = Path::join(Path::join(adddir, "cli"), "token.cpp"); // does not exist
170-
const std::string err = FileLister::addFiles(files, addfile, {}, true,PathMatch());
175+
PathMatch ignored;
176+
const std::string err = FileLister::addFiles(files, addfile, {}, true, ignored);
171177
ASSERT_EQUALS("", err);
172178
}
173179
{
174180
const std::string addfile = Path::join(Path::join(adddir, "lib2"), "token.cpp"); // does not exist
175-
const std::string err = FileLister::addFiles(files, addfile, {}, true,PathMatch());
181+
PathMatch ignored;
182+
const std::string err = FileLister::addFiles(files, addfile, {}, true, ignored);
176183
ASSERT_EQUALS("", err);
177184
}
178185
{
179186
const std::string addfile = Path::join(Path::join(adddir, "lib"), "matchcompiler.h");
180-
const std::string err = FileLister::addFiles(files, addfile, {}, true,PathMatch());
187+
PathMatch ignored;
188+
const std::string err = FileLister::addFiles(files, addfile, {}, true, ignored);
181189
ASSERT_EQUALS("", err);
182190
}
183191

‎test/testpathmatch.cpp‎

Lines changed: 70 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,10 @@ class TestPathMatch : public TestFixture {
4242
#else
4343
const std::string basepath{"/test"};
4444
#endif
45-
const PathMatch emptyMatcher{{}, basepath};
46-
const PathMatch srcMatcher{{"src/"}, basepath};
47-
const PathMatch fooCppMatcher{{"foo.cpp"}, basepath};
48-
const PathMatch srcFooCppMatcher{{"src/foo.cpp"}, basepath};
45+
PathMatch emptyMatcher{{}, basepath};
46+
PathMatch srcMatcher{{"src/"}, basepath};
47+
PathMatch fooCppMatcher{{"foo.cpp"}, basepath};
48+
PathMatch srcFooCppMatcher{{"src/foo.cpp"}, basepath};
4949

5050
void run() override {
5151
TEST_CASE(emptymaskemptyfile);
@@ -85,32 +85,36 @@ class TestPathMatch : public TestFixture {
8585
TEST_CASE(globstar1);
8686
TEST_CASE(globstar2);
8787
TEST_CASE(pathiterator);
88+
TEST_CASE(unmatched1);
89+
TEST_CASE(unmatched2);
90+
TEST_CASE(unmatched3);
91+
TEST_CASE(unmatched4);
8892
}
8993

9094
// Test empty PathMatch
91-
void emptymaskemptyfile() const {
95+
void emptymaskemptyfile() {
9296
ASSERT(!emptyMatcher.match(""));
9397
}
9498

95-
void emptymaskpath1() const {
99+
void emptymaskpath1() {
96100
ASSERT(!emptyMatcher.match("src/", ifdir));
97101
}
98102

99-
void emptymaskpath2() const {
103+
void emptymaskpath2() {
100104
ASSERT(!emptyMatcher.match("../src/", ifdir));
101105
}
102106

103-
void emptymaskpath3() const {
107+
void emptymaskpath3() {
104108
ASSERT(!emptyMatcher.match("/home/user/code/src/", ifdir));
105109
ASSERT(!emptyMatcher.match("d:/home/user/code/src/", ifdir));
106110
}
107111

108112
// Test PathMatch containing "src/"
109-
void onemaskemptypath() const {
113+
void onemaskemptypath() {
110114
ASSERT(!srcMatcher.match(""));
111115
}
112116

113-
void onemasksamepath() const {
117+
void onemasksamepath() {
114118
ASSERT(srcMatcher.match("src/", ifdir));
115119
ASSERT(!srcMatcher.match("src/", ifreg));
116120
}
@@ -127,7 +131,7 @@ class TestPathMatch : public TestFixture {
127131
ASSERT(!match.match("srC/", ifreg));
128132
}
129133

130-
void onemasksamepathwithfile() const {
134+
void onemasksamepathwithfile() {
131135
ASSERT(srcMatcher.match("src/file.txt"));
132136
}
133137

@@ -140,36 +144,36 @@ class TestPathMatch : public TestFixture {
140144
ASSERT(!match.match(shorterToMatch, ifdir));
141145
}
142146

143-
void onemaskdifferentdir1() const {
147+
void onemaskdifferentdir1() {
144148
ASSERT(!srcMatcher.match("srcfiles/file.txt"));
145149
}
146150

147-
void onemaskdifferentdir2() const {
151+
void onemaskdifferentdir2() {
148152
ASSERT(!srcMatcher.match("proj/srcfiles/file.txt"));
149153
}
150154

151-
void onemaskdifferentdir3() const {
155+
void onemaskdifferentdir3() {
152156
ASSERT(!srcMatcher.match("proj/mysrc/file.txt"));
153157
}
154158

155-
void onemaskdifferentdir4() const {
159+
void onemaskdifferentdir4() {
156160
ASSERT(!srcMatcher.match("proj/mysrcfiles/file.txt"));
157161
}
158162

159-
void onemasklongerpath1() const {
163+
void onemasklongerpath1() {
160164
ASSERT(srcMatcher.match("/tmp/src/", ifdir));
161165
ASSERT(srcMatcher.match("d:/tmp/src/", ifdir));
162166
}
163167

164-
void onemasklongerpath2() const {
168+
void onemasklongerpath2() {
165169
ASSERT(srcMatcher.match("src/module/", ifdir));
166170
}
167171

168-
void onemasklongerpath3() const {
172+
void onemasklongerpath3() {
169173
ASSERT(srcMatcher.match("project/src/module/", ifdir));
170174
}
171175

172-
void onemaskcwd() const {
176+
void onemaskcwd() {
173177
ASSERT(srcMatcher.match("./src", ifdir));
174178
}
175179

@@ -197,7 +201,7 @@ class TestPathMatch : public TestFixture {
197201
}
198202

199203
// Test PathMatch containing "foo.cpp"
200-
void filemask1() const {
204+
void filemask1() {
201205
ASSERT(fooCppMatcher.match("foo.cpp"));
202206
}
203207

@@ -206,32 +210,32 @@ class TestPathMatch : public TestFixture {
206210
ASSERT(match.match("fOo.cpp"));
207211
}
208212

209-
void filemask2() const {
213+
void filemask2() {
210214
ASSERT(fooCppMatcher.match("../foo.cpp"));
211215
}
212216

213-
void filemask3() const {
217+
void filemask3() {
214218
ASSERT(fooCppMatcher.match("src/foo.cpp"));
215219
}
216220

217-
void filemaskcwd() const {
221+
void filemaskcwd() {
218222
ASSERT(fooCppMatcher.match("./lib/foo.cpp"));
219223
}
220224

221225
// Test PathMatch containing "src/foo.cpp"
222-
void filemaskpath1() const {
226+
void filemaskpath1() {
223227
ASSERT(srcFooCppMatcher.match("src/foo.cpp"));
224228
}
225229

226-
void filemaskpath2() const {
230+
void filemaskpath2() {
227231
ASSERT(srcFooCppMatcher.match("proj/src/foo.cpp"));
228232
}
229233

230-
void filemaskpath3() const {
234+
void filemaskpath3() {
231235
ASSERT(!srcFooCppMatcher.match("foo.cpp"));
232236
}
233237

234-
void filemaskpath4() const {
238+
void filemaskpath4() {
235239
ASSERT(!srcFooCppMatcher.match("bar/foo.cpp"));
236240
}
237241

@@ -308,6 +312,45 @@ class TestPathMatch : public TestFixture {
308312
/* The server and share should actually be considered part of the root and not be removed */
309313
ASSERT_EQUALS("//", PathIterator("\\\\Server\\Share\\Directory", "../..\\../..", windows).read());
310314
}
315+
316+
void unmatched1() const {
317+
// nothing has been matched yet => all patterns are unmatched
318+
PathMatch match({"src/", "foo.cpp"});
319+
ASSERT_EQUALS(2, match.unmatched().size());
320+
ASSERT_EQUALS("src/", match.unmatched()[0]);
321+
ASSERT_EQUALS("foo.cpp", match.unmatched()[1]);
322+
}
323+
324+
void unmatched2() const {
325+
PathMatch match({"src/", "foo.cpp"});
326+
ASSERT(match.match("src/bar.cpp"));
327+
ASSERT_EQUALS(1, match.unmatched().size());
328+
ASSERT_EQUALS("foo.cpp", match.unmatched()[0]);
329+
ASSERT(match.match("lib/foo.cpp"));
330+
ASSERT_EQUALS(0, match.unmatched().size());
331+
}
332+
333+
void unmatched3() const {
334+
// failed matches does not affect the unmatched patterns
335+
PathMatch match({"src/", "foo.cpp"});
336+
ASSERT(!match.match("lib/bar.cpp"));
337+
ASSERT(!match.match("src/", ifreg));
338+
ASSERT_EQUALS(2, match.unmatched().size());
339+
ASSERT(match.match("src/", ifdir));
340+
ASSERT_EQUALS(1, match.unmatched().size());
341+
ASSERT_EQUALS("foo.cpp", match.unmatched()[0]);
342+
}
343+
344+
void unmatched4() const {
345+
// glob patterns
346+
PathMatch match({"test*.cpp", "src/**/foo.c"});
347+
ASSERT(match.match("src/lib/foo/foo.c"));
348+
ASSERT_EQUALS(1, match.unmatched().size());
349+
ASSERT_EQUALS("test*.cpp", match.unmatched()[0]);
350+
ASSERT(!match.match("src/foo.c"));
351+
ASSERT(match.match("test1.cpp"));
352+
ASSERT_EQUALS(0, match.unmatched().size());
353+
}
311354
};
312355

313356
REGISTER_TEST(TestPathMatch)

0 commit comments

Comments
 (0)