FormatTestProto.cpp 23 KB

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