FormatTestProto.cpp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414
  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. 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) {
  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(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, UnderstandsReturns) {
  100. verifyFormat("rpc Search(SearchRequest) returns (SearchResponse);");
  101. }
  102. TEST_F(FormatTestProto, MessageFieldAttributes) {
  103. verifyFormat("optional string test = 1 [default = \"test\"];");
  104. verifyFormat("optional bool a = 1 [default = true, deprecated = true];");
  105. verifyFormat("optional LongMessageType long_proto_field = 1 [\n"
  106. " default = REALLY_REALLY_LONG_CONSTANT_VALUE,\n"
  107. " deprecated = true\n"
  108. "];");
  109. verifyFormat("optional LongMessageType long_proto_field = 1\n"
  110. " [default = REALLY_REALLY_LONG_CONSTANT_VALUE];");
  111. verifyFormat("repeated double value = 1\n"
  112. " [(aaaaaaa.aaaaaaaaa) = {aaaaaaaaaaaaaaaaa: AAAAAAAA}];");
  113. verifyFormat("repeated double value = 1 [(aaaaaaa.aaaaaaaaa) = {\n"
  114. " aaaaaaaaaaaaaaaa: AAAAAAAAAA,\n"
  115. " bbbbbbbbbbbbbbbb: BBBBBBBBBB\n"
  116. "}];");
  117. verifyFormat("repeated double value = 1 [(aaaaaaa.aaaaaaaaa) = {\n"
  118. " aaaaaaaaaaaaaaaa: AAAAAAAAAA\n"
  119. " bbbbbbbbbbbbbbbb: BBBBBBBBBB\n"
  120. "}];");
  121. verifyFormat("repeated double value = 1 [\n"
  122. " (aaaaaaa.aaaaaaaaa) = {\n"
  123. " aaaaaaaaaaaaaaaa: AAAAAAAAAA\n"
  124. " bbbbbbbbbbbbbbbb: BBBBBBBBBB\n"
  125. " },\n"
  126. " (bbbbbbb.bbbbbbbbb) = {\n"
  127. " aaaaaaaaaaaaaaaa: AAAAAAAAAA\n"
  128. " bbbbbbbbbbbbbbbb: BBBBBBBBBB\n"
  129. " }\n"
  130. "];");
  131. verifyFormat("repeated double value = 1 [(aaaaaaa.aaaaaaaaa) = {\n"
  132. " type: \"AAAAAAAAAA\"\n"
  133. " is: \"AAAAAAAAAA\"\n"
  134. " or: \"BBBBBBBBBB\"\n"
  135. "}];");
  136. verifyFormat("repeated double value = 1 [(aaaaaaa.aaaaaaaaa) = {\n"
  137. " aaaaaaaaaaaaaaaa: AAAAAAAAAA,\n"
  138. " bbbbbbb: BBBB,\n"
  139. " bbbb: BBB\n"
  140. "}];");
  141. verifyFormat("optional AAA aaa = 1 [\n"
  142. " foo = {\n"
  143. " key: 'a' //\n"
  144. " },\n"
  145. " bar = {\n"
  146. " key: 'a' //\n"
  147. " }\n"
  148. "];");
  149. verifyFormat("optional string test = 1 [default =\n"
  150. " \"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. }
  160. TEST_F(FormatTestProto, DoesntWrapFileOptions) {
  161. EXPECT_EQ(
  162. "option java_package = "
  163. "\"some.really.long.package.that.exceeds.the.column.limit\";",
  164. format("option java_package = "
  165. "\"some.really.long.package.that.exceeds.the.column.limit\";"));
  166. }
  167. TEST_F(FormatTestProto, FormatsOptions) {
  168. verifyFormat("option (MyProto.options) = {\n"
  169. " field_a: OK\n"
  170. " field_b: \"OK\"\n"
  171. " field_c: \"OK\"\n"
  172. " msg_field: {field_d: 123}\n"
  173. "};");
  174. verifyFormat("option (MyProto.options) = {\n"
  175. " field_a: OK\n"
  176. " field_b: \"OK\"\n"
  177. " field_c: \"OK\"\n"
  178. " msg_field: {field_d: 123 field_e: OK}\n"
  179. "};");
  180. verifyFormat("option (MyProto.options) = {\n"
  181. " field_a: OK // Comment\n"
  182. " field_b: \"OK\"\n"
  183. " field_c: \"OK\"\n"
  184. " msg_field: {field_d: 123}\n"
  185. "};");
  186. verifyFormat("option (MyProto.options) = {\n"
  187. " field_c: \"OK\"\n"
  188. " msg_field {field_d: 123}\n"
  189. "};");
  190. verifyFormat("option (MyProto.options) = {\n"
  191. " field_a: OK\n"
  192. " field_b {field_c: OK}\n"
  193. " field_d: OKOKOK\n"
  194. " field_e: OK\n"
  195. "}");
  196. // Support syntax with <> instead of {}.
  197. verifyFormat("option (MyProto.options) = {\n"
  198. " field_c: \"OK\",\n"
  199. " msg_field: <field_d: 123>\n"
  200. "};");
  201. verifyFormat("option (MyProto.options) = {\n"
  202. " field_a: OK\n"
  203. " field_b <field_c: OK>\n"
  204. " field_d: OKOKOK\n"
  205. " field_e: OK\n"
  206. "}");
  207. verifyFormat("option (MyProto.options) = {\n"
  208. " msg_field: <>\n"
  209. " field_c: \"OK\",\n"
  210. " msg_field: <field_d: 123>\n"
  211. " field_e: OK\n"
  212. " msg_field: <field_d: 12>\n"
  213. "};");
  214. verifyFormat("option (MyProto.options) = <\n"
  215. " field_a: OK\n"
  216. " field_b: \"OK\"\n"
  217. " field_c: 1\n"
  218. " field_d: 12.5\n"
  219. " field_e: OK\n"
  220. ">;");
  221. verifyFormat("option (MyProto.options) = <\n"
  222. " field_a: OK,\n"
  223. " field_b: \"OK\",\n"
  224. " field_c: 1,\n"
  225. " field_d: 12.5,\n"
  226. " field_e: OK,\n"
  227. ">;");
  228. verifyFormat("option (MyProto.options) = <\n"
  229. " field_a: \"OK\"\n"
  230. " msg_field: {field_b: OK}\n"
  231. " field_g: OK\n"
  232. " field_g: OK\n"
  233. " field_g: OK\n"
  234. ">;");
  235. verifyFormat("option (MyProto.options) = <\n"
  236. " field_a: \"OK\"\n"
  237. " msg_field <\n"
  238. " field_b: OK\n"
  239. " field_c: OK\n"
  240. " field_d: OK\n"
  241. " field_e: OK\n"
  242. " field_f: OK\n"
  243. " >\n"
  244. " field_g: OK\n"
  245. ">;");
  246. verifyFormat("option (MyProto.options) = <\n"
  247. " field_a: \"OK\"\n"
  248. " msg_field <\n"
  249. " field_b: OK,\n"
  250. " field_c: OK,\n"
  251. " field_d: OK,\n"
  252. " field_e: OK,\n"
  253. " field_f: OK\n"
  254. " >\n"
  255. " field_g: OK\n"
  256. ">;");
  257. verifyFormat("option (MyProto.options) = <\n"
  258. " field_a: \"OK\"\n"
  259. " msg_field: <\n"
  260. " field_b: OK\n"
  261. " field_c: OK\n"
  262. " field_d: OK\n"
  263. " field_e: OK\n"
  264. " field_f: OK\n"
  265. " >\n"
  266. " field_g: OK\n"
  267. ">;");
  268. verifyFormat("option (MyProto.options) = <\n"
  269. " field_a: \"OK\"\n"
  270. " msg_field: {\n"
  271. " field_b: OK\n"
  272. " field_c: OK\n"
  273. " field_d: OK\n"
  274. " field_e: OK\n"
  275. " field_f: OK\n"
  276. " }\n"
  277. " field_g: OK\n"
  278. ">;");
  279. verifyFormat("option (MyProto.options) = <\n"
  280. " field_a: \"OK\"\n"
  281. " msg_field {\n"
  282. " field_b: OK\n"
  283. " field_c: OK\n"
  284. " field_d: OK\n"
  285. " field_e: OK\n"
  286. " field_f: OK\n"
  287. " }\n"
  288. " field_g: OK\n"
  289. ">;");
  290. verifyFormat("option (MyProto.options) = {\n"
  291. " field_a: \"OK\"\n"
  292. " msg_field <\n"
  293. " field_b: OK\n"
  294. " field_c: OK\n"
  295. " field_d: OK\n"
  296. " field_e: OK\n"
  297. " field_f: OK\n"
  298. " >\n"
  299. " field_g: OK\n"
  300. "};");
  301. verifyFormat("option (MyProto.options) = {\n"
  302. " field_a: \"OK\"\n"
  303. " msg_field: <\n"
  304. " field_b: OK\n"
  305. " field_c: OK\n"
  306. " field_d: OK\n"
  307. " field_e: OK\n"
  308. " field_f: OK\n"
  309. " >\n"
  310. " field_g: OK\n"
  311. "};");
  312. verifyFormat("option (MyProto.options) = <\n"
  313. " field_a: \"OK\"\n"
  314. " msg_field {\n"
  315. " field_b: OK\n"
  316. " field_c: OK\n"
  317. " field_d: OK\n"
  318. " msg_field <\n"
  319. " field_A: 1\n"
  320. " field_B: 2\n"
  321. " field_C: 3\n"
  322. " field_D: 4\n"
  323. " field_E: 5\n"
  324. " >\n"
  325. " msg_field <field_A: 1 field_B: 2 field_C: 3 field_D: 4>\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. " data1 <key1: value1>\n"
  333. " data2 {key2: value2}\n"
  334. ">;");
  335. verifyFormat("option (MyProto.options) = <\n"
  336. " app_id: 'com.javax.swing.salsa.latino'\n"
  337. " head_id: 1\n"
  338. " data <key: value>\n"
  339. ">;");
  340. verifyFormat("option (MyProto.options) = {\n"
  341. " app_id: 'com.javax.swing.salsa.latino'\n"
  342. " head_id: 1\n"
  343. " headheadheadheadheadhead_id: 1\n"
  344. " product_data {product {1}}\n"
  345. "};");
  346. }
  347. TEST_F(FormatTestProto, FormatsService) {
  348. verifyFormat("service SearchService {\n"
  349. " rpc Search(SearchRequest) returns (SearchResponse) {\n"
  350. " option foo = true;\n"
  351. " }\n"
  352. "};");
  353. }
  354. TEST_F(FormatTestProto, ExtendingMessage) {
  355. verifyFormat("extend .foo.Bar {\n"
  356. "}");
  357. }
  358. TEST_F(FormatTestProto, FormatsImports) {
  359. verifyFormat("import \"a.proto\";\n"
  360. "import \"b.proto\";\n"
  361. "// comment\n"
  362. "message A {\n"
  363. "}");
  364. verifyFormat("import public \"a.proto\";\n"
  365. "import \"b.proto\";\n"
  366. "// comment\n"
  367. "message A {\n"
  368. "}");
  369. // Missing semicolons should not confuse clang-format.
  370. verifyFormat("import \"a.proto\"\n"
  371. "import \"b.proto\"\n"
  372. "// comment\n"
  373. "message A {\n"
  374. "}");
  375. }
  376. } // end namespace tooling
  377. } // end namespace clang