Skip to content

Commit 5daa07a

Browse files
committed
improved testing of missing includes / made it possible to clear the include cache in simplecpp
1 parent 7945b83 commit 5daa07a

File tree

6 files changed

+185
-13
lines changed

6 files changed

+185
-13
lines changed

Makefile

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -729,7 +729,7 @@ test/testio.o: test/testio.cpp lib/check.h lib/checkio.h lib/color.h lib/config.
729729
test/testleakautovar.o: test/testleakautovar.cpp externals/simplecpp/simplecpp.h externals/tinyxml2/tinyxml2.h lib/check.h lib/checkleakautovar.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/importproject.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/templatesimplifier.h lib/timer.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h test/testsuite.h
730730
$(CXX) ${INCLUDE_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testleakautovar.cpp
731731

732-
test/testlibrary.o: test/testlibrary.cpp externals/tinyxml2/tinyxml2.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/importproject.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/templatesimplifier.h lib/timer.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h test/testsuite.h test/testutils.h
732+
test/testlibrary.o: test/testlibrary.cpp externals/tinyxml2/tinyxml2.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/importproject.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/templatesimplifier.h lib/timer.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h test/testsuite.h test/testutils.h
733733
$(CXX) ${INCLUDE_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testlibrary.cpp
734734

735735
test/testmathlib.o: test/testmathlib.cpp lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/mathlib.h lib/suppressions.h test/testsuite.h
@@ -759,10 +759,10 @@ test/testplatform.o: test/testplatform.cpp externals/tinyxml2/tinyxml2.h lib/col
759759
test/testpostfixoperator.o: test/testpostfixoperator.cpp lib/check.h lib/checkpostfixoperator.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/importproject.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/templatesimplifier.h lib/timer.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h test/testsuite.h
760760
$(CXX) ${INCLUDE_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testpostfixoperator.cpp
761761

762-
test/testpreprocessor.o: test/testpreprocessor.cpp externals/simplecpp/simplecpp.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/importproject.h lib/library.h lib/mathlib.h lib/platform.h lib/preprocessor.h lib/settings.h lib/standards.h lib/suppressions.h lib/templatesimplifier.h lib/timer.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h test/testsuite.h test/testutils.h
762+
test/testpreprocessor.o: test/testpreprocessor.cpp externals/simplecpp/simplecpp.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/importproject.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/preprocessor.h lib/settings.h lib/standards.h lib/suppressions.h lib/templatesimplifier.h lib/timer.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h test/testsuite.h test/testutils.h
763763
$(CXX) ${INCLUDE_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testpreprocessor.cpp
764764

765-
test/testprocessexecutor.o: test/testprocessexecutor.cpp cli/executor.h cli/processexecutor.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/importproject.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/templatesimplifier.h lib/timer.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h test/redirect.h test/testsuite.h test/testutils.h
765+
test/testprocessexecutor.o: test/testprocessexecutor.cpp cli/executor.h cli/processexecutor.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/importproject.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/templatesimplifier.h lib/timer.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h test/redirect.h test/testsuite.h test/testutils.h
766766
$(CXX) ${INCLUDE_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testprocessexecutor.cpp
767767

768768
test/testrunner.o: test/testrunner.cpp externals/simplecpp/simplecpp.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/preprocessor.h lib/suppressions.h test/options.h test/testsuite.h
@@ -795,19 +795,19 @@ test/testsuite.o: test/testsuite.cpp lib/color.h lib/config.h lib/errorlogger.h
795795
test/testsummaries.o: test/testsummaries.cpp lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/importproject.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/summaries.h lib/suppressions.h lib/templatesimplifier.h lib/timer.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h test/testsuite.h
796796
$(CXX) ${INCLUDE_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testsummaries.cpp
797797

798-
test/testsuppressions.o: test/testsuppressions.cpp cli/cppcheckexecutor.h cli/executor.h cli/processexecutor.h cli/threadexecutor.h lib/analyzerinfo.h lib/check.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/importproject.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/templatesimplifier.h lib/timer.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h test/testsuite.h test/testutils.h
798+
test/testsuppressions.o: test/testsuppressions.cpp cli/cppcheckexecutor.h cli/executor.h cli/processexecutor.h cli/threadexecutor.h lib/analyzerinfo.h lib/check.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/importproject.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/templatesimplifier.h lib/timer.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h test/testsuite.h test/testutils.h
799799
$(CXX) ${INCLUDE_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testsuppressions.cpp
800800

801-
test/testsymboldatabase.o: test/testsymboldatabase.cpp externals/tinyxml2/tinyxml2.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/importproject.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/sourcelocation.h lib/standards.h lib/suppressions.h lib/symboldatabase.h lib/templatesimplifier.h lib/timer.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h test/testsuite.h test/testutils.h
801+
test/testsymboldatabase.o: test/testsymboldatabase.cpp externals/tinyxml2/tinyxml2.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/importproject.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/sourcelocation.h lib/standards.h lib/suppressions.h lib/symboldatabase.h lib/templatesimplifier.h lib/timer.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h test/testsuite.h test/testutils.h
802802
$(CXX) ${INCLUDE_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testsymboldatabase.cpp
803803

804-
test/testthreadexecutor.o: test/testthreadexecutor.cpp cli/executor.h cli/threadexecutor.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/importproject.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/templatesimplifier.h lib/timer.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h test/redirect.h test/testsuite.h test/testutils.h
804+
test/testthreadexecutor.o: test/testthreadexecutor.cpp cli/executor.h cli/threadexecutor.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/importproject.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/templatesimplifier.h lib/timer.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h test/redirect.h test/testsuite.h test/testutils.h
805805
$(CXX) ${INCLUDE_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testthreadexecutor.cpp
806806

807807
test/testtimer.o: test/testtimer.cpp lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/suppressions.h lib/timer.h test/testsuite.h
808808
$(CXX) ${INCLUDE_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testtimer.cpp
809809

810-
test/testtoken.o: test/testtoken.cpp lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/importproject.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/templatesimplifier.h lib/timer.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h test/testsuite.h test/testutils.h
810+
test/testtoken.o: test/testtoken.cpp lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/importproject.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/templatesimplifier.h lib/timer.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h test/testsuite.h test/testutils.h
811811
$(CXX) ${INCLUDE_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testtoken.cpp
812812

813813
test/testtokenize.o: test/testtokenize.cpp externals/simplecpp/simplecpp.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/importproject.h lib/library.h lib/mathlib.h lib/platform.h lib/preprocessor.h lib/settings.h lib/standards.h lib/suppressions.h lib/templatesimplifier.h lib/timer.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h test/testsuite.h
@@ -834,7 +834,7 @@ test/testunusedprivfunc.o: test/testunusedprivfunc.cpp externals/simplecpp/simpl
834834
test/testunusedvar.o: test/testunusedvar.cpp externals/simplecpp/simplecpp.h lib/check.h lib/checkunusedvar.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/importproject.h lib/library.h lib/mathlib.h lib/platform.h lib/preprocessor.h lib/settings.h lib/standards.h lib/suppressions.h lib/templatesimplifier.h lib/timer.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h test/testsuite.h
835835
$(CXX) ${INCLUDE_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testunusedvar.cpp
836836

837-
test/testutils.o: test/testutils.cpp lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/importproject.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/templatesimplifier.h lib/timer.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h test/testsuite.h test/testutils.h
837+
test/testutils.o: test/testutils.cpp lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/importproject.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/templatesimplifier.h lib/timer.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h test/testsuite.h test/testutils.h
838838
$(CXX) ${INCLUDE_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testutils.cpp
839839

840840
test/testvaarg.o: test/testvaarg.cpp lib/check.h lib/checkvaarg.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/importproject.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/templatesimplifier.h lib/timer.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h test/testsuite.h

lib/preprocessor.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -626,6 +626,7 @@ static simplecpp::DUI createDUI(const Settings &mSettings, const std::string &cf
626626
dui.std = mSettings.standards.getCPP();
627627
else
628628
dui.std = mSettings.standards.getC();
629+
dui.clearIncludeCache = mSettings.clearIncludeCache;
629630
return dui;
630631
}
631632

lib/settings.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ Settings::Settings()
4444
clang(false),
4545
clangExecutable("clang"),
4646
clangTidy(false),
47+
clearIncludeCache(false),
4748
daca(false),
4849
debugnormal(false),
4950
debugSimplified(false),

lib/settings.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,9 @@ class CPPCHECKLIB Settings : public cppcheck::Platform {
143143
/** Use clang-tidy */
144144
bool clangTidy;
145145

146+
/** Internal: Clear the simplecpp non-existing include cache */
147+
bool clearIncludeCache;
148+
146149
/** @brief include paths excluded from checking the configuration */
147150
std::set<std::string> configExcludePaths;
148151

test/testpreprocessor.cpp

Lines changed: 142 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,11 @@ class TestPreprocessor : public TestFixture {
259259
TEST_CASE(testDirectiveIncludeComments);
260260

261261
TEST_CASE(testMissingInclude);
262+
TEST_CASE(testMissingInclude2);
263+
TEST_CASE(testMissingSystemInclude);
264+
TEST_CASE(testMissingSystemInclude2);
265+
TEST_CASE(testMissingSystemInclude3);
266+
TEST_CASE(testMissingIncludeMixed);
262267
TEST_CASE(testMissingIncludeCheckConfig);
263268
}
264269

@@ -2432,11 +2437,143 @@ class TestPreprocessor : public TestFixture {
24322437
ASSERT_EQUALS(dumpdata, ostr.str());
24332438
}
24342439

2440+
// TODO: test with absolute path
2441+
// TODO: test with include path
2442+
2443+
// test for existing local include
24352444
void testMissingInclude() {
24362445
Preprocessor::missingIncludeFlag = false;
24372446
Preprocessor::missingSystemIncludeFlag = false;
24382447

24392448
Settings settings;
2449+
settings.clearIncludeCache = true;
2450+
settings.severity.clear();
2451+
settings.checks.enable(Checks::missingInclude);
2452+
Preprocessor preprocessor(settings, this);
2453+
2454+
ScopedFile header("header.h", "");
2455+
2456+
std::string code("#include \"header.h\"");
2457+
errout.str("");
2458+
preprocessor.getcode(code, "", "test.c");
2459+
ASSERT_EQUALS(false, Preprocessor::missingIncludeFlag);
2460+
ASSERT_EQUALS(false, Preprocessor::missingSystemIncludeFlag);
2461+
2462+
// the expected messages are emitted outside of the Preprocessor
2463+
ASSERT_EQUALS("", errout.str());
2464+
2465+
Preprocessor::missingIncludeFlag = false;
2466+
Preprocessor::missingSystemIncludeFlag = false;
2467+
}
2468+
2469+
// test for missing local include
2470+
void testMissingInclude2() {
2471+
Preprocessor::missingIncludeFlag = false;
2472+
Preprocessor::missingSystemIncludeFlag = false;
2473+
2474+
Settings settings;
2475+
settings.clearIncludeCache = true;
2476+
settings.severity.clear();
2477+
settings.checks.enable(Checks::missingInclude);
2478+
Preprocessor preprocessor(settings, this);
2479+
2480+
std::string code("#include \"header.h\"");
2481+
errout.str("");
2482+
preprocessor.getcode(code, "", "test.c");
2483+
ASSERT_EQUALS(true, Preprocessor::missingIncludeFlag);
2484+
ASSERT_EQUALS(false, Preprocessor::missingSystemIncludeFlag);
2485+
2486+
// the expected messages are emitted outside of the Preprocessor
2487+
ASSERT_EQUALS("", errout.str());
2488+
2489+
Preprocessor::missingIncludeFlag = false;
2490+
Preprocessor::missingSystemIncludeFlag = false;
2491+
}
2492+
2493+
// test for missing system include - system includes are not searched for in relative path
2494+
void testMissingSystemInclude() {
2495+
Preprocessor::missingIncludeFlag = false;
2496+
Preprocessor::missingSystemIncludeFlag = false;
2497+
2498+
Settings settings;
2499+
settings.clearIncludeCache = true;
2500+
settings.severity.clear();
2501+
settings.checks.enable(Checks::missingInclude);
2502+
Preprocessor preprocessor(settings, this);
2503+
2504+
ScopedFile header("header.h", "");
2505+
2506+
std::string code("#include <header.h>");
2507+
errout.str("");
2508+
preprocessor.getcode(code, "", "test.c");
2509+
ASSERT_EQUALS(false, Preprocessor::missingIncludeFlag);
2510+
ASSERT_EQUALS(true, Preprocessor::missingSystemIncludeFlag);
2511+
2512+
// the expected messages are emitted outside of the Preprocessor
2513+
ASSERT_EQUALS("", errout.str());
2514+
2515+
Preprocessor::missingIncludeFlag = false;
2516+
Preprocessor::missingSystemIncludeFlag = false;
2517+
}
2518+
2519+
// test for missing system include
2520+
void testMissingSystemInclude2() {
2521+
Preprocessor::missingIncludeFlag = false;
2522+
Preprocessor::missingSystemIncludeFlag = false;
2523+
2524+
Settings settings;
2525+
settings.clearIncludeCache = true;
2526+
settings.severity.clear();
2527+
settings.checks.enable(Checks::missingInclude);
2528+
Preprocessor preprocessor(settings, this);
2529+
2530+
std::string code("#include <header.h>");
2531+
errout.str("");
2532+
preprocessor.getcode(code, "", "test.c");
2533+
ASSERT_EQUALS(false, Preprocessor::missingIncludeFlag);
2534+
ASSERT_EQUALS(true, Preprocessor::missingSystemIncludeFlag);
2535+
2536+
// the expected messages are emitted outside of the Preprocessor
2537+
ASSERT_EQUALS("", errout.str());
2538+
2539+
Preprocessor::missingIncludeFlag = false;
2540+
Preprocessor::missingSystemIncludeFlag = false;
2541+
}
2542+
2543+
// test for existing system include in system include path
2544+
void testMissingSystemInclude3() {
2545+
Preprocessor::missingIncludeFlag = false;
2546+
Preprocessor::missingSystemIncludeFlag = false;
2547+
2548+
Settings settings;
2549+
settings.clearIncludeCache = true;
2550+
settings.severity.clear();
2551+
settings.checks.enable(Checks::missingInclude);
2552+
settings.includePaths.emplace_back("system");
2553+
Preprocessor preprocessor(settings, this);
2554+
2555+
ScopedFile header("header.h", "", "system");
2556+
2557+
std::string code("#include <header.h>");
2558+
errout.str("");
2559+
preprocessor.getcode(code, "", "test.c");
2560+
ASSERT_EQUALS(false, Preprocessor::missingIncludeFlag);
2561+
ASSERT_EQUALS(false, Preprocessor::missingSystemIncludeFlag);
2562+
2563+
// the expected messages are emitted outside of the Preprocessor
2564+
ASSERT_EQUALS("", errout.str());
2565+
2566+
Preprocessor::missingIncludeFlag = false;
2567+
Preprocessor::missingSystemIncludeFlag = false;
2568+
}
2569+
2570+
// test for missing local and system include
2571+
void testMissingIncludeMixed() {
2572+
Preprocessor::missingIncludeFlag = false;
2573+
Preprocessor::missingSystemIncludeFlag = false;
2574+
2575+
Settings settings;
2576+
settings.clearIncludeCache = true;
24402577
settings.severity.clear();
24412578
settings.checks.enable(Checks::missingInclude);
24422579
Preprocessor preprocessor(settings, this);
@@ -2465,18 +2602,22 @@ class TestPreprocessor : public TestFixture {
24652602
Preprocessor::missingSystemIncludeFlag = false;
24662603

24672604
Settings settings;
2605+
settings.clearIncludeCache = true;
24682606
settings.checkConfiguration = true;
24692607
settings.severity.clear();
2608+
settings.includePaths.emplace_back("system");
24702609
// needs to be reported regardless of enabled checks
24712610
Preprocessor preprocessor(settings, this);
24722611

24732612
ScopedFile header("header.h", "");
24742613
ScopedFile header2("header2.h", "");
2614+
ScopedFile header3("header3.h", "", "system");
24752615

24762616
std::string code("#include \"missing.h\"\n"
24772617
"#include <header.h>\n"
24782618
"#include <missing2.h>\n"
2479-
"#include \"header2.h\"");
2619+
"#include \"header2.h\""
2620+
"#include <header3.h>\n");
24802621
errout.str("");
24812622
preprocessor.getcode(code, "", "test.c");
24822623
ASSERT_EQUALS(true, Preprocessor::missingIncludeFlag);

test/testutils.h

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
#include "color.h"
2323
#include "errorlogger.h"
24+
#include "path.h"
2425
#include "settings.h"
2526
#include "suppressions.h"
2627
#include "tokenize.h"
@@ -33,6 +34,14 @@
3334
#include <string>
3435
#include <utility>
3536

37+
#ifdef _WIN32
38+
#include <windows.h>
39+
#else
40+
#include <sys/stat.h>
41+
#include <sys/types.h>
42+
#include <unistd.h>
43+
#endif
44+
3645
class Token;
3746

3847
class givenACodeSampleToTokenize {
@@ -74,16 +83,33 @@ class SimpleSuppressor : public ErrorLogger {
7483

7584
class ScopedFile {
7685
public:
77-
ScopedFile(std::string name, const std::string &content) : mName(std::move(name)) {
78-
std::ofstream of(mName);
86+
ScopedFile(std::string name, const std::string &content, std::string path = "")
87+
: mName(std::move(name))
88+
, mPath(Path::toNativeSeparators(std::move(path)))
89+
, mFullPath(Path::join(mPath, mName))
90+
{
91+
#ifdef _WIN32
92+
CreateDirectoryA(mPath.c_str());
93+
#else
94+
mkdir(mPath.c_str(), S_IRUSR | S_IWUSR);
95+
#endif
96+
97+
std::ofstream of(mFullPath);
7998
of << content;
8099
}
81100

82101
~ScopedFile() {
83-
remove(mName.c_str());
102+
remove(mFullPath.c_str());
103+
#ifdef _WIN32
104+
RemoveDirectoryA(mPath.c_str());
105+
#else
106+
rmdir(mPath.c_str());
107+
#endif
84108
}
85109
private:
86-
std::string mName;
110+
const std::string mName;
111+
const std::string mPath;
112+
const std::string mFullPath;
87113
};
88114

89115
#endif // TestUtilsH

0 commit comments

Comments
 (0)