testVisualStudioSlnParser.cxx 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. #include "testVisualStudioSlnParser.h"
  2. #include <iostream>
  3. #include "cmVisualStudioSlnData.h"
  4. #include "cmVisualStudioSlnParser.h"
  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 initialization 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",
  43. "ALL_BUILD",
  44. "CMakeLib",
  45. "CMakeLibTests",
  46. "CMakePredefinedTargets",
  47. "CPackLib",
  48. "CTestDashboardTargets",
  49. "CTestLib",
  50. "Continuous",
  51. "Documentation",
  52. "Experimental",
  53. "INSTALL",
  54. "KWSys",
  55. "LIBCURL",
  56. "Nightly",
  57. "NightlyMemoryCheck",
  58. "PACKAGE",
  59. "RUN_TESTS",
  60. "Tests",
  61. "Utilities",
  62. "Win9xCompat",
  63. "ZERO_CHECK",
  64. "cmIML_test",
  65. "cmake",
  66. "cmbzip2",
  67. "cmcldeps",
  68. "cmcompress",
  69. "cmcurl",
  70. "cmexpat",
  71. "cmlibarchive",
  72. "cmsys",
  73. "cmsysEncodeExecutable",
  74. "cmsysProcessFwd9x",
  75. "cmsysTestDynload",
  76. "cmsysTestProcess",
  77. "cmsysTestsC",
  78. "cmsysTestsCxx",
  79. "cmsys_c",
  80. "cmw9xcom",
  81. "cmzlib",
  82. "cpack",
  83. "ctest",
  84. "documentation",
  85. "memcheck_fail",
  86. "pseudo_BC",
  87. "pseudo_purify",
  88. "pseudo_valgrind",
  89. "test_clean",
  90. "uninstall"
  91. /* clang-format needs this comment to break after the opening brace */
  92. };
  93. const size_t expectedProjectCount = sizeof(names) / sizeof(*names);
  94. if (projects.size() != expectedProjectCount) {
  95. std::cerr << "cmVisualStudioSlnParser returned bad number of "
  96. << "projects (" << projects.size() << " instead of "
  97. << expectedProjectCount << ')' << std::endl;
  98. return 1;
  99. }
  100. for (size_t idx = 0; idx < expectedProjectCount; ++idx) {
  101. if (projects[idx].GetName() != names[idx]) {
  102. std::cerr << "cmVisualStudioSlnParser returned bad project #" << idx
  103. << "; expected \"" << names[idx] << "\", got \""
  104. << projects[idx].GetName() << '"' << std::endl;
  105. return 1;
  106. }
  107. }
  108. if (projects[0].GetRelativePath() != "Utilities\\3rdParty") {
  109. std::cerr << "cmVisualStudioSlnParser returned bad relative path of "
  110. << "project 3rdParty; expected \"Utilities\\3rdParty\", "
  111. << "got \"" << projects[0].GetRelativePath() << '"'
  112. << std::endl;
  113. return 1;
  114. }
  115. if (projects[2].GetGUID() != "{59BCCCCD-3AD1-4491-B8F4-C5793AC007E2}") {
  116. std::cerr << "cmVisualStudioSlnParser returned bad relative path of "
  117. << "project CMakeLib; expected "
  118. << "\"{59BCCCCD-3AD1-4491-B8F4-C5793AC007E2}\", "
  119. << "got \"" << projects[2].GetGUID() << '"' << std::endl;
  120. return 1;
  121. }
  122. }
  123. // Test BOM parsing
  124. {
  125. cmSlnData data;
  126. if (!parsedRight(parser, "bom", data)) {
  127. return 1;
  128. }
  129. if (!parser.GetParseHadBOM()) {
  130. std::cerr << "cmVisualStudioSlnParser didn't find BOM in bom."
  131. << SLN_EXTENSION << std::endl;
  132. return 1;
  133. }
  134. if (!parsedRight(parser, "nobom", data)) {
  135. return 1;
  136. }
  137. if (parser.GetParseHadBOM()) {
  138. std::cerr << "cmVisualStudioSlnParser found BOM in nobom."
  139. << SLN_EXTENSION << std::endl;
  140. return 1;
  141. }
  142. }
  143. // Test invalid sln
  144. {
  145. {
  146. cmSlnData data;
  147. if (!parsedRight(parser, "err-nonexistent", data,
  148. cmVisualStudioSlnParser::ResultErrorOpeningInput)) {
  149. return 1;
  150. }
  151. }
  152. {
  153. cmSlnData data;
  154. if (!parsedRight(parser, "err-empty", data,
  155. cmVisualStudioSlnParser::ResultErrorReadingInput)) {
  156. return 1;
  157. }
  158. }
  159. const char* const files[] = {
  160. "header", "projectArgs", "topLevel", "projectContents",
  161. "projectSection", "global", "unclosed", "strayQuote",
  162. "strayParen", "strayQuote2"
  163. /* clang-format needs this comment to break after the opening brace */
  164. };
  165. for (size_t idx = 0; idx < sizeof(files) / sizeof(files[0]); ++idx) {
  166. cmSlnData data;
  167. if (!parsedRight(parser, std::string("err-structure-") + files[idx],
  168. data,
  169. cmVisualStudioSlnParser::ResultErrorInputStructure)) {
  170. return 1;
  171. }
  172. }
  173. {
  174. cmSlnData data;
  175. if (!parsedRight(parser, "err-data", data,
  176. cmVisualStudioSlnParser::ResultErrorInputData)) {
  177. return 1;
  178. }
  179. }
  180. }
  181. // All is well
  182. return 0;
  183. }