FormatTestTextProto.cpp 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738
  1. //===- unittest/Format/FormatTestTextProto.cpp ----------------------------===//
  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/Support/Debug.h"
  11. #include "gtest/gtest.h"
  12. #define DEBUG_TYPE "format-test"
  13. namespace clang {
  14. namespace format {
  15. class FormatTestTextProto : public ::testing::Test {
  16. protected:
  17. static std::string format(llvm::StringRef Code, unsigned Offset,
  18. unsigned Length, const FormatStyle &Style) {
  19. LLVM_DEBUG(llvm::errs() << "---\n");
  20. LLVM_DEBUG(llvm::errs() << Code << "\n\n");
  21. std::vector<tooling::Range> Ranges(1, tooling::Range(Offset, Length));
  22. tooling::Replacements Replaces = reformat(Style, Code, Ranges);
  23. auto Result = applyAllReplacements(Code, Replaces);
  24. EXPECT_TRUE(static_cast<bool>(Result));
  25. LLVM_DEBUG(llvm::errs() << "\n" << *Result << "\n\n");
  26. return *Result;
  27. }
  28. static std::string format(llvm::StringRef Code, const FormatStyle &Style) {
  29. return format(Code, 0, Code.size(), Style);
  30. }
  31. static void verifyFormat(llvm::StringRef Code, const FormatStyle &Style) {
  32. EXPECT_EQ(Code.str(), format(Code, Style)) << "Expected code is not stable";
  33. EXPECT_EQ(Code.str(), format(test::messUp(Code), Style));
  34. }
  35. static void verifyFormat(llvm::StringRef Code) {
  36. FormatStyle Style = getGoogleStyle(FormatStyle::LK_TextProto);
  37. Style.ColumnLimit = 60; // To make writing tests easier.
  38. verifyFormat(Code, Style);
  39. }
  40. };
  41. TEST_F(FormatTestTextProto, KeepsTopLevelEntriesFittingALine) {
  42. verifyFormat("field_a: OK field_b: OK field_c: OK field_d: OK field_e: OK");
  43. }
  44. TEST_F(FormatTestTextProto, SupportsMessageFields) {
  45. verifyFormat("msg_field: {}");
  46. verifyFormat("msg_field: { field_a: A }");
  47. verifyFormat("msg_field: { field_a: \"OK\" field_b: 123 }");
  48. verifyFormat("msg_field: {\n"
  49. " field_a: 1\n"
  50. " field_b: OK\n"
  51. " field_c: \"OK\"\n"
  52. " field_d: 123\n"
  53. " field_e: 23\n"
  54. "}");
  55. verifyFormat("msg_field {}");
  56. verifyFormat("msg_field { field_a: A }");
  57. verifyFormat("msg_field { field_a: \"OK\" field_b: 123 }");
  58. verifyFormat("msg_field {\n"
  59. " field_a: 1\n"
  60. " field_b: OK\n"
  61. " field_c: \"OK\"\n"
  62. " field_d: 123\n"
  63. " field_e: 23.0\n"
  64. " field_f: false\n"
  65. " field_g: 'lala'\n"
  66. " field_h: 1234.567e-89\n"
  67. "}");
  68. verifyFormat("msg_field: { msg_field { field_a: 1 } }");
  69. verifyFormat("id: \"ala.bala\"\n"
  70. "item { type: ITEM_A rank: 1 score: 90.0 }\n"
  71. "item { type: ITEM_B rank: 2 score: 70.5 }\n"
  72. "item {\n"
  73. " type: ITEM_A\n"
  74. " rank: 3\n"
  75. " score: 20.0\n"
  76. " description: \"the third item has a description\"\n"
  77. "}");
  78. }
  79. TEST_F(FormatTestTextProto, AvoidsTopLevelBinPacking) {
  80. verifyFormat("field_a: OK\n"
  81. "field_b: OK\n"
  82. "field_c: OK\n"
  83. "field_d: OK\n"
  84. "field_e: OK\n"
  85. "field_f: OK");
  86. verifyFormat("field_a: OK\n"
  87. "field_b: \"OK\"\n"
  88. "field_c: \"OK\"\n"
  89. "msg_field: { field_d: 123 }\n"
  90. "field_e: OK\n"
  91. "field_f: OK");
  92. verifyFormat("field_a: OK\n"
  93. "field_b: \"OK\"\n"
  94. "field_c: \"OK\"\n"
  95. "msg_field: { field_d: 123 field_e: OK }");
  96. verifyFormat("a: {\n"
  97. " field_a: OK\n"
  98. " field_b { field_c: OK }\n"
  99. " field_d: OKOKOK\n"
  100. " field_e: OK\n"
  101. "}");
  102. verifyFormat("field_a: OK,\n"
  103. "field_b { field_c: OK },\n"
  104. "field_d: OKOKOK,\n"
  105. "field_e: OK");
  106. }
  107. TEST_F(FormatTestTextProto, AddsNewlinesAfterTrailingComments) {
  108. verifyFormat("field_a: OK // Comment\n"
  109. "field_b: 1");
  110. verifyFormat("field_a: OK\n"
  111. "msg_field: {\n"
  112. " field_b: OK // Comment\n"
  113. "}");
  114. verifyFormat("field_a: OK\n"
  115. "msg_field {\n"
  116. " field_b: OK // Comment\n"
  117. "}");
  118. }
  119. TEST_F(FormatTestTextProto, ImplicitStringLiteralConcatenation) {
  120. verifyFormat("field_a: 'aaaaa'\n"
  121. " 'bbbbb'");
  122. verifyFormat("field_a: \"aaaaa\"\n"
  123. " \"bbbbb\"");
  124. FormatStyle Style = getGoogleStyle(FormatStyle::LK_TextProto);
  125. Style.AlwaysBreakBeforeMultilineStrings = true;
  126. verifyFormat("field_a:\n"
  127. " 'aaaaa'\n"
  128. " 'bbbbb'",
  129. Style);
  130. verifyFormat("field_a:\n"
  131. " \"aaaaa\"\n"
  132. " \"bbbbb\"",
  133. Style);
  134. }
  135. TEST_F(FormatTestTextProto, SupportsAngleBracketMessageFields) {
  136. // Single-line tests
  137. verifyFormat("msg_field <>");
  138. verifyFormat("msg_field: <>");
  139. verifyFormat("msg_field < field_a: OK >");
  140. verifyFormat("msg_field: < field_a: 123 >");
  141. verifyFormat("msg_field < field_a <> >");
  142. verifyFormat("msg_field < field_a < field_b <> > >");
  143. verifyFormat("msg_field: < field_a < field_b: <> > >");
  144. verifyFormat("msg_field < field_a: OK, field_b: \"OK\" >");
  145. verifyFormat("msg_field: < field_a: OK, field_b: \"OK\" >");
  146. // Multiple lines tests
  147. verifyFormat("msg_field <\n"
  148. " field_a: OK\n"
  149. " field_b: <>,\n"
  150. " field_c: OK\n"
  151. ">");
  152. verifyFormat("msg_field <\n"
  153. " field_a { field_b: 1 },\n"
  154. " field_c: < f_d: 2 >\n"
  155. ">");
  156. verifyFormat("msg_field: <\n"
  157. " field_a: OK\n"
  158. " field_b: <>,\n"
  159. " field_c: OK\n"
  160. ">");
  161. verifyFormat("msg_field: <\n"
  162. " field_a { field_b: 1 },\n"
  163. " field_c: < fd_d: 2 >\n"
  164. ">");
  165. verifyFormat("field_a: \"OK\",\n"
  166. "msg_field: < field_b: 123 >,\n"
  167. "field_c: {}");
  168. verifyFormat("field_a < field_b: 1 >,\n"
  169. "msg_fid: < fiel_b: 123 >,\n"
  170. "field_c <>");
  171. verifyFormat("field_a < field_b: 1 >\n"
  172. "msg_fied: < field_b: 123 >\n"
  173. "field_c <>");
  174. verifyFormat("field <\n"
  175. " field < field: <> >,\n"
  176. " field <>\n"
  177. ">\n"
  178. "field: < field: 1 >");
  179. verifyFormat("msg_field <\n"
  180. " field_a: OK\n"
  181. " field_b: \"OK\"\n"
  182. " field_c: 1\n"
  183. " field_d: 12.5\n"
  184. " field_e: OK\n"
  185. ">");
  186. verifyFormat("msg_field: <>\n"
  187. "field_c: \"OK\",\n"
  188. "msg_field: < field_d: 123 >\n"
  189. "field_e: OK\n"
  190. "msg_field: < field_d: 12 >");
  191. verifyFormat("field_a: OK,\n"
  192. "field_b < field_c: OK >,\n"
  193. "field_d: < 12.5 >,\n"
  194. "field_e: OK");
  195. verifyFormat("field_a: OK\n"
  196. "field_b < field_c: OK >\n"
  197. "field_d: < 12.5 >\n"
  198. "field_e: OKOKOK");
  199. verifyFormat("msg_field <\n"
  200. " field_a: OK,\n"
  201. " field_b < field_c: OK >,\n"
  202. " field_d: < 12.5 >,\n"
  203. " field_e: OK\n"
  204. ">");
  205. verifyFormat("msg_field <\n"
  206. " field_a: < field: OK >,\n"
  207. " field_b < field_c: OK >,\n"
  208. " field_d: < 12.5 >,\n"
  209. " field_e: OK,\n"
  210. ">");
  211. verifyFormat("msg_field: <\n"
  212. " field_a: \"OK\"\n"
  213. " msg_field: { field_b: OK }\n"
  214. " field_g: OK\n"
  215. " field_g: OK\n"
  216. " field_g: OK\n"
  217. ">");
  218. verifyFormat("field_a {\n"
  219. " field_d: ok\n"
  220. " field_b: < field_c: 1 >\n"
  221. " field_d: ok\n"
  222. " field_d: ok\n"
  223. "}");
  224. verifyFormat("field_a: {\n"
  225. " field_d: ok\n"
  226. " field_b: < field_c: 1 >\n"
  227. " field_d: ok\n"
  228. " field_d: ok\n"
  229. "}");
  230. verifyFormat("field_a: <\n"
  231. " f1: 1,\n"
  232. " f2: <>\n"
  233. ">\n"
  234. "field_b <\n"
  235. " field_b1: <>\n"
  236. " field_b2: ok,\n"
  237. " field_b3: <\n"
  238. " field_x {} // Comment\n"
  239. " field_y: { field_z: 1 }\n"
  240. " field_w: ok\n"
  241. " >\n"
  242. " field {\n"
  243. " field_x <> // Comment\n"
  244. " field_y: < field_z: 1 >\n"
  245. " field_w: ok\n"
  246. " msg_field: <\n"
  247. " field: <>\n"
  248. " field: < field: 1 >\n"
  249. " field: < field: 2 >\n"
  250. " field: < field: 3 >\n"
  251. " field: < field: 4 >\n"
  252. " field: ok\n"
  253. " >\n"
  254. " }\n"
  255. ">\n"
  256. "field: OK,\n"
  257. "field_c < field < field <> > >");
  258. verifyFormat("app_id: 'com.javax.swing.salsa.latino'\n"
  259. "head_id: 1\n"
  260. "data < key: value >");
  261. verifyFormat("app_id: 'com.javax.swing.salsa.latino'\n"
  262. "head_id: 1\n"
  263. "data < key: value >\n"
  264. "tail_id: 2");
  265. verifyFormat("app_id: 'com.javax.swing.salsa.latino'\n"
  266. "head_id: 1\n"
  267. "data < key: value >\n"
  268. "data { key: value }");
  269. verifyFormat("app {\n"
  270. " app_id: 'com.javax.swing.salsa.latino'\n"
  271. " head_id: 1\n"
  272. " data < key: value >\n"
  273. "}");
  274. verifyFormat("app: {\n"
  275. " app_id: 'com.javax.swing.salsa.latino'\n"
  276. " head_id: 1\n"
  277. " data < key: value >\n"
  278. "}");
  279. verifyFormat("app_id: 'com.javax.swing.salsa.latino'\n"
  280. "headheadheadheadheadhead_id: 1\n"
  281. "product_data { product { 1 } }");
  282. verifyFormat("app_id: 'com.javax.swing.salsa.latino'\n"
  283. "headheadheadheadheadhead_id: 1\n"
  284. "product_data < product { 1 } >");
  285. verifyFormat("app_id: 'com.javax.swing.salsa.latino'\n"
  286. "headheadheadheadheadhead_id: 1\n"
  287. "product_data < product < 1 > >");
  288. verifyFormat("app <\n"
  289. " app_id: 'com.javax.swing.salsa.latino'\n"
  290. " headheadheadheadheadhead_id: 1\n"
  291. " product_data < product { 1 } >\n"
  292. ">");
  293. verifyFormat("dcccwrnfioeruvginerurneitinfo {\n"
  294. " exte3nsionrnfvui { key: value }\n"
  295. "}");
  296. }
  297. TEST_F(FormatTestTextProto, DiscardsUnbreakableTailIfCanBreakAfter) {
  298. // The two closing braces count towards the string UnbreakableTailLength, but
  299. // since we have broken after the corresponding opening braces, we don't
  300. // consider that length for string breaking.
  301. verifyFormat(
  302. "foo: {\n"
  303. " bar: {\n"
  304. " text: \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
  305. " }\n"
  306. "}");
  307. }
  308. TEST_F(FormatTestTextProto, KeepsLongStringLiteralsOnSameLine) {
  309. verifyFormat(
  310. "foo: {\n"
  311. " text: \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasaaaaaaaaaa\"\n"
  312. "}");
  313. }
  314. TEST_F(FormatTestTextProto, KeepsCommentsIndentedInList) {
  315. verifyFormat("aaaaaaaaaa: 100\n"
  316. "bbbbbbbbbbbbbbbbbbbbbbbbbbb: 200\n"
  317. "# Single line comment for stuff here.\n"
  318. "cccccccccccccccccccccccc: 3849\n"
  319. "# Multiline comment for stuff here.\n"
  320. "# Multiline comment for stuff here.\n"
  321. "# Multiline comment for stuff here.\n"
  322. "cccccccccccccccccccccccc: 3849");
  323. }
  324. TEST_F(FormatTestTextProto, UnderstandsHashHashComments) {
  325. FormatStyle Style = getGoogleStyle(FormatStyle::LK_TextProto);
  326. Style.ColumnLimit = 60; // To make writing tests easier.
  327. EXPECT_EQ("aaa: 100\n"
  328. "##this is a double-hash comment.\n"
  329. "bb: 100\n"
  330. "## another double-hash comment.\n"
  331. "### a triple-hash comment\n"
  332. "cc: 200\n"
  333. "#### a quadriple-hash comment\n"
  334. "dd: 100\n",
  335. format("aaa: 100\n"
  336. "##this is a double-hash comment.\n"
  337. "bb: 100\n"
  338. "## another double-hash comment.\n"
  339. "### a triple-hash comment\n"
  340. "cc: 200\n"
  341. "#### a quadriple-hash comment\n"
  342. "dd: 100\n",
  343. Style));
  344. }
  345. TEST_F(FormatTestTextProto, FormatsExtensions) {
  346. verifyFormat("[type] { key: value }");
  347. verifyFormat("[type] {\n"
  348. " keyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy: value\n"
  349. "}");
  350. verifyFormat("[type.type] { key: value }");
  351. verifyFormat("[type.type] < key: value >");
  352. verifyFormat("[type.type/type.type] { key: value }");
  353. verifyFormat("msg {\n"
  354. " [type.type] { key: value }\n"
  355. "}");
  356. verifyFormat("msg {\n"
  357. " [type.type] {\n"
  358. " keyyyyyyyyyyyyyy: valuuuuuuuuuuuuuuuuuuuuuuuuue\n"
  359. " }\n"
  360. "}");
  361. verifyFormat("key: value\n"
  362. "[a.b] { key: value }");
  363. verifyFormat("msg: <\n"
  364. " key: value\n"
  365. " [a.b.c/d.e]: < key: value >\n"
  366. " [f.g]: <\n"
  367. " key: valueeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee\n"
  368. " key: {}\n"
  369. " >\n"
  370. " key {}\n"
  371. " [h.i.j] < key: value >\n"
  372. " [a]: {\n"
  373. " [b.c]: {}\n"
  374. " [d] <>\n"
  375. " [e/f]: 1\n"
  376. " }\n"
  377. ">");
  378. verifyFormat("[longg.long.long.long.long.long.long.long.long.long.long\n"
  379. " .longg.longlong] { key: value }");
  380. verifyFormat("[longg.long.long.long.long.long.long.long.long.long.long\n"
  381. " .longg.longlong] {\n"
  382. " key: value\n"
  383. " key: value\n"
  384. " key: value\n"
  385. " key: value\n"
  386. "}");
  387. verifyFormat("[longg.long.long.long.long.long.long.long.long.long\n"
  388. " .long/longg.longlong] { key: value }");
  389. verifyFormat("[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/\n"
  390. " bbbbbbbbbbbbbb] { key: value }");
  391. // These go over the column limit intentionally, since the alternative
  392. // [aa..a\n] is worse.
  393. verifyFormat("[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa] {\n"
  394. " key: value\n"
  395. "}");
  396. verifyFormat("[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa] {\n"
  397. " [type.type] {\n"
  398. " keyyyyyyyyyyyyyy: valuuuuuuuuuuuuuuuuuuuuuuuuue\n"
  399. " }\n"
  400. "}");
  401. verifyFormat("[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/\n"
  402. " bbbbbbb] {\n"
  403. " [type.type] {\n"
  404. " keyyyyyyyyyyyyyy: valuuuuuuuuuuuuuuuuuuuuuuuuue\n"
  405. " }\n"
  406. "}");
  407. verifyFormat(
  408. "aaaaaaaaaaaaaaa {\n"
  409. " bbbbbb {\n"
  410. " [a.b/cy] {\n"
  411. " eeeeeeeeeeeee: \"The lazy coo cat jumps over the lazy hot dog\"\n"
  412. " }\n"
  413. " }\n"
  414. "}");
  415. }
  416. TEST_F(FormatTestTextProto, SpacesAroundPercents) {
  417. verifyFormat("key: %d");
  418. verifyFormat("key: 0x%04x");
  419. verifyFormat("key: \"%d %d\"");
  420. }
  421. TEST_F(FormatTestTextProto, FormatsRepeatedListInitializers) {
  422. verifyFormat("keys: []");
  423. verifyFormat("keys: [ 1 ]");
  424. verifyFormat("keys: [ 'ala', 'bala' ]");
  425. verifyFormat("keys: [\n"
  426. " 'ala',\n"
  427. " 'bala',\n"
  428. " 'porto',\n"
  429. " 'kala',\n"
  430. " 'too',\n"
  431. " 'long',\n"
  432. " 'ng'\n"
  433. "]");
  434. verifyFormat("key: item\n"
  435. "keys: [\n"
  436. " 'ala',\n"
  437. " 'bala',\n"
  438. " 'porto',\n"
  439. " 'kala',\n"
  440. " 'too',\n"
  441. " 'long',\n"
  442. " 'long',\n"
  443. " 'long'\n"
  444. "]\n"
  445. "key: item\n"
  446. "msg {\n"
  447. " key: item\n"
  448. " keys: [\n"
  449. " 'ala',\n"
  450. " 'bala',\n"
  451. " 'porto',\n"
  452. " 'kala',\n"
  453. " 'too',\n"
  454. " 'long',\n"
  455. " 'long'\n"
  456. " ]\n"
  457. "}\n"
  458. "key: value"
  459. );
  460. FormatStyle Style = getGoogleStyle(FormatStyle::LK_TextProto);
  461. Style.ColumnLimit = 60; // To make writing tests easier.
  462. Style.Cpp11BracedListStyle = true;
  463. verifyFormat("keys: [1]", Style);
  464. }
  465. TEST_F(FormatTestTextProto, AcceptsOperatorAsKey) {
  466. verifyFormat("aaaaaaaaaaa: <\n"
  467. " bbbbbbbbb: <\n"
  468. " ccccccccccccccccccccccc: <\n"
  469. " operator: 1\n"
  470. " operator: 2\n"
  471. " operator: 3\n"
  472. " operator { key: value }\n"
  473. " >\n"
  474. " >\n"
  475. ">");
  476. }
  477. TEST_F(FormatTestTextProto, BreaksConsecutiveStringLiterals) {
  478. verifyFormat("ala: \"str1\"\n"
  479. " \"str2\"\n");
  480. }
  481. TEST_F(FormatTestTextProto, PutsMultipleEntriesInExtensionsOnNewlines) {
  482. FormatStyle Style = getGoogleStyle(FormatStyle::LK_TextProto);
  483. verifyFormat("pppppppppp: {\n"
  484. " ssssss: \"http://example.com/blahblahblah\"\n"
  485. " ppppppp: \"sssss/MMMMMMMMMMMM\"\n"
  486. " [ns.sssss.eeeeeeeee.eeeeeeeeeeeeeee] { begin: 24 end: 252 }\n"
  487. " [ns.sssss.eeeeeeeee.eeeeeeeeeeeeeee] {\n"
  488. " begin: 24\n"
  489. " end: 252\n"
  490. " key: value\n"
  491. " key: value\n"
  492. " }\n"
  493. "}", Style);
  494. }
  495. TEST_F(FormatTestTextProto, BreaksAfterBraceFollowedByClosingBraceOnNextLine) {
  496. FormatStyle Style = getGoogleStyle(FormatStyle::LK_TextProto);
  497. Style.ColumnLimit = 60;
  498. verifyFormat("keys: [\n"
  499. " data: { item: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' }\n"
  500. "]");
  501. verifyFormat("keys: <\n"
  502. " data: { item: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' }\n"
  503. ">");
  504. }
  505. TEST_F(FormatTestTextProto, BreaksEntriesOfSubmessagesContainingSubmessages) {
  506. FormatStyle Style = getGoogleStyle(FormatStyle::LK_TextProto);
  507. Style.ColumnLimit = 60;
  508. // The column limit allows for the keys submessage to be put on 1 line, but we
  509. // break it since it contains a submessage an another entry.
  510. verifyFormat("key: valueeeeeeee\n"
  511. "keys: {\n"
  512. " item: 'aaaaaaaaaaaaaaaa'\n"
  513. " sub <>\n"
  514. "}");
  515. verifyFormat("key: valueeeeeeee\n"
  516. "keys: {\n"
  517. " item: 'aaaaaaaaaaaaaaaa'\n"
  518. " sub {}\n"
  519. "}");
  520. verifyFormat("key: valueeeeeeee\n"
  521. "keys: {\n"
  522. " sub {}\n"
  523. " sub: <>\n"
  524. " sub: []\n"
  525. "}");
  526. verifyFormat("key: valueeeeeeee\n"
  527. "keys: {\n"
  528. " item: 'aaaaaaaaaaa'\n"
  529. " sub { msg: 1 }\n"
  530. "}");
  531. verifyFormat("key: valueeeeeeee\n"
  532. "keys: {\n"
  533. " item: 'aaaaaaaaaaa'\n"
  534. " sub: { msg: 1 }\n"
  535. "}");
  536. verifyFormat("key: valueeeeeeee\n"
  537. "keys: {\n"
  538. " item: 'aaaaaaaaaaa'\n"
  539. " sub < msg: 1 >\n"
  540. "}");
  541. verifyFormat("key: valueeeeeeee\n"
  542. "keys: {\n"
  543. " item: 'aaaaaaaaaaa'\n"
  544. " sub: [ msg: 1 ]\n"
  545. "}");
  546. verifyFormat("key: valueeeeeeee\n"
  547. "keys: <\n"
  548. " item: 'aaaaaaaaaaa'\n"
  549. " sub: [ 1, 2 ]\n"
  550. ">");
  551. verifyFormat("key: valueeeeeeee\n"
  552. "keys: {\n"
  553. " sub {}\n"
  554. " item: 'aaaaaaaaaaaaaaaa'\n"
  555. "}");
  556. verifyFormat("key: valueeeeeeee\n"
  557. "keys: {\n"
  558. " sub: []\n"
  559. " item: 'aaaaaaaaaaaaaaaa'\n"
  560. "}");
  561. verifyFormat("key: valueeeeeeee\n"
  562. "keys: {\n"
  563. " sub <>\n"
  564. " item: 'aaaaaaaaaaaaaaaa'\n"
  565. "}");
  566. verifyFormat("key: valueeeeeeee\n"
  567. "keys: {\n"
  568. " sub { key: value }\n"
  569. " item: 'aaaaaaaaaaaaaaaa'\n"
  570. "}");
  571. verifyFormat("key: valueeeeeeee\n"
  572. "keys: {\n"
  573. " sub: [ 1, 2 ]\n"
  574. " item: 'aaaaaaaaaaaaaaaa'\n"
  575. "}");
  576. verifyFormat("key: valueeeeeeee\n"
  577. "keys: {\n"
  578. " sub < sub_2: {} >\n"
  579. " item: 'aaaaaaaaaaaaaaaa'\n"
  580. "}");
  581. verifyFormat("key: valueeeeeeee\n"
  582. "keys: {\n"
  583. " item: data\n"
  584. " sub: [ 1, 2 ]\n"
  585. " item: 'aaaaaaaaaaaaaaaa'\n"
  586. "}");
  587. verifyFormat("key: valueeeeeeee\n"
  588. "keys: {\n"
  589. " item: data\n"
  590. " sub < sub_2: {} >\n"
  591. " item: 'aaaaaaaaaaaaaaaa'\n"
  592. "}");
  593. verifyFormat("sub: {\n"
  594. " key: valueeeeeeee\n"
  595. " keys: {\n"
  596. " sub: [ 1, 2 ]\n"
  597. " item: 'aaaaaaaaaaaaaaaa'\n"
  598. " }\n"
  599. "}");
  600. verifyFormat("sub: {\n"
  601. " key: 1\n"
  602. " sub: {}\n"
  603. "}\n"
  604. "# comment\n");
  605. verifyFormat("sub: {\n"
  606. " key: 1\n"
  607. " # comment\n"
  608. " sub: {}\n"
  609. "}");
  610. }
  611. TEST_F(FormatTestTextProto, PreventBreaksBetweenKeyAndSubmessages) {
  612. verifyFormat("submessage: {\n"
  613. " key: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'\n"
  614. "}");
  615. verifyFormat("submessage {\n"
  616. " key: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'\n"
  617. "}");
  618. verifyFormat("submessage: <\n"
  619. " key: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'\n"
  620. ">");
  621. verifyFormat("submessage <\n"
  622. " key: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'\n"
  623. ">");
  624. verifyFormat("repeatedd: [\n"
  625. " 'eyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'\n"
  626. "]");
  627. // "{" is going over the column limit.
  628. verifyFormat(
  629. "submessageeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee: {\n"
  630. " key: 'aaaaa'\n"
  631. "}");
  632. }
  633. TEST_F(FormatTestTextProto, FormatsCommentsAtEndOfFile) {
  634. verifyFormat("key: value\n"
  635. "# endfile comment");
  636. verifyFormat("key: value\n"
  637. "// endfile comment");
  638. verifyFormat("key: value\n"
  639. "// endfile comment 1\n"
  640. "// endfile comment 2");
  641. verifyFormat("submessage { key: value }\n"
  642. "# endfile comment");
  643. verifyFormat("submessage <\n"
  644. " key: value\n"
  645. " item {}\n"
  646. ">\n"
  647. "# endfile comment");
  648. }
  649. TEST_F(FormatTestTextProto, KeepsAmpersandsNextToKeys) {
  650. verifyFormat("@tmpl { field: 1 }");
  651. verifyFormat("@placeholder: 1");
  652. verifyFormat("@name <>");
  653. verifyFormat("submessage: @base { key: value }");
  654. verifyFormat("submessage: @base {\n"
  655. " key: value\n"
  656. " item: {}\n"
  657. "}");
  658. verifyFormat("submessage: {\n"
  659. " msg: @base {\n"
  660. " yolo: {}\n"
  661. " key: value\n"
  662. " }\n"
  663. " key: value\n"
  664. "}");
  665. }
  666. } // end namespace tooling
  667. } // end namespace clang