Home | History | Annotate | Download | only in Format
      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 
     10 #include "FormatTestUtils.h"
     11 #include "clang/Format/Format.h"
     12 #include "llvm/Support/Debug.h"
     13 #include "gtest/gtest.h"
     14 
     15 #define DEBUG_TYPE "format-test"
     16 
     17 namespace clang {
     18 namespace format {
     19 
     20 class FormatTestProto : public ::testing::Test {
     21 protected:
     22   static std::string format(llvm::StringRef Code, unsigned Offset,
     23                             unsigned Length, const FormatStyle &Style) {
     24     DEBUG(llvm::errs() << "---\n");
     25     DEBUG(llvm::errs() << Code << "\n\n");
     26     std::vector<tooling::Range> Ranges(1, tooling::Range(Offset, Length));
     27     tooling::Replacements Replaces = reformat(Style, Code, Ranges);
     28     std::string Result = applyAllReplacements(Code, Replaces);
     29     EXPECT_NE("", Result);
     30     DEBUG(llvm::errs() << "\n" << Result << "\n\n");
     31     return Result;
     32   }
     33 
     34   static std::string format(llvm::StringRef Code) {
     35     FormatStyle Style = getGoogleStyle(FormatStyle::LK_Proto);
     36     Style.ColumnLimit = 60; // To make writing tests easier.
     37     return format(Code, 0, Code.size(), Style);
     38   }
     39 
     40   static void verifyFormat(llvm::StringRef Code) {
     41     EXPECT_EQ(Code.str(), format(test::messUp(Code)));
     42   }
     43 };
     44 
     45 TEST_F(FormatTestProto, FormatsMessages) {
     46   verifyFormat("message SomeMessage {\n"
     47                "  required int32 field1 = 1;\n"
     48                "}");
     49   verifyFormat("message SomeMessage {\n"
     50                "  required .absolute.Reference field1 = 1;\n"
     51                "}");
     52   verifyFormat("message SomeMessage {\n"
     53                "  required int32 field1 = 1;\n"
     54                "  optional string field2 = 2 [default = \"2\"]\n"
     55                "}");
     56 
     57   verifyFormat("message SomeMessage {\n"
     58                "  optional really.really.long.qualified.type.aaa.aaaaaaa\n"
     59                "      fiiiiiiiiiiiiiiiiiiiiiiiiield = 1;\n"
     60                "  optional\n"
     61                "      really.really.long.qualified.type.aaa.aaaaaaa.aaaaaaaa\n"
     62                "          another_fiiiiiiiiiiiiiiiiiiiiield = 2;\n"
     63                "}");
     64 }
     65 
     66 TEST_F(FormatTestProto, KeywordsInOtherLanguages) {
     67   verifyFormat("optional string operator = 1;");
     68 }
     69 
     70 TEST_F(FormatTestProto, FormatsEnums) {
     71   verifyFormat("enum Type {\n"
     72                "  UNKNOWN = 0;\n"
     73                "  TYPE_A = 1;\n"
     74                "  TYPE_B = 2;\n"
     75                "};");
     76   verifyFormat("enum Type {\n"
     77                "  UNKNOWN = 0 [(some_options) = {\n"
     78                "    a: aa,\n"
     79                "    b: bb\n"
     80                "  }];\n"
     81                "};");
     82 }
     83 
     84 TEST_F(FormatTestProto, UnderstandsReturns) {
     85   verifyFormat("rpc Search(SearchRequest) returns (SearchResponse);");
     86 }
     87 
     88 TEST_F(FormatTestProto, MessageFieldAttributes) {
     89   verifyFormat("optional string test = 1 [default = \"test\"];");
     90   verifyFormat("optional bool a = 1 [default = true, deprecated = true];");
     91   verifyFormat("optional LongMessageType long_proto_field = 1\n"
     92                "    [default = REALLY_REALLY_LONG_CONSTANT_VALUE,\n"
     93                "     deprecated = true];");
     94   verifyFormat("optional LongMessageType long_proto_field = 1\n"
     95                "    [default = REALLY_REALLY_LONG_CONSTANT_VALUE];");
     96   verifyFormat("repeated double value = 1\n"
     97                "    [(aaaaaaa.aaaaaaaaa) = {aaaaaaaaaaaaaaaaa: AAAAAAAA}];");
     98   verifyFormat("repeated double value = 1 [(aaaaaaa.aaaaaaaaa) = {\n"
     99                "  aaaaaaaaaaaaaaaa: AAAAAAAAAA,\n"
    100                "  bbbbbbbbbbbbbbbb: BBBBBBBBBB\n"
    101                "}];");
    102   verifyFormat("repeated double value = 1 [(aaaaaaa.aaaaaaaaa) = {\n"
    103                "  aaaaaaaaaaaaaaaa: AAAAAAAAAA\n"
    104                "  bbbbbbbbbbbbbbbb: BBBBBBBBBB\n"
    105                "}];");
    106   verifyFormat("repeated double value = 1 [(aaaaaaa.aaaaaaaaa) = {\n"
    107                "  type: \"AAAAAAAAAA\"\n"
    108                "  is: \"AAAAAAAAAA\"\n"
    109                "  or: \"BBBBBBBBBB\"\n"
    110                "}];");
    111   verifyFormat("repeated double value = 1 [(aaaaaaa.aaaaaaaaa) = {\n"
    112                "  aaaaaaaaaaaaaaaa: AAAAAAAAAA,\n"
    113                "  bbbbbbb: BBBB,\n"
    114                "  bbbb: BBB\n"
    115                "}];");
    116 }
    117 
    118 TEST_F(FormatTestProto, DoesntWrapFileOptions) {
    119   EXPECT_EQ(
    120       "option java_package = "
    121       "\"some.really.long.package.that.exceeds.the.column.limit\";",
    122       format("option    java_package   =    "
    123              "\"some.really.long.package.that.exceeds.the.column.limit\";"));
    124 }
    125 
    126 TEST_F(FormatTestProto, FormatsOptions) {
    127   verifyFormat("option (MyProto.options) = {\n"
    128                "  field_a: OK\n"
    129                "  field_b: \"OK\"\n"
    130                "  field_c: \"OK\"\n"
    131                "  msg_field: {field_d: 123}\n"
    132                "};");
    133 
    134   verifyFormat("option (MyProto.options) = {\n"
    135                "  field_a: OK\n"
    136                "  field_b: \"OK\"\n"
    137                "  field_c: \"OK\"\n"
    138                "  msg_field: {\n"
    139                "    field_d: 123\n"
    140                "    field_e: OK\n"
    141                "  }\n"
    142                "};");
    143 
    144   verifyFormat("option (MyProto.options) = {\n"
    145                "  field_a: OK  // Comment\n"
    146                "  field_b: \"OK\"\n"
    147                "  field_c: \"OK\"\n"
    148                "  msg_field: {field_d: 123}\n"
    149                "};");
    150 
    151   verifyFormat("option (MyProto.options) = {\n"
    152                "  field_c: \"OK\"\n"
    153                "  msg_field{field_d: 123}\n"
    154                "};");
    155 }
    156 
    157 TEST_F(FormatTestProto, FormatsService) {
    158   verifyFormat("service SearchService {\n"
    159                "  rpc Search(SearchRequest) returns (SearchResponse) {\n"
    160                "    option foo = true;\n"
    161                "  }\n"
    162                "};");
    163 }
    164 
    165 TEST_F(FormatTestProto, ExtendingMessage) {
    166   verifyFormat("extend .foo.Bar {\n"
    167                "}");
    168 }
    169 
    170 } // end namespace tooling
    171 } // end namespace clang
    172