NamespaceEndCommentsFixerTest.cpp 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786
  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. const 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. // Add comment for namespaces which will be 'compacted'
  180. FormatStyle CompactNamespacesStyle = getLLVMStyle();
  181. CompactNamespacesStyle.CompactNamespaces = true;
  182. EXPECT_EQ("namespace out { namespace in {\n"
  183. "int i;\n"
  184. "int j;\n"
  185. "}}// namespace out::in",
  186. fixNamespaceEndComments("namespace out { namespace in {\n"
  187. "int i;\n"
  188. "int j;\n"
  189. "}}",
  190. CompactNamespacesStyle));
  191. EXPECT_EQ("namespace out {\n"
  192. "namespace in {\n"
  193. "int i;\n"
  194. "int j;\n"
  195. "}\n"
  196. "}// namespace out::in",
  197. fixNamespaceEndComments("namespace out {\n"
  198. "namespace in {\n"
  199. "int i;\n"
  200. "int j;\n"
  201. "}\n"
  202. "}",
  203. CompactNamespacesStyle));
  204. EXPECT_EQ("namespace out { namespace in {\n"
  205. "int i;\n"
  206. "int j;\n"
  207. "};}// namespace out::in",
  208. fixNamespaceEndComments("namespace out { namespace in {\n"
  209. "int i;\n"
  210. "int j;\n"
  211. "};}",
  212. CompactNamespacesStyle));
  213. // Adds an end comment after a semicolon.
  214. EXPECT_EQ("namespace {\n"
  215. " int i;\n"
  216. " int j;\n"
  217. "};// namespace",
  218. fixNamespaceEndComments("namespace {\n"
  219. " int i;\n"
  220. " int j;\n"
  221. "};"));
  222. EXPECT_EQ("namespace A {\n"
  223. " int i;\n"
  224. " int j;\n"
  225. "};// namespace A",
  226. fixNamespaceEndComments("namespace A {\n"
  227. " int i;\n"
  228. " int j;\n"
  229. "};"));
  230. EXPECT_EQ("namespace A {\n"
  231. " int i;\n"
  232. " int j;\n"
  233. "};// namespace A\n"
  234. "// unrelated",
  235. fixNamespaceEndComments("namespace A {\n"
  236. " int i;\n"
  237. " int j;\n"
  238. "};\n"
  239. "// unrelated"));
  240. }
  241. TEST_F(NamespaceEndCommentsFixerTest, AddsNewlineIfNeeded) {
  242. EXPECT_EQ("namespace A {\n"
  243. " int i;\n"
  244. " int j;\n"
  245. "}// namespace A\n"
  246. " int k;",
  247. fixNamespaceEndComments("namespace A {\n"
  248. " int i;\n"
  249. " int j;\n"
  250. "} int k;"));
  251. EXPECT_EQ("namespace {\n"
  252. " int i;\n"
  253. " int j;\n"
  254. "}// namespace\n"
  255. " int k;",
  256. fixNamespaceEndComments("namespace {\n"
  257. " int i;\n"
  258. " int j;\n"
  259. "} int k;"));
  260. EXPECT_EQ("namespace A {\n"
  261. " int i;\n"
  262. " int j;\n"
  263. "}// namespace A\n"
  264. " namespace B {\n"
  265. " int j;\n"
  266. " int k;\n"
  267. "}// namespace B",
  268. fixNamespaceEndComments("namespace A {\n"
  269. " int i;\n"
  270. " int j;\n"
  271. "} namespace B {\n"
  272. " int j;\n"
  273. " int k;\n"
  274. "}"));
  275. EXPECT_EQ("namespace {\n"
  276. " int i;\n"
  277. " int j;\n"
  278. "};// namespace\n"
  279. "int k;",
  280. fixNamespaceEndComments("namespace {\n"
  281. " int i;\n"
  282. " int j;\n"
  283. "};int k;"));
  284. EXPECT_EQ("namespace {\n"
  285. " int i;\n"
  286. " int j;\n"
  287. "};// namespace\n"
  288. ";",
  289. fixNamespaceEndComments("namespace {\n"
  290. " int i;\n"
  291. " int j;\n"
  292. "};;"));
  293. }
  294. TEST_F(NamespaceEndCommentsFixerTest, DoesNotAddEndCommentForShortNamespace) {
  295. EXPECT_EQ("namespace {}", fixNamespaceEndComments("namespace {}"));
  296. EXPECT_EQ("namespace A {}", fixNamespaceEndComments("namespace A {}"));
  297. EXPECT_EQ("namespace A { a }",
  298. fixNamespaceEndComments("namespace A { a }"));
  299. EXPECT_EQ("namespace A { a };",
  300. fixNamespaceEndComments("namespace A { a };"));
  301. }
  302. TEST_F(NamespaceEndCommentsFixerTest, DoesNotAddCommentAfterUnaffectedRBrace) {
  303. EXPECT_EQ("namespace A {\n"
  304. " int i;\n"
  305. "}",
  306. fixNamespaceEndComments("namespace A {\n"
  307. " int i;\n"
  308. "}",
  309. // The range (16, 3) spans the 'int' above.
  310. /*Ranges=*/{1, tooling::Range(16, 3)}));
  311. EXPECT_EQ("namespace A {\n"
  312. " int i;\n"
  313. "};",
  314. fixNamespaceEndComments("namespace A {\n"
  315. " int i;\n"
  316. "};",
  317. // The range (16, 3) spans the 'int' above.
  318. /*Ranges=*/{1, tooling::Range(16, 3)}));
  319. }
  320. TEST_F(NamespaceEndCommentsFixerTest, DoesNotAddCommentAfterRBraceInPPDirective) {
  321. EXPECT_EQ("#define SAD \\\n"
  322. "namespace A { \\\n"
  323. " int i; \\\n"
  324. "}",
  325. fixNamespaceEndComments("#define SAD \\\n"
  326. "namespace A { \\\n"
  327. " int i; \\\n"
  328. "}"));
  329. }
  330. TEST_F(NamespaceEndCommentsFixerTest, KeepsValidEndComment) {
  331. EXPECT_EQ("namespace {\n"
  332. " int i;\n"
  333. "} // end anonymous namespace",
  334. fixNamespaceEndComments("namespace {\n"
  335. " int i;\n"
  336. "} // end anonymous namespace"));
  337. EXPECT_EQ("namespace A {\n"
  338. " int i;\n"
  339. "} /* end of namespace A */",
  340. fixNamespaceEndComments("namespace A {\n"
  341. " int i;\n"
  342. "} /* end of namespace A */"));
  343. EXPECT_EQ("namespace A {\n"
  344. " int i;\n"
  345. "} // namespace A",
  346. fixNamespaceEndComments("namespace A {\n"
  347. " int i;\n"
  348. "} // namespace A"));
  349. EXPECT_EQ("namespace A::B {\n"
  350. " int i;\n"
  351. "} // end namespace A::B",
  352. fixNamespaceEndComments("namespace A::B {\n"
  353. " int i;\n"
  354. "} // end namespace A::B"));
  355. EXPECT_EQ("namespace A {\n"
  356. " int i;\n"
  357. "}; // end namespace A",
  358. fixNamespaceEndComments("namespace A {\n"
  359. " int i;\n"
  360. "}; // end namespace A"));
  361. EXPECT_EQ("namespace {\n"
  362. " int i;\n"
  363. "}; /* unnamed namespace */",
  364. fixNamespaceEndComments("namespace {\n"
  365. " int i;\n"
  366. "}; /* unnamed namespace */"));
  367. }
  368. TEST_F(NamespaceEndCommentsFixerTest, UpdatesInvalidEndLineComment) {
  369. EXPECT_EQ("namespace {\n"
  370. " int i;\n"
  371. "} // namespace",
  372. fixNamespaceEndComments("namespace {\n"
  373. " int i;\n"
  374. "} // namespace A"));
  375. EXPECT_EQ("namespace A {\n"
  376. " int i;\n"
  377. "} // namespace A",
  378. fixNamespaceEndComments("namespace A {\n"
  379. " int i;\n"
  380. "} // namespace"));
  381. EXPECT_EQ("namespace A {\n"
  382. " int i;\n"
  383. "} // namespace A",
  384. fixNamespaceEndComments("namespace A {\n"
  385. " int i;\n"
  386. "} //"));
  387. EXPECT_EQ("namespace A {\n"
  388. " int i;\n"
  389. "} // namespace A",
  390. fixNamespaceEndComments("namespace A {\n"
  391. " int i;\n"
  392. "} //"));
  393. EXPECT_EQ("namespace A {\n"
  394. " int i;\n"
  395. "} // namespace A",
  396. fixNamespaceEndComments("namespace A {\n"
  397. " int i;\n"
  398. "} // banamespace A"));
  399. EXPECT_EQ("namespace A {\n"
  400. " int i;\n"
  401. "}; // namespace A",
  402. fixNamespaceEndComments("namespace A {\n"
  403. " int i;\n"
  404. "}; // banamespace A"));
  405. // Updates invalid line comments even for short namespaces.
  406. EXPECT_EQ("namespace A {} // namespace A",
  407. fixNamespaceEndComments("namespace A {} // namespace"));
  408. EXPECT_EQ("namespace A {}; // namespace A",
  409. fixNamespaceEndComments("namespace A {}; // namespace"));
  410. // Update invalid comments for compacted namespaces.
  411. FormatStyle CompactNamespacesStyle = getLLVMStyle();
  412. CompactNamespacesStyle.CompactNamespaces = true;
  413. EXPECT_EQ("namespace out { namespace in {\n"
  414. "}} // namespace out::in",
  415. fixNamespaceEndComments("namespace out { namespace in {\n"
  416. "}} // namespace out",
  417. CompactNamespacesStyle));
  418. EXPECT_EQ("namespace out { namespace in {\n"
  419. "}} // namespace out::in",
  420. fixNamespaceEndComments("namespace out { namespace in {\n"
  421. "}} // namespace in",
  422. CompactNamespacesStyle));
  423. EXPECT_EQ("namespace out { namespace in {\n"
  424. "}\n"
  425. "} // namespace out::in",
  426. fixNamespaceEndComments("namespace out { namespace in {\n"
  427. "}// banamespace in\n"
  428. "} // namespace out",
  429. CompactNamespacesStyle));
  430. }
  431. TEST_F(NamespaceEndCommentsFixerTest, UpdatesInvalidEndBlockComment) {
  432. EXPECT_EQ("namespace {\n"
  433. " int i;\n"
  434. "} // namespace",
  435. fixNamespaceEndComments("namespace {\n"
  436. " int i;\n"
  437. "} /* namespace A */"));
  438. EXPECT_EQ("namespace A {\n"
  439. " int i;\n"
  440. "} // namespace A",
  441. fixNamespaceEndComments("namespace A {\n"
  442. " int i;\n"
  443. "} /* end namespace */"));
  444. EXPECT_EQ("namespace A {\n"
  445. " int i;\n"
  446. "} // namespace A",
  447. fixNamespaceEndComments("namespace A {\n"
  448. " int i;\n"
  449. "} /**/"));
  450. EXPECT_EQ("namespace A {\n"
  451. " int i;\n"
  452. "} // namespace A",
  453. fixNamespaceEndComments("namespace A {\n"
  454. " int i;\n"
  455. "} /* end unnamed namespace */"));
  456. EXPECT_EQ("namespace A {\n"
  457. " int i;\n"
  458. "} // namespace A",
  459. fixNamespaceEndComments("namespace A {\n"
  460. " int i;\n"
  461. "} /* banamespace A */"));
  462. EXPECT_EQ("namespace A {\n"
  463. " int i;\n"
  464. "}; // namespace A",
  465. fixNamespaceEndComments("namespace A {\n"
  466. " int i;\n"
  467. "}; /* banamespace A */"));
  468. EXPECT_EQ("namespace A {} // namespace A",
  469. fixNamespaceEndComments("namespace A {} /**/"));
  470. EXPECT_EQ("namespace A {}; // namespace A",
  471. fixNamespaceEndComments("namespace A {}; /**/"));
  472. }
  473. TEST_F(NamespaceEndCommentsFixerTest,
  474. DoesNotAddEndCommentForNamespacesControlledByMacros) {
  475. EXPECT_EQ("#ifdef 1\n"
  476. "namespace A {\n"
  477. "#elseif\n"
  478. "namespace B {\n"
  479. "#endif\n"
  480. " int i;\n"
  481. "}\n"
  482. "}\n",
  483. fixNamespaceEndComments("#ifdef 1\n"
  484. "namespace A {\n"
  485. "#elseif\n"
  486. "namespace B {\n"
  487. "#endif\n"
  488. " int i;\n"
  489. "}\n"
  490. "}\n"));
  491. }
  492. TEST_F(NamespaceEndCommentsFixerTest, AddEndCommentForNamespacesAroundMacros) {
  493. // Conditional blocks around are fine
  494. EXPECT_EQ("namespace A {\n"
  495. "#if 1\n"
  496. "int i;\n"
  497. "#endif\n"
  498. "}// namespace A",
  499. fixNamespaceEndComments("namespace A {\n"
  500. "#if 1\n"
  501. "int i;\n"
  502. "#endif\n"
  503. "}"));
  504. EXPECT_EQ("#if 1\n"
  505. "#endif\n"
  506. "namespace A {\n"
  507. "int i;\n"
  508. "int j;\n"
  509. "}// namespace A",
  510. fixNamespaceEndComments("#if 1\n"
  511. "#endif\n"
  512. "namespace A {\n"
  513. "int i;\n"
  514. "int j;\n"
  515. "}"));
  516. EXPECT_EQ("namespace A {\n"
  517. "int i;\n"
  518. "int j;\n"
  519. "}// namespace A\n"
  520. "#if 1\n"
  521. "#endif",
  522. fixNamespaceEndComments("namespace A {\n"
  523. "int i;\n"
  524. "int j;\n"
  525. "}\n"
  526. "#if 1\n"
  527. "#endif"));
  528. EXPECT_EQ("#if 1\n"
  529. "namespace A {\n"
  530. "int i;\n"
  531. "int j;\n"
  532. "}// namespace A\n"
  533. "#endif",
  534. fixNamespaceEndComments("#if 1\n"
  535. "namespace A {\n"
  536. "int i;\n"
  537. "int j;\n"
  538. "}\n"
  539. "#endif"));
  540. // Macro definition has no impact
  541. EXPECT_EQ("namespace A {\n"
  542. "#define FOO\n"
  543. "int i;\n"
  544. "}// namespace A",
  545. fixNamespaceEndComments("namespace A {\n"
  546. "#define FOO\n"
  547. "int i;\n"
  548. "}"));
  549. EXPECT_EQ("#define FOO\n"
  550. "namespace A {\n"
  551. "int i;\n"
  552. "int j;\n"
  553. "}// namespace A",
  554. fixNamespaceEndComments("#define FOO\n"
  555. "namespace A {\n"
  556. "int i;\n"
  557. "int j;\n"
  558. "}"));
  559. EXPECT_EQ("namespace A {\n"
  560. "int i;\n"
  561. "int j;\n"
  562. "}// namespace A\n"
  563. "#define FOO\n",
  564. fixNamespaceEndComments("namespace A {\n"
  565. "int i;\n"
  566. "int j;\n"
  567. "}\n"
  568. "#define FOO\n"));
  569. // No replacement if open & close in different conditional blocks
  570. EXPECT_EQ("#if 1\n"
  571. "namespace A {\n"
  572. "#endif\n"
  573. "int i;\n"
  574. "int j;\n"
  575. "#if 1\n"
  576. "}\n"
  577. "#endif",
  578. fixNamespaceEndComments("#if 1\n"
  579. "namespace A {\n"
  580. "#endif\n"
  581. "int i;\n"
  582. "int j;\n"
  583. "#if 1\n"
  584. "}\n"
  585. "#endif"));
  586. EXPECT_EQ("#ifdef A\n"
  587. "namespace A {\n"
  588. "#endif\n"
  589. "int i;\n"
  590. "int j;\n"
  591. "#ifdef B\n"
  592. "}\n"
  593. "#endif",
  594. fixNamespaceEndComments("#ifdef A\n"
  595. "namespace A {\n"
  596. "#endif\n"
  597. "int i;\n"
  598. "int j;\n"
  599. "#ifdef B\n"
  600. "}\n"
  601. "#endif"));
  602. // No replacement inside unreachable conditional block
  603. EXPECT_EQ("#if 0\n"
  604. "namespace A {\n"
  605. "int i;\n"
  606. "int j;\n"
  607. "}\n"
  608. "#endif",
  609. fixNamespaceEndComments("#if 0\n"
  610. "namespace A {\n"
  611. "int i;\n"
  612. "int j;\n"
  613. "}\n"
  614. "#endif"));
  615. }
  616. TEST_F(NamespaceEndCommentsFixerTest,
  617. DoesNotAddEndCommentForNamespacesInMacroDeclarations) {
  618. EXPECT_EQ("#ifdef 1\n"
  619. "namespace A {\n"
  620. "#elseif\n"
  621. "namespace B {\n"
  622. "#endif\n"
  623. " int i;\n"
  624. "}\n"
  625. "}\n",
  626. fixNamespaceEndComments("#ifdef 1\n"
  627. "namespace A {\n"
  628. "#elseif\n"
  629. "namespace B {\n"
  630. "#endif\n"
  631. " int i;\n"
  632. "}\n"
  633. "}\n"));
  634. EXPECT_EQ("namespace {\n"
  635. " int i;\n"
  636. " int j;\n"
  637. "}// namespace\n"
  638. "#if A\n"
  639. " int i;\n"
  640. "#else\n"
  641. " int j;\n"
  642. "#endif",
  643. fixNamespaceEndComments("namespace {\n"
  644. " int i;\n"
  645. " int j;\n"
  646. "}\n"
  647. "#if A\n"
  648. " int i;\n"
  649. "#else\n"
  650. " int j;\n"
  651. "#endif"));
  652. EXPECT_EQ("#if A\n"
  653. "namespace A {\n"
  654. "#else\n"
  655. "namespace B {\n"
  656. "#endif\n"
  657. "int i;\n"
  658. "int j;\n"
  659. "}",
  660. fixNamespaceEndComments("#if A\n"
  661. "namespace A {\n"
  662. "#else\n"
  663. "namespace B {\n"
  664. "#endif\n"
  665. "int i;\n"
  666. "int j;\n"
  667. "}"));
  668. EXPECT_EQ("#if A\n"
  669. "namespace A {\n"
  670. "#else\n"
  671. "namespace B {\n"
  672. "#endif\n"
  673. "int i;\n"
  674. "int j;\n"
  675. "} // namespace A",
  676. fixNamespaceEndComments("#if A\n"
  677. "namespace A {\n"
  678. "#else\n"
  679. "namespace B {\n"
  680. "#endif\n"
  681. "int i;\n"
  682. "int j;\n"
  683. "} // namespace A"));
  684. EXPECT_EQ("#if A\n"
  685. "namespace A {\n"
  686. "#else\n"
  687. "namespace B {\n"
  688. "#endif\n"
  689. "int i;\n"
  690. "int j;\n"
  691. "} // namespace B",
  692. fixNamespaceEndComments("#if A\n"
  693. "namespace A {\n"
  694. "#else\n"
  695. "namespace B {\n"
  696. "#endif\n"
  697. "int i;\n"
  698. "int j;\n"
  699. "} // namespace B"));
  700. EXPECT_EQ("namespace A\n"
  701. "int i;\n"
  702. "int j;\n"
  703. "#if A\n"
  704. "}\n"
  705. "#else\n"
  706. "}\n"
  707. "#endif",
  708. fixNamespaceEndComments("namespace A\n"
  709. "int i;\n"
  710. "int j;\n"
  711. "#if A\n"
  712. "}\n"
  713. "#else\n"
  714. "}\n"
  715. "#endif"));
  716. EXPECT_EQ("namespace A\n"
  717. "int i;\n"
  718. "int j;\n"
  719. "#if A\n"
  720. "} // namespace A\n"
  721. "#else\n"
  722. "} // namespace A\n"
  723. "#endif",
  724. fixNamespaceEndComments("namespace A\n"
  725. "int i;\n"
  726. "int j;\n"
  727. "#if A\n"
  728. "} // namespace A\n"
  729. "#else\n"
  730. "} // namespace A\n"
  731. "#endif"));
  732. }
  733. TEST_F(NamespaceEndCommentsFixerTest,
  734. DoesNotAddEndCommentForUnbalancedRBracesAfterNamespaceEnd) {
  735. EXPECT_EQ("namespace {\n"
  736. " int i;\n"
  737. "} // namespace\n"
  738. "}",
  739. fixNamespaceEndComments("namespace {\n"
  740. " int i;\n"
  741. "} // namespace\n"
  742. "}"));
  743. }
  744. TEST_F(NamespaceEndCommentsFixerTest, HandlesInlineAtEndOfLine_PR32438) {
  745. EXPECT_EQ("template <int> struct a {};\n"
  746. "struct a<bool{}> b() {\n"
  747. "}\n"
  748. "#define c inline\n"
  749. "void d() {\n"
  750. "}\n",
  751. fixNamespaceEndComments("template <int> struct a {};\n"
  752. "struct a<bool{}> b() {\n"
  753. "}\n"
  754. "#define c inline\n"
  755. "void d() {\n"
  756. "}\n"));
  757. }
  758. } // end namespace
  759. } // end namespace format
  760. } // end namespace clang