diff --git a/Coverage-x86/Coverage-x86.vcxproj b/Coverage-x86/Coverage-x86.vcxproj index f57dc5f..a7a6fbd 100644 --- a/Coverage-x86/Coverage-x86.vcxproj +++ b/Coverage-x86/Coverage-x86.vcxproj @@ -54,6 +54,7 @@ + @@ -127,37 +128,6 @@ dbghelp.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Coverage-x86/Coverage-x86.vcxproj.filters b/Coverage-x86/Coverage-x86.vcxproj.filters index a1bdd45..d56ba3c 100644 --- a/Coverage-x86/Coverage-x86.vcxproj.filters +++ b/Coverage-x86/Coverage-x86.vcxproj.filters @@ -5,53 +5,5 @@ {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - {701ca765-1c95-4bb0-b030-4ba6c4a3640b} - - - - - - - - - - - - Disassembler - - - Disassembler - - - Disassembler - - - - - - - - - - - - - Disassembler - - - Disassembler - - - - - - - Disassembler - - - Disassembler - - \ No newline at end of file diff --git a/Coverage/Coverage.vcxproj b/Coverage/Coverage.vcxproj index b6c5b92..e64799f 100644 --- a/Coverage/Coverage.vcxproj +++ b/Coverage/Coverage.vcxproj @@ -55,6 +55,7 @@ + @@ -136,41 +137,6 @@ dbghelp.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Coverage/Coverage.vcxproj.filters b/Coverage/Coverage.vcxproj.filters index 0b2b5a3..d56ba3c 100644 --- a/Coverage/Coverage.vcxproj.filters +++ b/Coverage/Coverage.vcxproj.filters @@ -5,57 +5,5 @@ {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - {61466815-0264-4d18-81fc-e6f4620e6882} - - - - - - Disassembler - - - Disassembler - - - - - - - - - - - - - - - - - - Disassembler - - - Disassembler - - - Disassembler - - - - - - - - - - - - Disassembler - - - Disassembler - - \ No newline at end of file diff --git a/Coverage/CoverageRunner.h b/Coverage/CoverageRunner.h index 51b973a..0115e35 100644 --- a/Coverage/CoverageRunner.h +++ b/Coverage/CoverageRunner.h @@ -992,7 +992,10 @@ struct CoverageRunner } // Write report of current execution - coverageContext.WriteReport(options.ExportFormat, mergedInfo, outputFile); + { + std::ofstream ofs(outputFile); + coverageContext.WriteReport(options.ExportFormat, mergedInfo, ofs); + } if (options.isAtLeastLevel(VerboseLevel::Info)) { diff --git a/Coverage/FileCallbackInfo.h b/Coverage/FileCallbackInfo.h index 2929d21..61a6cec 100644 --- a/Coverage/FileCallbackInfo.h +++ b/Coverage/FileCallbackInfo.h @@ -49,11 +49,14 @@ struct FileCallbackInfo std::string filename; std::string sourcePath; - std::unordered_map> lineData; + using MergedProfileInfoMap = std::unordered_map>>; + using FileInfoMap = std::unordered_map>; + + FileInfoMap lineData; void Filter(RuntimeNotifications& notifications) { - std::unordered_map> newLineData; + FileInfoMap newLineData; for (auto& it : lineData) { if (!notifications.IgnoreFile(it.first)) @@ -110,7 +113,10 @@ struct FileCallbackInfo auto it = lineData.find(filename); if (it == lineData.end()) { - auto newLineData = new FileInfo(filename); + std::ifstream ifs(filename); + auto newLineData = new FileInfo(ifs); + ifs.close(); + lineData[filename] = std::unique_ptr(newLineData); return newLineData->LineInfo(size_t(lineNumber)); @@ -121,24 +127,21 @@ struct FileCallbackInfo } } - void WriteReport(RuntimeOptions::ExportFormatType exportFormat, std::unordered_map>>& mergedProfileInfo, const std::string& filename) + void WriteReport(RuntimeOptions::ExportFormatType exportFormat, const MergedProfileInfoMap& mergedProfileInfo, std::ostream& stream) { switch (exportFormat) { - case RuntimeOptions::Clover: WriteClover(filename); break; - case RuntimeOptions::Cobertura: WriteCobertura(filename); break; - case RuntimeOptions::NativeV2: WriteNativeV2(filename, mergedProfileInfo); break; - default: WriteNative(filename, mergedProfileInfo); break; + case RuntimeOptions::Clover: WriteClover(stream); break; + case RuntimeOptions::Cobertura: WriteCobertura(stream); break; + case RuntimeOptions::NativeV2: WriteNativeV2(stream); break; + default: WriteNative(stream, mergedProfileInfo); break; } } private: - void WriteClover(const std::string& filename) + void WriteClover(std::ostream& stream) { - std::string reportFilename = filename; - std::ofstream ofs(reportFilename); - size_t totalFiles = 0; size_t coveredFiles = 0; size_t totalLines = 0; @@ -163,19 +166,19 @@ struct FileCallbackInfo } time_t t = time(0); // get time now - ofs << "" << std::endl; - ofs << "" << std::endl; - ofs << "" << std::endl; - ofs << "" << std::endl; - ofs << "" << std::endl; + stream << "" << std::endl; + stream << "" << std::endl; + stream << "" << std::endl; + stream << "" << std::endl; + stream << "" << std::endl; for (auto& it : lineData) { auto ptr = it.second.get(); - ofs << "" << std::endl; + stream << "" << std::endl; for (size_t i = 0; i < ptr->numberLines; ++i) { @@ -183,28 +186,25 @@ struct FileCallbackInfo { if (ptr->lines[i].HitCount == ptr->lines[i].DebugCount) { - ofs << "" << std::endl; + stream << "" << std::endl; } else { - ofs << "" << std::endl; + stream << "" << std::endl; } } } - ofs << "" << std::endl; + stream << "" << std::endl; } - ofs << "" << std::endl; - ofs << "" << std::endl; - ofs << "" << std::endl; + stream << "" << std::endl; + stream << "" << std::endl; + stream << "" << std::endl; } - void WriteCobertura(const std::string& filename) + void WriteCobertura(std::ostream& stream) { - std::string reportFilename = filename; - std::ofstream ofs(reportFilename); - std::unordered_set sourceList; double total = 0; @@ -228,12 +228,12 @@ struct FileCallbackInfo double lineRate = covered / total; - ofs << "" << std::endl; - ofs << "" << std::endl; - ofs << "\t" << "" << std::endl; + stream << "" << std::endl; + stream << "" << std::endl; + stream << "\t" << "" << std::endl; - ofs << "\t\t" << "" << std::endl; - ofs << "\t\t\t" << "" << std::endl; + stream << "\t\t" << "" << std::endl; + stream << "\t\t\t" << "" << std::endl; for (auto& it : lineData) { auto ptr = it.second.get(); @@ -261,8 +261,8 @@ struct FileCallbackInfo double lineRate = covered / total; - ofs << "\t\t\t\t" << "" << std::endl; - ofs << "\t\t\t\t\t" << "" << std::endl; + stream << "\t\t\t\t" << "" << std::endl; + stream << "\t\t\t\t\t" << "" << std::endl; for (size_t i = 0; i < ptr->numberLines; ++i) { @@ -270,38 +270,36 @@ struct FileCallbackInfo { if (ptr->lines[i].HitCount == ptr->lines[i].DebugCount) { - ofs << "\t\t\t\t\t\t" << "" << std::endl; + stream << "\t\t\t\t\t\t" << "" << std::endl; } else { - ofs << "\t\t\t\t\t\t" << "" << std::endl; + stream << "\t\t\t\t\t\t" << "" << std::endl; } } } - ofs << "\t\t\t\t\t" << "" << std::endl; - ofs << "\t\t\t\t" << "" << std::endl; + stream << "\t\t\t\t\t" << "" << std::endl; + stream << "\t\t\t\t" << "" << std::endl; } - ofs << "\t\t\t" << "" << std::endl; - ofs << "\t\t" << "" << std::endl; - ofs << "\t" << "" << std::endl; - ofs << "\t" << std::endl; + stream << "\t\t\t" << "" << std::endl; + stream << "\t\t" << "" << std::endl; + stream << "\t" << "" << std::endl; + stream << "\t" << std::endl; for (const auto& source : sourceList) { - ofs << "\t\t" << source << ":" << std::endl; + stream << "\t\t" << source << ":" << std::endl; } - ofs << "\t" << std::endl; - ofs << "" << std::endl; + stream << "\t" << std::endl; + stream << "" << std::endl; } - void WriteNative(const std::string& filename, std::unordered_map>>& mergedProfileInfo) + void WriteNative(std::ostream& stream, const MergedProfileInfoMap& mergedProfileInfo) { - std::ofstream ofs(filename); - for (auto& it : lineData) { - ofs << "FILE: " << it.first << std::endl; + stream << "FILE: " << it.first << std::endl; auto ptr = it.second.get(); std::string result; @@ -333,27 +331,27 @@ struct FileCallbackInfo result.push_back(state); } - ofs << "RES: " << result << std::endl; + stream << "RES: " << result << std::endl; auto profInfo = mergedProfileInfo.find(it.first); if (profInfo == mergedProfileInfo.end()) { - ofs << "PROF: " << std::endl; + stream << "PROF: " << std::endl; } else { - ofs << "PROF: "; + stream << "PROF: "; for (auto& it : *(profInfo->second.get())) { - ofs << int(it.Deep) << ',' << int(it.Shallow) << ','; + stream << int(it.Deep) << ',' << int(it.Shallow) << ','; } - ofs << std::endl; + stream << std::endl; } } } - void WriteNativeV2(const std::string& filename, std::unordered_map>>& mergedProfileInfo) + void WriteNativeV2(std::ostream& stream) { const auto encodeCoverage = [](const FileInfo& info) -> FileCoverageV2 { @@ -372,11 +370,9 @@ struct FileCallbackInfo return coverage; }; - std::ofstream ofs(filename); - MD5 md5; - FileCoverageV2::writeHeader(ofs); + FileCoverageV2::writeHeader(stream); std::vector filepaths; filepaths.reserve(lineData.size()); @@ -408,19 +404,19 @@ struct FileCallbackInfo if (!dirPartAdded && !dirPath.empty()) { dirPartAdded = true; - FileCoverageV2::openDirectory(ofs, dirPath); + FileCoverageV2::openDirectory(stream, dirPath); } auto coverage = encodeCoverage(*it.second.get()); coverage.md5Code = md5.encode(it.first); - coverage.write(filepath, ofs); + coverage.write(filepath, stream); filepaths.erase(std::remove(filepaths.begin(), filepaths.end(), it.first), filepaths.end()); } if (dirPartAdded && !dirPath.empty()) { - FileCoverageV2::closeDirectory(ofs); + FileCoverageV2::closeDirectory(stream); } } @@ -441,7 +437,6 @@ struct FileCallbackInfo } } - FileCoverageV2::writeFooter(ofs); - ofs.close(); + FileCoverageV2::writeFooter(stream); } }; diff --git a/Coverage/FileInfo.cpp b/Coverage/FileInfo.cpp index b3676c0..ea88c48 100644 --- a/Coverage/FileInfo.cpp +++ b/Coverage/FileInfo.cpp @@ -5,10 +5,8 @@ #include #include -FileInfo::FileInfo(const std::string& filename) +FileInfo::FileInfo(std::istream& ifs) { - std::ifstream ifs(filename); - bool current = true; std::string line; diff --git a/Coverage/FileInfo.h b/Coverage/FileInfo.h index a26b77a..a9ecb12 100644 --- a/Coverage/FileInfo.h +++ b/Coverage/FileInfo.h @@ -38,7 +38,7 @@ struct FileInfo LineType GetLineType(const std::string& line); public: - FileInfo(const std::string& filename); + FileInfo(std::istream& ifs); std::vector relevant; std::vector lines; diff --git a/Coverage/ModuleInfo.h b/Coverage/ModuleInfo.h deleted file mode 100644 index 6f70f09..0000000 --- a/Coverage/ModuleInfo.h +++ /dev/null @@ -1 +0,0 @@ -#pragma once diff --git a/Coverage/Shared/Shared.vcxitems b/Coverage/Shared/Shared.vcxitems new file mode 100644 index 0000000..607a897 --- /dev/null +++ b/Coverage/Shared/Shared.vcxitems @@ -0,0 +1,51 @@ + + + + $(MSBuildAllProjects);$(MSBuildThisFileFullPath) + true + {9d16d9c8-4c07-40cc-96dc-f0fefc8c33b3} + + + + %(AdditionalIncludeDirectories);$(MSBuildThisFileDirectory) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Coverage/Shared/Shared.vcxitems.filters b/Coverage/Shared/Shared.vcxitems.filters new file mode 100644 index 0000000..d3178d8 --- /dev/null +++ b/Coverage/Shared/Shared.vcxitems.filters @@ -0,0 +1,57 @@ + + + + + + + + Disassembler + + + Disassembler + + + + + + + + + + + + + + + + + + + + + + + Disassembler + + + Disassembler + + + Disassembler + + + + + + Disassembler + + + Disassembler + + + + + {a848a8d1-9837-4608-923e-a1169637de43} + + + \ No newline at end of file diff --git a/Coverage/Test/Test.vcxproj b/Coverage/Test/Test.vcxproj index ea20e49..06f1537 100644 --- a/Coverage/Test/Test.vcxproj +++ b/Coverage/Test/Test.vcxproj @@ -29,7 +29,7 @@ DynamicLibrary true v143 - Unicode + MultiByte false @@ -37,14 +37,14 @@ false v143 true - Unicode + MultiByte false DynamicLibrary true v143 - Unicode + MultiByte false @@ -52,13 +52,14 @@ false v143 true - Unicode + MultiByte false + @@ -90,9 +91,10 @@ NotUsing Level3 Disabled - $(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories) + $(VCInstallDir)UnitTest\include;..;%(AdditionalIncludeDirectories) WIN32;_DEBUG;%(PreprocessorDefinitions) true + stdcpp20 Windows @@ -127,9 +129,10 @@ MaxSpeed true true - $(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories) + $(VCInstallDir)UnitTest\include;..;%(AdditionalIncludeDirectories) WIN32;NDEBUG;%(PreprocessorDefinitions) true + stdcpp20 Windows @@ -162,14 +165,11 @@ - - - - + diff --git a/Coverage/Test/nativeV2.cpp b/Coverage/Test/nativeV2.cpp index 795a963..f1a90b3 100644 --- a/Coverage/Test/nativeV2.cpp +++ b/Coverage/Test/nativeV2.cpp @@ -52,7 +52,8 @@ namespace TestFormat Assert::AreEqual(reference, merge._code); Assert::AreEqual(coverage._nbLinesFile, merge._nbLinesFile); Assert::AreEqual(coverage._nbLinesCode, merge._nbLinesCode); - Assert::AreEqual(5ull, merge._nbLinesCovered); + const size_t EXPECT_LINES_COVERED = 5; + Assert::AreEqual(EXPECT_LINES_COVERED, merge._nbLinesCovered); // Write data const std::string filename("demo"); @@ -77,7 +78,8 @@ namespace TestFormat options.ExportFormat = RuntimeOptions::ExportFormatType::NativeV2; MergeRunnerV2 runner(options); auto dict = runner.createDictionary(filename, ss); - Assert::AreEqual(1ull, dict.size()); + const size_t EXPECT_DICT_SIZE = 1; + Assert::AreEqual(EXPECT_DICT_SIZE, dict.size()); // Check dictionary const auto& saved = dict[dirName][filename]; diff --git a/Coverage/Test/writeReportTest.cpp b/Coverage/Test/writeReportTest.cpp new file mode 100644 index 0000000..581f42a --- /dev/null +++ b/Coverage/Test/writeReportTest.cpp @@ -0,0 +1,147 @@ +#include "CppUnitTest.h" +#include +#include + +#include "FileCallbackInfo.h" + +#ifndef NOMINMAX +# define NOMINMAX +# include +#endif + +#pragma warning(disable: 4091) +#include +#pragma warning(default: 4091) + +using namespace Microsoft::VisualStudio::CppUnitTestFramework; + +namespace TestFormat +{ + TEST_CLASS(TestWriteReport) + { + public: + + TEST_CLASS_INITIALIZE(Init) + { + auto& options = RuntimeOptions::Instance(); + options.CodePaths.push_back("C:\\proj\\src\\"); + options.CodePaths.push_back("C:\\proj\\empty\\"); + options.CodePaths.push_back("C:\\proj\\lib\\"); + + options.PackageName = "MyPackage.exe"; + } + + TEST_CLASS_CLEANUP(CleanUp) + { + auto& options = RuntimeOptions::Instance(); + options.CodePaths.clear(); + options.PackageName.clear(); + } + + void WriteReport(const std::string& expectReport, RuntimeOptions::ExportFormatType exportFormat, const FileCallbackInfo::MergedProfileInfoMap& mergedProfileData) + { + auto createFileLineInfoArray = [](const std::vector>& lineInfo) -> std::vector + { + std::vector arrayFileLineInfo; + arrayFileLineInfo.resize(lineInfo.size()); + for (unsigned i = 0; i < lineInfo.size(); i++) + { + arrayFileLineInfo[i].DebugCount = std::get<0>(lineInfo.at(i)); + arrayFileLineInfo[i].HitCount = std::get<1>(lineInfo.at(i)); + } + return arrayFileLineInfo; + }; + + auto addFile = [](FileCallbackInfo& fileCallbackInfo, const std::string filename, const std::vector& lines) + { + std::istringstream iss{}; + auto fileInfo = new FileInfo(iss); + fileInfo->relevant.assign(lines.size(), true); + fileInfo->numberLines = lines.size(); + fileInfo->lines = lines; + + fileCallbackInfo.lineData[filename] = std::unique_ptr(fileInfo); + }; + + FileCallbackInfo fileCallbackInfo("report.txt"); + + addFile(fileCallbackInfo, "C:\\proj\\src\\srcFile.cpp", createFileLineInfoArray({ {4, 4}, {4, 2}, {0, 0}, {4, 0}, {4, 2} })); + addFile(fileCallbackInfo, "C:\\proj\\src\\srcFile.h", createFileLineInfoArray({ {6, 6}, {3, 3} })); + addFile(fileCallbackInfo, "C:\\proj\\lib\\libFile.cpp", createFileLineInfoArray({ {7, 0}, {4, 0}, {2, 0} })); + addFile(fileCallbackInfo, "C:\\proj\\lib\\libFile.h", createFileLineInfoArray({ {18, 12}, {14, 7}, {3, 0} })); + + std::stringstream ss; + fileCallbackInfo.WriteReport(exportFormat, mergedProfileData, ss); + + Assert::AreEqual(expectReport, ss.str()); + } + + TEST_METHOD(WriteReportNativeWithoutProfileData) + { + const std::string expectReport = + "FILE: C:\\proj\\src\\srcFile.cpp\n" \ + "RES: cp_up\n" \ + "PROF: \n" \ + "FILE: C:\\proj\\src\\srcFile.h\n" \ + "RES: cc\n" \ + "PROF: \n" \ + "FILE: C:\\proj\\lib\\libFile.cpp\n" \ + "RES: uuu\n" \ + "PROF: \n" \ + "FILE: C:\\proj\\lib\\libFile.h\n" \ + "RES: ppu\n" \ + "PROF: \n"; + + FileCallbackInfo::MergedProfileInfoMap mergedProfileData; + WriteReport(expectReport, RuntimeOptions::ExportFormatType::Native, mergedProfileData); + } + + TEST_METHOD(WriteReportCobertura) + { + const std::string expectReport = + R"()""\n" \ + R"()""\n" \ + R"( )""\n" \ + R"( )""\n" \ + R"( )""\n" \ + R"( )""\n" \ + R"( )""\n" \ + R"( )""\n" \ + R"( )""\n" \ + R"( )""\n" \ + R"( )""\n" \ + R"( )""\n" \ + R"( )""\n" \ + R"( )""\n" \ + R"( )""\n" \ + R"( )""\n" \ + R"( )""\n" \ + R"( )""\n" \ + R"( )""\n" \ + R"( )""\n" \ + R"( )""\n" \ + R"( )""\n" \ + R"( )""\n" \ + R"( )""\n" \ + R"( )""\n" \ + R"( )""\n" \ + R"( )""\n" \ + R"( )""\n" \ + R"( )""\n" \ + R"( )""\n" \ + R"( )""\n" \ + R"( )""\n" \ + R"( )""\n" \ + R"( )""\n" \ + R"( )""\n" \ + R"( )""\n" \ + R"( )""\n" \ + R"( C:)""\n" \ + R"( )""\n" \ + R"()""\n"; + + FileCallbackInfo::MergedProfileInfoMap mergedProfileData; // it doesn't matter, can be empty + WriteReport(expectReport, RuntimeOptions::ExportFormatType::Cobertura, mergedProfileData); + } + }; +} \ No newline at end of file diff --git a/Library/Library.vcxproj b/Library/Library.vcxproj index bf815ef..ee70a96 100644 --- a/Library/Library.vcxproj +++ b/Library/Library.vcxproj @@ -85,6 +85,7 @@ Level3 Disabled true + stdcpp20 @@ -107,6 +108,7 @@ true true true + stdcpp20 true diff --git a/MinimumTest/MinimumTest.vcxproj b/MinimumTest/MinimumTest.vcxproj index 15f9218..4c2efc5 100644 --- a/MinimumTest/MinimumTest.vcxproj +++ b/MinimumTest/MinimumTest.vcxproj @@ -93,6 +93,7 @@ $(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories) WIN32;_DEBUG;%(PreprocessorDefinitions) true + stdcpp20 Windows @@ -130,6 +131,7 @@ $(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories) WIN32;NDEBUG;%(PreprocessorDefinitions) true + stdcpp20 Windows diff --git a/MinimumTestApp/MinimumTestApp.vcxproj b/MinimumTestApp/MinimumTestApp.vcxproj index 1852470..ae78c8b 100644 --- a/MinimumTestApp/MinimumTestApp.vcxproj +++ b/MinimumTestApp/MinimumTestApp.vcxproj @@ -74,6 +74,7 @@ Level3 Disabled true + stdcpp20 @@ -95,6 +96,7 @@ true true true + stdcpp20 true diff --git a/OpenCPPCoverage.sln b/OpenCPPCoverage.sln index 6c14cf9..1046a90 100644 --- a/OpenCPPCoverage.sln +++ b/OpenCPPCoverage.sln @@ -36,7 +36,15 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Test", "Coverage\Test\Test.vcxproj", "{CC47FB0B-0F7B-4C92-A0EF-07C922A28D87}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Shared", "Coverage\Shared\Shared.vcxitems", "{9D16D9C8-4C07-40CC-96DC-F0FEFC8C33B3}" +EndProject Global + GlobalSection(SharedMSBuildProjectFiles) = preSolution + Coverage\Shared\Shared.vcxitems*{70397440-c4f5-4091-8dbe-f2ffe6107d2d}*SharedItemsImports = 4 + Coverage\Shared\Shared.vcxitems*{9d16d9c8-4c07-40cc-96dc-f0fefc8c33b3}*SharedItemsImports = 9 + Coverage\Shared\Shared.vcxitems*{bab94fd2-1956-45b8-8d2f-904519d7ffa4}*SharedItemsImports = 4 + Coverage\Shared\Shared.vcxitems*{cc47fb0b-0f7b-4c92-a0ef-07c922a28d87}*SharedItemsImports = 4 + EndGlobalSection GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Debug|x64 = Debug|x64 @@ -137,6 +145,7 @@ Global {BAB94FD2-1956-45B8-8D2F-904519D7FFA4} = {8A6341B3-9141-4255-8C2B-38343873451F} {BF2ED12B-E0FC-4FD1-8F95-CEC239453846} = {7A7E6ED9-8154-4643-A506-1E1714A42F13} {CC47FB0B-0F7B-4C92-A0EF-07C922A28D87} = {8A6341B3-9141-4255-8C2B-38343873451F} + {9D16D9C8-4C07-40CC-96DC-F0FEFC8C33B3} = {8A6341B3-9141-4255-8C2B-38343873451F} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {B6F6F243-9A1D-4173-BE73-D10A344BA683}