NamespaceEndCommentsFixerTest.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362
  1. //===- NamespaceEndCommentsFixerTest.cpp - Formatting unit tests ----------===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is distributed under the University of Illinois Open Source
  6. // License. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. #include "clang/Format/Format.h"
  10. #include "clang/Frontend/TextDiagnosticPrinter.h"
  11. #include "llvm/Support/Debug.h"
  12. #include "gtest/gtest.h"
  13. #define DEBUG_TYPE "namespace-end-comments-fixer-test"
  14. namespace clang {
  15. namespace format {
  16. namespace {
  17. class NamespaceEndCommentsFixerTest : public ::testing::Test {
  18. protected:
  19. std::string
  20. fixNamespaceEndComments(llvm::StringRef Code,
  21. std::vector<tooling::Range> Ranges,
  22. const FormatStyle &Style = getLLVMStyle()) {
  23. DEBUG(llvm::errs() << "---\n");
  24. DEBUG(llvm::errs() << Code << "\n\n");
  25. tooling::Replacements Replaces =
  26. clang::format::fixNamespaceEndComments(Style, Code, Ranges, "<stdin>");
  27. auto Result = applyAllReplacements(Code, Replaces);
  28. EXPECT_TRUE(static_cast<bool>(Result));
  29. DEBUG(llvm::errs() << "\n" << *Result << "\n\n");
  30. return *Result;
  31. }
  32. std::string
  33. fixNamespaceEndComments(llvm::StringRef Code,
  34. const FormatStyle &Style = getLLVMStyle()) {
  35. return fixNamespaceEndComments(
  36. Code,
  37. /*Ranges=*/{1, tooling::Range(0, Code.size())}, Style);
  38. }
  39. };
  40. TEST_F(NamespaceEndCommentsFixerTest, AddsEndComment) {
  41. EXPECT_EQ("namespace {\n"
  42. " int i;\n"
  43. "}// namespace",
  44. fixNamespaceEndComments("namespace {\n"
  45. " int i;\n"
  46. "}"));
  47. EXPECT_EQ("namespace {\n"
  48. " int i;\n"
  49. "}// namespace\n",
  50. fixNamespaceEndComments("namespace {\n"
  51. " int i;\n"
  52. "}\n"));
  53. EXPECT_EQ("namespace A {\n"
  54. " int i;\n"
  55. "}// namespace A",
  56. fixNamespaceEndComments("namespace A {\n"
  57. " int i;\n"
  58. "}"));
  59. EXPECT_EQ("inline namespace A {\n"
  60. " int i;\n"
  61. "}// namespace A",
  62. fixNamespaceEndComments("inline namespace A {\n"
  63. " int i;\n"
  64. "}"));
  65. EXPECT_EQ("namespace ::A {\n"
  66. " int i;\n"
  67. "}// namespace ::A",
  68. fixNamespaceEndComments("namespace ::A {\n"
  69. " int i;\n"
  70. "}"));
  71. EXPECT_EQ("namespace ::A::B {\n"
  72. " int i;\n"
  73. "}// namespace ::A::B",
  74. fixNamespaceEndComments("namespace ::A::B {\n"
  75. " int i;\n"
  76. "}"));
  77. EXPECT_EQ("namespace /**/::/**/A/**/::/**/B/**/ {\n"
  78. " int i;\n"
  79. "}// namespace ::A::B",
  80. fixNamespaceEndComments("namespace /**/::/**/A/**/::/**/B/**/ {\n"
  81. " int i;\n"
  82. "}"));
  83. EXPECT_EQ("namespace A {\n"
  84. "namespace B {\n"
  85. " int i;\n"
  86. "}// namespace B\n"
  87. "}// namespace A",
  88. fixNamespaceEndComments("namespace A {\n"
  89. "namespace B {\n"
  90. " int i;\n"
  91. "}\n"
  92. "}"));
  93. EXPECT_EQ("namespace A {\n"
  94. " int a;\n"
  95. "}// namespace A\n"
  96. "namespace B {\n"
  97. " int b;\n"
  98. "}// namespace B",
  99. fixNamespaceEndComments("namespace A {\n"
  100. " int a;\n"
  101. "}\n"
  102. "namespace B {\n"
  103. " int b;\n"
  104. "}"));
  105. EXPECT_EQ("namespace A {\n"
  106. " int a1;\n"
  107. "}// namespace A\n"
  108. "namespace A {\n"
  109. " int a2;\n"
  110. "}// namespace A",
  111. fixNamespaceEndComments("namespace A {\n"
  112. " int a1;\n"
  113. "}\n"
  114. "namespace A {\n"
  115. " int a2;\n"
  116. "}"));
  117. EXPECT_EQ("namespace A {\n"
  118. " int a;\n"
  119. "}// namespace A\n"
  120. "// comment about b\n"
  121. "int b;",
  122. fixNamespaceEndComments("namespace A {\n"
  123. " int a;\n"
  124. "}\n"
  125. "// comment about b\n"
  126. "int b;"));
  127. EXPECT_EQ("namespace A {\n"
  128. "namespace B {\n"
  129. "namespace C {\n"
  130. "namespace D {\n"
  131. "}// namespace D\n"
  132. "}// namespace C\n"
  133. "}// namespace B\n"
  134. "}// namespace A",
  135. fixNamespaceEndComments("namespace A {\n"
  136. "namespace B {\n"
  137. "namespace C {\n"
  138. "namespace D {\n"
  139. "}\n"
  140. "}\n"
  141. "}\n"
  142. "}"));
  143. }
  144. TEST_F(NamespaceEndCommentsFixerTest, AddsNewlineIfNeeded) {
  145. EXPECT_EQ("namespace A {\n"
  146. " int i;\n"
  147. "}// namespace A\n"
  148. " int j;",
  149. fixNamespaceEndComments("namespace A {\n"
  150. " int i;\n"
  151. "} int j;"));
  152. EXPECT_EQ("namespace {\n"
  153. " int i;\n"
  154. "}// namespace\n"
  155. " int j;",
  156. fixNamespaceEndComments("namespace {\n"
  157. " int i;\n"
  158. "} int j;"));
  159. EXPECT_EQ("namespace A {\n"
  160. " int i;\n"
  161. "}// namespace A\n"
  162. " namespace B {\n"
  163. " int j;\n"
  164. "}// namespace B",
  165. fixNamespaceEndComments("namespace A {\n"
  166. " int i;\n"
  167. "} namespace B {\n"
  168. " int j;\n"
  169. "}"));
  170. }
  171. TEST_F(NamespaceEndCommentsFixerTest, DoesNotAddEndCommentForShortNamespace) {
  172. EXPECT_EQ("namespace {}", fixNamespaceEndComments("namespace {}"));
  173. EXPECT_EQ("namespace A {}", fixNamespaceEndComments("namespace A {}"));
  174. EXPECT_EQ("namespace A { int i; }",
  175. fixNamespaceEndComments("namespace A { int i; }"));
  176. }
  177. TEST_F(NamespaceEndCommentsFixerTest, DoesNotAddCommentAfterUnaffectedRBrace) {
  178. EXPECT_EQ("namespace A {\n"
  179. " int i;\n"
  180. "}",
  181. fixNamespaceEndComments("namespace A {\n"
  182. " int i;\n"
  183. "}",
  184. // The range (16, 3) spans the 'int' above.
  185. /*Ranges=*/{1, tooling::Range(16, 3)}));
  186. }
  187. TEST_F(NamespaceEndCommentsFixerTest, DoesNotAddCommentAfterRBraceInPPDirective) {
  188. EXPECT_EQ("#define SAD \\\n"
  189. "namespace A { \\\n"
  190. " int i; \\\n"
  191. "}",
  192. fixNamespaceEndComments("#define SAD \\\n"
  193. "namespace A { \\\n"
  194. " int i; \\\n"
  195. "}"));
  196. }
  197. TEST_F(NamespaceEndCommentsFixerTest, KeepsValidEndComment) {
  198. EXPECT_EQ("namespace {\n"
  199. " int i;\n"
  200. "} // end anonymous namespace",
  201. fixNamespaceEndComments("namespace {\n"
  202. " int i;\n"
  203. "} // end anonymous namespace"));
  204. EXPECT_EQ("namespace A {\n"
  205. " int i;\n"
  206. "} /* end of namespace A */",
  207. fixNamespaceEndComments("namespace A {\n"
  208. " int i;\n"
  209. "} /* end of namespace A */"));
  210. EXPECT_EQ("namespace A {\n"
  211. " int i;\n"
  212. "} // namespace A",
  213. fixNamespaceEndComments("namespace A {\n"
  214. " int i;\n"
  215. "} // namespace A"));
  216. EXPECT_EQ("namespace A::B {\n"
  217. " int i;\n"
  218. "} // end namespace A::B",
  219. fixNamespaceEndComments("namespace A::B {\n"
  220. " int i;\n"
  221. "} // end namespace A::B"));
  222. }
  223. TEST_F(NamespaceEndCommentsFixerTest, UpdatesInvalidEndLineComment) {
  224. EXPECT_EQ("namespace {\n"
  225. " int i;\n"
  226. "} // namespace",
  227. fixNamespaceEndComments("namespace {\n"
  228. " int i;\n"
  229. "} // namespace A"));
  230. EXPECT_EQ("namespace A {\n"
  231. " int i;\n"
  232. "} // namespace A",
  233. fixNamespaceEndComments("namespace A {\n"
  234. " int i;\n"
  235. "} // namespace"));
  236. EXPECT_EQ("namespace A {\n"
  237. " int i;\n"
  238. "} // namespace A",
  239. fixNamespaceEndComments("namespace A {\n"
  240. " int i;\n"
  241. "} //"));
  242. EXPECT_EQ("namespace A {\n"
  243. " int i;\n"
  244. "} // namespace A",
  245. fixNamespaceEndComments("namespace A {\n"
  246. " int i;\n"
  247. "} //"));
  248. EXPECT_EQ("namespace A {\n"
  249. " int i;\n"
  250. "} // namespace A",
  251. fixNamespaceEndComments("namespace A {\n"
  252. " int i;\n"
  253. "} // banamespace A"));
  254. // Updates invalid line comments even for short namespaces.
  255. EXPECT_EQ("namespace A {} // namespace A",
  256. fixNamespaceEndComments("namespace A {} // namespace"));
  257. }
  258. TEST_F(NamespaceEndCommentsFixerTest, UpdatesInvalidEndBlockComment) {
  259. EXPECT_EQ("namespace {\n"
  260. " int i;\n"
  261. "} // namespace",
  262. fixNamespaceEndComments("namespace {\n"
  263. " int i;\n"
  264. "} /* namespace A */"));
  265. EXPECT_EQ("namespace A {\n"
  266. " int i;\n"
  267. "} // namespace A",
  268. fixNamespaceEndComments("namespace A {\n"
  269. " int i;\n"
  270. "} /* end namespace */"));
  271. EXPECT_EQ("namespace A {\n"
  272. " int i;\n"
  273. "} // namespace A",
  274. fixNamespaceEndComments("namespace A {\n"
  275. " int i;\n"
  276. "} /**/"));
  277. EXPECT_EQ("namespace A {\n"
  278. " int i;\n"
  279. "} // namespace A",
  280. fixNamespaceEndComments("namespace A {\n"
  281. " int i;\n"
  282. "} /* end unnamed namespace */"));
  283. EXPECT_EQ("namespace A {\n"
  284. " int i;\n"
  285. "} // namespace A",
  286. fixNamespaceEndComments("namespace A {\n"
  287. " int i;\n"
  288. "} /* banamespace A */"));
  289. EXPECT_EQ("namespace A {} // namespace A",
  290. fixNamespaceEndComments("namespace A {} /**/"));
  291. }
  292. TEST_F(NamespaceEndCommentsFixerTest,
  293. DoesNotAddEndCommentForNamespacesControlledByMacros) {
  294. EXPECT_EQ("#ifdef 1\n"
  295. "namespace A {\n"
  296. "#elseif\n"
  297. "namespace B {\n"
  298. "#endif\n"
  299. " int i;\n"
  300. "}\n"
  301. "}\n",
  302. fixNamespaceEndComments("#ifdef 1\n"
  303. "namespace A {\n"
  304. "#elseif\n"
  305. "namespace B {\n"
  306. "#endif\n"
  307. " int i;\n"
  308. "}\n"
  309. "}\n"));
  310. }
  311. TEST_F(NamespaceEndCommentsFixerTest,
  312. DoesNotAddEndCommentForNamespacesInMacroDeclarations) {
  313. EXPECT_EQ("#ifdef 1\n"
  314. "namespace A {\n"
  315. "#elseif\n"
  316. "namespace B {\n"
  317. "#endif\n"
  318. " int i;\n"
  319. "}\n"
  320. "}\n",
  321. fixNamespaceEndComments("#ifdef 1\n"
  322. "namespace A {\n"
  323. "#elseif\n"
  324. "namespace B {\n"
  325. "#endif\n"
  326. " int i;\n"
  327. "}\n"
  328. "}\n"));
  329. }
  330. TEST_F(NamespaceEndCommentsFixerTest,
  331. DoesNotAddEndCommentForUnbalancedRBracesAfterNamespaceEnd) {
  332. EXPECT_EQ("namespace {\n"
  333. " int i;\n"
  334. "} // namespace\n"
  335. "}",
  336. fixNamespaceEndComments("namespace {\n"
  337. " int i;\n"
  338. "} // namespace\n"
  339. "}"));
  340. }
  341. } // end namespace
  342. } // end namespace format
  343. } // end namespace clang