testVisualStudioSlnParser.cxx 5.5 KB

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