SortIncludesTest.cpp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596
  1. //===- unittest/Format/SortIncludesTest.cpp - Include sort 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 "FormatTestUtils.h"
  10. #include "clang/Format/Format.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. auto Replaces = sortIncludes(FmtStyle, Code, Ranges, FileName);
  25. Ranges = tooling::calculateRangesAfterReplacements(Replaces, Ranges);
  26. auto Sorted = applyAllReplacements(Code, Replaces);
  27. EXPECT_TRUE(static_cast<bool>(Sorted));
  28. auto Result = applyAllReplacements(
  29. *Sorted, reformat(FmtStyle, *Sorted, Ranges, FileName));
  30. EXPECT_TRUE(static_cast<bool>(Result));
  31. return *Result;
  32. }
  33. std::string sort(StringRef Code, StringRef FileName = "input.cpp") {
  34. return sort(Code, GetCodeRange(Code), FileName);
  35. }
  36. unsigned newCursor(llvm::StringRef Code, unsigned Cursor) {
  37. sortIncludes(FmtStyle, Code, GetCodeRange(Code), "input.cpp", &Cursor);
  38. return Cursor;
  39. }
  40. FormatStyle FmtStyle = getLLVMStyle();
  41. tooling::IncludeStyle &Style = FmtStyle.IncludeStyle;
  42. };
  43. TEST_F(SortIncludesTest, BasicSorting) {
  44. EXPECT_EQ("#include \"a.h\"\n"
  45. "#include \"b.h\"\n"
  46. "#include \"c.h\"\n",
  47. sort("#include \"a.h\"\n"
  48. "#include \"c.h\"\n"
  49. "#include \"b.h\"\n"));
  50. EXPECT_EQ("// comment\n"
  51. "#include <a>\n"
  52. "#include <b>\n",
  53. sort("// comment\n"
  54. "#include <b>\n"
  55. "#include <a>\n",
  56. {tooling::Range(25, 1)}));
  57. }
  58. TEST_F(SortIncludesTest, NoReplacementsForValidIncludes) {
  59. // Identical #includes have led to a failure with an unstable sort.
  60. std::string Code = "#include <a>\n"
  61. "#include <b>\n"
  62. "#include <c>\n"
  63. "#include <d>\n"
  64. "#include <e>\n"
  65. "#include <f>\n";
  66. EXPECT_TRUE(sortIncludes(FmtStyle, Code, GetCodeRange(Code), "a.cc").empty());
  67. }
  68. TEST_F(SortIncludesTest, SortedIncludesInMultipleBlocksAreMerged) {
  69. Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge;
  70. EXPECT_EQ("#include \"a.h\"\n"
  71. "#include \"b.h\"\n"
  72. "#include \"c.h\"\n",
  73. sort("#include \"a.h\"\n"
  74. "#include \"c.h\"\n"
  75. "\n"
  76. "\n"
  77. "#include \"b.h\"\n"));
  78. Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup;
  79. EXPECT_EQ("#include \"a.h\"\n"
  80. "#include \"b.h\"\n"
  81. "#include \"c.h\"\n",
  82. sort("#include \"a.h\"\n"
  83. "#include \"c.h\"\n"
  84. "\n"
  85. "\n"
  86. "#include \"b.h\"\n"));
  87. }
  88. TEST_F(SortIncludesTest, SupportClangFormatOff) {
  89. EXPECT_EQ("#include <a>\n"
  90. "#include <b>\n"
  91. "#include <c>\n"
  92. "// clang-format off\n"
  93. "#include <b>\n"
  94. "#include <a>\n"
  95. "#include <c>\n"
  96. "// clang-format on\n",
  97. sort("#include <b>\n"
  98. "#include <a>\n"
  99. "#include <c>\n"
  100. "// clang-format off\n"
  101. "#include <b>\n"
  102. "#include <a>\n"
  103. "#include <c>\n"
  104. "// clang-format on\n"));
  105. }
  106. TEST_F(SortIncludesTest, IncludeSortingCanBeDisabled) {
  107. FmtStyle.SortIncludes = false;
  108. EXPECT_EQ("#include \"a.h\"\n"
  109. "#include \"c.h\"\n"
  110. "#include \"b.h\"\n",
  111. sort("#include \"a.h\"\n"
  112. "#include \"c.h\"\n"
  113. "#include \"b.h\"\n"));
  114. }
  115. TEST_F(SortIncludesTest, MixIncludeAndImport) {
  116. EXPECT_EQ("#include \"a.h\"\n"
  117. "#import \"b.h\"\n"
  118. "#include \"c.h\"\n",
  119. sort("#include \"a.h\"\n"
  120. "#include \"c.h\"\n"
  121. "#import \"b.h\"\n"));
  122. }
  123. TEST_F(SortIncludesTest, FixTrailingComments) {
  124. EXPECT_EQ("#include \"a.h\" // comment\n"
  125. "#include \"bb.h\" // comment\n"
  126. "#include \"ccc.h\"\n",
  127. sort("#include \"a.h\" // comment\n"
  128. "#include \"ccc.h\"\n"
  129. "#include \"bb.h\" // comment\n"));
  130. }
  131. TEST_F(SortIncludesTest, LeadingWhitespace) {
  132. EXPECT_EQ("#include \"a.h\"\n"
  133. "#include \"b.h\"\n"
  134. "#include \"c.h\"\n",
  135. sort(" #include \"a.h\"\n"
  136. " #include \"c.h\"\n"
  137. " #include \"b.h\"\n"));
  138. EXPECT_EQ("#include \"a.h\"\n"
  139. "#include \"b.h\"\n"
  140. "#include \"c.h\"\n",
  141. sort("# include \"a.h\"\n"
  142. "# include \"c.h\"\n"
  143. "# include \"b.h\"\n"));
  144. }
  145. TEST_F(SortIncludesTest, GreaterInComment) {
  146. EXPECT_EQ("#include \"a.h\"\n"
  147. "#include \"b.h\" // >\n"
  148. "#include \"c.h\"\n",
  149. sort("#include \"a.h\"\n"
  150. "#include \"c.h\"\n"
  151. "#include \"b.h\" // >\n"));
  152. }
  153. TEST_F(SortIncludesTest, SortsLocallyInEachBlock) {
  154. EXPECT_EQ("#include \"a.h\"\n"
  155. "#include \"c.h\"\n"
  156. "\n"
  157. "#include \"b.h\"\n",
  158. sort("#include \"a.h\"\n"
  159. "#include \"c.h\"\n"
  160. "\n"
  161. "#include \"b.h\"\n"));
  162. }
  163. TEST_F(SortIncludesTest, SortsAllBlocksWhenMerging) {
  164. Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge;
  165. EXPECT_EQ("#include \"a.h\"\n"
  166. "#include \"b.h\"\n"
  167. "#include \"c.h\"\n",
  168. sort("#include \"a.h\"\n"
  169. "#include \"c.h\"\n"
  170. "\n"
  171. "#include \"b.h\"\n"));
  172. }
  173. TEST_F(SortIncludesTest, CommentsAlwaysSeparateGroups) {
  174. EXPECT_EQ("#include \"a.h\"\n"
  175. "#include \"c.h\"\n"
  176. "// comment\n"
  177. "#include \"b.h\"\n",
  178. sort("#include \"c.h\"\n"
  179. "#include \"a.h\"\n"
  180. "// comment\n"
  181. "#include \"b.h\"\n"));
  182. Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge;
  183. EXPECT_EQ("#include \"a.h\"\n"
  184. "#include \"c.h\"\n"
  185. "// comment\n"
  186. "#include \"b.h\"\n",
  187. sort("#include \"c.h\"\n"
  188. "#include \"a.h\"\n"
  189. "// comment\n"
  190. "#include \"b.h\"\n"));
  191. Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup;
  192. EXPECT_EQ("#include \"a.h\"\n"
  193. "#include \"c.h\"\n"
  194. "// comment\n"
  195. "#include \"b.h\"\n",
  196. sort("#include \"c.h\"\n"
  197. "#include \"a.h\"\n"
  198. "// comment\n"
  199. "#include \"b.h\"\n"));
  200. }
  201. TEST_F(SortIncludesTest, HandlesAngledIncludesAsSeparateBlocks) {
  202. EXPECT_EQ("#include \"a.h\"\n"
  203. "#include \"c.h\"\n"
  204. "#include <b.h>\n"
  205. "#include <d.h>\n",
  206. sort("#include <d.h>\n"
  207. "#include <b.h>\n"
  208. "#include \"c.h\"\n"
  209. "#include \"a.h\"\n"));
  210. FmtStyle = getGoogleStyle(FormatStyle::LK_Cpp);
  211. EXPECT_EQ("#include <b.h>\n"
  212. "#include <d.h>\n"
  213. "#include \"a.h\"\n"
  214. "#include \"c.h\"\n",
  215. sort("#include <d.h>\n"
  216. "#include <b.h>\n"
  217. "#include \"c.h\"\n"
  218. "#include \"a.h\"\n"));
  219. }
  220. TEST_F(SortIncludesTest, RegroupsAngledIncludesInSeparateBlocks) {
  221. Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup;
  222. EXPECT_EQ("#include \"a.h\"\n"
  223. "#include \"c.h\"\n"
  224. "\n"
  225. "#include <b.h>\n"
  226. "#include <d.h>\n",
  227. sort("#include <d.h>\n"
  228. "#include <b.h>\n"
  229. "#include \"c.h\"\n"
  230. "#include \"a.h\"\n"));
  231. }
  232. TEST_F(SortIncludesTest, HandlesMultilineIncludes) {
  233. EXPECT_EQ("#include \"a.h\"\n"
  234. "#include \"b.h\"\n"
  235. "#include \"c.h\"\n",
  236. sort("#include \"a.h\"\n"
  237. "#include \\\n"
  238. "\"c.h\"\n"
  239. "#include \"b.h\"\n"));
  240. }
  241. TEST_F(SortIncludesTest, LeavesMainHeaderFirst) {
  242. Style.IncludeIsMainRegex = "([-_](test|unittest))?$";
  243. EXPECT_EQ("#include \"llvm/a.h\"\n"
  244. "#include \"b.h\"\n"
  245. "#include \"c.h\"\n",
  246. sort("#include \"llvm/a.h\"\n"
  247. "#include \"c.h\"\n"
  248. "#include \"b.h\"\n",
  249. "a.cc"));
  250. EXPECT_EQ("#include \"llvm/a.h\"\n"
  251. "#include \"b.h\"\n"
  252. "#include \"c.h\"\n",
  253. sort("#include \"llvm/a.h\"\n"
  254. "#include \"c.h\"\n"
  255. "#include \"b.h\"\n",
  256. "a_test.cc"));
  257. EXPECT_EQ("#include \"llvm/input.h\"\n"
  258. "#include \"b.h\"\n"
  259. "#include \"c.h\"\n",
  260. sort("#include \"llvm/input.h\"\n"
  261. "#include \"c.h\"\n"
  262. "#include \"b.h\"\n",
  263. "input.mm"));
  264. // Don't allow prefixes.
  265. EXPECT_EQ("#include \"b.h\"\n"
  266. "#include \"c.h\"\n"
  267. "#include \"llvm/not_a.h\"\n",
  268. sort("#include \"llvm/not_a.h\"\n"
  269. "#include \"c.h\"\n"
  270. "#include \"b.h\"\n",
  271. "a.cc"));
  272. // Don't do this for _main and other suffixes.
  273. EXPECT_EQ("#include \"b.h\"\n"
  274. "#include \"c.h\"\n"
  275. "#include \"llvm/a.h\"\n",
  276. sort("#include \"llvm/a.h\"\n"
  277. "#include \"c.h\"\n"
  278. "#include \"b.h\"\n",
  279. "a_main.cc"));
  280. // Don't do this in headers.
  281. EXPECT_EQ("#include \"b.h\"\n"
  282. "#include \"c.h\"\n"
  283. "#include \"llvm/a.h\"\n",
  284. sort("#include \"llvm/a.h\"\n"
  285. "#include \"c.h\"\n"
  286. "#include \"b.h\"\n",
  287. "a.h"));
  288. // Only do this in the first #include block.
  289. EXPECT_EQ("#include <a>\n"
  290. "\n"
  291. "#include \"b.h\"\n"
  292. "#include \"c.h\"\n"
  293. "#include \"llvm/a.h\"\n",
  294. sort("#include <a>\n"
  295. "\n"
  296. "#include \"llvm/a.h\"\n"
  297. "#include \"c.h\"\n"
  298. "#include \"b.h\"\n",
  299. "a.cc"));
  300. // Only recognize the first #include with a matching basename as main include.
  301. EXPECT_EQ("#include \"a.h\"\n"
  302. "#include \"b.h\"\n"
  303. "#include \"c.h\"\n"
  304. "#include \"llvm/a.h\"\n",
  305. sort("#include \"b.h\"\n"
  306. "#include \"a.h\"\n"
  307. "#include \"c.h\"\n"
  308. "#include \"llvm/a.h\"\n",
  309. "a.cc"));
  310. }
  311. TEST_F(SortIncludesTest, RecognizeMainHeaderInAllGroups) {
  312. Style.IncludeIsMainRegex = "([-_](test|unittest))?$";
  313. Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge;
  314. EXPECT_EQ("#include \"c.h\"\n"
  315. "#include \"a.h\"\n"
  316. "#include \"b.h\"\n",
  317. sort("#include \"b.h\"\n"
  318. "\n"
  319. "#include \"a.h\"\n"
  320. "#include \"c.h\"\n",
  321. "c.cc"));
  322. }
  323. TEST_F(SortIncludesTest, MainHeaderIsSeparatedWhenRegroupping) {
  324. Style.IncludeIsMainRegex = "([-_](test|unittest))?$";
  325. Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup;
  326. EXPECT_EQ("#include \"a.h\"\n"
  327. "\n"
  328. "#include \"b.h\"\n"
  329. "#include \"c.h\"\n",
  330. sort("#include \"b.h\"\n"
  331. "\n"
  332. "#include \"a.h\"\n"
  333. "#include \"c.h\"\n",
  334. "a.cc"));
  335. }
  336. TEST_F(SortIncludesTest, SupportCaseInsensitiveMatching) {
  337. // Setup an regex for main includes so we can cover those as well.
  338. Style.IncludeIsMainRegex = "([-_](test|unittest))?$";
  339. // Ensure both main header detection and grouping work in a case insensitive
  340. // manner.
  341. EXPECT_EQ("#include \"llvm/A.h\"\n"
  342. "#include \"b.h\"\n"
  343. "#include \"c.h\"\n"
  344. "#include \"LLVM/z.h\"\n"
  345. "#include \"llvm/X.h\"\n"
  346. "#include \"GTest/GTest.h\"\n"
  347. "#include \"gmock/gmock.h\"\n",
  348. sort("#include \"c.h\"\n"
  349. "#include \"b.h\"\n"
  350. "#include \"GTest/GTest.h\"\n"
  351. "#include \"llvm/A.h\"\n"
  352. "#include \"gmock/gmock.h\"\n"
  353. "#include \"llvm/X.h\"\n"
  354. "#include \"LLVM/z.h\"\n",
  355. "a_TEST.cc"));
  356. }
  357. TEST_F(SortIncludesTest, NegativePriorities) {
  358. Style.IncludeCategories = {{".*important_os_header.*", -1}, {".*", 1}};
  359. EXPECT_EQ("#include \"important_os_header.h\"\n"
  360. "#include \"c_main.h\"\n"
  361. "#include \"a_other.h\"\n",
  362. sort("#include \"c_main.h\"\n"
  363. "#include \"a_other.h\"\n"
  364. "#include \"important_os_header.h\"\n",
  365. "c_main.cc"));
  366. // check stable when re-run
  367. EXPECT_EQ("#include \"important_os_header.h\"\n"
  368. "#include \"c_main.h\"\n"
  369. "#include \"a_other.h\"\n",
  370. sort("#include \"important_os_header.h\"\n"
  371. "#include \"c_main.h\"\n"
  372. "#include \"a_other.h\"\n",
  373. "c_main.cc"));
  374. }
  375. TEST_F(SortIncludesTest, PriorityGroupsAreSeparatedWhenRegroupping) {
  376. Style.IncludeCategories = {{".*important_os_header.*", -1}, {".*", 1}};
  377. Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup;
  378. EXPECT_EQ("#include \"important_os_header.h\"\n"
  379. "\n"
  380. "#include \"c_main.h\"\n"
  381. "\n"
  382. "#include \"a_other.h\"\n",
  383. sort("#include \"c_main.h\"\n"
  384. "#include \"a_other.h\"\n"
  385. "#include \"important_os_header.h\"\n",
  386. "c_main.cc"));
  387. // check stable when re-run
  388. EXPECT_EQ("#include \"important_os_header.h\"\n"
  389. "\n"
  390. "#include \"c_main.h\"\n"
  391. "\n"
  392. "#include \"a_other.h\"\n",
  393. sort("#include \"important_os_header.h\"\n"
  394. "\n"
  395. "#include \"c_main.h\"\n"
  396. "\n"
  397. "#include \"a_other.h\"\n",
  398. "c_main.cc"));
  399. }
  400. TEST_F(SortIncludesTest, CalculatesCorrectCursorPosition) {
  401. std::string Code = "#include <ccc>\n" // Start of line: 0
  402. "#include <bbbbbb>\n" // Start of line: 15
  403. "#include <a>\n"; // Start of line: 33
  404. EXPECT_EQ(31u, newCursor(Code, 0));
  405. EXPECT_EQ(13u, newCursor(Code, 15));
  406. EXPECT_EQ(0u, newCursor(Code, 33));
  407. EXPECT_EQ(41u, newCursor(Code, 10));
  408. EXPECT_EQ(23u, newCursor(Code, 25));
  409. EXPECT_EQ(10u, newCursor(Code, 43));
  410. }
  411. TEST_F(SortIncludesTest, DeduplicateIncludes) {
  412. EXPECT_EQ("#include <a>\n"
  413. "#include <b>\n"
  414. "#include <c>\n",
  415. sort("#include <a>\n"
  416. "#include <b>\n"
  417. "#include <b>\n"
  418. "#include <b>\n"
  419. "#include <b>\n"
  420. "#include <c>\n"));
  421. Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge;
  422. EXPECT_EQ("#include <a>\n"
  423. "#include <b>\n"
  424. "#include <c>\n",
  425. sort("#include <a>\n"
  426. "#include <b>\n"
  427. "\n"
  428. "#include <b>\n"
  429. "\n"
  430. "#include <b>\n"
  431. "#include <c>\n"));
  432. Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup;
  433. EXPECT_EQ("#include <a>\n"
  434. "#include <b>\n"
  435. "#include <c>\n",
  436. sort("#include <a>\n"
  437. "#include <b>\n"
  438. "\n"
  439. "#include <b>\n"
  440. "\n"
  441. "#include <b>\n"
  442. "#include <c>\n"));
  443. }
  444. TEST_F(SortIncludesTest, SortAndDeduplicateIncludes) {
  445. EXPECT_EQ("#include <a>\n"
  446. "#include <b>\n"
  447. "#include <c>\n",
  448. sort("#include <b>\n"
  449. "#include <a>\n"
  450. "#include <b>\n"
  451. "#include <b>\n"
  452. "#include <c>\n"
  453. "#include <b>\n"));
  454. Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge;
  455. EXPECT_EQ("#include <a>\n"
  456. "#include <b>\n"
  457. "#include <c>\n",
  458. sort("#include <b>\n"
  459. "#include <a>\n"
  460. "\n"
  461. "#include <b>\n"
  462. "\n"
  463. "#include <c>\n"
  464. "#include <b>\n"));
  465. Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup;
  466. EXPECT_EQ("#include <a>\n"
  467. "#include <b>\n"
  468. "#include <c>\n",
  469. sort("#include <b>\n"
  470. "#include <a>\n"
  471. "\n"
  472. "#include <b>\n"
  473. "\n"
  474. "#include <c>\n"
  475. "#include <b>\n"));
  476. }
  477. TEST_F(SortIncludesTest, CalculatesCorrectCursorPositionAfterDeduplicate) {
  478. std::string Code = "#include <b>\n" // Start of line: 0
  479. "#include <a>\n" // Start of line: 13
  480. "#include <b>\n" // Start of line: 26
  481. "#include <b>\n" // Start of line: 39
  482. "#include <c>\n" // Start of line: 52
  483. "#include <b>\n"; // Start of line: 65
  484. std::string Expected = "#include <a>\n" // Start of line: 0
  485. "#include <b>\n" // Start of line: 13
  486. "#include <c>\n"; // Start of line: 26
  487. EXPECT_EQ(Expected, sort(Code));
  488. // Cursor on 'i' in "#include <a>".
  489. EXPECT_EQ(1u, newCursor(Code, 14));
  490. // Cursor on 'b' in "#include <b>".
  491. EXPECT_EQ(23u, newCursor(Code, 10));
  492. EXPECT_EQ(23u, newCursor(Code, 36));
  493. EXPECT_EQ(23u, newCursor(Code, 49));
  494. EXPECT_EQ(23u, newCursor(Code, 36));
  495. EXPECT_EQ(23u, newCursor(Code, 75));
  496. // Cursor on '#' in "#include <c>".
  497. EXPECT_EQ(26u, newCursor(Code, 52));
  498. }
  499. TEST_F(SortIncludesTest, DeduplicateLocallyInEachBlock) {
  500. EXPECT_EQ("#include <a>\n"
  501. "#include <b>\n"
  502. "\n"
  503. "#include <b>\n"
  504. "#include <c>\n",
  505. sort("#include <a>\n"
  506. "#include <b>\n"
  507. "\n"
  508. "#include <c>\n"
  509. "#include <b>\n"
  510. "#include <b>\n"));
  511. }
  512. TEST_F(SortIncludesTest, ValidAffactedRangesAfterDeduplicatingIncludes) {
  513. std::string Code = "#include <a>\n"
  514. "#include <b>\n"
  515. "#include <a>\n"
  516. "#include <a>\n"
  517. "\n"
  518. " int x ;";
  519. std::vector<tooling::Range> Ranges = {tooling::Range(0, 52)};
  520. auto Replaces = sortIncludes(FmtStyle, Code, Ranges, "input.cpp");
  521. Ranges = tooling::calculateRangesAfterReplacements(Replaces, Ranges);
  522. EXPECT_EQ(1u, Ranges.size());
  523. EXPECT_EQ(0u, Ranges[0].getOffset());
  524. EXPECT_EQ(26u, Ranges[0].getLength());
  525. }
  526. TEST_F(SortIncludesTest, DoNotSortLikelyXml) {
  527. EXPECT_EQ("<!--;\n"
  528. "#include <b>\n"
  529. "#include <a>\n"
  530. "-->",
  531. sort("<!--;\n"
  532. "#include <b>\n"
  533. "#include <a>\n"
  534. "-->"));
  535. }
  536. } // end namespace
  537. } // end namespace format
  538. } // end namespace clang