#include "testVisualStudioSlnParser.h" #include "cmVisualStudioSlnData.h" #include "cmVisualStudioSlnParser.h" #include static bool parsedRight(cmVisualStudioSlnParser& parser, const std::string& file, cmSlnData& data, cmVisualStudioSlnParser::ParseResult expected = cmVisualStudioSlnParser::ResultOK) { if (parser.ParseFile(SOURCE_DIR "/testVisualStudioSlnParser_data/" + file + "." SLN_EXTENSION, data, cmVisualStudioSlnParser::DataGroupProjects)) { if (expected == cmVisualStudioSlnParser::ResultOK) { return true; } } else { if (parser.GetParseResult() == expected) { return true; } } std::cerr << "cmVisualStudioSlnParser mis-parsed " << file << "." SLN_EXTENSION << "; expected result " << expected << ", got " << parser.GetParseResult() << std::endl; return false; } int testVisualStudioSlnParser(int, char* []) { cmVisualStudioSlnParser parser; // Test clean parser if (parser.GetParseResult() != cmVisualStudioSlnParser::ResultOK) { std::cerr << "cmVisualStudioSlnParser initialisation failed" << std::endl; return 1; } // Test parsing valid sln { cmSlnData data; if (!parsedRight(parser, "valid", data)) { return 1; } const std::vector& projects = data.GetProjects(); const char* const names[] = { "3rdParty", "ALL_BUILD", "CMakeLib", "CMakeLibTests", "CMakePredefinedTargets", "CPackLib", "CTestDashboardTargets", "CTestLib", "Continuous", "Documentation", "Experimental", "INSTALL", "KWSys", "LIBCURL", "Nightly", "NightlyMemoryCheck", "PACKAGE", "RUN_TESTS", "Tests", "Utilities", "Win9xCompat", "ZERO_CHECK", "cmIML_test", "cmake", "cmbzip2", "cmcldeps", "cmcompress", "cmcurl", "cmexpat", "cmlibarchive", "cmsys", "cmsysEncodeExecutable", "cmsysProcessFwd9x", "cmsysTestDynload", "cmsysTestProcess", "cmsysTestSharedForward", "cmsysTestsC", "cmsysTestsCxx", "cmsys_c", "cmw9xcom", "cmzlib", "cpack", "ctest", "documentation", "memcheck_fail", "pseudo_BC", "pseudo_purify", "pseudo_valgrind", "test_clean", "uninstall" /* clang-format needs this comment to break after the opening brace */ }; const size_t expectedProjectCount = sizeof(names) / sizeof(*names); if (projects.size() != expectedProjectCount) { std::cerr << "cmVisualStudioSlnParser returned bad number of " << "projects (" << projects.size() << " instead of " << expectedProjectCount << ')' << std::endl; return 1; } for (size_t idx = 0; idx < expectedProjectCount; ++idx) { if (projects[idx].GetName() != names[idx]) { std::cerr << "cmVisualStudioSlnParser returned bad project #" << idx << "; expected \"" << names[idx] << "\", got \"" << projects[idx].GetName() << '"' << std::endl; return 1; } } if (projects[0].GetRelativePath() != "Utilities\\3rdParty") { std::cerr << "cmVisualStudioSlnParser returned bad relative path of " << "project 3rdParty; expected \"Utilities\\3rdParty\", " << "got \"" << projects[0].GetRelativePath() << '"' << std::endl; return 1; } if (projects[2].GetGUID() != "{59BCCCCD-3AD1-4491-B8F4-C5793AC007E2}") { std::cerr << "cmVisualStudioSlnParser returned bad relative path of " << "project CMakeLib; expected " << "\"{59BCCCCD-3AD1-4491-B8F4-C5793AC007E2}\", " << "got \"" << projects[2].GetGUID() << '"' << std::endl; return 1; } } // Test BOM parsing { cmSlnData data; if (!parsedRight(parser, "bom", data)) { return 1; } if (!parser.GetParseHadBOM()) { std::cerr << "cmVisualStudioSlnParser didn't find BOM in bom." << SLN_EXTENSION << std::endl; return 1; } if (!parsedRight(parser, "nobom", data)) { return 1; } if (parser.GetParseHadBOM()) { std::cerr << "cmVisualStudioSlnParser found BOM in nobom." << SLN_EXTENSION << std::endl; return 1; } } // Test invalid sln { { cmSlnData data; if (!parsedRight(parser, "err-nonexistent", data, cmVisualStudioSlnParser::ResultErrorOpeningInput)) { return 1; } } { cmSlnData data; if (!parsedRight(parser, "err-empty", data, cmVisualStudioSlnParser::ResultErrorReadingInput)) { return 1; } } const char* const files[] = { "header", "projectArgs", "topLevel", "projectContents", "projectSection", "global", "unclosed", "strayQuote", "strayParen", "strayQuote2" /* clang-format needs this comment to break after the opening brace */ }; for (size_t idx = 0; idx < sizeof(files) / sizeof(files[0]); ++idx) { cmSlnData data; if (!parsedRight(parser, std::string("err-structure-") + files[idx], data, cmVisualStudioSlnParser::ResultErrorInputStructure)) { return 1; } } { cmSlnData data; if (!parsedRight(parser, "err-data", data, cmVisualStudioSlnParser::ResultErrorInputData)) { return 1; } } } // All is well return 0; }