testVisualStudioSlnParser.cxx 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  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 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",
  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. "cmsysTestSharedForward",
  78. "cmsysTestsC",
  79. "cmsysTestsCxx",
  80. "cmsys_c",
  81. "cmw9xcom",
  82. "cmzlib",
  83. "cpack",
  84. "ctest",
  85. "documentation",
  86. "memcheck_fail",
  87. "pseudo_BC",
  88. "pseudo_purify",
  89. "pseudo_valgrind",
  90. "test_clean",
  91. "uninstall"
  92. /* clang-format needs this comment to break after the opening brace */
  93. };
  94. const size_t expectedProjectCount = sizeof(names) / sizeof(*names);
  95. if (projects.size() != expectedProjectCount) {
  96. std::cerr << "cmVisualStudioSlnParser returned bad number of "
  97. << "projects (" << projects.size() << " instead of "
  98. << expectedProjectCount << ')' << std::endl;
  99. return 1;
  100. }
  101. for (size_t idx = 0; idx < expectedProjectCount; ++idx) {
  102. if (projects[idx].GetName() != names[idx]) {
  103. std::cerr << "cmVisualStudioSlnParser returned bad project #" << idx
  104. << "; expected \"" << names[idx] << "\", got \""
  105. << projects[idx].GetName() << '"' << std::endl;
  106. return 1;
  107. }
  108. }
  109. if (projects[0].GetRelativePath() != "Utilities\\3rdParty") {
  110. std::cerr << "cmVisualStudioSlnParser returned bad relative path of "
  111. << "project 3rdParty; expected \"Utilities\\3rdParty\", "
  112. << "got \"" << projects[0].GetRelativePath() << '"'
  113. << std::endl;
  114. return 1;
  115. }
  116. if (projects[2].GetGUID() != "{59BCCCCD-3AD1-4491-B8F4-C5793AC007E2}") {
  117. std::cerr << "cmVisualStudioSlnParser returned bad relative path of "
  118. << "project CMakeLib; expected "
  119. << "\"{59BCCCCD-3AD1-4491-B8F4-C5793AC007E2}\", "
  120. << "got \"" << projects[2].GetGUID() << '"' << std::endl;
  121. return 1;
  122. }
  123. }
  124. // Test BOM parsing
  125. {
  126. cmSlnData data;
  127. if (!parsedRight(parser, "bom", data)) {
  128. return 1;
  129. }
  130. if (!parser.GetParseHadBOM()) {
  131. std::cerr << "cmVisualStudioSlnParser didn't find BOM in bom."
  132. << SLN_EXTENSION << std::endl;
  133. return 1;
  134. }
  135. if (!parsedRight(parser, "nobom", data)) {
  136. return 1;
  137. }
  138. if (parser.GetParseHadBOM()) {
  139. std::cerr << "cmVisualStudioSlnParser found BOM in nobom."
  140. << SLN_EXTENSION << std::endl;
  141. return 1;
  142. }
  143. }
  144. // Test invalid sln
  145. {
  146. {
  147. cmSlnData data;
  148. if (!parsedRight(parser, "err-nonexistent", data,
  149. cmVisualStudioSlnParser::ResultErrorOpeningInput)) {
  150. return 1;
  151. }
  152. }
  153. {
  154. cmSlnData data;
  155. if (!parsedRight(parser, "err-empty", data,
  156. cmVisualStudioSlnParser::ResultErrorReadingInput)) {
  157. return 1;
  158. }
  159. }
  160. const char* const files[] = {
  161. "header", "projectArgs", "topLevel", "projectContents",
  162. "projectSection", "global", "unclosed", "strayQuote",
  163. "strayParen", "strayQuote2"
  164. /* clang-format needs this comment to break after the opening brace */
  165. };
  166. for (size_t idx = 0; idx < sizeof(files) / sizeof(files[0]); ++idx) {
  167. cmSlnData data;
  168. if (!parsedRight(parser, std::string("err-structure-") + files[idx],
  169. data,
  170. cmVisualStudioSlnParser::ResultErrorInputStructure)) {
  171. return 1;
  172. }
  173. }
  174. {
  175. cmSlnData data;
  176. if (!parsedRight(parser, "err-data", data,
  177. cmVisualStudioSlnParser::ResultErrorInputData)) {
  178. return 1;
  179. }
  180. }
  181. }
  182. // All is well
  183. return 0;
  184. }