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, FormatsEnums) {
     67   verifyFormat("enum Type {\n"
     68                "  UNKNOWN = 0;\n"
     69                "  TYPE_A = 1;\n"
     70                "  TYPE_B = 2;\n"
     71                "};");
     72 }
     73 
     74 TEST_F(FormatTestProto, UnderstandsReturns) {
     75   verifyFormat("rpc Search(SearchRequest) returns (SearchResponse);");
     76 }
     77 
     78 TEST_F(FormatTestProto, MessageFieldAttributes) {
     79   verifyFormat("optional string test = 1 [default = \"test\"];");
     80   verifyFormat("optional bool a = 1 [default = true, deprecated = true];");
     81   verifyFormat("optional LongMessageType long_proto_field = 1\n"
     82                "    [default = REALLY_REALLY_LONG_CONSTANT_VALUE,\n"
     83                "     deprecated = true];");
     84   verifyFormat("optional LongMessageType long_proto_field = 1\n"
     85                "    [default = REALLY_REALLY_LONG_CONSTANT_VALUE];");
     86   verifyFormat("repeated double value = 1\n"
     87                "    [(aaaaaaa.aaaaaaaaa) = {aaaaaaaaaaaaaaaaa: AAAAAAAA}];");
     88   verifyFormat("repeated double value = 1 [(aaaaaaa.aaaaaaaaa) = {\n"
     89                "  aaaaaaaaaaaaaaaa: AAAAAAAAAA,\n"
     90                "  bbbbbbbbbbbbbbbb: BBBBBBBBBB\n"
     91                "}];");
     92   verifyFormat("repeated double value = 1 [(aaaaaaa.aaaaaaaaa) = {\n"
     93                "  aaaaaaaaaaaaaaaa: AAAAAAAAAA\n"
     94                "  bbbbbbbbbbbbbbbb: BBBBBBBBBB\n"
     95                "}];");
     96   verifyFormat("repeated double value = 1 [(aaaaaaa.aaaaaaaaa) = {\n"
     97                "  type: \"AAAAAAAAAA\"\n"
     98                "  is: \"AAAAAAAAAA\"\n"
     99                "  or: \"BBBBBBBBBB\"\n"
    100                "}];");
    101   verifyFormat("repeated double value = 1 [(aaaaaaa.aaaaaaaaa) = {\n"
    102                "  aaaaaaaaaaaaaaaa: AAAAAAAAAA,\n"
    103                "  bbbbbbb: BBBB,\n"
    104                "  bbbb: BBB\n"
    105                "}];");
    106 }
    107 
    108 TEST_F(FormatTestProto, FormatsOptions) {
    109   verifyFormat("option (MyProto.options) = {\n"
    110                "  field_a: OK\n"
    111                "  field_b: \"OK\"\n"
    112                "  field_c: \"OK\"\n"
    113                "  msg_field: {field_d: 123}\n"
    114                "};");
    115 
    116   verifyFormat("option (MyProto.options) = {\n"
    117                "  field_a: OK\n"
    118                "  field_b: \"OK\"\n"
    119                "  field_c: \"OK\"\n"
    120                "  msg_field: {\n"
    121                "    field_d: 123\n"
    122                "    field_e: OK\n"
    123                "  }\n"
    124                "};");
    125 
    126   verifyFormat("option (MyProto.options) = {\n"
    127                "  field_a: OK  // Comment\n"
    128                "  field_b: \"OK\"\n"
    129                "  field_c: \"OK\"\n"
    130                "  msg_field: {field_d: 123}\n"
    131                "};");
    132 
    133   verifyFormat("option (MyProto.options) = {\n"
    134                "  field_c: \"OK\"\n"
    135                "  msg_field{field_d: 123}\n"
    136                "};");
    137 }
    138 
    139 TEST_F(FormatTestProto, FormatsService) {
    140   verifyFormat("service SearchService {\n"
    141                "  rpc Search(SearchRequest) returns (SearchResponse) {\n"
    142                "    option foo = true;\n"
    143                "  }\n"
    144                "};");
    145 }
    146 
    147 } // end namespace tooling
    148 } // end namespace clang
    149