testVisualStudioSlnParser.cxx 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. #include "testVisualStudioSlnParser.h"
  2. #include "cmVisualStudioSlnData.h"
  3. #include "cmVisualStudioSlnParser.h"
  4. #include <iostream>
  5. static bool parsedRight(cmVisualStudioSlnParser& parser,
  6. const std::string& file, cmSlnData& data,
  7. cmVisualStudioSlnParser::ParseResult expected =
  8. cmVisualStudioSlnParser::ResultOK)
  9. {
  10. if (parser.ParseFile(SOURCE_DIR "/testVisualStudioSlnParser_data/" + file +
  11. "." SLN_EXTENSION,
  12. data, cmVisualStudioSlnParser::DataGroupProjects)) {
  13. if (expected == cmVisualStudioSlnParser::ResultOK) {
  14. return true;
  15. }
  16. } else {
  17. if (parser.GetParseResult() == expected) {
  18. return true;
  19. }
  20. }
  21. std::cerr << "cmVisualStudioSlnParser mis-parsed " << file
  22. << "." SLN_EXTENSION << "; expected result " << expected
  23. << ", got " << parser.GetParseResult() << std::endl;
  24. return false;
  25. }
  26. int testVisualStudioSlnParser(int, char* [])
  27. {
  28. cmVisualStudioSlnParser parser;
  29. // Test clean parser
  30. if (parser.GetParseResult() != cmVisualStudioSlnParser::ResultOK) {
  31. std::cerr << "cmVisualStudioSlnParser initialisation failed" << std::endl;
  32. return 1;
  33. }
  34. // Test parsing valid sln
  35. {
  36. cmSlnData data;
  37. if (!parsedRight(parser, "valid", data)) {
  38. return 1;
  39. }
  40. const std::vector<cmSlnProjectEntry>& projects = data.GetProjects();
  41. const char* const names[] = {
  42. "3rdParty", "ALL_BUILD", "CMakeLib", "CMakeLibTests",
  43. "CMakePredefinedTargets", "CPackLib", "CTestDashboardTargets",
  44. "CTestLib", "Continuous", "Documentation", "Experimental", "INSTALL",
  45. "KWSys", "LIBCURL", "Nightly", "NightlyMemoryCheck", "PACKAGE",
  46. "RUN_TESTS", "Tests", "Utilities", "Win9xCompat", "ZERO_CHECK",
  47. "cmIML_test", "cmake", "cmbzip2", "cmcldeps", "cmcompress", "cmcurl",
  48. "cmexpat", "cmlibarchive", "cmsys", "cmsysEncodeExecutable",
  49. "cmsysProcessFwd9x", "cmsysTestDynload", "cmsysTestProcess",
  50. "cmsysTestSharedForward", "cmsysTestsC", "cmsysTestsCxx", "cmsys_c",
  51. "cmw9xcom", "cmzlib", "cpack", "ctest", "documentation", "memcheck_fail",
  52. "pseudo_BC", "pseudo_purify", "pseudo_valgrind", "test_clean",
  53. "uninstall"
  54. /* clang-format needs this comment to break after the opening brace */
  55. };
  56. const size_t expectedProjectCount = sizeof(names) / sizeof(*names);
  57. if (projects.size() != expectedProjectCount) {
  58. std::cerr << "cmVisualStudioSlnParser returned bad number of "
  59. << "projects (" << projects.size() << " instead of "
  60. << expectedProjectCount << ')' << std::endl;
  61. return 1;
  62. }
  63. for (size_t idx = 0; idx < expectedProjectCount; ++idx) {
  64. if (projects[idx].GetName() != names[idx]) {
  65. std::cerr << "cmVisualStudioSlnParser returned bad project #" << idx
  66. << "; expected \"" << names[idx] << "\", got \""
  67. << projects[idx].GetName() << '"' << std::endl;
  68. return 1;
  69. }
  70. }
  71. if (projects[0].GetRelativePath() != "Utilities\\3rdParty") {
  72. std::cerr << "cmVisualStudioSlnParser returned bad relative path of "
  73. << "project 3rdParty; expected \"Utilities\\3rdParty\", "
  74. << "got \"" << projects[0].GetRelativePath() << '"'
  75. << std::endl;
  76. return 1;
  77. }
  78. if (projects[2].GetGUID() != "{59BCCCCD-3AD1-4491-B8F4-C5793AC007E2}") {
  79. std::cerr << "cmVisualStudioSlnParser returned bad relative path of "
  80. << "project CMakeLib; expected "
  81. << "\"{59BCCCCD-3AD1-4491-B8F4-C5793AC007E2}\", "
  82. << "got \"" << projects[2].GetGUID() << '"' << std::endl;
  83. return 1;
  84. }
  85. }
  86. // Test BOM parsing
  87. {
  88. cmSlnData data;
  89. if (!parsedRight(parser, "bom", data)) {
  90. return 1;
  91. }
  92. if (!parser.GetParseHadBOM()) {
  93. std::cerr << "cmVisualStudioSlnParser didn't find BOM in bom."
  94. << SLN_EXTENSION << std::endl;
  95. return 1;
  96. }
  97. if (!parsedRight(parser, "nobom", data)) {
  98. return 1;
  99. }
  100. if (parser.GetParseHadBOM()) {
  101. std::cerr << "cmVisualStudioSlnParser found BOM in nobom."
  102. << SLN_EXTENSION << std::endl;
  103. return 1;
  104. }
  105. }
  106. // Test invalid sln
  107. {
  108. {
  109. cmSlnData data;
  110. if (!parsedRight(parser, "err-nonexistent", data,
  111. cmVisualStudioSlnParser::ResultErrorOpeningInput)) {
  112. return 1;
  113. }
  114. }
  115. {
  116. cmSlnData data;
  117. if (!parsedRight(parser, "err-empty", data,
  118. cmVisualStudioSlnParser::ResultErrorReadingInput)) {
  119. return 1;
  120. }
  121. }
  122. const char* const files[] = {
  123. "header", "projectArgs", "topLevel", "projectContents",
  124. "projectSection", "global", "unclosed", "strayQuote",
  125. "strayParen", "strayQuote2"
  126. /* clang-format needs this comment to break after the opening brace */
  127. };
  128. for (size_t idx = 0; idx < sizeof(files) / sizeof(files[0]); ++idx) {
  129. cmSlnData data;
  130. if (!parsedRight(parser, std::string("err-structure-") + files[idx],
  131. data,
  132. cmVisualStudioSlnParser::ResultErrorInputStructure)) {
  133. return 1;
  134. }
  135. }
  136. {
  137. cmSlnData data;
  138. if (!parsedRight(parser, "err-data", data,
  139. cmVisualStudioSlnParser::ResultErrorInputData)) {
  140. return 1;
  141. }
  142. }
  143. }
  144. // All is well
  145. return 0;
  146. }