FormatTestProto.cpp 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628
  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 FormatTestProto : public ::testing::Test {
  17. protected:
  18. static std::string format(llvm::StringRef Code, unsigned Offset,
  19. unsigned Length, const FormatStyle &Style) {
  20. LLVM_DEBUG(llvm::errs() << "---\n");
  21. LLVM_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. LLVM_DEBUG(llvm::errs() << "\n" << *Result << "\n\n");
  27. return *Result;
  28. }
  29. static std::string format(llvm::StringRef Code) {
  30. FormatStyle Style = getGoogleStyle(FormatStyle::LK_Proto);
  31. Style.ColumnLimit = 60; // To make writing tests easier.
  32. return format(Code, 0, Code.size(), Style);
  33. }
  34. static void verifyFormat(llvm::StringRef Code) {
  35. EXPECT_EQ(Code.str(), format(Code)) << "Expected code is not stable";
  36. EXPECT_EQ(Code.str(), format(test::messUp(Code)));
  37. }
  38. };
  39. TEST_F(FormatTestProto, FormatsMessages) {
  40. verifyFormat("message SomeMessage {\n"
  41. " required int32 field1 = 1;\n"
  42. "}");
  43. verifyFormat("message SomeMessage {\n"
  44. " required .absolute.Reference field1 = 1;\n"
  45. "}");
  46. verifyFormat("message SomeMessage {\n"
  47. " required int32 field1 = 1;\n"
  48. " optional string field2 = 2 [default = \"2\"]\n"
  49. "}");
  50. verifyFormat("message SomeMessage {\n"
  51. " optional really.really.long.qualified.type.aaa.aaaaaaa\n"
  52. " fiiiiiiiiiiiiiiiiiiiiiiiiield = 1;\n"
  53. " optional\n"
  54. " really.really.long.qualified.type.aaa.aaaaaaa.aaaaaaaa\n"
  55. " another_fiiiiiiiiiiiiiiiiiiiiield = 2;\n"
  56. "}");
  57. verifyFormat("message SomeMessage {\n"
  58. " map<string, Project> projects = 1;\n"
  59. " optional map<string, int32> size_projects = 2;\n"
  60. " map<int, really.really.really.long.qualified.type.nameeee>\n"
  61. " projects = 3;\n"
  62. " map<int, really.really.really.really.long.qualified.type\n"
  63. " .nameeee> projects = 4;\n"
  64. " map<int,\n"
  65. " reallyreallyreallyreallyreallyreallyreallylongname>\n"
  66. " projects = 5;\n"
  67. " map<int, Project>\n"
  68. " longlonglonglonglonglonglonglonglonglongonglon = 6;\n"
  69. " map<releleallyreallyreallyreallyreallyreallyreallylongname,\n"
  70. " int> projects = 7;\n"
  71. " map<releleallyreallyreallyreallyreallyreallyreallylongname,\n"
  72. " releleallyreallyreallyreallyreallyreallyreallylongname>\n"
  73. " releleallyreallyreallyreallyreallyreallyreallylongnam =\n"
  74. " 8;\n"
  75. " map<relele.llyreal.yreallyr.allyreally.eallyreal\n"
  76. " .sauenirylongname,\n"
  77. " really.really.really.really.long.qualified.type\n"
  78. " .nameeee> projects = 9;\n"
  79. "}");
  80. }
  81. TEST_F(FormatTestProto, KeywordsInOtherLanguages) {
  82. verifyFormat("optional string operator = 1;");
  83. }
  84. TEST_F(FormatTestProto, FormatsEnums) {
  85. verifyFormat("enum Type {\n"
  86. " UNKNOWN = 0;\n"
  87. " TYPE_A = 1;\n"
  88. " TYPE_B = 2;\n"
  89. "};");
  90. verifyFormat("enum Type {\n"
  91. " UNKNOWN = 0 [(some_options) = { a: aa, b: bb }];\n"
  92. "};");
  93. verifyFormat("enum Type {\n"
  94. " UNKNOWN = 0 [(some_options) = {\n"
  95. " a: aa, // wrap\n"
  96. " b: bb\n"
  97. " }];\n"
  98. "};");
  99. }
  100. TEST_F(FormatTestProto, UnderstandsReturns) {
  101. verifyFormat("rpc Search(SearchRequest) returns (SearchResponse);");
  102. }
  103. TEST_F(FormatTestProto, MessageFieldAttributes) {
  104. verifyFormat("optional string test = 1 [default = \"test\"];");
  105. verifyFormat("optional bool a = 1 [default = true, deprecated = true];");
  106. verifyFormat("optional LongMessageType long_proto_field = 1 [\n"
  107. " default = REALLY_REALLY_LONG_CONSTANT_VALUE,\n"
  108. " deprecated = true\n"
  109. "];");
  110. verifyFormat("optional LongMessageType long_proto_field = 1\n"
  111. " [default = REALLY_REALLY_LONG_CONSTANT_VALUE];");
  112. verifyFormat("repeated double value = 1\n"
  113. " [(aaaaaaa.aaaaaaaaa) = { aaaaaaaaaaaaaaaaa: AAAAAAAA }];");
  114. verifyFormat("repeated double value = 1 [(aaaaaaa.aaaaaaaaa) = {\n"
  115. " aaaaaaaaaaaaaaaa: AAAAAAAAAA,\n"
  116. " bbbbbbbbbbbbbbbb: BBBBBBBBBB\n"
  117. "}];");
  118. verifyFormat("repeated double value = 1 [(aaaaaaa.aaaaaaaaa) = {\n"
  119. " aaaaaaaaaaaaaaaa: AAAAAAAAAA\n"
  120. " bbbbbbbbbbbbbbbb: BBBBBBBBBB\n"
  121. "}];");
  122. verifyFormat("repeated double value = 1 [\n"
  123. " (aaaaaaa.aaaaaaaaa) = {\n"
  124. " aaaaaaaaaaaaaaaa: AAAAAAAAAA\n"
  125. " bbbbbbbbbbbbbbbb: BBBBBBBBBB\n"
  126. " },\n"
  127. " (bbbbbbb.bbbbbbbbb) = {\n"
  128. " aaaaaaaaaaaaaaaa: AAAAAAAAAA\n"
  129. " bbbbbbbbbbbbbbbb: BBBBBBBBBB\n"
  130. " }\n"
  131. "];");
  132. verifyFormat("repeated double value = 1 [(aaaaaaa.aaaaaaaaa) = {\n"
  133. " type: \"AAAAAAAAAA\"\n"
  134. " is: \"AAAAAAAAAA\"\n"
  135. " or: \"BBBBBBBBBB\"\n"
  136. "}];");
  137. verifyFormat("repeated double value = 1 [(aaaaaaa.aaaaaaaaa) = {\n"
  138. " aaaaaaaaaaaaaaaa: AAAAAAAAAA,\n"
  139. " bbbbbbb: BBBB,\n"
  140. " bbbb: BBB\n"
  141. "}];");
  142. verifyFormat("optional AAA aaa = 1 [\n"
  143. " foo = {\n"
  144. " key: 'a' //\n"
  145. " },\n"
  146. " bar = {\n"
  147. " key: 'a' //\n"
  148. " }\n"
  149. "];");
  150. verifyFormat("optional string test = 1 [default = \"test\"\n"
  151. " \"test\"];");
  152. verifyFormat("optional Aaaaaaaa aaaaaaaa = 12 [\n"
  153. " (aaa) = aaaa,\n"
  154. " (bbbbbbbbbbbbbbbbbbbbbbbbbb) = {\n"
  155. " aaaaaaaaaaaaaaaaa: true,\n"
  156. " aaaaaaaaaaaaaaaa: true\n"
  157. " }\n"
  158. "];");
  159. verifyFormat("extensions 20 [(proto2.type) = 'Aaaa.bbbb'];");
  160. verifyFormat("extensions 20\n"
  161. " [(proto3.type) = 'Aaaa.bbbb', (aaa.Aaa) = 'aaa.bbb'];");
  162. verifyFormat("extensions 123 [\n"
  163. " (aaa) = aaaa,\n"
  164. " (bbbbbbbbbbbbbbbbbbbbbbbbbb) = {\n"
  165. " aaaaaaaaaaaaaaaaa: true,\n"
  166. " aaaaaaaaaaaaaaaa: true\n"
  167. " }\n"
  168. "];");
  169. }
  170. TEST_F(FormatTestProto, DoesntWrapFileOptions) {
  171. EXPECT_EQ(
  172. "option java_package = "
  173. "\"some.really.long.package.that.exceeds.the.column.limit\";",
  174. format("option java_package = "
  175. "\"some.really.long.package.that.exceeds.the.column.limit\";"));
  176. }
  177. TEST_F(FormatTestProto, FormatsOptions) {
  178. verifyFormat("option (MyProto.options) = {\n"
  179. " field_a: OK\n"
  180. " field_b: \"OK\"\n"
  181. " field_c: \"OK\"\n"
  182. " msg_field: { field_d: 123 }\n"
  183. "};");
  184. verifyFormat("option (MyProto.options) = {\n"
  185. " field_a: OK\n"
  186. " field_b: \"OK\"\n"
  187. " field_c: \"OK\"\n"
  188. " msg_field: { field_d: 123 field_e: OK }\n"
  189. "};");
  190. verifyFormat("option (MyProto.options) = {\n"
  191. " field_a: OK // Comment\n"
  192. " field_b: \"OK\"\n"
  193. " field_c: \"OK\"\n"
  194. " msg_field: { field_d: 123 }\n"
  195. "};");
  196. verifyFormat("option (MyProto.options) = {\n"
  197. " field_c: \"OK\"\n"
  198. " msg_field { field_d: 123 }\n"
  199. "};");
  200. verifyFormat("option (MyProto.options) = {\n"
  201. " field_a: OK\n"
  202. " field_b { field_c: OK }\n"
  203. " field_d: OKOKOK\n"
  204. " field_e: OK\n"
  205. "}");
  206. // Support syntax with <> instead of {}.
  207. verifyFormat("option (MyProto.options) = {\n"
  208. " field_c: \"OK\",\n"
  209. " msg_field: < field_d: 123 >\n"
  210. " empty: <>\n"
  211. " empty <>\n"
  212. "};");
  213. verifyFormat("option (MyProto.options) = {\n"
  214. " field_a: OK\n"
  215. " field_b < field_c: OK >\n"
  216. " field_d: OKOKOK\n"
  217. " field_e: OK\n"
  218. "}");
  219. verifyFormat("option (MyProto.options) = {\n"
  220. " msg_field: <>\n"
  221. " field_c: \"OK\",\n"
  222. " msg_field: < field_d: 123 >\n"
  223. " field_e: OK\n"
  224. " msg_field: < field_d: 12 >\n"
  225. "};");
  226. verifyFormat("option (MyProto.options) = <\n"
  227. " field_a: OK\n"
  228. " field_b: \"OK\"\n"
  229. " field_c: 1\n"
  230. " field_d: 12.5\n"
  231. " field_e: OK\n"
  232. ">;");
  233. verifyFormat("option (MyProto.options) = <\n"
  234. " field_a: OK,\n"
  235. " field_b: \"OK\",\n"
  236. " field_c: 1,\n"
  237. " field_d: 12.5,\n"
  238. " field_e: OK,\n"
  239. ">;");
  240. verifyFormat("option (MyProto.options) = <\n"
  241. " field_a: \"OK\"\n"
  242. " msg_field: { field_b: OK }\n"
  243. " field_g: OK\n"
  244. " field_g: OK\n"
  245. " field_g: OK\n"
  246. ">;");
  247. verifyFormat("option (MyProto.options) = <\n"
  248. " field_a: \"OK\"\n"
  249. " msg_field <\n"
  250. " field_b: OK\n"
  251. " field_c: OK\n"
  252. " field_d: OK\n"
  253. " field_e: OK\n"
  254. " field_f: OK\n"
  255. " >\n"
  256. " field_g: OK\n"
  257. ">;");
  258. verifyFormat("option (MyProto.options) = <\n"
  259. " field_a: \"OK\"\n"
  260. " msg_field <\n"
  261. " field_b: OK,\n"
  262. " field_c: OK,\n"
  263. " field_d: OK,\n"
  264. " field_e: OK,\n"
  265. " field_f: OK\n"
  266. " >\n"
  267. " field_g: OK\n"
  268. ">;");
  269. verifyFormat("option (MyProto.options) = <\n"
  270. " field_a: \"OK\"\n"
  271. " msg_field: <\n"
  272. " field_b: OK\n"
  273. " field_c: OK\n"
  274. " field_d: OK\n"
  275. " field_e: OK\n"
  276. " field_f: OK\n"
  277. " >\n"
  278. " field_g: OK\n"
  279. ">;");
  280. verifyFormat("option (MyProto.options) = <\n"
  281. " field_a: \"OK\"\n"
  282. " msg_field: {\n"
  283. " field_b: OK\n"
  284. " field_c: OK\n"
  285. " field_d: OK\n"
  286. " field_e: OK\n"
  287. " field_f: OK\n"
  288. " }\n"
  289. " field_g: OK\n"
  290. ">;");
  291. verifyFormat("option (MyProto.options) = <\n"
  292. " field_a: \"OK\"\n"
  293. " msg_field {\n"
  294. " field_b: OK\n"
  295. " field_c: OK\n"
  296. " field_d: OK\n"
  297. " field_e: OK\n"
  298. " field_f: OK\n"
  299. " }\n"
  300. " field_g: OK\n"
  301. ">;");
  302. verifyFormat("option (MyProto.options) = {\n"
  303. " field_a: \"OK\"\n"
  304. " msg_field <\n"
  305. " field_b: OK\n"
  306. " field_c: OK\n"
  307. " field_d: OK\n"
  308. " field_e: OK\n"
  309. " field_f: OK\n"
  310. " >\n"
  311. " field_g: OK\n"
  312. "};");
  313. verifyFormat("option (MyProto.options) = {\n"
  314. " field_a: \"OK\"\n"
  315. " msg_field: <\n"
  316. " field_b: OK\n"
  317. " field_c: OK\n"
  318. " field_d: OK\n"
  319. " field_e: OK\n"
  320. " field_f: OK\n"
  321. " >\n"
  322. " field_g: OK\n"
  323. "};");
  324. verifyFormat("option (MyProto.options) = <\n"
  325. " field_a: \"OK\"\n"
  326. " msg_field {\n"
  327. " field_b: OK\n"
  328. " field_c: OK\n"
  329. " field_d: OK\n"
  330. " msg_field <\n"
  331. " field_A: 1\n"
  332. " field_B: 2\n"
  333. " field_C: 3\n"
  334. " field_D: 4\n"
  335. " field_E: 5\n"
  336. " >\n"
  337. " msg_field < field_A: 1 field_B: 2 field_C: 3 f_D: 4 >\n"
  338. " field_e: OK\n"
  339. " field_f: OK\n"
  340. " }\n"
  341. " field_g: OK\n"
  342. ">;");
  343. verifyFormat("option (MyProto.options) = <\n"
  344. " data1 < key1: value1 >\n"
  345. " data2 { key2: value2 }\n"
  346. ">;");
  347. verifyFormat("option (MyProto.options) = <\n"
  348. " app_id: 'com.javax.swing.salsa.latino'\n"
  349. " head_id: 1\n"
  350. " data < key: value >\n"
  351. ">;");
  352. verifyFormat("option (MyProto.options) = {\n"
  353. " app_id: 'com.javax.swing.salsa.latino'\n"
  354. " head_id: 1\n"
  355. " headheadheadheadheadhead_id: 1\n"
  356. " product_data { product { 1 } }\n"
  357. "};");
  358. }
  359. TEST_F(FormatTestProto, FormatsService) {
  360. verifyFormat("service SearchService {\n"
  361. " rpc Search(SearchRequest) returns (SearchResponse) {\n"
  362. " option foo = true;\n"
  363. " }\n"
  364. "};");
  365. }
  366. TEST_F(FormatTestProto, ExtendingMessage) {
  367. verifyFormat("extend .foo.Bar {\n"
  368. "}");
  369. }
  370. TEST_F(FormatTestProto, FormatsImports) {
  371. verifyFormat("import \"a.proto\";\n"
  372. "import \"b.proto\";\n"
  373. "// comment\n"
  374. "message A {\n"
  375. "}");
  376. verifyFormat("import public \"a.proto\";\n"
  377. "import \"b.proto\";\n"
  378. "// comment\n"
  379. "message A {\n"
  380. "}");
  381. // Missing semicolons should not confuse clang-format.
  382. verifyFormat("import \"a.proto\"\n"
  383. "import \"b.proto\"\n"
  384. "// comment\n"
  385. "message A {\n"
  386. "}");
  387. }
  388. TEST_F(FormatTestProto, KeepsLongStringLiteralsOnSameLine) {
  389. verifyFormat(
  390. "option (MyProto.options) = {\n"
  391. " foo: {\n"
  392. " text: \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasaaaaaaaa\"\n"
  393. " }\n"
  394. "}");
  395. }
  396. TEST_F(FormatTestProto, FormatsOptionsExtensions) {
  397. verifyFormat("option (MyProto.options) = {\n"
  398. " msg_field: { field_d: 123 }\n"
  399. " [ext.t/u] { key: value }\n"
  400. " key: value\n"
  401. " [t.u/v] <\n"
  402. " [ext] { key: value }\n"
  403. " >\n"
  404. "};");
  405. }
  406. TEST_F(FormatTestProto, SpacesAroundPercents) {
  407. verifyFormat("option (MyProto.options) = {\n"
  408. " key: %lld\n"
  409. " key: 0x%04x\n"
  410. " key: \"%d %d\"\n"
  411. "};");
  412. }
  413. TEST_F(FormatTestProto, FormatsRepeatedListInitializersInOptions) {
  414. verifyFormat("option (MyProto.options) = {\n"
  415. " key: item\n"
  416. " keys: [\n"
  417. " 'ala',\n"
  418. " 'bala',\n"
  419. " 'porto',\n"
  420. " 'kala',\n"
  421. " 'too',\n"
  422. " 'long',\n"
  423. " 'long',\n"
  424. " 'long'\n"
  425. " ]\n"
  426. " key: [ item ]\n"
  427. " msg {\n"
  428. " key: item\n"
  429. " keys: [\n"
  430. " 'ala',\n"
  431. " 'bala',\n"
  432. " 'porto',\n"
  433. " 'kala',\n"
  434. " 'too',\n"
  435. " 'long',\n"
  436. " 'long'\n"
  437. " ]\n"
  438. " }\n"
  439. " key: value\n"
  440. "};");
  441. }
  442. TEST_F(FormatTestProto, AcceptsOperatorAsKeyInOptions) {
  443. verifyFormat("option (MyProto.options) = {\n"
  444. " bbbbbbbbb: <\n"
  445. " ccccccccccccccccccccccc: <\n"
  446. " operator: 1\n"
  447. " operator: 2\n"
  448. " operator: 3\n"
  449. " operator { key: value }\n"
  450. " >\n"
  451. " >\n"
  452. "};");
  453. }
  454. TEST_F(FormatTestProto, BreaksEntriesOfSubmessagesContainingSubmessages) {
  455. FormatStyle Style = getGoogleStyle(FormatStyle::LK_TextProto);
  456. Style.ColumnLimit = 60;
  457. // The column limit allows for the keys submessage to be put on 1 line, but we
  458. // break it since it contains a submessage an another entry.
  459. verifyFormat("option (MyProto.options) = {\n"
  460. " key: valueeeeeeee\n"
  461. " keys: {\n"
  462. " item: 'aaaaaaaaaaaaaaaa'\n"
  463. " sub <>\n"
  464. " }\n"
  465. "}");
  466. verifyFormat("option (MyProto.options) = {\n"
  467. " key: valueeeeeeee\n"
  468. " keys: {\n"
  469. " item: 'aaaaaaaaaaaaaaaa'\n"
  470. " sub {}\n"
  471. " }\n"
  472. "}");
  473. verifyFormat("option (MyProto.options) = {\n"
  474. " key: valueeeeeeee\n"
  475. " keys: {\n"
  476. " sub {}\n"
  477. " sub: <>\n"
  478. " sub: []\n"
  479. " }\n"
  480. "}");
  481. verifyFormat("option (MyProto.options) = {\n"
  482. " key: valueeeeeeee\n"
  483. " keys: {\n"
  484. " item: 'aaaaaaaaaaa'\n"
  485. " sub { msg: 1 }\n"
  486. " }\n"
  487. "}");
  488. verifyFormat("option (MyProto.options) = {\n"
  489. " key: valueeeeeeee\n"
  490. " keys: {\n"
  491. " item: 'aaaaaaaaaaa'\n"
  492. " sub: { msg: 1 }\n"
  493. " }\n"
  494. "}");
  495. verifyFormat("option (MyProto.options) = {\n"
  496. " key: valueeeeeeee\n"
  497. " keys: {\n"
  498. " item: 'aaaaaaaaaaa'\n"
  499. " sub < msg: 1 >\n"
  500. " }\n"
  501. "}");
  502. verifyFormat("option (MyProto.options) = {\n"
  503. " key: valueeeeeeee\n"
  504. " keys: {\n"
  505. " item: 'aaaaaaaaaaa'\n"
  506. " sub: [ msg: 1 ]\n"
  507. " }\n"
  508. "}");
  509. verifyFormat("option (MyProto.options) = {\n"
  510. " key: valueeeeeeee\n"
  511. " keys: <\n"
  512. " item: 'aaaaaaaaaaa'\n"
  513. " sub: [ 1, 2 ]\n"
  514. " >\n"
  515. "}");
  516. verifyFormat("option (MyProto.options) = {\n"
  517. " key: valueeeeeeee\n"
  518. " keys: {\n"
  519. " sub {}\n"
  520. " item: 'aaaaaaaaaaaaaaaa'\n"
  521. " }\n"
  522. "}");
  523. verifyFormat("option (MyProto.options) = {\n"
  524. " key: valueeeeeeee\n"
  525. " keys: {\n"
  526. " sub: []\n"
  527. " item: 'aaaaaaaaaaaaaaaa'\n"
  528. " }\n"
  529. "}");
  530. verifyFormat("option (MyProto.options) = {\n"
  531. " key: valueeeeeeee\n"
  532. " keys: {\n"
  533. " sub <>\n"
  534. " item: 'aaaaaaaaaaaaaaaa'\n"
  535. " }\n"
  536. "}");
  537. verifyFormat("option (MyProto.options) = {\n"
  538. " key: valueeeeeeee\n"
  539. " keys: {\n"
  540. " sub { key: value }\n"
  541. " item: 'aaaaaaaaaaaaaaaa'\n"
  542. " }\n"
  543. "}");
  544. verifyFormat("option (MyProto.options) = {\n"
  545. " key: valueeeeeeee\n"
  546. " keys: {\n"
  547. " sub: [ 1, 2 ]\n"
  548. " item: 'aaaaaaaaaaaaaaaa'\n"
  549. " }\n"
  550. "}");
  551. verifyFormat("option (MyProto.options) = {\n"
  552. " key: valueeeeeeee\n"
  553. " keys: {\n"
  554. " sub < sub_2: {} >\n"
  555. " item: 'aaaaaaaaaaaaaaaa'\n"
  556. " }\n"
  557. "}");
  558. verifyFormat("option (MyProto.options) = {\n"
  559. " key: valueeeeeeee\n"
  560. " keys: {\n"
  561. " item: data\n"
  562. " sub: [ 1, 2 ]\n"
  563. " item: 'aaaaaaaaaaaaaaaa'\n"
  564. " }\n"
  565. "}");
  566. verifyFormat("option (MyProto.options) = {\n"
  567. " key: valueeeeeeee\n"
  568. " keys: {\n"
  569. " item: data\n"
  570. " sub < sub_2: {} >\n"
  571. " item: 'aaaaaaaaaaaaaaaa'\n"
  572. " }\n"
  573. "}");
  574. verifyFormat("option (MyProto.options) = {\n"
  575. " sub: {\n"
  576. " key: valueeeeeeee\n"
  577. " keys: {\n"
  578. " sub: [ 1, 2 ]\n"
  579. " item: 'aaaaaaaaaaaaaaaa'\n"
  580. " }\n"
  581. " }\n"
  582. "}");
  583. }
  584. } // end namespace tooling
  585. } // end namespace clang