FormatTestTextProto.cpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497
  1. //===- unittest/Format/FormatTestProto.cpp --------------------------------===//
  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. class FormatTestTextProto : public ::testing::Test {
  17. protected:
  18. static std::string format(llvm::StringRef Code, unsigned Offset,
  19. unsigned Length, const FormatStyle &Style) {
  20. DEBUG(llvm::errs() << "---\n");
  21. DEBUG(llvm::errs() << Code << "\n\n");
  22. std::vector<tooling::Range> Ranges(1, tooling::Range(Offset, Length));
  23. tooling::Replacements Replaces = reformat(Style, Code, Ranges);
  24. auto Result = applyAllReplacements(Code, Replaces);
  25. EXPECT_TRUE(static_cast<bool>(Result));
  26. DEBUG(llvm::errs() << "\n" << *Result << "\n\n");
  27. return *Result;
  28. }
  29. static std::string format(llvm::StringRef Code, const FormatStyle &Style) {
  30. return format(Code, 0, Code.size(), Style);
  31. }
  32. static void verifyFormat(llvm::StringRef Code, const FormatStyle &Style) {
  33. EXPECT_EQ(Code.str(), format(Code, Style)) << "Expected code is not stable";
  34. EXPECT_EQ(Code.str(), format(test::messUp(Code), Style));
  35. }
  36. static void verifyFormat(llvm::StringRef Code) {
  37. FormatStyle Style = getGoogleStyle(FormatStyle::LK_TextProto);
  38. Style.ColumnLimit = 60; // To make writing tests easier.
  39. verifyFormat(Code, Style);
  40. }
  41. };
  42. TEST_F(FormatTestTextProto, KeepsTopLevelEntriesFittingALine) {
  43. verifyFormat("field_a: OK field_b: OK field_c: OK field_d: OK field_e: OK");
  44. }
  45. TEST_F(FormatTestTextProto, SupportsMessageFields) {
  46. verifyFormat("msg_field: {}");
  47. verifyFormat("msg_field: { field_a: A }");
  48. verifyFormat("msg_field: { field_a: \"OK\" field_b: 123 }");
  49. verifyFormat("msg_field: {\n"
  50. " field_a: 1\n"
  51. " field_b: OK\n"
  52. " field_c: \"OK\"\n"
  53. " field_d: 123\n"
  54. " field_e: 23\n"
  55. "}");
  56. verifyFormat("msg_field {}");
  57. verifyFormat("msg_field { field_a: A }");
  58. verifyFormat("msg_field { field_a: \"OK\" field_b: 123 }");
  59. verifyFormat("msg_field {\n"
  60. " field_a: 1\n"
  61. " field_b: OK\n"
  62. " field_c: \"OK\"\n"
  63. " field_d: 123\n"
  64. " field_e: 23.0\n"
  65. " field_f: false\n"
  66. " field_g: 'lala'\n"
  67. " field_h: 1234.567e-89\n"
  68. "}");
  69. verifyFormat("msg_field: { msg_field { field_a: 1 } }");
  70. verifyFormat("id: \"ala.bala\"\n"
  71. "item { type: ITEM_A rank: 1 score: 90.0 }\n"
  72. "item { type: ITEM_B rank: 2 score: 70.5 }\n"
  73. "item {\n"
  74. " type: ITEM_A\n"
  75. " rank: 3\n"
  76. " score: 20.0\n"
  77. " description: \"the third item has a description\"\n"
  78. "}");
  79. }
  80. TEST_F(FormatTestTextProto, AvoidsTopLevelBinPacking) {
  81. verifyFormat("field_a: OK\n"
  82. "field_b: OK\n"
  83. "field_c: OK\n"
  84. "field_d: OK\n"
  85. "field_e: OK\n"
  86. "field_f: OK");
  87. verifyFormat("field_a: OK\n"
  88. "field_b: \"OK\"\n"
  89. "field_c: \"OK\"\n"
  90. "msg_field: { field_d: 123 }\n"
  91. "field_e: OK\n"
  92. "field_f: OK");
  93. verifyFormat("field_a: OK\n"
  94. "field_b: \"OK\"\n"
  95. "field_c: \"OK\"\n"
  96. "msg_field: { field_d: 123 field_e: OK }");
  97. verifyFormat("a: {\n"
  98. " field_a: OK\n"
  99. " field_b { field_c: OK }\n"
  100. " field_d: OKOKOK\n"
  101. " field_e: OK\n"
  102. "}");
  103. verifyFormat("field_a: OK,\n"
  104. "field_b { field_c: OK },\n"
  105. "field_d: OKOKOK,\n"
  106. "field_e: OK");
  107. }
  108. TEST_F(FormatTestTextProto, AddsNewlinesAfterTrailingComments) {
  109. verifyFormat("field_a: OK // Comment\n"
  110. "field_b: 1");
  111. verifyFormat("field_a: OK\n"
  112. "msg_field: {\n"
  113. " field_b: OK // Comment\n"
  114. "}");
  115. verifyFormat("field_a: OK\n"
  116. "msg_field {\n"
  117. " field_b: OK // Comment\n"
  118. "}");
  119. }
  120. TEST_F(FormatTestTextProto, ImplicitStringLiteralConcatenation) {
  121. verifyFormat("field_a: 'aaaaa'\n"
  122. " 'bbbbb'");
  123. verifyFormat("field_a: \"aaaaa\"\n"
  124. " \"bbbbb\"");
  125. FormatStyle Style = getGoogleStyle(FormatStyle::LK_TextProto);
  126. Style.AlwaysBreakBeforeMultilineStrings = true;
  127. verifyFormat("field_a:\n"
  128. " 'aaaaa'\n"
  129. " 'bbbbb'",
  130. Style);
  131. verifyFormat("field_a:\n"
  132. " \"aaaaa\"\n"
  133. " \"bbbbb\"",
  134. Style);
  135. }
  136. TEST_F(FormatTestTextProto, SupportsAngleBracketMessageFields) {
  137. // Single-line tests
  138. verifyFormat("msg_field <>");
  139. verifyFormat("msg_field: <>");
  140. verifyFormat("msg_field < field_a: OK >");
  141. verifyFormat("msg_field: < field_a: 123 >");
  142. verifyFormat("msg_field < field_a <> >");
  143. verifyFormat("msg_field < field_a < field_b <> > >");
  144. verifyFormat("msg_field: < field_a < field_b: <> > >");
  145. verifyFormat("msg_field < field_a: OK, field_b: \"OK\" >");
  146. verifyFormat("msg_field < field_a: OK field_b: <>, field_c: OK >");
  147. verifyFormat("msg_field < field_a { field_b: 1 }, field_c: < f_d: 2 > >");
  148. verifyFormat("msg_field: < field_a: OK, field_b: \"OK\" >");
  149. verifyFormat("msg_field: < field_a: OK field_b: <>, field_c: OK >");
  150. verifyFormat("msg_field: < field_a { field_b: 1 }, field_c: < fd_d: 2 > >");
  151. verifyFormat("field_a: \"OK\", msg_field: < field_b: 123 >, field_c: {}");
  152. verifyFormat("field_a < field_b: 1 >, msg_fid: < fiel_b: 123 >, field_c <>");
  153. verifyFormat("field_a < field_b: 1 > msg_fied: < field_b: 123 > field_c <>");
  154. verifyFormat("field < field < field: <> >, field <> > field: < field: 1 >");
  155. // Multiple lines tests
  156. verifyFormat("msg_field <\n"
  157. " field_a: OK\n"
  158. " field_b: \"OK\"\n"
  159. " field_c: 1\n"
  160. " field_d: 12.5\n"
  161. " field_e: OK\n"
  162. ">");
  163. verifyFormat("msg_field: <>\n"
  164. "field_c: \"OK\",\n"
  165. "msg_field: < field_d: 123 >\n"
  166. "field_e: OK\n"
  167. "msg_field: < field_d: 12 >");
  168. verifyFormat("field_a: OK,\n"
  169. "field_b < field_c: OK >,\n"
  170. "field_d: < 12.5 >,\n"
  171. "field_e: OK");
  172. verifyFormat("field_a: OK\n"
  173. "field_b < field_c: OK >\n"
  174. "field_d: < 12.5 >\n"
  175. "field_e: OKOKOK");
  176. verifyFormat("msg_field <\n"
  177. " field_a: OK,\n"
  178. " field_b < field_c: OK >,\n"
  179. " field_d: < 12.5 >,\n"
  180. " field_e: OK\n"
  181. ">");
  182. verifyFormat("msg_field <\n"
  183. " field_a: < field: OK >,\n"
  184. " field_b < field_c: OK >,\n"
  185. " field_d: < 12.5 >,\n"
  186. " field_e: OK,\n"
  187. ">");
  188. verifyFormat("msg_field: <\n"
  189. " field_a: \"OK\"\n"
  190. " msg_field: { field_b: OK }\n"
  191. " field_g: OK\n"
  192. " field_g: OK\n"
  193. " field_g: OK\n"
  194. ">");
  195. verifyFormat("field_a {\n"
  196. " field_d: ok\n"
  197. " field_b: < field_c: 1 >\n"
  198. " field_d: ok\n"
  199. " field_d: ok\n"
  200. "}");
  201. verifyFormat("field_a: {\n"
  202. " field_d: ok\n"
  203. " field_b: < field_c: 1 >\n"
  204. " field_d: ok\n"
  205. " field_d: ok\n"
  206. "}");
  207. verifyFormat("field_a: < f1: 1, f2: <> >\n"
  208. "field_b <\n"
  209. " field_b1: <>\n"
  210. " field_b2: ok,\n"
  211. " field_b3: <\n"
  212. " field_x {} // Comment\n"
  213. " field_y: { field_z: 1 }\n"
  214. " field_w: ok\n"
  215. " >\n"
  216. " field {\n"
  217. " field_x <> // Comment\n"
  218. " field_y: < field_z: 1 >\n"
  219. " field_w: ok\n"
  220. " msg_field: <\n"
  221. " field: <>\n"
  222. " field: < field: 1 >\n"
  223. " field: < field: 2 >\n"
  224. " field: < field: 3 >\n"
  225. " field: < field: 4 >\n"
  226. " field: ok\n"
  227. " >\n"
  228. " }\n"
  229. ">\n"
  230. "field: OK,\n"
  231. "field_c < field < field <> > >");
  232. verifyFormat("app_id: 'com.javax.swing.salsa.latino'\n"
  233. "head_id: 1\n"
  234. "data < key: value >");
  235. verifyFormat("app_id: 'com.javax.swing.salsa.latino'\n"
  236. "head_id: 1\n"
  237. "data < key: value >\n"
  238. "tail_id: 2");
  239. verifyFormat("app_id: 'com.javax.swing.salsa.latino'\n"
  240. "head_id: 1\n"
  241. "data < key: value >\n"
  242. "data { key: value }");
  243. verifyFormat("app {\n"
  244. " app_id: 'com.javax.swing.salsa.latino'\n"
  245. " head_id: 1\n"
  246. " data < key: value >\n"
  247. "}");
  248. verifyFormat("app: {\n"
  249. " app_id: 'com.javax.swing.salsa.latino'\n"
  250. " head_id: 1\n"
  251. " data < key: value >\n"
  252. "}");
  253. verifyFormat("app_id: 'com.javax.swing.salsa.latino'\n"
  254. "headheadheadheadheadhead_id: 1\n"
  255. "product_data { product { 1 } }");
  256. verifyFormat("app_id: 'com.javax.swing.salsa.latino'\n"
  257. "headheadheadheadheadhead_id: 1\n"
  258. "product_data < product { 1 } >");
  259. verifyFormat("app_id: 'com.javax.swing.salsa.latino'\n"
  260. "headheadheadheadheadhead_id: 1\n"
  261. "product_data < product < 1 > >");
  262. verifyFormat("app <\n"
  263. " app_id: 'com.javax.swing.salsa.latino'\n"
  264. " headheadheadheadheadhead_id: 1\n"
  265. " product_data < product { 1 } >\n"
  266. ">");
  267. verifyFormat("dcccwrnfioeruvginerurneitinfo {\n"
  268. " exte3nsionrnfvui { key: value }\n"
  269. "}");
  270. }
  271. TEST_F(FormatTestTextProto, DiscardsUnbreakableTailIfCanBreakAfter) {
  272. // The two closing braces count towards the string UnbreakableTailLength, but
  273. // since we have broken after the corresponding opening braces, we don't
  274. // consider that length for string breaking.
  275. verifyFormat(
  276. "foo: {\n"
  277. " bar: {\n"
  278. " text: \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
  279. " }\n"
  280. "}");
  281. }
  282. TEST_F(FormatTestTextProto, KeepsLongStringLiteralsOnSameLine) {
  283. verifyFormat(
  284. "foo: {\n"
  285. " text: \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasaaaaaaaaaa\"\n"
  286. "}");
  287. }
  288. TEST_F(FormatTestTextProto, KeepsCommentsIndentedInList) {
  289. verifyFormat("aaaaaaaaaa: 100\n"
  290. "bbbbbbbbbbbbbbbbbbbbbbbbbbb: 200\n"
  291. "# Single line comment for stuff here.\n"
  292. "cccccccccccccccccccccccc: 3849\n"
  293. "# Multiline comment for stuff here.\n"
  294. "# Multiline comment for stuff here.\n"
  295. "# Multiline comment for stuff here.\n"
  296. "cccccccccccccccccccccccc: 3849");
  297. }
  298. TEST_F(FormatTestTextProto, FormatsExtensions) {
  299. verifyFormat("[type] { key: value }");
  300. verifyFormat("[type] {\n"
  301. " keyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy: value\n"
  302. "}");
  303. verifyFormat("[type.type] { key: value }");
  304. verifyFormat("[type.type] < key: value >");
  305. verifyFormat("[type.type/type.type] { key: value }");
  306. verifyFormat("msg {\n"
  307. " [type.type] { key: value }\n"
  308. "}");
  309. verifyFormat("msg {\n"
  310. " [type.type] {\n"
  311. " keyyyyyyyyyyyyyy: valuuuuuuuuuuuuuuuuuuuuuuuuue\n"
  312. " }\n"
  313. "}");
  314. verifyFormat("key: value\n"
  315. "[a.b] { key: value }");
  316. verifyFormat("msg: <\n"
  317. " key: value\n"
  318. " [a.b.c/d.e]: < key: value >\n"
  319. " [f.g]: <\n"
  320. " key: valueeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee\n"
  321. " key: {}\n"
  322. " >\n"
  323. " key {}\n"
  324. " [h.i.j] < key: value >\n"
  325. " [a]: {\n"
  326. " [b.c]: {}\n"
  327. " [d] <>\n"
  328. " [e/f]: 1\n"
  329. " }\n"
  330. ">");
  331. verifyFormat("[longg.long.long.long.long.long.long.long.long.long.long\n"
  332. " .longg.longlong] { key: value }");
  333. verifyFormat("[longg.long.long.long.long.long.long.long.long.long.long\n"
  334. " .longg.longlong] {\n"
  335. " key: value\n"
  336. " key: value\n"
  337. " key: value\n"
  338. " key: value\n"
  339. "}");
  340. verifyFormat("[longg.long.long.long.long.long.long.long.long.long\n"
  341. " .long/longg.longlong] { key: value }");
  342. verifyFormat("[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/\n"
  343. " bbbbbbbbbbbbbb] { key: value }");
  344. // These go over the column limit intentionally, since the alternative
  345. // [aa..a\n] is worse.
  346. verifyFormat("[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa] {\n"
  347. " key: value\n"
  348. "}");
  349. verifyFormat("[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa] {\n"
  350. " [type.type] {\n"
  351. " keyyyyyyyyyyyyyy: valuuuuuuuuuuuuuuuuuuuuuuuuue\n"
  352. " }\n"
  353. "}");
  354. verifyFormat("[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/\n"
  355. " bbbbbbb] {\n"
  356. " [type.type] {\n"
  357. " keyyyyyyyyyyyyyy: valuuuuuuuuuuuuuuuuuuuuuuuuue\n"
  358. " }\n"
  359. "}");
  360. verifyFormat(
  361. "aaaaaaaaaaaaaaa {\n"
  362. " bbbbbb {\n"
  363. " [a.b/cy] {\n"
  364. " eeeeeeeeeeeee: \"The lazy coo cat jumps over the lazy hot dog\"\n"
  365. " }\n"
  366. " }\n"
  367. "}");
  368. }
  369. TEST_F(FormatTestTextProto, NoSpaceAfterPercent) {
  370. verifyFormat("key: %d");
  371. }
  372. TEST_F(FormatTestTextProto, FormatsRepeatedListInitializers) {
  373. verifyFormat("keys: []");
  374. verifyFormat("keys: [ 1 ]");
  375. verifyFormat("keys: [ 'ala', 'bala' ]");
  376. verifyFormat("keys:\n"
  377. " [ 'ala', 'bala', 'porto', 'kala', 'too', 'long', 'ng' ]");
  378. verifyFormat("key: item\n"
  379. "keys: [\n"
  380. " 'ala',\n"
  381. " 'bala',\n"
  382. " 'porto',\n"
  383. " 'kala',\n"
  384. " 'too',\n"
  385. " 'long',\n"
  386. " 'long',\n"
  387. " 'long'\n"
  388. "]\n"
  389. "key: item\n"
  390. "msg {\n"
  391. " key: item\n"
  392. " keys: [\n"
  393. " 'ala',\n"
  394. " 'bala',\n"
  395. " 'porto',\n"
  396. " 'kala',\n"
  397. " 'too',\n"
  398. " 'long',\n"
  399. " 'long'\n"
  400. " ]\n"
  401. "}\n"
  402. "key: value"
  403. );
  404. FormatStyle Style = getGoogleStyle(FormatStyle::LK_TextProto);
  405. Style.ColumnLimit = 60; // To make writing tests easier.
  406. Style.Cpp11BracedListStyle = true;
  407. verifyFormat("keys: [1]", Style);
  408. }
  409. TEST_F(FormatTestTextProto, AcceptsOperatorAsKey) {
  410. verifyFormat("aaaaaaaaaaa: <\n"
  411. " bbbbbbbbb: <\n"
  412. " ccccccccccccccccccccccc: <\n"
  413. " operator: 1\n"
  414. " operator: 2\n"
  415. " operator { key: value }\n"
  416. " >\n"
  417. " >\n"
  418. ">");
  419. }
  420. TEST_F(FormatTestTextProto, BreaksConsecutiveStringLiterals) {
  421. verifyFormat("ala: \"str1\"\n"
  422. " \"str2\"\n");
  423. }
  424. TEST_F(FormatTestTextProto, PutsMultipleEntriesInExtensionsOnNewlines) {
  425. FormatStyle Style = getGoogleStyle(FormatStyle::LK_TextProto);
  426. verifyFormat("pppppppppp: {\n"
  427. " ssssss: \"http://example.com/blahblahblah\"\n"
  428. " ppppppp: \"sssss/MMMMMMMMMMMM\"\n"
  429. " [ns.sssss.eeeeeeeee.eeeeeeeeeeeeeee] { begin: 24 end: 252 }\n"
  430. " [ns.sssss.eeeeeeeee.eeeeeeeeeeeeeee] {\n"
  431. " begin: 24\n"
  432. " end: 252\n"
  433. " key: value\n"
  434. " key: value\n"
  435. " }\n"
  436. "}", Style);
  437. }
  438. } // end namespace tooling
  439. } // end namespace clang