SortIncludesTest.cpp 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749
  1. //===- unittest/Format/SortIncludesTest.cpp - Include sort unit tests -----===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. #include "FormatTestUtils.h"
  9. #include "clang/Format/Format.h"
  10. #include "llvm/ADT/None.h"
  11. #include "llvm/Support/Debug.h"
  12. #include "gtest/gtest.h"
  13. #define DEBUG_TYPE "format-test"
  14. namespace clang {
  15. namespace format {
  16. namespace {
  17. class SortIncludesTest : public ::testing::Test {
  18. protected:
  19. std::vector<tooling::Range> GetCodeRange(StringRef Code) {
  20. return std::vector<tooling::Range>(1, tooling::Range(0, Code.size()));
  21. }
  22. std::string sort(StringRef Code, std::vector<tooling::Range> Ranges,
  23. StringRef FileName = "input.cc",
  24. unsigned ExpectedNumRanges = 1) {
  25. auto Replaces = sortIncludes(FmtStyle, Code, Ranges, FileName);
  26. Ranges = tooling::calculateRangesAfterReplacements(Replaces, Ranges);
  27. EXPECT_EQ(ExpectedNumRanges, Replaces.size());
  28. auto Sorted = applyAllReplacements(Code, Replaces);
  29. EXPECT_TRUE(static_cast<bool>(Sorted));
  30. auto Result = applyAllReplacements(
  31. *Sorted, reformat(FmtStyle, *Sorted, Ranges, FileName));
  32. EXPECT_TRUE(static_cast<bool>(Result));
  33. return *Result;
  34. }
  35. std::string sort(StringRef Code,
  36. StringRef FileName = "input.cpp",
  37. unsigned ExpectedNumRanges = 1) {
  38. return sort(Code, GetCodeRange(Code), FileName, ExpectedNumRanges);
  39. }
  40. unsigned newCursor(llvm::StringRef Code, unsigned Cursor) {
  41. sortIncludes(FmtStyle, Code, GetCodeRange(Code), "input.cpp", &Cursor);
  42. return Cursor;
  43. }
  44. FormatStyle FmtStyle = getLLVMStyle();
  45. tooling::IncludeStyle &Style = FmtStyle.IncludeStyle;
  46. };
  47. TEST_F(SortIncludesTest, BasicSorting) {
  48. EXPECT_EQ("#include \"a.h\"\n"
  49. "#include \"b.h\"\n"
  50. "#include \"c.h\"\n",
  51. sort("#include \"a.h\"\n"
  52. "#include \"c.h\"\n"
  53. "#include \"b.h\"\n"));
  54. EXPECT_EQ("// comment\n"
  55. "#include <a>\n"
  56. "#include <b>\n",
  57. sort("// comment\n"
  58. "#include <b>\n"
  59. "#include <a>\n",
  60. {tooling::Range(25, 1)}));
  61. }
  62. TEST_F(SortIncludesTest, SortedIncludesUsingSortPriorityAttribute) {
  63. FmtStyle.IncludeStyle.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup;
  64. FmtStyle.IncludeStyle.IncludeCategories = {
  65. {"^<sys/param\\.h>", 1, 0},
  66. {"^<sys/types\\.h>", 1, 1},
  67. {"^<sys.*/", 1, 2},
  68. {"^<uvm/", 2, 3},
  69. {"^<machine/", 3, 4},
  70. {"^<dev/", 4, 5},
  71. {"^<net.*/", 5, 6},
  72. {"^<protocols/", 5, 7},
  73. {"^<(fs|miscfs|msdosfs|nfs|ntfs|ufs)/", 6, 8},
  74. {"^<(x86|amd64|i386|xen)/", 7, 8},
  75. {"<path", 9, 11},
  76. {"^<[^/].*\\.h>", 8, 10},
  77. {"^\".*\\.h\"", 10, 12}};
  78. EXPECT_EQ("#include <sys/param.h>\n"
  79. "#include <sys/types.h>\n"
  80. "#include <sys/ioctl.h>\n"
  81. "#include <sys/socket.h>\n"
  82. "#include <sys/stat.h>\n"
  83. "#include <sys/wait.h>\n"
  84. "\n"
  85. "#include <net/if.h>\n"
  86. "#include <net/if_dl.h>\n"
  87. "#include <net/route.h>\n"
  88. "#include <netinet/in.h>\n"
  89. "#include <protocols/rwhod.h>\n"
  90. "\n"
  91. "#include <assert.h>\n"
  92. "#include <errno.h>\n"
  93. "#include <inttypes.h>\n"
  94. "#include <stdio.h>\n"
  95. "#include <stdlib.h>\n"
  96. "\n"
  97. "#include <paths.h>\n"
  98. "\n"
  99. "#include \"pathnames.h\"\n",
  100. sort("#include <sys/param.h>\n"
  101. "#include <sys/types.h>\n"
  102. "#include <sys/ioctl.h>\n"
  103. "#include <net/if_dl.h>\n"
  104. "#include <net/route.h>\n"
  105. "#include <netinet/in.h>\n"
  106. "#include <sys/socket.h>\n"
  107. "#include <sys/stat.h>\n"
  108. "#include <sys/wait.h>\n"
  109. "#include <net/if.h>\n"
  110. "#include <protocols/rwhod.h>\n"
  111. "#include <assert.h>\n"
  112. "#include <paths.h>\n"
  113. "#include \"pathnames.h\"\n"
  114. "#include <errno.h>\n"
  115. "#include <inttypes.h>\n"
  116. "#include <stdio.h>\n"
  117. "#include <stdlib.h>\n"));
  118. }
  119. TEST_F(SortIncludesTest, SortPriorityNotDefined) {
  120. FmtStyle = getLLVMStyle();
  121. EXPECT_EQ("#include \"FormatTestUtils.h\"\n"
  122. "#include \"clang/Format/Format.h\"\n"
  123. "#include \"llvm/ADT/None.h\"\n"
  124. "#include \"llvm/Support/Debug.h\"\n"
  125. "#include \"gtest/gtest.h\"\n",
  126. sort("#include \"clang/Format/Format.h\"\n"
  127. "#include \"llvm/ADT/None.h\"\n"
  128. "#include \"FormatTestUtils.h\"\n"
  129. "#include \"gtest/gtest.h\"\n"
  130. "#include \"llvm/Support/Debug.h\"\n"));
  131. }
  132. TEST_F(SortIncludesTest, NoReplacementsForValidIncludes) {
  133. // Identical #includes have led to a failure with an unstable sort.
  134. std::string Code = "#include <a>\n"
  135. "#include <b>\n"
  136. "#include <c>\n"
  137. "#include <d>\n"
  138. "#include <e>\n"
  139. "#include <f>\n";
  140. EXPECT_TRUE(sortIncludes(FmtStyle, Code, GetCodeRange(Code), "a.cc").empty());
  141. }
  142. TEST_F(SortIncludesTest, SortedIncludesInMultipleBlocksAreMerged) {
  143. Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge;
  144. EXPECT_EQ("#include \"a.h\"\n"
  145. "#include \"b.h\"\n"
  146. "#include \"c.h\"\n",
  147. sort("#include \"a.h\"\n"
  148. "#include \"c.h\"\n"
  149. "\n"
  150. "\n"
  151. "#include \"b.h\"\n"));
  152. Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup;
  153. EXPECT_EQ("#include \"a.h\"\n"
  154. "#include \"b.h\"\n"
  155. "#include \"c.h\"\n",
  156. sort("#include \"a.h\"\n"
  157. "#include \"c.h\"\n"
  158. "\n"
  159. "\n"
  160. "#include \"b.h\"\n"));
  161. }
  162. TEST_F(SortIncludesTest, SupportClangFormatOff) {
  163. EXPECT_EQ("#include <a>\n"
  164. "#include <b>\n"
  165. "#include <c>\n"
  166. "// clang-format off\n"
  167. "#include <b>\n"
  168. "#include <a>\n"
  169. "#include <c>\n"
  170. "// clang-format on\n",
  171. sort("#include <b>\n"
  172. "#include <a>\n"
  173. "#include <c>\n"
  174. "// clang-format off\n"
  175. "#include <b>\n"
  176. "#include <a>\n"
  177. "#include <c>\n"
  178. "// clang-format on\n"));
  179. }
  180. TEST_F(SortIncludesTest, SupportClangFormatOffCStyle) {
  181. EXPECT_EQ("#include <a>\n"
  182. "#include <b>\n"
  183. "#include <c>\n"
  184. "/* clang-format off */\n"
  185. "#include <b>\n"
  186. "#include <a>\n"
  187. "#include <c>\n"
  188. "/* clang-format on */\n",
  189. sort("#include <b>\n"
  190. "#include <a>\n"
  191. "#include <c>\n"
  192. "/* clang-format off */\n"
  193. "#include <b>\n"
  194. "#include <a>\n"
  195. "#include <c>\n"
  196. "/* clang-format on */\n"));
  197. // Not really turning it off
  198. EXPECT_EQ("#include <a>\n"
  199. "#include <b>\n"
  200. "#include <c>\n"
  201. "/* clang-format offically */\n"
  202. "#include <a>\n"
  203. "#include <b>\n"
  204. "#include <c>\n"
  205. "/* clang-format onwards */\n",
  206. sort("#include <b>\n"
  207. "#include <a>\n"
  208. "#include <c>\n"
  209. "/* clang-format offically */\n"
  210. "#include <b>\n"
  211. "#include <a>\n"
  212. "#include <c>\n"
  213. "/* clang-format onwards */\n", "input.h", 2));
  214. }
  215. TEST_F(SortIncludesTest, IncludeSortingCanBeDisabled) {
  216. FmtStyle.SortIncludes = false;
  217. EXPECT_EQ("#include \"a.h\"\n"
  218. "#include \"c.h\"\n"
  219. "#include \"b.h\"\n",
  220. sort("#include \"a.h\"\n"
  221. "#include \"c.h\"\n"
  222. "#include \"b.h\"\n",
  223. "input.h", 0));
  224. }
  225. TEST_F(SortIncludesTest, MixIncludeAndImport) {
  226. EXPECT_EQ("#include \"a.h\"\n"
  227. "#import \"b.h\"\n"
  228. "#include \"c.h\"\n",
  229. sort("#include \"a.h\"\n"
  230. "#include \"c.h\"\n"
  231. "#import \"b.h\"\n"));
  232. }
  233. TEST_F(SortIncludesTest, FixTrailingComments) {
  234. EXPECT_EQ("#include \"a.h\" // comment\n"
  235. "#include \"bb.h\" // comment\n"
  236. "#include \"ccc.h\"\n",
  237. sort("#include \"a.h\" // comment\n"
  238. "#include \"ccc.h\"\n"
  239. "#include \"bb.h\" // comment\n"));
  240. }
  241. TEST_F(SortIncludesTest, LeadingWhitespace) {
  242. EXPECT_EQ("#include \"a.h\"\n"
  243. "#include \"b.h\"\n"
  244. "#include \"c.h\"\n",
  245. sort(" #include \"a.h\"\n"
  246. " #include \"c.h\"\n"
  247. " #include \"b.h\"\n"));
  248. EXPECT_EQ("#include \"a.h\"\n"
  249. "#include \"b.h\"\n"
  250. "#include \"c.h\"\n",
  251. sort("# include \"a.h\"\n"
  252. "# include \"c.h\"\n"
  253. "# include \"b.h\"\n"));
  254. }
  255. TEST_F(SortIncludesTest, GreaterInComment) {
  256. EXPECT_EQ("#include \"a.h\"\n"
  257. "#include \"b.h\" // >\n"
  258. "#include \"c.h\"\n",
  259. sort("#include \"a.h\"\n"
  260. "#include \"c.h\"\n"
  261. "#include \"b.h\" // >\n"));
  262. }
  263. TEST_F(SortIncludesTest, SortsLocallyInEachBlock) {
  264. EXPECT_EQ("#include \"a.h\"\n"
  265. "#include \"c.h\"\n"
  266. "\n"
  267. "#include \"b.h\"\n",
  268. sort("#include \"a.h\"\n"
  269. "#include \"c.h\"\n"
  270. "\n"
  271. "#include \"b.h\"\n", "input.h", 0));
  272. }
  273. TEST_F(SortIncludesTest, SortsAllBlocksWhenMerging) {
  274. Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge;
  275. EXPECT_EQ("#include \"a.h\"\n"
  276. "#include \"b.h\"\n"
  277. "#include \"c.h\"\n",
  278. sort("#include \"a.h\"\n"
  279. "#include \"c.h\"\n"
  280. "\n"
  281. "#include \"b.h\"\n"));
  282. }
  283. TEST_F(SortIncludesTest, CommentsAlwaysSeparateGroups) {
  284. EXPECT_EQ("#include \"a.h\"\n"
  285. "#include \"c.h\"\n"
  286. "// comment\n"
  287. "#include \"b.h\"\n",
  288. sort("#include \"c.h\"\n"
  289. "#include \"a.h\"\n"
  290. "// comment\n"
  291. "#include \"b.h\"\n"));
  292. Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge;
  293. EXPECT_EQ("#include \"a.h\"\n"
  294. "#include \"c.h\"\n"
  295. "// comment\n"
  296. "#include \"b.h\"\n",
  297. sort("#include \"c.h\"\n"
  298. "#include \"a.h\"\n"
  299. "// comment\n"
  300. "#include \"b.h\"\n"));
  301. Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup;
  302. EXPECT_EQ("#include \"a.h\"\n"
  303. "#include \"c.h\"\n"
  304. "// comment\n"
  305. "#include \"b.h\"\n",
  306. sort("#include \"c.h\"\n"
  307. "#include \"a.h\"\n"
  308. "// comment\n"
  309. "#include \"b.h\"\n"));
  310. }
  311. TEST_F(SortIncludesTest, HandlesAngledIncludesAsSeparateBlocks) {
  312. EXPECT_EQ("#include \"a.h\"\n"
  313. "#include \"c.h\"\n"
  314. "#include <array>\n"
  315. "#include <b.h>\n"
  316. "#include <d.h>\n"
  317. "#include <vector>\n",
  318. sort("#include <vector>\n"
  319. "#include <d.h>\n"
  320. "#include <array>\n"
  321. "#include <b.h>\n"
  322. "#include \"c.h\"\n"
  323. "#include \"a.h\"\n"));
  324. FmtStyle = getGoogleStyle(FormatStyle::LK_Cpp);
  325. EXPECT_EQ("#include <b.h>\n"
  326. "#include <d.h>\n"
  327. "\n"
  328. "#include <array>\n"
  329. "#include <vector>\n"
  330. "\n"
  331. "#include \"a.h\"\n"
  332. "#include \"c.h\"\n",
  333. sort("#include <vector>\n"
  334. "#include <d.h>\n"
  335. "#include <array>\n"
  336. "#include <b.h>\n"
  337. "#include \"c.h\"\n"
  338. "#include \"a.h\"\n"));
  339. }
  340. TEST_F(SortIncludesTest, RegroupsAngledIncludesInSeparateBlocks) {
  341. Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup;
  342. EXPECT_EQ("#include \"a.h\"\n"
  343. "#include \"c.h\"\n"
  344. "\n"
  345. "#include <b.h>\n"
  346. "#include <d.h>\n",
  347. sort("#include <d.h>\n"
  348. "#include <b.h>\n"
  349. "#include \"c.h\"\n"
  350. "#include \"a.h\"\n"));
  351. }
  352. TEST_F(SortIncludesTest, HandlesMultilineIncludes) {
  353. EXPECT_EQ("#include \"a.h\"\n"
  354. "#include \"b.h\"\n"
  355. "#include \"c.h\"\n",
  356. sort("#include \"a.h\"\n"
  357. "#include \\\n"
  358. "\"c.h\"\n"
  359. "#include \"b.h\"\n"));
  360. }
  361. TEST_F(SortIncludesTest, LeavesMainHeaderFirst) {
  362. Style.IncludeIsMainRegex = "([-_](test|unittest))?$";
  363. EXPECT_EQ("#include \"llvm/a.h\"\n"
  364. "#include \"b.h\"\n"
  365. "#include \"c.h\"\n",
  366. sort("#include \"llvm/a.h\"\n"
  367. "#include \"c.h\"\n"
  368. "#include \"b.h\"\n",
  369. "a.cc"));
  370. EXPECT_EQ("#include \"llvm/a.h\"\n"
  371. "#include \"b.h\"\n"
  372. "#include \"c.h\"\n",
  373. sort("#include \"llvm/a.h\"\n"
  374. "#include \"c.h\"\n"
  375. "#include \"b.h\"\n",
  376. "a_test.cc"));
  377. EXPECT_EQ("#include \"llvm/input.h\"\n"
  378. "#include \"b.h\"\n"
  379. "#include \"c.h\"\n",
  380. sort("#include \"llvm/input.h\"\n"
  381. "#include \"c.h\"\n"
  382. "#include \"b.h\"\n",
  383. "input.mm"));
  384. // Don't allow prefixes.
  385. EXPECT_EQ("#include \"b.h\"\n"
  386. "#include \"c.h\"\n"
  387. "#include \"llvm/not_a.h\"\n",
  388. sort("#include \"llvm/not_a.h\"\n"
  389. "#include \"c.h\"\n"
  390. "#include \"b.h\"\n",
  391. "a.cc"));
  392. // Don't do this for _main and other suffixes.
  393. EXPECT_EQ("#include \"b.h\"\n"
  394. "#include \"c.h\"\n"
  395. "#include \"llvm/a.h\"\n",
  396. sort("#include \"llvm/a.h\"\n"
  397. "#include \"c.h\"\n"
  398. "#include \"b.h\"\n",
  399. "a_main.cc"));
  400. // Don't do this in headers.
  401. EXPECT_EQ("#include \"b.h\"\n"
  402. "#include \"c.h\"\n"
  403. "#include \"llvm/a.h\"\n",
  404. sort("#include \"llvm/a.h\"\n"
  405. "#include \"c.h\"\n"
  406. "#include \"b.h\"\n",
  407. "a.h"));
  408. // Only do this in the first #include block.
  409. EXPECT_EQ("#include <a>\n"
  410. "\n"
  411. "#include \"b.h\"\n"
  412. "#include \"c.h\"\n"
  413. "#include \"llvm/a.h\"\n",
  414. sort("#include <a>\n"
  415. "\n"
  416. "#include \"llvm/a.h\"\n"
  417. "#include \"c.h\"\n"
  418. "#include \"b.h\"\n",
  419. "a.cc"));
  420. // Only recognize the first #include with a matching basename as main include.
  421. EXPECT_EQ("#include \"a.h\"\n"
  422. "#include \"b.h\"\n"
  423. "#include \"c.h\"\n"
  424. "#include \"llvm/a.h\"\n",
  425. sort("#include \"b.h\"\n"
  426. "#include \"a.h\"\n"
  427. "#include \"c.h\"\n"
  428. "#include \"llvm/a.h\"\n",
  429. "a.cc"));
  430. }
  431. TEST_F(SortIncludesTest, RecognizeMainHeaderInAllGroups) {
  432. Style.IncludeIsMainRegex = "([-_](test|unittest))?$";
  433. Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge;
  434. EXPECT_EQ("#include \"c.h\"\n"
  435. "#include \"a.h\"\n"
  436. "#include \"b.h\"\n",
  437. sort("#include \"b.h\"\n"
  438. "\n"
  439. "#include \"a.h\"\n"
  440. "#include \"c.h\"\n",
  441. "c.cc"));
  442. }
  443. TEST_F(SortIncludesTest, MainHeaderIsSeparatedWhenRegroupping) {
  444. Style.IncludeIsMainRegex = "([-_](test|unittest))?$";
  445. Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup;
  446. EXPECT_EQ("#include \"a.h\"\n"
  447. "\n"
  448. "#include \"b.h\"\n"
  449. "#include \"c.h\"\n",
  450. sort("#include \"b.h\"\n"
  451. "\n"
  452. "#include \"a.h\"\n"
  453. "#include \"c.h\"\n",
  454. "a.cc"));
  455. }
  456. TEST_F(SortIncludesTest, SupportCaseInsensitiveMatching) {
  457. // Setup an regex for main includes so we can cover those as well.
  458. Style.IncludeIsMainRegex = "([-_](test|unittest))?$";
  459. // Ensure both main header detection and grouping work in a case insensitive
  460. // manner.
  461. EXPECT_EQ("#include \"llvm/A.h\"\n"
  462. "#include \"b.h\"\n"
  463. "#include \"c.h\"\n"
  464. "#include \"LLVM/z.h\"\n"
  465. "#include \"llvm/X.h\"\n"
  466. "#include \"GTest/GTest.h\"\n"
  467. "#include \"gmock/gmock.h\"\n",
  468. sort("#include \"c.h\"\n"
  469. "#include \"b.h\"\n"
  470. "#include \"GTest/GTest.h\"\n"
  471. "#include \"llvm/A.h\"\n"
  472. "#include \"gmock/gmock.h\"\n"
  473. "#include \"llvm/X.h\"\n"
  474. "#include \"LLVM/z.h\"\n",
  475. "a_TEST.cc"));
  476. }
  477. TEST_F(SortIncludesTest, NegativePriorities) {
  478. Style.IncludeCategories = {{".*important_os_header.*", -1, 0}, {".*", 1, 0}};
  479. EXPECT_EQ("#include \"important_os_header.h\"\n"
  480. "#include \"c_main.h\"\n"
  481. "#include \"a_other.h\"\n",
  482. sort("#include \"c_main.h\"\n"
  483. "#include \"a_other.h\"\n"
  484. "#include \"important_os_header.h\"\n",
  485. "c_main.cc"));
  486. // check stable when re-run
  487. EXPECT_EQ("#include \"important_os_header.h\"\n"
  488. "#include \"c_main.h\"\n"
  489. "#include \"a_other.h\"\n",
  490. sort("#include \"important_os_header.h\"\n"
  491. "#include \"c_main.h\"\n"
  492. "#include \"a_other.h\"\n",
  493. "c_main.cc", 0));
  494. }
  495. TEST_F(SortIncludesTest, PriorityGroupsAreSeparatedWhenRegroupping) {
  496. Style.IncludeCategories = {{".*important_os_header.*", -1, 0}, {".*", 1, 0}};
  497. Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup;
  498. EXPECT_EQ("#include \"important_os_header.h\"\n"
  499. "\n"
  500. "#include \"c_main.h\"\n"
  501. "\n"
  502. "#include \"a_other.h\"\n",
  503. sort("#include \"c_main.h\"\n"
  504. "#include \"a_other.h\"\n"
  505. "#include \"important_os_header.h\"\n",
  506. "c_main.cc"));
  507. // check stable when re-run
  508. EXPECT_EQ("#include \"important_os_header.h\"\n"
  509. "\n"
  510. "#include \"c_main.h\"\n"
  511. "\n"
  512. "#include \"a_other.h\"\n",
  513. sort("#include \"important_os_header.h\"\n"
  514. "\n"
  515. "#include \"c_main.h\"\n"
  516. "\n"
  517. "#include \"a_other.h\"\n",
  518. "c_main.cc", 0));
  519. }
  520. TEST_F(SortIncludesTest, CalculatesCorrectCursorPosition) {
  521. std::string Code = "#include <ccc>\n" // Start of line: 0
  522. "#include <bbbbbb>\n" // Start of line: 15
  523. "#include <a>\n"; // Start of line: 33
  524. EXPECT_EQ(31u, newCursor(Code, 0));
  525. EXPECT_EQ(13u, newCursor(Code, 15));
  526. EXPECT_EQ(0u, newCursor(Code, 33));
  527. EXPECT_EQ(41u, newCursor(Code, 10));
  528. EXPECT_EQ(23u, newCursor(Code, 25));
  529. EXPECT_EQ(10u, newCursor(Code, 43));
  530. }
  531. TEST_F(SortIncludesTest, DeduplicateIncludes) {
  532. EXPECT_EQ("#include <a>\n"
  533. "#include <b>\n"
  534. "#include <c>\n",
  535. sort("#include <a>\n"
  536. "#include <b>\n"
  537. "#include <b>\n"
  538. "#include <b>\n"
  539. "#include <b>\n"
  540. "#include <c>\n"));
  541. Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge;
  542. EXPECT_EQ("#include <a>\n"
  543. "#include <b>\n"
  544. "#include <c>\n",
  545. sort("#include <a>\n"
  546. "#include <b>\n"
  547. "\n"
  548. "#include <b>\n"
  549. "\n"
  550. "#include <b>\n"
  551. "#include <c>\n"));
  552. Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup;
  553. EXPECT_EQ("#include <a>\n"
  554. "#include <b>\n"
  555. "#include <c>\n",
  556. sort("#include <a>\n"
  557. "#include <b>\n"
  558. "\n"
  559. "#include <b>\n"
  560. "\n"
  561. "#include <b>\n"
  562. "#include <c>\n"));
  563. }
  564. TEST_F(SortIncludesTest, SortAndDeduplicateIncludes) {
  565. EXPECT_EQ("#include <a>\n"
  566. "#include <b>\n"
  567. "#include <c>\n",
  568. sort("#include <b>\n"
  569. "#include <a>\n"
  570. "#include <b>\n"
  571. "#include <b>\n"
  572. "#include <c>\n"
  573. "#include <b>\n"));
  574. Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge;
  575. EXPECT_EQ("#include <a>\n"
  576. "#include <b>\n"
  577. "#include <c>\n",
  578. sort("#include <b>\n"
  579. "#include <a>\n"
  580. "\n"
  581. "#include <b>\n"
  582. "\n"
  583. "#include <c>\n"
  584. "#include <b>\n"));
  585. Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup;
  586. EXPECT_EQ("#include <a>\n"
  587. "#include <b>\n"
  588. "#include <c>\n",
  589. sort("#include <b>\n"
  590. "#include <a>\n"
  591. "\n"
  592. "#include <b>\n"
  593. "\n"
  594. "#include <c>\n"
  595. "#include <b>\n"));
  596. }
  597. TEST_F(SortIncludesTest, CalculatesCorrectCursorPositionAfterDeduplicate) {
  598. std::string Code = "#include <b>\n" // Start of line: 0
  599. "#include <a>\n" // Start of line: 13
  600. "#include <b>\n" // Start of line: 26
  601. "#include <b>\n" // Start of line: 39
  602. "#include <c>\n" // Start of line: 52
  603. "#include <b>\n"; // Start of line: 65
  604. std::string Expected = "#include <a>\n" // Start of line: 0
  605. "#include <b>\n" // Start of line: 13
  606. "#include <c>\n"; // Start of line: 26
  607. EXPECT_EQ(Expected, sort(Code));
  608. // Cursor on 'i' in "#include <a>".
  609. EXPECT_EQ(1u, newCursor(Code, 14));
  610. // Cursor on 'b' in "#include <b>".
  611. EXPECT_EQ(23u, newCursor(Code, 10));
  612. EXPECT_EQ(23u, newCursor(Code, 36));
  613. EXPECT_EQ(23u, newCursor(Code, 49));
  614. EXPECT_EQ(23u, newCursor(Code, 36));
  615. EXPECT_EQ(23u, newCursor(Code, 75));
  616. // Cursor on '#' in "#include <c>".
  617. EXPECT_EQ(26u, newCursor(Code, 52));
  618. }
  619. TEST_F(SortIncludesTest, DeduplicateLocallyInEachBlock) {
  620. EXPECT_EQ("#include <a>\n"
  621. "#include <b>\n"
  622. "\n"
  623. "#include <b>\n"
  624. "#include <c>\n",
  625. sort("#include <a>\n"
  626. "#include <b>\n"
  627. "\n"
  628. "#include <c>\n"
  629. "#include <b>\n"
  630. "#include <b>\n"));
  631. }
  632. TEST_F(SortIncludesTest, ValidAffactedRangesAfterDeduplicatingIncludes) {
  633. std::string Code = "#include <a>\n"
  634. "#include <b>\n"
  635. "#include <a>\n"
  636. "#include <a>\n"
  637. "\n"
  638. " int x ;";
  639. std::vector<tooling::Range> Ranges = {tooling::Range(0, 52)};
  640. auto Replaces = sortIncludes(FmtStyle, Code, Ranges, "input.cpp");
  641. Ranges = tooling::calculateRangesAfterReplacements(Replaces, Ranges);
  642. EXPECT_EQ(1u, Ranges.size());
  643. EXPECT_EQ(0u, Ranges[0].getOffset());
  644. EXPECT_EQ(26u, Ranges[0].getLength());
  645. }
  646. TEST_F(SortIncludesTest, DoNotSortLikelyXml) {
  647. EXPECT_EQ("<!--;\n"
  648. "#include <b>\n"
  649. "#include <a>\n"
  650. "-->",
  651. sort("<!--;\n"
  652. "#include <b>\n"
  653. "#include <a>\n"
  654. "-->", "input.h", 0));
  655. }
  656. TEST_F(SortIncludesTest, DoNotOutputReplacementsForSortedBlocksWithRegrouping) {
  657. Style.IncludeBlocks = Style.IBS_Regroup;
  658. std::string Code = R"(
  659. #include "b.h"
  660. #include <a.h>
  661. )";
  662. EXPECT_EQ(Code, sort(Code, "input.h", 0));
  663. }
  664. TEST_F(SortIncludesTest,
  665. DoNotOutputReplacementsForSortedBlocksWithRegroupingWindows) {
  666. Style.IncludeBlocks = Style.IBS_Regroup;
  667. std::string Code = "#include \"b.h\"\r\n"
  668. "\r\n"
  669. "#include <a.h>\r\n";
  670. EXPECT_EQ(Code, sort(Code, "input.h", 0));
  671. }
  672. TEST_F(SortIncludesTest, DoNotRegroupGroupsInGoogleObjCStyle) {
  673. FmtStyle = getGoogleStyle(FormatStyle::LK_ObjC);
  674. EXPECT_EQ("#include <a.h>\n"
  675. "#include <b.h>\n"
  676. "#include \"a.h\"",
  677. sort("#include <b.h>\n"
  678. "#include <a.h>\n"
  679. "#include \"a.h\""));
  680. }
  681. } // end namespace
  682. } // end namespace format
  683. } // end namespace clang