FormatTestTextProto.cpp 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  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) {
  30. FormatStyle Style = getGoogleStyle(FormatStyle::LK_TextProto);
  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(FormatTestTextProto, KeepsTopLevelEntriesFittingALine) {
  39. verifyFormat("field_a: OK field_b: OK field_c: OK field_d: OK field_e: OK");
  40. }
  41. TEST_F(FormatTestTextProto, SupportsMessageFields) {
  42. verifyFormat("msg_field: {}");
  43. verifyFormat("msg_field: {field_a: A}");
  44. verifyFormat("msg_field: {field_a: \"OK\" field_b: 123}");
  45. verifyFormat("msg_field: {\n"
  46. " field_a: 1\n"
  47. " field_b: OK\n"
  48. " field_c: \"OK\"\n"
  49. " field_d: 123\n"
  50. " field_e: 23\n"
  51. "}");
  52. verifyFormat("msg_field{}");
  53. verifyFormat("msg_field{field_a: A}");
  54. verifyFormat("msg_field{field_a: \"OK\" field_b: 123}");
  55. verifyFormat("msg_field{\n"
  56. " field_a: 1\n"
  57. " field_b: OK\n"
  58. " field_c: \"OK\"\n"
  59. " field_d: 123\n"
  60. " field_e: 23.0\n"
  61. " field_f: false\n"
  62. " field_g: 'lala'\n"
  63. " field_h: 1234.567e-89\n"
  64. "}");
  65. verifyFormat("msg_field: {msg_field{field_a: 1}}");
  66. verifyFormat("id: \"ala.bala\"\n"
  67. "item{type: ITEM_A rank: 1 score: 90.0}\n"
  68. "item{type: ITEM_B rank: 2 score: 70.5}\n"
  69. "item{\n"
  70. " type: ITEM_A\n"
  71. " rank: 3\n"
  72. " score: 20.0\n"
  73. " description: \"the third item has a description\"\n"
  74. "}");
  75. }
  76. TEST_F(FormatTestTextProto, AvoidsTopLevelBinPacking) {
  77. verifyFormat("field_a: OK\n"
  78. "field_b: OK\n"
  79. "field_c: OK\n"
  80. "field_d: OK\n"
  81. "field_e: OK\n"
  82. "field_f: OK");
  83. verifyFormat("field_a: OK\n"
  84. "field_b: \"OK\"\n"
  85. "field_c: \"OK\"\n"
  86. "msg_field: {field_d: 123}\n"
  87. "field_e: OK\n"
  88. "field_f: OK");
  89. verifyFormat("field_a: OK\n"
  90. "field_b: \"OK\"\n"
  91. "field_c: \"OK\"\n"
  92. "msg_field: {field_d: 123 field_e: OK}");
  93. verifyFormat("a: {\n"
  94. " field_a: OK\n"
  95. " field_b{field_c: OK}\n"
  96. " field_d: OKOKOK\n"
  97. " field_e: OK\n"
  98. "}");
  99. verifyFormat("field_a: OK,\n"
  100. "field_b{field_c: OK},\n"
  101. "field_d: OKOKOK,\n"
  102. "field_e: OK");
  103. }
  104. TEST_F(FormatTestTextProto, AddsNewlinesAfterTrailingComments) {
  105. verifyFormat("field_a: OK // Comment\n"
  106. "field_b: 1");
  107. verifyFormat("field_a: OK\n"
  108. "msg_field: {\n"
  109. " field_b: OK // Comment\n"
  110. "}");
  111. verifyFormat("field_a: OK\n"
  112. "msg_field{\n"
  113. " field_b: OK // Comment\n"
  114. "}");
  115. }
  116. TEST_F(FormatTestTextProto, SupportsAngleBracketMessageFields) {
  117. // Single-line tests
  118. verifyFormat("msg_field<>");
  119. verifyFormat("msg_field: <>");
  120. verifyFormat("msg_field<field_a: OK>");
  121. verifyFormat("msg_field: <field_a: 123>");
  122. verifyFormat("msg_field<field_a<>>");
  123. verifyFormat("msg_field<field_a<field_b<>>>");
  124. verifyFormat("msg_field: <field_a<field_b: <>>>");
  125. verifyFormat("msg_field<field_a: OK, field_b: \"OK\">");
  126. verifyFormat("msg_field<field_a: OK field_b: <>, field_c: OK>");
  127. verifyFormat("msg_field<field_a{field_b: 1}, field_c: <field_d: 2>>");
  128. verifyFormat("msg_field: <field_a: OK, field_b: \"OK\">");
  129. verifyFormat("msg_field: <field_a: OK field_b: <>, field_c: OK>");
  130. verifyFormat("msg_field: <field_a{field_b: 1}, field_c: <field_d: 2>>");
  131. verifyFormat("field_a: \"OK\", msg_field: <field_b: 123>, field_c: {}");
  132. verifyFormat("field_a<field_b: 1>, msg_field: <field_b: 123>, field_c<>");
  133. verifyFormat("field_a<field_b: 1> msg_field: <field_b: 123> field_c<>");
  134. verifyFormat("field<field<field: <>>, field<>> field: <field: 1>");
  135. // Multiple lines tests
  136. verifyFormat("msg_field<\n"
  137. " field_a: OK\n"
  138. " field_b: \"OK\"\n"
  139. " field_c: 1\n"
  140. " field_d: 12.5\n"
  141. " field_e: OK\n"
  142. ">");
  143. verifyFormat("msg_field: <>\n"
  144. "field_c: \"OK\",\n"
  145. "msg_field: <field_d: 123>\n"
  146. "field_e: OK\n"
  147. "msg_field: <field_d: 12>");
  148. verifyFormat("field_a: OK,\n"
  149. "field_b<field_c: OK>,\n"
  150. "field_d: <12.5>,\n"
  151. "field_e: OK");
  152. verifyFormat("field_a: OK\n"
  153. "field_b<field_c: OK>\n"
  154. "field_d: <12.5>\n"
  155. "field_e: OKOKOK");
  156. verifyFormat("msg_field<\n"
  157. " field_a: OK,\n"
  158. " field_b<field_c: OK>,\n"
  159. " field_d: <12.5>,\n"
  160. " field_e: OK\n"
  161. ">");
  162. verifyFormat("msg_field<\n"
  163. " field_a: <field: OK>,\n"
  164. " field_b<field_c: OK>,\n"
  165. " field_d: <12.5>,\n"
  166. " field_e: OK,\n"
  167. ">");
  168. verifyFormat("msg_field: <\n"
  169. " field_a: \"OK\"\n"
  170. " msg_field: {field_b: OK}\n"
  171. " field_g: OK\n"
  172. " field_g: OK\n"
  173. " field_g: OK\n"
  174. ">");
  175. verifyFormat("field_a{\n"
  176. " field_d: ok\n"
  177. " field_b: <field_c: 1>\n"
  178. " field_d: ok\n"
  179. " field_d: ok\n"
  180. "}");
  181. verifyFormat("field_a: {\n"
  182. " field_d: ok\n"
  183. " field_b: <field_c: 1>\n"
  184. " field_d: ok\n"
  185. " field_d: ok\n"
  186. "}");
  187. verifyFormat("field_a: <f1: 1, f2: <>>\n"
  188. "field_b<\n"
  189. " field_b1: <>\n"
  190. " field_b2: ok,\n"
  191. " field_b3: <\n"
  192. " field_x{} // Comment\n"
  193. " field_y: {field_z: 1}\n"
  194. " field_w: ok\n"
  195. " >\n"
  196. " field{\n"
  197. " field_x<> // Comment\n"
  198. " field_y: <field_z: 1>\n"
  199. " field_w: ok\n"
  200. " msg_field: <\n"
  201. " field: <>\n"
  202. " field: <field: 1>\n"
  203. " field: <field: 2>\n"
  204. " field: <field: 3>\n"
  205. " field: <field: 4>\n"
  206. " field: ok\n"
  207. " >\n"
  208. " }\n"
  209. ">\n"
  210. "field: OK,\n"
  211. "field_c<field<field<>>>");
  212. }
  213. } // end namespace tooling
  214. } // end namespace clang