brintos

brintos / llvm-project-archived public Read only

0
0
Text · 22.8 KiB · 6cddb83 Raw
728 lines · cpp
1//===- unittest/Format/FormatTestTextProto.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-exception6//7//===----------------------------------------------------------------------===//8 9#include "FormatTestBase.h"10 11#define DEBUG_TYPE "format-test-text-proto"12 13namespace clang {14namespace format {15namespace test {16namespace {17 18class FormatTestTextProto : public FormatTestBase {19protected:20  virtual FormatStyle getDefaultStyle() const override {21    return getTextProtoStyleWithColumns(60);22  }23};24 25TEST_F(FormatTestTextProto, KeepsTopLevelEntriesFittingALine) {26  verifyFormat("field_a: OK field_b: OK field_c: OK field_d: OK field_e: OK");27}28 29TEST_F(FormatTestTextProto, SupportsMessageFields) {30  verifyFormat("msg_field: {}");31 32  verifyFormat("msg_field: { field_a: A }");33 34  verifyFormat("msg_field: { field_a: \"OK\" field_b: 123 }");35 36  verifyFormat("msg_field: {\n"37               "  field_a: 1\n"38               "  field_b: OK\n"39               "  field_c: \"OK\"\n"40               "  field_d: 123\n"41               "  field_e: 23\n"42               "}");43 44  verifyFormat("msg_field {}");45 46  verifyFormat("msg_field { field_a: A }");47 48  verifyFormat("msg_field { field_a: \"OK\" field_b: 123 }");49 50  verifyFormat("msg_field {\n"51               "  field_a: 1\n"52               "  field_b: OK\n"53               "  field_c: \"OK\"\n"54               "  field_d: 123\n"55               "  field_e: 23.0\n"56               "  field_f: false\n"57               "  field_g: 'lala'\n"58               "  field_h: 1234.567e-89\n"59               "}");60 61  verifyFormat("msg_field: { msg_field { field_a: 1 } }");62 63  verifyFormat("id: \"ala.bala\"\n"64               "item { type: ITEM_A rank: 1 score: 90.0 }\n"65               "item { type: ITEM_B rank: 2 score: 70.5 }\n"66               "item {\n"67               "  type: ITEM_A\n"68               "  rank: 3\n"69               "  score: 20.0\n"70               "  description: \"the third item has a description\"\n"71               "}");72}73 74TEST_F(FormatTestTextProto, AvoidsTopLevelBinPacking) {75  verifyFormat("field_a: OK\n"76               "field_b: OK\n"77               "field_c: OK\n"78               "field_d: OK\n"79               "field_e: OK\n"80               "field_f: OK");81 82  verifyFormat("field_a: OK\n"83               "field_b: \"OK\"\n"84               "field_c: \"OK\"\n"85               "msg_field: { field_d: 123 }\n"86               "field_e: OK\n"87               "field_f: OK");88 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 94  verifyFormat("a: {\n"95               "  field_a: OK\n"96               "  field_b { field_c: OK }\n"97               "  field_d: OKOKOK\n"98               "  field_e: OK\n"99               "}");100 101  verifyFormat("field_a: OK,\n"102               "field_b { field_c: OK },\n"103               "field_d: OKOKOK,\n"104               "field_e: OK");105}106 107TEST_F(FormatTestTextProto, AddsNewlinesAfterTrailingComments) {108  verifyFormat("field_a: OK  // Comment\n"109               "field_b: 1");110 111  verifyFormat("field_a: OK\n"112               "msg_field: {\n"113               "  field_b: OK  // Comment\n"114               "}");115 116  verifyFormat("field_a: OK\n"117               "msg_field {\n"118               "  field_b: OK  // Comment\n"119               "}");120}121 122TEST_F(FormatTestTextProto, ImplicitStringLiteralConcatenation) {123  verifyFormat("field_a: 'aaaaa'\n"124               "         'bbbbb'");125  verifyFormat("field_a: \"aaaaa\"\n"126               "         \"bbbbb\"");127 128  auto Style = getDefaultStyle();129  Style.AlwaysBreakBeforeMultilineStrings = true;130  verifyFormat("field_a:\n"131               "    'aaaaa'\n"132               "    'bbbbb'",133               Style);134  verifyFormat("field_a:\n"135               "    \"aaaaa\"\n"136               "    \"bbbbb\"",137               Style);138}139 140TEST_F(FormatTestTextProto, SupportsAngleBracketMessageFields) {141  // Single-line tests142  verifyFormat("msg_field <>");143  verifyFormat("msg_field: <>");144  verifyFormat("msg_field < field_a: OK >");145  verifyFormat("msg_field: < field_a: 123 >");146  verifyFormat("msg_field < field_a <> >");147  verifyFormat("msg_field < field_a < field_b <> > >");148  verifyFormat("msg_field: < field_a < field_b: <> > >");149  verifyFormat("msg_field < field_a: OK, field_b: \"OK\" >");150  verifyFormat("msg_field: < field_a: OK, field_b: \"OK\" >");151  // Multiple lines tests152  verifyFormat("msg_field <\n"153               "  field_a: OK\n"154               "  field_b: <>,\n"155               "  field_c: OK\n"156               ">");157 158  verifyFormat("msg_field <\n"159               "  field_a { field_b: 1 },\n"160               "  field_c: < f_d: 2 >\n"161               ">");162 163  verifyFormat("msg_field: <\n"164               "  field_a: OK\n"165               "  field_b: <>,\n"166               "  field_c: OK\n"167               ">");168 169  verifyFormat("msg_field: <\n"170               "  field_a { field_b: 1 },\n"171               "  field_c: < fd_d: 2 >\n"172               ">");173 174  verifyFormat("field_a: \"OK\",\n"175               "msg_field: < field_b: 123 >,\n"176               "field_c: {}");177 178  verifyFormat("field_a < field_b: 1 >,\n"179               "msg_fid: < fiel_b: 123 >,\n"180               "field_c <>");181 182  verifyFormat("field_a < field_b: 1 >\n"183               "msg_fied: < field_b: 123 >\n"184               "field_c <>");185 186  verifyFormat("field <\n"187               "  field < field: <> >,\n"188               "  field <>\n"189               ">\n"190               "field: < field: 1 >");191 192  verifyFormat("msg_field <\n"193               "  field_a: OK\n"194               "  field_b: \"OK\"\n"195               "  field_c: 1\n"196               "  field_d: 12.5\n"197               "  field_e: OK\n"198               ">");199 200  verifyFormat("msg_field: <>\n"201               "field_c: \"OK\",\n"202               "msg_field: < field_d: 123 >\n"203               "field_e: OK\n"204               "msg_field: < field_d: 12 >");205 206  verifyFormat("field_a: OK,\n"207               "field_b < field_c: OK >,\n"208               "field_d: < 12.5 >,\n"209               "field_e: OK");210 211  verifyFormat("field_a: OK\n"212               "field_b < field_c: OK >\n"213               "field_d: < 12.5 >\n"214               "field_e: OKOKOK");215 216  verifyFormat("msg_field <\n"217               "  field_a: OK,\n"218               "  field_b < field_c: OK >,\n"219               "  field_d: < 12.5 >,\n"220               "  field_e: OK\n"221               ">");222 223  verifyFormat("msg_field <\n"224               "  field_a: < field: OK >,\n"225               "  field_b < field_c: OK >,\n"226               "  field_d: < 12.5 >,\n"227               "  field_e: OK,\n"228               ">");229 230  verifyFormat("msg_field: <\n"231               "  field_a: \"OK\"\n"232               "  msg_field: { field_b: OK }\n"233               "  field_g: OK\n"234               "  field_g: OK\n"235               "  field_g: OK\n"236               ">");237 238  verifyFormat("field_a {\n"239               "  field_d: ok\n"240               "  field_b: < field_c: 1 >\n"241               "  field_d: ok\n"242               "  field_d: ok\n"243               "}");244 245  verifyFormat("field_a: {\n"246               "  field_d: ok\n"247               "  field_b: < field_c: 1 >\n"248               "  field_d: ok\n"249               "  field_d: ok\n"250               "}");251 252  verifyFormat("field_a: <\n"253               "  f1: 1,\n"254               "  f2: <>\n"255               ">\n"256               "field_b <\n"257               "  field_b1: <>\n"258               "  field_b2: ok,\n"259               "  field_b3: <\n"260               "    field_x {}  // Comment\n"261               "    field_y: { field_z: 1 }\n"262               "    field_w: ok\n"263               "  >\n"264               "  field {\n"265               "    field_x <>  // Comment\n"266               "    field_y: < field_z: 1 >\n"267               "    field_w: ok\n"268               "    msg_field: <\n"269               "      field: <>\n"270               "      field: < field: 1 >\n"271               "      field: < field: 2 >\n"272               "      field: < field: 3 >\n"273               "      field: < field: 4 >\n"274               "      field: ok\n"275               "    >\n"276               "  }\n"277               ">\n"278               "field: OK,\n"279               "field_c < field < field <> > >");280 281  verifyFormat("app_id: 'com.javax.swing.salsa.latino'\n"282               "head_id: 1\n"283               "data < key: value >");284 285  verifyFormat("app_id: 'com.javax.swing.salsa.latino'\n"286               "head_id: 1\n"287               "data < key: value >\n"288               "tail_id: 2");289 290  verifyFormat("app_id: 'com.javax.swing.salsa.latino'\n"291               "head_id: 1\n"292               "data < key: value >\n"293               "data { key: value }");294 295  verifyFormat("app {\n"296               "  app_id: 'com.javax.swing.salsa.latino'\n"297               "  head_id: 1\n"298               "  data < key: value >\n"299               "}");300 301  verifyFormat("app: {\n"302               "  app_id: 'com.javax.swing.salsa.latino'\n"303               "  head_id: 1\n"304               "  data < key: value >\n"305               "}");306 307  verifyFormat("app_id: 'com.javax.swing.salsa.latino'\n"308               "headheadheadheadheadhead_id: 1\n"309               "product_data { product { 1 } }");310 311  verifyFormat("app_id: 'com.javax.swing.salsa.latino'\n"312               "headheadheadheadheadhead_id: 1\n"313               "product_data < product { 1 } >");314 315  verifyFormat("app_id: 'com.javax.swing.salsa.latino'\n"316               "headheadheadheadheadhead_id: 1\n"317               "product_data < product < 1 > >");318 319  verifyFormat("app <\n"320               "  app_id: 'com.javax.swing.salsa.latino'\n"321               "  headheadheadheadheadhead_id: 1\n"322               "  product_data < product { 1 } >\n"323               ">");324 325  verifyFormat("dcccwrnfioeruvginerurneitinfo {\n"326               "  exte3nsionrnfvui { key: value }\n"327               "}");328}329 330TEST_F(FormatTestTextProto, DiscardsUnbreakableTailIfCanBreakAfter) {331  // The two closing braces count towards the string UnbreakableTailLength, but332  // since we have broken after the corresponding opening braces, we don't333  // consider that length for string breaking.334  verifyFormat(335      "foo: {\n"336      "  bar: {\n"337      "    text: \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"338      "  }\n"339      "}");340}341 342TEST_F(FormatTestTextProto, KeepsLongStringLiteralsOnSameLine) {343  verifyFormat(344      "foo: {\n"345      "  text: \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasaaaaaaaaaa\"\n"346      "}");347}348 349TEST_F(FormatTestTextProto, KeepsCommentsIndentedInList) {350  verifyFormat("aaaaaaaaaa: 100\n"351               "bbbbbbbbbbbbbbbbbbbbbbbbbbb: 200\n"352               "# Single line comment for stuff here.\n"353               "cccccccccccccccccccccccc: 3849\n"354               "# Multiline comment for stuff here.\n"355               "# Multiline comment for stuff here.\n"356               "# Multiline comment for stuff here.\n"357               "cccccccccccccccccccccccc: 3849");358}359 360TEST_F(FormatTestTextProto, UnderstandsHashComments) {361  auto Style = getDefaultStyle();362 363  verifyFormat("aaa: 100\n"364               "## this is a double-hash comment.\n"365               "bb: 100\n"366               "## another double-hash comment.\n"367               "### a triple-hash comment\n"368               "cc: 200\n"369               "### another triple-hash comment\n"370               "#### a quadriple-hash comment\n"371               "dd: 100\n"372               "#### another quadriple-hash comment",373               "aaa: 100\n"374               "##this is a double-hash comment.\n"375               "bb: 100\n"376               "## another double-hash comment.\n"377               "###a triple-hash comment\n"378               "cc: 200\n"379               "### another triple-hash comment\n"380               "####a quadriple-hash comment\n"381               "dd: 100\n"382               "#### another quadriple-hash comment",383               Style);384 385  // Ensure we support a common pattern for naming sections.386  verifyFormat("##############\n"387               "# section name\n"388               "##############",389               Style);390 391  verifyFormat("///////////////\n"392               "// section name\n"393               "///////////////",394               Style);395}396 397TEST_F(FormatTestTextProto, FormatsExtensions) {398  verifyFormat("[type] { key: value }");399  verifyFormat("[type] {\n"400               "  keyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy: value\n"401               "}");402  verifyFormat("[type.type] { key: value }");403  verifyFormat("[type.type] < key: value >");404  verifyFormat("[type.type/type.type] { key: value }");405  verifyFormat("msg {\n"406               "  [type.type] { key: value }\n"407               "}");408  verifyFormat("msg {\n"409               "  [type.type] {\n"410               "    keyyyyyyyyyyyyyy: valuuuuuuuuuuuuuuuuuuuuuuuuue\n"411               "  }\n"412               "}");413  verifyFormat("key: value\n"414               "[a.b] { key: value }");415  verifyFormat("msg: <\n"416               "  key: value\n"417               "  [a.b.c/d.e]: < key: value >\n"418               "  [f.g]: <\n"419               "    key: valueeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee\n"420               "    key: {}\n"421               "  >\n"422               "  key {}\n"423               "  [h.i.j] < key: value >\n"424               "  [a]: {\n"425               "    [b.c]: {}\n"426               "    [d] <>\n"427               "    [e/f]: 1\n"428               "  }\n"429               ">");430  verifyFormat("[longg.long.long.long.long.long.long.long.long.long.long\n"431               "     .longg.longlong] { key: value }");432  verifyFormat("[longg.long.long.long.long.long.long.long.long.long.long\n"433               "     .longg.longlong] {\n"434               "  key: value\n"435               "  key: value\n"436               "  key: value\n"437               "  key: value\n"438               "}");439  verifyFormat("[longg.long.long.long.long.long.long.long.long.long\n"440               "     .long/longg.longlong] { key: value }");441  verifyFormat("[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/\n"442               " bbbbbbbbbbbbbb] { key: value }");443  // These go over the column limit intentionally, since the alternative444  // [aa..a\n] is worse.445  verifyFormat(446      "[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa] {\n"447      "  key: value\n"448      "}");449  verifyFormat(450      "[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa] {\n"451      "  [type.type] {\n"452      "    keyyyyyyyyyyyyyy: valuuuuuuuuuuuuuuuuuuuuuuuuue\n"453      "  }\n"454      "}");455  verifyFormat("[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/\n"456               " bbbbbbb] {\n"457               "  [type.type] {\n"458               "    keyyyyyyyyyyyyyy: valuuuuuuuuuuuuuuuuuuuuuuuuue\n"459               "  }\n"460               "}");461  verifyFormat(462      "aaaaaaaaaaaaaaa {\n"463      "  bbbbbb {\n"464      "    [a.b/cy] {\n"465      "      eeeeeeeeeeeee: \"The lazy coo cat jumps over the lazy hot dog\"\n"466      "    }\n"467      "  }\n"468      "}");469}470 471TEST_F(FormatTestTextProto, SpacesAroundPercents) {472  verifyFormat("key: %d");473  verifyFormat("key: 0x%04x");474  verifyFormat("key: \"%d %d\"");475}476 477TEST_F(FormatTestTextProto, FormatsRepeatedListInitializers) {478  verifyFormat("keys: []");479  verifyFormat("keys: [ 1 ]");480  verifyFormat("keys: [ 'ala', 'bala' ]");481  verifyFormat("keys: [\n"482               "  'ala',\n"483               "  'bala',\n"484               "  'porto',\n"485               "  'kala',\n"486               "  'too',\n"487               "  'long',\n"488               "  'ng'\n"489               "]");490  verifyFormat("key: item\n"491               "keys: [\n"492               "  'ala',\n"493               "  'bala',\n"494               "  'porto',\n"495               "  'kala',\n"496               "  'too',\n"497               "  'long',\n"498               "  'long',\n"499               "  'long'\n"500               "]\n"501               "key: item\n"502               "msg {\n"503               "  key: item\n"504               "  keys: [\n"505               "    'ala',\n"506               "    'bala',\n"507               "    'porto',\n"508               "    'kala',\n"509               "    'too',\n"510               "    'long',\n"511               "    'long'\n"512               "  ]\n"513               "}\n"514               "key: value");515 516  auto Style = getDefaultStyle();517  Style.Cpp11BracedListStyle = FormatStyle::BLS_AlignFirstComment;518  verifyFormat("keys: [1]", Style);519}520 521TEST_F(FormatTestTextProto, AcceptsOperatorAsKey) {522  verifyFormat("aaaaaaaaaaa: <\n"523               "  bbbbbbbbb: <\n"524               "    ccccccccccccccccccccccc: <\n"525               "      operator: 1\n"526               "      operator: 2\n"527               "      operator: 3\n"528               "      operator { key: value }\n"529               "    >\n"530               "  >\n"531               ">");532}533 534TEST_F(FormatTestTextProto, BreaksConsecutiveStringLiterals) {535  verifyFormat("ala: \"str1\"\n"536               "     \"str2\"");537}538 539TEST_F(FormatTestTextProto, PutsMultipleEntriesInExtensionsOnNewlines) {540  verifyFormat("pppppppppp: {\n"541               "  ssssss: \"http://example.com/blahblahblah\"\n"542               "  ppppppp: \"sssss/MMMMMMMMMMMM\"\n"543               "  [ns.sssss.eeeeeeeee.eeeeeeeeeeeeeee] { begin: 24 end: 252 }\n"544               "  [ns.sssss.eeeeeeeee.eeeeeeeeeeeeeee] {\n"545               "    begin: 24\n"546               "    end: 252\n"547               "    key: value\n"548               "    key: value\n"549               "  }\n"550               "}",551               getGoogleStyle(FormatStyle::LK_TextProto));552}553 554TEST_F(FormatTestTextProto, BreaksAfterBraceFollowedByClosingBraceOnNextLine) {555  verifyFormat("keys: [\n"556               "  data: { item: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' }\n"557               "]");558  verifyFormat("keys: <\n"559               "  data: { item: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' }\n"560               ">");561}562 563TEST_F(FormatTestTextProto, BreaksEntriesOfSubmessagesContainingSubmessages) {564  verifyFormat("key: valueeeeeeee\n"565               "keys: {\n"566               "  item: 'aaaaaaaaaaaaaaaa'\n"567               "  sub <>\n"568               "}");569  verifyFormat("key: valueeeeeeee\n"570               "keys: {\n"571               "  item: 'aaaaaaaaaaaaaaaa'\n"572               "  sub {}\n"573               "}");574  verifyFormat("key: valueeeeeeee\n"575               "keys: {\n"576               "  sub {}\n"577               "  sub: <>\n"578               "  sub: []\n"579               "}");580  verifyFormat("key: valueeeeeeee\n"581               "keys: {\n"582               "  item: 'aaaaaaaaaaa'\n"583               "  sub { msg: 1 }\n"584               "}");585  verifyFormat("key: valueeeeeeee\n"586               "keys: {\n"587               "  item: 'aaaaaaaaaaa'\n"588               "  sub: { msg: 1 }\n"589               "}");590  verifyFormat("key: valueeeeeeee\n"591               "keys: {\n"592               "  item: 'aaaaaaaaaaa'\n"593               "  sub < msg: 1 >\n"594               "}");595  verifyFormat("key: valueeeeeeee\n"596               "keys: {\n"597               "  item: 'aaaaaaaaaaa'\n"598               "  sub: [ msg: 1 ]\n"599               "}");600  verifyFormat("key: valueeeeeeee\n"601               "keys: <\n"602               "  item: 'aaaaaaaaaaa'\n"603               "  sub: [ 1, 2 ]\n"604               ">");605  verifyFormat("key: valueeeeeeee\n"606               "keys: {\n"607               "  sub {}\n"608               "  item: 'aaaaaaaaaaaaaaaa'\n"609               "}");610  verifyFormat("key: valueeeeeeee\n"611               "keys: {\n"612               "  sub: []\n"613               "  item: 'aaaaaaaaaaaaaaaa'\n"614               "}");615  verifyFormat("key: valueeeeeeee\n"616               "keys: {\n"617               "  sub <>\n"618               "  item: 'aaaaaaaaaaaaaaaa'\n"619               "}");620  verifyFormat("key: valueeeeeeee\n"621               "keys: {\n"622               "  sub { key: value }\n"623               "  item: 'aaaaaaaaaaaaaaaa'\n"624               "}");625  verifyFormat("key: valueeeeeeee\n"626               "keys: {\n"627               "  sub: [ 1, 2 ]\n"628               "  item: 'aaaaaaaaaaaaaaaa'\n"629               "}");630  verifyFormat("key: valueeeeeeee\n"631               "keys: {\n"632               "  sub < sub_2: {} >\n"633               "  item: 'aaaaaaaaaaaaaaaa'\n"634               "}");635  verifyFormat("key: valueeeeeeee\n"636               "keys: {\n"637               "  item: data\n"638               "  sub: [ 1, 2 ]\n"639               "  item: 'aaaaaaaaaaaaaaaa'\n"640               "}");641  verifyFormat("key: valueeeeeeee\n"642               "keys: {\n"643               "  item: data\n"644               "  sub < sub_2: {} >\n"645               "  item: 'aaaaaaaaaaaaaaaa'\n"646               "}");647  verifyFormat("sub: {\n"648               "  key: valueeeeeeee\n"649               "  keys: {\n"650               "    sub: [ 1, 2 ]\n"651               "    item: 'aaaaaaaaaaaaaaaa'\n"652               "  }\n"653               "}");654  verifyFormat("sub: {\n"655               "  key: 1\n"656               "  sub: {}\n"657               "}\n"658               "# comment");659  verifyFormat("sub: {\n"660               "  key: 1\n"661               "  # comment\n"662               "  sub: {}\n"663               "}");664}665 666TEST_F(FormatTestTextProto, PreventBreaksBetweenKeyAndSubmessages) {667  verifyFormat("submessage: {\n"668               "  key: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'\n"669               "}");670  verifyFormat("submessage {\n"671               "  key: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'\n"672               "}");673  verifyFormat("submessage: <\n"674               "  key: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'\n"675               ">");676  verifyFormat("submessage <\n"677               "  key: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'\n"678               ">");679  verifyFormat("repeatedd: [\n"680               "  'eyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'\n"681               "]");682  // "{" is going over the column limit.683  verifyFormat(684      "submessageeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee: {\n"685      "  key: 'aaaaa'\n"686      "}");687}688 689TEST_F(FormatTestTextProto, FormatsCommentsAtEndOfFile) {690  verifyFormat("key: value\n"691               "# endfile comment");692  verifyFormat("key: value\n"693               "// endfile comment");694  verifyFormat("key: value\n"695               "// endfile comment 1\n"696               "// endfile comment 2");697  verifyFormat("submessage { key: value }\n"698               "# endfile comment");699  verifyFormat("submessage <\n"700               "  key: value\n"701               "  item {}\n"702               ">\n"703               "# endfile comment");704}705 706TEST_F(FormatTestTextProto, KeepsAmpersandsNextToKeys) {707  verifyFormat("@tmpl { field: 1 }");708  verifyFormat("@placeholder: 1");709  verifyFormat("@name <>");710  verifyFormat("submessage: @base { key: value }");711  verifyFormat("submessage: @base {\n"712               "  key: value\n"713               "  item: {}\n"714               "}");715  verifyFormat("submessage: {\n"716               "  msg: @base {\n"717               "    yolo: {}\n"718               "    key: value\n"719               "  }\n"720               "  key: value\n"721               "}");722}723 724} // namespace725} // namespace test726} // namespace format727} // end namespace clang728