NamespaceEndCommentsFixerTest.cpp 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424
  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. " int j;\n"
  44. "}// namespace",
  45. fixNamespaceEndComments("namespace {\n"
  46. " int i;\n"
  47. " int j;\n"
  48. "}"));
  49. EXPECT_EQ("namespace {\n"
  50. " int i;\n"
  51. " int j;\n"
  52. "}// namespace\n",
  53. fixNamespaceEndComments("namespace {\n"
  54. " int i;\n"
  55. " int j;\n"
  56. "}\n"));
  57. EXPECT_EQ("namespace A {\n"
  58. " int i;\n"
  59. " int j;\n"
  60. "}// namespace A",
  61. fixNamespaceEndComments("namespace A {\n"
  62. " int i;\n"
  63. " int j;\n"
  64. "}"));
  65. EXPECT_EQ("inline namespace A {\n"
  66. " int i;\n"
  67. " int j;\n"
  68. "}// namespace A",
  69. fixNamespaceEndComments("inline namespace A {\n"
  70. " int i;\n"
  71. " int j;\n"
  72. "}"));
  73. EXPECT_EQ("namespace ::A {\n"
  74. " int i;\n"
  75. " int j;\n"
  76. "}// namespace ::A",
  77. fixNamespaceEndComments("namespace ::A {\n"
  78. " int i;\n"
  79. " int j;\n"
  80. "}"));
  81. EXPECT_EQ("namespace ::A::B {\n"
  82. " int i;\n"
  83. " int j;\n"
  84. "}// namespace ::A::B",
  85. fixNamespaceEndComments("namespace ::A::B {\n"
  86. " int i;\n"
  87. " int j;\n"
  88. "}"));
  89. EXPECT_EQ("namespace /**/::/**/A/**/::/**/B/**/ {\n"
  90. " int i;\n"
  91. " int j;\n"
  92. "}// namespace ::A::B",
  93. fixNamespaceEndComments("namespace /**/::/**/A/**/::/**/B/**/ {\n"
  94. " int i;\n"
  95. " int j;\n"
  96. "}"));
  97. EXPECT_EQ("namespace A {\n"
  98. "namespace B {\n"
  99. " int i;\n"
  100. "}\n"
  101. "}// namespace A",
  102. fixNamespaceEndComments("namespace A {\n"
  103. "namespace B {\n"
  104. " int i;\n"
  105. "}\n"
  106. "}"));
  107. EXPECT_EQ("namespace A {\n"
  108. "namespace B {\n"
  109. " int i;\n"
  110. " int j;\n"
  111. "}// namespace B\n"
  112. "}// namespace A",
  113. fixNamespaceEndComments("namespace A {\n"
  114. "namespace B {\n"
  115. " int i;\n"
  116. " int j;\n"
  117. "}\n"
  118. "}"));
  119. EXPECT_EQ("namespace A {\n"
  120. " int a;\n"
  121. " int b;\n"
  122. "}// namespace A\n"
  123. "namespace B {\n"
  124. " int b;\n"
  125. " int a;\n"
  126. "}// namespace B",
  127. fixNamespaceEndComments("namespace A {\n"
  128. " int a;\n"
  129. " int b;\n"
  130. "}\n"
  131. "namespace B {\n"
  132. " int b;\n"
  133. " int a;\n"
  134. "}"));
  135. EXPECT_EQ("namespace A {\n"
  136. " int a1;\n"
  137. " int a2;\n"
  138. "}// namespace A\n"
  139. "namespace A {\n"
  140. " int a2;\n"
  141. " int a1;\n"
  142. "}// namespace A",
  143. fixNamespaceEndComments("namespace A {\n"
  144. " int a1;\n"
  145. " int a2;\n"
  146. "}\n"
  147. "namespace A {\n"
  148. " int a2;\n"
  149. " int a1;\n"
  150. "}"));
  151. EXPECT_EQ("namespace A {\n"
  152. " int a;\n"
  153. " int b;\n"
  154. "}// namespace A\n"
  155. "// comment about b\n"
  156. "int b;",
  157. fixNamespaceEndComments("namespace A {\n"
  158. " int a;\n"
  159. " int b;\n"
  160. "}\n"
  161. "// comment about b\n"
  162. "int b;"));
  163. EXPECT_EQ("namespace A {\n"
  164. "namespace B {\n"
  165. "namespace C {\n"
  166. "namespace D {\n"
  167. "}\n"
  168. "}// namespace C\n"
  169. "}// namespace B\n"
  170. "}// namespace A",
  171. fixNamespaceEndComments("namespace A {\n"
  172. "namespace B {\n"
  173. "namespace C {\n"
  174. "namespace D {\n"
  175. "}\n"
  176. "}\n"
  177. "}\n"
  178. "}"));
  179. }
  180. TEST_F(NamespaceEndCommentsFixerTest, AddsNewlineIfNeeded) {
  181. EXPECT_EQ("namespace A {\n"
  182. " int i;\n"
  183. " int j;\n"
  184. "}// namespace A\n"
  185. " int k;",
  186. fixNamespaceEndComments("namespace A {\n"
  187. " int i;\n"
  188. " int j;\n"
  189. "} int k;"));
  190. EXPECT_EQ("namespace {\n"
  191. " int i;\n"
  192. " int j;\n"
  193. "}// namespace\n"
  194. " int k;",
  195. fixNamespaceEndComments("namespace {\n"
  196. " int i;\n"
  197. " int j;\n"
  198. "} int k;"));
  199. EXPECT_EQ("namespace A {\n"
  200. " int i;\n"
  201. " int j;\n"
  202. "}// namespace A\n"
  203. " namespace B {\n"
  204. " int j;\n"
  205. " int k;\n"
  206. "}// namespace B",
  207. fixNamespaceEndComments("namespace A {\n"
  208. " int i;\n"
  209. " int j;\n"
  210. "} namespace B {\n"
  211. " int j;\n"
  212. " int k;\n"
  213. "}"));
  214. }
  215. TEST_F(NamespaceEndCommentsFixerTest, DoesNotAddEndCommentForShortNamespace) {
  216. EXPECT_EQ("namespace {}", fixNamespaceEndComments("namespace {}"));
  217. EXPECT_EQ("namespace A {}", fixNamespaceEndComments("namespace A {}"));
  218. EXPECT_EQ("namespace A { a }",
  219. fixNamespaceEndComments("namespace A { a }"));
  220. }
  221. TEST_F(NamespaceEndCommentsFixerTest, DoesNotAddCommentAfterUnaffectedRBrace) {
  222. EXPECT_EQ("namespace A {\n"
  223. " int i;\n"
  224. "}",
  225. fixNamespaceEndComments("namespace A {\n"
  226. " int i;\n"
  227. "}",
  228. // The range (16, 3) spans the 'int' above.
  229. /*Ranges=*/{1, tooling::Range(16, 3)}));
  230. }
  231. TEST_F(NamespaceEndCommentsFixerTest, DoesNotAddCommentAfterRBraceInPPDirective) {
  232. EXPECT_EQ("#define SAD \\\n"
  233. "namespace A { \\\n"
  234. " int i; \\\n"
  235. "}",
  236. fixNamespaceEndComments("#define SAD \\\n"
  237. "namespace A { \\\n"
  238. " int i; \\\n"
  239. "}"));
  240. }
  241. TEST_F(NamespaceEndCommentsFixerTest, KeepsValidEndComment) {
  242. EXPECT_EQ("namespace {\n"
  243. " int i;\n"
  244. "} // end anonymous namespace",
  245. fixNamespaceEndComments("namespace {\n"
  246. " int i;\n"
  247. "} // end anonymous namespace"));
  248. EXPECT_EQ("namespace A {\n"
  249. " int i;\n"
  250. "} /* end of namespace A */",
  251. fixNamespaceEndComments("namespace A {\n"
  252. " int i;\n"
  253. "} /* end of namespace A */"));
  254. EXPECT_EQ("namespace A {\n"
  255. " int i;\n"
  256. "} // namespace A",
  257. fixNamespaceEndComments("namespace A {\n"
  258. " int i;\n"
  259. "} // namespace A"));
  260. EXPECT_EQ("namespace A::B {\n"
  261. " int i;\n"
  262. "} // end namespace A::B",
  263. fixNamespaceEndComments("namespace A::B {\n"
  264. " int i;\n"
  265. "} // end namespace A::B"));
  266. }
  267. TEST_F(NamespaceEndCommentsFixerTest, UpdatesInvalidEndLineComment) {
  268. EXPECT_EQ("namespace {\n"
  269. " int i;\n"
  270. "} // namespace",
  271. fixNamespaceEndComments("namespace {\n"
  272. " int i;\n"
  273. "} // namespace A"));
  274. EXPECT_EQ("namespace A {\n"
  275. " int i;\n"
  276. "} // namespace A",
  277. fixNamespaceEndComments("namespace A {\n"
  278. " int i;\n"
  279. "} // namespace"));
  280. EXPECT_EQ("namespace A {\n"
  281. " int i;\n"
  282. "} // namespace A",
  283. fixNamespaceEndComments("namespace A {\n"
  284. " int i;\n"
  285. "} //"));
  286. EXPECT_EQ("namespace A {\n"
  287. " int i;\n"
  288. "} // namespace A",
  289. fixNamespaceEndComments("namespace A {\n"
  290. " int i;\n"
  291. "} //"));
  292. EXPECT_EQ("namespace A {\n"
  293. " int i;\n"
  294. "} // namespace A",
  295. fixNamespaceEndComments("namespace A {\n"
  296. " int i;\n"
  297. "} // banamespace A"));
  298. // Updates invalid line comments even for short namespaces.
  299. EXPECT_EQ("namespace A {} // namespace A",
  300. fixNamespaceEndComments("namespace A {} // namespace"));
  301. }
  302. TEST_F(NamespaceEndCommentsFixerTest, UpdatesInvalidEndBlockComment) {
  303. EXPECT_EQ("namespace {\n"
  304. " int i;\n"
  305. "} // namespace",
  306. fixNamespaceEndComments("namespace {\n"
  307. " int i;\n"
  308. "} /* namespace A */"));
  309. EXPECT_EQ("namespace A {\n"
  310. " int i;\n"
  311. "} // namespace A",
  312. fixNamespaceEndComments("namespace A {\n"
  313. " int i;\n"
  314. "} /* end namespace */"));
  315. EXPECT_EQ("namespace A {\n"
  316. " int i;\n"
  317. "} // namespace A",
  318. fixNamespaceEndComments("namespace A {\n"
  319. " int i;\n"
  320. "} /**/"));
  321. EXPECT_EQ("namespace A {\n"
  322. " int i;\n"
  323. "} // namespace A",
  324. fixNamespaceEndComments("namespace A {\n"
  325. " int i;\n"
  326. "} /* end unnamed namespace */"));
  327. EXPECT_EQ("namespace A {\n"
  328. " int i;\n"
  329. "} // namespace A",
  330. fixNamespaceEndComments("namespace A {\n"
  331. " int i;\n"
  332. "} /* banamespace A */"));
  333. EXPECT_EQ("namespace A {} // namespace A",
  334. fixNamespaceEndComments("namespace A {} /**/"));
  335. }
  336. TEST_F(NamespaceEndCommentsFixerTest,
  337. DoesNotAddEndCommentForNamespacesControlledByMacros) {
  338. EXPECT_EQ("#ifdef 1\n"
  339. "namespace A {\n"
  340. "#elseif\n"
  341. "namespace B {\n"
  342. "#endif\n"
  343. " int i;\n"
  344. "}\n"
  345. "}\n",
  346. fixNamespaceEndComments("#ifdef 1\n"
  347. "namespace A {\n"
  348. "#elseif\n"
  349. "namespace B {\n"
  350. "#endif\n"
  351. " int i;\n"
  352. "}\n"
  353. "}\n"));
  354. }
  355. TEST_F(NamespaceEndCommentsFixerTest,
  356. DoesNotAddEndCommentForNamespacesInMacroDeclarations) {
  357. EXPECT_EQ("#ifdef 1\n"
  358. "namespace A {\n"
  359. "#elseif\n"
  360. "namespace B {\n"
  361. "#endif\n"
  362. " int i;\n"
  363. "}\n"
  364. "}\n",
  365. fixNamespaceEndComments("#ifdef 1\n"
  366. "namespace A {\n"
  367. "#elseif\n"
  368. "namespace B {\n"
  369. "#endif\n"
  370. " int i;\n"
  371. "}\n"
  372. "}\n"));
  373. EXPECT_EQ("namespace {\n"
  374. " int i;\n"
  375. " int j;\n"
  376. "}// namespace\n"
  377. "#if A\n"
  378. " int i;\n"
  379. "#else\n"
  380. " int j;\n"
  381. "#endif",
  382. fixNamespaceEndComments("namespace {\n"
  383. " int i;\n"
  384. " int j;\n"
  385. "}\n"
  386. "#if A\n"
  387. " int i;\n"
  388. "#else\n"
  389. " int j;\n"
  390. "#endif"));
  391. }
  392. TEST_F(NamespaceEndCommentsFixerTest,
  393. DoesNotAddEndCommentForUnbalancedRBracesAfterNamespaceEnd) {
  394. EXPECT_EQ("namespace {\n"
  395. " int i;\n"
  396. "} // namespace\n"
  397. "}",
  398. fixNamespaceEndComments("namespace {\n"
  399. " int i;\n"
  400. "} // namespace\n"
  401. "}"));
  402. }
  403. } // end namespace
  404. } // end namespace format
  405. } // end namespace clang