1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Protocol Buffers - Google's data interchange format
2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Copyright 2008 Google Inc.  All rights reserved.
3fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// http://code.google.com/p/protobuf/
4fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
5fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Redistribution and use in source and binary forms, with or without
6fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// modification, are permitted provided that the following conditions are
7fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// met:
8fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
9fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     * Redistributions of source code must retain the above copyright
10fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// notice, this list of conditions and the following disclaimer.
11fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     * Redistributions in binary form must reproduce the above
12fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// copyright notice, this list of conditions and the following disclaimer
13fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// in the documentation and/or other materials provided with the
14fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// distribution.
15fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     * Neither the name of Google Inc. nor the names of its
16fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// contributors may be used to endorse or promote products derived from
17fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// this software without specific prior written permission.
18fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
19fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
31fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Author: kenton@google.com (Kenton Varda)
32fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//  Based on original Protocol Buffers design by
33fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//  Sanjay Ghemawat, Jeff Dean, and others.
34fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
35fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <vector>
36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <algorithm>
37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/compiler/parser.h>
39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/io/tokenizer.h>
41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/io/zero_copy_stream_impl.h>
42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/descriptor.pb.h>
43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/wire_format.h>
44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/text_format.h>
45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/unittest.pb.h>
46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/stubs/strutil.h>
47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/stubs/substitute.h>
48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/testing/googletest.h>
50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <gtest/gtest.h>
51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace google {
53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace protobuf {
54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace compiler {
55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace {
57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass MockErrorCollector : public io::ErrorCollector {
59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  MockErrorCollector() {}
61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ~MockErrorCollector() {}
62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  string text_;
64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // implements ErrorCollector ---------------------------------------
66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void AddError(int line, int column, const string& message) {
67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    strings::SubstituteAndAppend(&text_, "$0:$1: $2\n",
68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                 line, column, message);
69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass MockValidationErrorCollector : public DescriptorPool::ErrorCollector {
73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  MockValidationErrorCollector(const SourceLocationTable& source_locations,
75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                               io::ErrorCollector* wrapped_collector)
76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    : source_locations_(source_locations),
77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      wrapped_collector_(wrapped_collector) {}
78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ~MockValidationErrorCollector() {}
79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // implements ErrorCollector ---------------------------------------
81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void AddError(const string& filename,
82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                const string& element_name,
83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                const Message* descriptor,
84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                ErrorLocation location,
85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                const string& message) {
86fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    int line, column;
87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    source_locations_.Find(descriptor, location, &line, &column);
88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    wrapped_collector_->AddError(line, column, message);
89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const SourceLocationTable& source_locations_;
93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  io::ErrorCollector* wrapped_collector_;
94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ParserTest : public testing::Test {
97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protected:
98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ParserTest()
99fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    : require_syntax_identifier_(false) {}
100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Set up the parser to parse the given text.
102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void SetupParser(const char* text) {
103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    raw_input_.reset(new io::ArrayInputStream(text, strlen(text)));
104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    input_.reset(new io::Tokenizer(raw_input_.get(), &error_collector_));
105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    parser_.reset(new Parser());
106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    parser_->RecordErrorsTo(&error_collector_);
107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    parser_->SetRequireSyntaxIdentifier(require_syntax_identifier_);
108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Parse the input and expect that the resulting FileDescriptorProto matches
111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // the given output.  The output is a FileDescriptorProto in protocol buffer
112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // text format.
113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void ExpectParsesTo(const char* input, const char* output) {
114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    SetupParser(input);
115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FileDescriptorProto actual, expected;
116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    parser_->Parse(input_.get(), &actual);
118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_EQ(io::Tokenizer::TYPE_END, input_->current().type);
119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ASSERT_EQ("", error_collector_.text_);
120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Parse the ASCII representation in order to canonicalize it.  We could
122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // just compare directly to actual.DebugString(), but that would require
123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // that the caller precisely match the formatting that DebugString()
124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // produces.
125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ASSERT_TRUE(TextFormat::ParseFromString(output, &expected));
126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Compare by comparing debug strings.
128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // TODO(kenton):  Use differencer, once it is available.
129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_EQ(expected.DebugString(), actual.DebugString());
130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Parse the text and expect that the given errors are reported.
133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void ExpectHasErrors(const char* text, const char* expected_errors) {
134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ExpectHasEarlyExitErrors(text, expected_errors);
135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_EQ(io::Tokenizer::TYPE_END, input_->current().type);
136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Same as above but does not expect that the parser parses the complete
139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // input.
140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void ExpectHasEarlyExitErrors(const char* text, const char* expected_errors) {
141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    SetupParser(text);
142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FileDescriptorProto file;
143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    parser_->Parse(input_.get(), &file);
144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_EQ(expected_errors, error_collector_.text_);
145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Parse the text as a file and validate it (with a DescriptorPool), and
148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // expect that the validation step reports the given errors.
149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void ExpectHasValidationErrors(const char* text,
150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                 const char* expected_errors) {
151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    SetupParser(text);
152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    SourceLocationTable source_locations;
153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    parser_->RecordSourceLocationsTo(&source_locations);
154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FileDescriptorProto file;
156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    file.set_name("foo.proto");
157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    parser_->Parse(input_.get(), &file);
158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_EQ(io::Tokenizer::TYPE_END, input_->current().type);
159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ASSERT_EQ("", error_collector_.text_);
160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    MockValidationErrorCollector validation_error_collector(
162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      source_locations, &error_collector_);
163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_TRUE(pool_.BuildFileCollectingErrors(
164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      file, &validation_error_collector) == NULL);
165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_EQ(expected_errors, error_collector_.text_);
166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  MockErrorCollector error_collector_;
169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  DescriptorPool pool_;
170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  scoped_ptr<io::ZeroCopyInputStream> raw_input_;
172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  scoped_ptr<io::Tokenizer> input_;
173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  scoped_ptr<Parser> parser_;
174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  bool require_syntax_identifier_;
175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ===================================================================
178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParserTest, StopAfterSyntaxIdentifier) {
180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  SetupParser(
181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "// blah\n"
182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "syntax = \"foobar\";\n"
183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "this line will not be parsed\n");
184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  parser_->SetStopAfterSyntaxIdentifier(true);
185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_TRUE(parser_->Parse(input_.get(), NULL));
186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ("", error_collector_.text_);
187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ("foobar", parser_->GetSyntaxIdentifier());
188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParserTest, StopAfterOmittedSyntaxIdentifier) {
191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  SetupParser(
192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "// blah\n"
193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "this line will not be parsed\n");
194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  parser_->SetStopAfterSyntaxIdentifier(true);
195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_TRUE(parser_->Parse(input_.get(), NULL));
196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ("", error_collector_.text_);
197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ("", parser_->GetSyntaxIdentifier());
198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParserTest, StopAfterSyntaxIdentifierWithErrors) {
201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  SetupParser(
202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "// blah\n"
203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "syntax = error;\n");
204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  parser_->SetStopAfterSyntaxIdentifier(true);
205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_FALSE(parser_->Parse(input_.get(), NULL));
206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ("1:9: Expected syntax identifier.\n", error_collector_.text_);
207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ===================================================================
210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletypedef ParserTest ParseMessageTest;
212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseMessageTest, SimpleMessage) {
214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectParsesTo(
215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message TestMessage {\n"
216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  required int32 foo = 1;\n"
217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n",
218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message_type {"
220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  name: \"TestMessage\""
221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_INT32 number:1 }"
222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}");
223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseMessageTest, ImplicitSyntaxIdentifier) {
226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  require_syntax_identifier_ = false;
227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectParsesTo(
228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message TestMessage {\n"
229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  required int32 foo = 1;\n"
230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n",
231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message_type {"
233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  name: \"TestMessage\""
234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_INT32 number:1 }"
235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}");
236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ("proto2", parser_->GetSyntaxIdentifier());
237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseMessageTest, ExplicitSyntaxIdentifier) {
240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectParsesTo(
241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "syntax = \"proto2\";\n"
242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message TestMessage {\n"
243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  required int32 foo = 1;\n"
244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n",
245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message_type {"
247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  name: \"TestMessage\""
248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_INT32 number:1 }"
249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}");
250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ("proto2", parser_->GetSyntaxIdentifier());
251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseMessageTest, ExplicitRequiredSyntaxIdentifier) {
254fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  require_syntax_identifier_ = true;
255fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectParsesTo(
256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "syntax = \"proto2\";\n"
257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message TestMessage {\n"
258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  required int32 foo = 1;\n"
259fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n",
260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message_type {"
262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  name: \"TestMessage\""
263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_INT32 number:1 }"
264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}");
265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ("proto2", parser_->GetSyntaxIdentifier());
266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
268fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseMessageTest, SimpleFields) {
269fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectParsesTo(
270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message TestMessage {\n"
271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  required int32 foo = 15;\n"
272fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  optional int32 bar = 34;\n"
273fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  repeated int32 baz = 3;\n"
274fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n",
275fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
276fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message_type {"
277fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  name: \"TestMessage\""
278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_INT32 number:15 }"
279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  field { name:\"bar\" label:LABEL_OPTIONAL type:TYPE_INT32 number:34 }"
280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  field { name:\"baz\" label:LABEL_REPEATED type:TYPE_INT32 number:3  }"
281fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}");
282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
283fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
284fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseMessageTest, PrimitiveFieldTypes) {
285fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectParsesTo(
286fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message TestMessage {\n"
287fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  required int32    foo = 1;\n"
288fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  required int64    foo = 1;\n"
289fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  required uint32   foo = 1;\n"
290fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  required uint64   foo = 1;\n"
291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  required sint32   foo = 1;\n"
292fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  required sint64   foo = 1;\n"
293fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  required fixed32  foo = 1;\n"
294fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  required fixed64  foo = 1;\n"
295fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  required sfixed32 foo = 1;\n"
296fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  required sfixed64 foo = 1;\n"
297fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  required float    foo = 1;\n"
298fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  required double   foo = 1;\n"
299fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  required string   foo = 1;\n"
300fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  required bytes    foo = 1;\n"
301fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  required bool     foo = 1;\n"
302fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n",
303fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
304fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message_type {"
305fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  name: \"TestMessage\""
306fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_INT32    number:1 }"
307fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_INT64    number:1 }"
308fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_UINT32   number:1 }"
309fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_UINT64   number:1 }"
310fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_SINT32   number:1 }"
311fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_SINT64   number:1 }"
312fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_FIXED32  number:1 }"
313fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_FIXED64  number:1 }"
314fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_SFIXED32 number:1 }"
315fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_SFIXED64 number:1 }"
316fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_FLOAT    number:1 }"
317fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_DOUBLE   number:1 }"
318fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_STRING   number:1 }"
319fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_BYTES    number:1 }"
320fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_BOOL     number:1 }"
321fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}");
322fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
323fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
324fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseMessageTest, FieldDefaults) {
325fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectParsesTo(
326fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message TestMessage {\n"
327fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  required int32  foo = 1 [default=  1  ];\n"
328fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  required int32  foo = 1 [default= -2  ];\n"
329fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  required int64  foo = 1 [default=  3  ];\n"
330fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  required int64  foo = 1 [default= -4  ];\n"
331fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  required uint32 foo = 1 [default=  5  ];\n"
332fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  required uint64 foo = 1 [default=  6  ];\n"
333fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  required float  foo = 1 [default=  7.5];\n"
334fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  required float  foo = 1 [default= -8.5];\n"
335fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  required float  foo = 1 [default=  9  ];\n"
336fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  required double foo = 1 [default= 10.5];\n"
337fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  required double foo = 1 [default=-11.5];\n"
338fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  required double foo = 1 [default= 12  ];\n"
339d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "  required double foo = 1 [default= inf ];\n"
340d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "  required double foo = 1 [default=-inf ];\n"
341d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "  required double foo = 1 [default= nan ];\n"
342fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  required string foo = 1 [default='13\\001'];\n"
343fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  required string foo = 1 [default='a' \"b\" \n \"c\"];\n"
344fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  required bytes  foo = 1 [default='14\\002'];\n"
345fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  required bytes  foo = 1 [default='a' \"b\" \n 'c'];\n"
346fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  required bool   foo = 1 [default=true ];\n"
347fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  required Foo    foo = 1 [default=FOO  ];\n"
348fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
349fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  required int32  foo = 1 [default= 0x7FFFFFFF];\n"
350fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  required int32  foo = 1 [default=-0x80000000];\n"
351fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  required uint32 foo = 1 [default= 0xFFFFFFFF];\n"
352fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  required int64  foo = 1 [default= 0x7FFFFFFFFFFFFFFF];\n"
353fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  required int64  foo = 1 [default=-0x8000000000000000];\n"
354fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  required uint64 foo = 1 [default= 0xFFFFFFFFFFFFFFFF];\n"
355fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  required double foo = 1 [default= 0xabcd];\n"
356fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n",
357fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
358fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define ETC "name:\"foo\" label:LABEL_REQUIRED number:1"
359fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message_type {"
360fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  name: \"TestMessage\""
361fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  field { type:TYPE_INT32   default_value:\"1\"         "ETC" }"
362fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  field { type:TYPE_INT32   default_value:\"-2\"        "ETC" }"
363fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  field { type:TYPE_INT64   default_value:\"3\"         "ETC" }"
364fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  field { type:TYPE_INT64   default_value:\"-4\"        "ETC" }"
365fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  field { type:TYPE_UINT32  default_value:\"5\"         "ETC" }"
366fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  field { type:TYPE_UINT64  default_value:\"6\"         "ETC" }"
367fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  field { type:TYPE_FLOAT   default_value:\"7.5\"       "ETC" }"
368fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  field { type:TYPE_FLOAT   default_value:\"-8.5\"      "ETC" }"
369fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  field { type:TYPE_FLOAT   default_value:\"9\"         "ETC" }"
370fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  field { type:TYPE_DOUBLE  default_value:\"10.5\"      "ETC" }"
371fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  field { type:TYPE_DOUBLE  default_value:\"-11.5\"     "ETC" }"
372fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  field { type:TYPE_DOUBLE  default_value:\"12\"        "ETC" }"
373d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "  field { type:TYPE_DOUBLE  default_value:\"inf\"       "ETC" }"
374d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "  field { type:TYPE_DOUBLE  default_value:\"-inf\"      "ETC" }"
375d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "  field { type:TYPE_DOUBLE  default_value:\"nan\"       "ETC" }"
376fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  field { type:TYPE_STRING  default_value:\"13\\001\"   "ETC" }"
377fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  field { type:TYPE_STRING  default_value:\"abc\"       "ETC" }"
378fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  field { type:TYPE_BYTES   default_value:\"14\\\\002\" "ETC" }"
379fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  field { type:TYPE_BYTES   default_value:\"abc\"       "ETC" }"
380fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  field { type:TYPE_BOOL    default_value:\"true\"      "ETC" }"
381fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  field { type_name:\"Foo\" default_value:\"FOO\"       "ETC" }"
382fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
383fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  field { type:TYPE_INT32   default_value:\"2147483647\"           "ETC" }"
384fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  field { type:TYPE_INT32   default_value:\"-2147483648\"          "ETC" }"
385fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  field { type:TYPE_UINT32  default_value:\"4294967295\"           "ETC" }"
386fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  field { type:TYPE_INT64   default_value:\"9223372036854775807\"  "ETC" }"
387fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  field { type:TYPE_INT64   default_value:\"-9223372036854775808\" "ETC" }"
388fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  field { type:TYPE_UINT64  default_value:\"18446744073709551615\" "ETC" }"
389fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  field { type:TYPE_DOUBLE  default_value:\"43981\"                "ETC" }"
390fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}");
391fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef ETC
392fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
393fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
394fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseMessageTest, FieldOptions) {
395fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectParsesTo(
396fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message TestMessage {\n"
397fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  optional string foo = 1\n"
398fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "      [ctype=CORD, (foo)=7, foo.(.bar.baz).qux.quux.(corge)=-33, \n"
399fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "       (quux)=\"x\040y\", (baz.qux)=hey];\n"
400fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n",
401fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
402fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message_type {"
403fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  name: \"TestMessage\""
404fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  field { name: \"foo\" label: LABEL_OPTIONAL type: TYPE_STRING number: 1"
405fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "          options { uninterpreted_option: { name { name_part: \"ctype\" "
406fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "                                                   is_extension: false } "
407fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "                                            identifier_value: \"CORD\"  }"
408fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "                    uninterpreted_option: { name { name_part: \"foo\" "
409fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "                                                   is_extension: true } "
410fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "                                            positive_int_value: 7  }"
411fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "                    uninterpreted_option: { name { name_part: \"foo\" "
412fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "                                                   is_extension: false } "
413fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "                                            name { name_part: \".bar.baz\""
414fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "                                                   is_extension: true } "
415fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "                                            name { name_part: \"qux\" "
416fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "                                                   is_extension: false } "
417fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "                                            name { name_part: \"quux\" "
418fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "                                                   is_extension: false } "
419fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "                                            name { name_part: \"corge\" "
420fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "                                                   is_extension: true } "
421fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "                                            negative_int_value: -33 }"
422fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "                    uninterpreted_option: { name { name_part: \"quux\" "
423fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "                                                   is_extension: true } "
424fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "                                            string_value: \"x y\" }"
425fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "                    uninterpreted_option: { name { name_part: \"baz.qux\" "
426fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "                                                   is_extension: true } "
427fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "                                            identifier_value: \"hey\" }"
428fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "          }"
429fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  }"
430fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}");
431fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
432fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
433fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseMessageTest, Group) {
434fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectParsesTo(
435fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message TestMessage {\n"
436fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  optional group TestGroup = 1 {};\n"
437fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n",
438fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
439fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message_type {"
440fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  name: \"TestMessage\""
441fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  nested_type { name: \"TestGroup\" }"
442fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  field { name:\"testgroup\" label:LABEL_OPTIONAL number:1"
443fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "          type:TYPE_GROUP type_name: \"TestGroup\" }"
444fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}");
445fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
446fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
447fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseMessageTest, NestedMessage) {
448fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectParsesTo(
449fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message TestMessage {\n"
450fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  message Nested {}\n"
451fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  optional Nested test_nested = 1;\n"
452fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n",
453fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
454fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message_type {"
455fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  name: \"TestMessage\""
456fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  nested_type { name: \"Nested\" }"
457fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  field { name:\"test_nested\" label:LABEL_OPTIONAL number:1"
458fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "          type_name: \"Nested\" }"
459fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}");
460fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
461fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
462fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseMessageTest, NestedEnum) {
463fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectParsesTo(
464fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message TestMessage {\n"
465fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  enum NestedEnum {}\n"
466fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  optional NestedEnum test_enum = 1;\n"
467fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n",
468fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
469fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message_type {"
470fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  name: \"TestMessage\""
471fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  enum_type { name: \"NestedEnum\" }"
472fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  field { name:\"test_enum\" label:LABEL_OPTIONAL number:1"
473fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "          type_name: \"NestedEnum\" }"
474fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}");
475fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
476fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
477fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseMessageTest, ExtensionRange) {
478fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectParsesTo(
479fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message TestMessage {\n"
480fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  extensions 10 to 19;\n"
481fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  extensions 30 to max;\n"
482fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n",
483fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
484fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message_type {"
485fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  name: \"TestMessage\""
486fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  extension_range { start:10 end:20        }"
487fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  extension_range { start:30 end:536870912 }"
488fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}");
489fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
490fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
491fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseMessageTest, CompoundExtensionRange) {
492fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectParsesTo(
493fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message TestMessage {\n"
494fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  extensions 2, 15, 9 to 11, 100 to max, 3;\n"
495fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n",
496fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
497fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message_type {"
498fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  name: \"TestMessage\""
499fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  extension_range { start:2   end:3         }"
500fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  extension_range { start:15  end:16        }"
501fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  extension_range { start:9   end:12        }"
502fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  extension_range { start:100 end:536870912 }"
503fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  extension_range { start:3   end:4         }"
504fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}");
505fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
506fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
507fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseMessageTest, Extensions) {
508fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectParsesTo(
509fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "extend Extendee1 { optional int32 foo = 12; }\n"
510fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "extend Extendee2 { repeated TestMessage bar = 22; }\n",
511fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
512fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "extension { name:\"foo\" label:LABEL_OPTIONAL type:TYPE_INT32 number:12"
513fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "            extendee: \"Extendee1\" } "
514fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "extension { name:\"bar\" label:LABEL_REPEATED number:22"
515fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "            type_name:\"TestMessage\" extendee: \"Extendee2\" }");
516fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
517fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
518fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseMessageTest, ExtensionsInMessageScope) {
519fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectParsesTo(
520fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message TestMessage {\n"
521fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  extend Extendee1 { optional int32 foo = 12; }\n"
522fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  extend Extendee2 { repeated TestMessage bar = 22; }\n"
523fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n",
524fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
525fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message_type {"
526fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  name: \"TestMessage\""
527fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  extension { name:\"foo\" label:LABEL_OPTIONAL type:TYPE_INT32 number:12"
528fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "              extendee: \"Extendee1\" }"
529fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  extension { name:\"bar\" label:LABEL_REPEATED number:22"
530fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "              type_name:\"TestMessage\" extendee: \"Extendee2\" }"
531fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}");
532fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
533fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
534fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseMessageTest, MultipleExtensionsOneExtendee) {
535fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectParsesTo(
536fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "extend Extendee1 {\n"
537fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  optional int32 foo = 12;\n"
538fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  repeated TestMessage bar = 22;\n"
539fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n",
540fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
541fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "extension { name:\"foo\" label:LABEL_OPTIONAL type:TYPE_INT32 number:12"
542fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "            extendee: \"Extendee1\" } "
543fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "extension { name:\"bar\" label:LABEL_REPEATED number:22"
544fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "            type_name:\"TestMessage\" extendee: \"Extendee1\" }");
545fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
546fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
547fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ===================================================================
548fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
549fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletypedef ParserTest ParseEnumTest;
550fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
551fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseEnumTest, SimpleEnum) {
552fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectParsesTo(
553fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "enum TestEnum {\n"
554fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  FOO = 0;\n"
555fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n",
556fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
557fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "enum_type {"
558fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  name: \"TestEnum\""
559fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  value { name:\"FOO\" number:0 }"
560fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}");
561fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
562fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
563fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseEnumTest, Values) {
564fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectParsesTo(
565fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "enum TestEnum {\n"
566fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  FOO = 13;\n"
567fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  BAR = -10;\n"
568fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  BAZ = 500;\n"
569fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n",
570fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
571fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "enum_type {"
572fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  name: \"TestEnum\""
573fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  value { name:\"FOO\" number:13 }"
574fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  value { name:\"BAR\" number:-10 }"
575fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  value { name:\"BAZ\" number:500 }"
576fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}");
577fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
578fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
579fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseEnumTest, ValueOptions) {
580fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectParsesTo(
581fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "enum TestEnum {\n"
582fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  FOO = 13;\n"
583fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  BAR = -10 [ (something.text) = 'abc' ];\n"
584fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  BAZ = 500 [ (something.text) = 'def', other = 1 ];\n"
585fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n",
586fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
587fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "enum_type {"
588fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  name: \"TestEnum\""
589fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  value { name: \"FOO\" number: 13 }"
590fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  value { name: \"BAR\" number: -10 "
591fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "    options { "
592fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "      uninterpreted_option { "
593fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "        name { name_part: \"something.text\" is_extension: true } "
594fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "        string_value: \"abc\" "
595fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "      } "
596fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "    } "
597fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  } "
598fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  value { name: \"BAZ\" number: 500 "
599fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "    options { "
600fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "      uninterpreted_option { "
601fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "        name { name_part: \"something.text\" is_extension: true } "
602fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "        string_value: \"def\" "
603fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "      } "
604fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "      uninterpreted_option { "
605fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "        name { name_part: \"other\" is_extension: false } "
606fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "        positive_int_value: 1 "
607fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "      } "
608fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "    } "
609fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  } "
610fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}");
611fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
612fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
613fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ===================================================================
614fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
615fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletypedef ParserTest ParseServiceTest;
616fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
617fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseServiceTest, SimpleService) {
618fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectParsesTo(
619fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "service TestService {\n"
620fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  rpc Foo(In) returns (Out);\n"
621fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n",
622fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
623fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "service {"
624fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  name: \"TestService\""
625fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  method { name:\"Foo\" input_type:\"In\" output_type:\"Out\" }"
626fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}");
627fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
628fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
629fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseServiceTest, Methods) {
630fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectParsesTo(
631fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "service TestService {\n"
632fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  rpc Foo(In1) returns (Out1);\n"
633fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  rpc Bar(In2) returns (Out2);\n"
634fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  rpc Baz(In3) returns (Out3);\n"
635fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n",
636fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
637fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "service {"
638fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  name: \"TestService\""
639fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  method { name:\"Foo\" input_type:\"In1\" output_type:\"Out1\" }"
640fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  method { name:\"Bar\" input_type:\"In2\" output_type:\"Out2\" }"
641fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  method { name:\"Baz\" input_type:\"In3\" output_type:\"Out3\" }"
642fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}");
643fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
644fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
645fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ===================================================================
646fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// imports and packages
647fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
648fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletypedef ParserTest ParseMiscTest;
649fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
650fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseMiscTest, ParseImport) {
651fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectParsesTo(
652fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "import \"foo/bar/baz.proto\";\n",
653fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "dependency: \"foo/bar/baz.proto\"");
654fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
655fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
656fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseMiscTest, ParseMultipleImports) {
657fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectParsesTo(
658fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "import \"foo.proto\";\n"
659fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "import \"bar.proto\";\n"
660fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "import \"baz.proto\";\n",
661fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "dependency: \"foo.proto\""
662fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "dependency: \"bar.proto\""
663fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "dependency: \"baz.proto\"");
664fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
665fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
666fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseMiscTest, ParsePackage) {
667fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectParsesTo(
668fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "package foo.bar.baz;\n",
669fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "package: \"foo.bar.baz\"");
670fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
671fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
672fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseMiscTest, ParsePackageWithSpaces) {
673fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectParsesTo(
674fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "package foo   .   bar.  \n"
675fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  baz;\n",
676fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "package: \"foo.bar.baz\"");
677fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
678fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
679fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ===================================================================
680fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// options
681fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
682fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseMiscTest, ParseFileOptions) {
683fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectParsesTo(
684fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "option java_package = \"com.google.foo\";\n"
685fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "option optimize_for = CODE_SIZE;",
686fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
687fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "options {"
688fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "uninterpreted_option { name { name_part: \"java_package\" "
689fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "                              is_extension: false }"
690fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "                       string_value: \"com.google.foo\"} "
691fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "uninterpreted_option { name { name_part: \"optimize_for\" "
692fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "                              is_extension: false }"
693fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "                       identifier_value: \"CODE_SIZE\" } "
694fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}");
695fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
696fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
697fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ===================================================================
698fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Error tests
699fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
700fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// There are a very large number of possible errors that the parser could
701fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// report, so it's infeasible to test every single one of them.  Instead,
702fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// we test each unique call to AddError() in parser.h.  This does not mean
703fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// we are testing every possible error that Parser can generate because
704fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// each variant of the Consume() helper only counts as one unique call to
705fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// AddError().
706fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
707fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletypedef ParserTest ParseErrorTest;
708fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
709fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, MissingSyntaxIdentifier) {
710fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  require_syntax_identifier_ = true;
711fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectHasEarlyExitErrors(
712fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message TestMessage {}",
713fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "0:0: File must begin with 'syntax = \"proto2\";'.\n");
714fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ("", parser_->GetSyntaxIdentifier());
715fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
716fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
717fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, UnknownSyntaxIdentifier) {
718fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectHasEarlyExitErrors(
719fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "syntax = \"no_such_syntax\";",
720fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "0:9: Unrecognized syntax identifier \"no_such_syntax\".  This parser "
721fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "only recognizes \"proto2\".\n");
722fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ("no_such_syntax", parser_->GetSyntaxIdentifier());
723fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
724fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
725fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, SimpleSyntaxError) {
726fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectHasErrors(
727fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message TestMessage @#$ { blah }",
728fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "0:20: Expected \"{\".\n");
729fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ("proto2", parser_->GetSyntaxIdentifier());
730fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
731fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
732fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, ExpectedTopLevel) {
733fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectHasErrors(
734fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "blah;",
735fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "0:0: Expected top-level statement (e.g. \"message\").\n");
736fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
737fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
738fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, UnmatchedCloseBrace) {
739fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // This used to cause an infinite loop.  Doh.
740fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectHasErrors(
741fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}",
742fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "0:0: Expected top-level statement (e.g. \"message\").\n"
743fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "0:0: Unmatched \"}\".\n");
744fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
745fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
746fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// -------------------------------------------------------------------
747fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Message errors
748fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
749fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, MessageMissingName) {
750fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectHasErrors(
751fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message {}",
752fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "0:8: Expected message name.\n");
753fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
754fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
755fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, MessageMissingBody) {
756fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectHasErrors(
757fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message TestMessage;",
758fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "0:19: Expected \"{\".\n");
759fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
760fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
761fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, EofInMessage) {
762fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectHasErrors(
763fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message TestMessage {",
764fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "0:21: Reached end of input in message definition (missing '}').\n");
765fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
766fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
767fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, MissingFieldNumber) {
768fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectHasErrors(
769fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message TestMessage {\n"
770fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  optional int32 foo;\n"
771fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n",
772fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "1:20: Missing field number.\n");
773fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
774fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
775fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, ExpectedFieldNumber) {
776fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectHasErrors(
777fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message TestMessage {\n"
778fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  optional int32 foo = ;\n"
779fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n",
780fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "1:23: Expected field number.\n");
781fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
782fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
783fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, FieldNumberOutOfRange) {
784fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectHasErrors(
785fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message TestMessage {\n"
786fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  optional int32 foo = 0x100000000;\n"
787fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n",
788fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "1:23: Integer out of range.\n");
789fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
790fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
791fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, MissingLabel) {
792fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectHasErrors(
793fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message TestMessage {\n"
794fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  int32 foo = 1;\n"
795fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n",
796fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "1:2: Expected \"required\", \"optional\", or \"repeated\".\n");
797fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
798fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
799fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, ExpectedOptionName) {
800fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectHasErrors(
801fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message TestMessage {\n"
802fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  optional uint32 foo = 1 [];\n"
803fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n",
804fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "1:27: Expected identifier.\n");
805fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
806fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
807fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, NonExtensionOptionNameBeginningWithDot) {
808fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectHasErrors(
809fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message TestMessage {\n"
810fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  optional uint32 foo = 1 [.foo=1];\n"
811fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n",
812fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "1:27: Expected identifier.\n");
813fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
814fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
815fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, DefaultValueTypeMismatch) {
816fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectHasErrors(
817fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message TestMessage {\n"
818fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  optional uint32 foo = 1 [default=true];\n"
819fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n",
820fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "1:35: Expected integer.\n");
821fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
822fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
823fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, DefaultValueNotBoolean) {
824fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectHasErrors(
825fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message TestMessage {\n"
826fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  optional bool foo = 1 [default=blah];\n"
827fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n",
828fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "1:33: Expected \"true\" or \"false\".\n");
829fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
830fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
831fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, DefaultValueNotString) {
832fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectHasErrors(
833fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message TestMessage {\n"
834fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  optional string foo = 1 [default=1];\n"
835fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n",
836fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "1:35: Expected string.\n");
837fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
838fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
839fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, DefaultValueUnsignedNegative) {
840fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectHasErrors(
841fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message TestMessage {\n"
842fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  optional uint32 foo = 1 [default=-1];\n"
843fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n",
844fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "1:36: Unsigned field can't have negative default value.\n");
845fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
846fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
847fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, DefaultValueTooLarge) {
848fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectHasErrors(
849fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message TestMessage {\n"
850fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  optional int32  foo = 1 [default= 0x80000000];\n"
851fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  optional int32  foo = 1 [default=-0x80000001];\n"
852fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  optional uint32 foo = 1 [default= 0x100000000];\n"
853fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  optional int64  foo = 1 [default= 0x80000000000000000];\n"
854fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  optional int64  foo = 1 [default=-0x80000000000000001];\n"
855fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  optional uint64 foo = 1 [default= 0x100000000000000000];\n"
856fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n",
857fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "1:36: Integer out of range.\n"
858fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "2:36: Integer out of range.\n"
859fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "3:36: Integer out of range.\n"
860fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "4:36: Integer out of range.\n"
861fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "5:36: Integer out of range.\n"
862fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "6:36: Integer out of range.\n");
863fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
864fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
865fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, DefaultValueMissing) {
866fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectHasErrors(
867fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message TestMessage {\n"
868fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  optional uint32 foo = 1 [default=];\n"
869fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n",
870fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "1:35: Expected integer.\n");
871fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
872fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
873fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, DefaultValueForGroup) {
874fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectHasErrors(
875fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message TestMessage {\n"
876fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  optional group Foo = 1 [default=blah] {}\n"
877fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n",
878fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "1:34: Messages can't have default values.\n");
879fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
880fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
881fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, DuplicateDefaultValue) {
882fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectHasErrors(
883fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message TestMessage {\n"
884fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  optional uint32 foo = 1 [default=1,default=2];\n"
885fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n",
886fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "1:37: Already set option \"default\".\n");
887fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
888fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
889fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, GroupNotCapitalized) {
890fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectHasErrors(
891fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message TestMessage {\n"
892fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  optional group foo = 1 {}\n"
893fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n",
894fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "1:17: Group names must start with a capital letter.\n");
895fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
896fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
897fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, GroupMissingBody) {
898fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectHasErrors(
899fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message TestMessage {\n"
900fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  optional group Foo = 1;\n"
901fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n",
902fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "1:24: Missing group body.\n");
903fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
904fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
905fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, ExtendingPrimitive) {
906fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectHasErrors(
907fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "extend int32 { optional string foo = 4; }\n",
908fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "0:7: Expected message type.\n");
909fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
910fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
911fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, ErrorInExtension) {
912fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectHasErrors(
913fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message Foo { extensions 100 to 199; }\n"
914fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "extend Foo { optional string foo; }\n",
915fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "1:32: Missing field number.\n");
916fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
917fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
918fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, MultipleParseErrors) {
919fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // When a statement has a parse error, the parser should be able to continue
920fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // parsing at the next statement.
921fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectHasErrors(
922fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message TestMessage {\n"
923fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  optional int32 foo;\n"
924fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  !invalid statement ending in a block { blah blah { blah } blah }\n"
925fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  optional int32 bar = 3 {}\n"
926fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n",
927fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "1:20: Missing field number.\n"
928fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "2:2: Expected \"required\", \"optional\", or \"repeated\".\n"
929fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "2:2: Expected type name.\n"
930fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "3:25: Expected \";\".\n");
931fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
932fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
933fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// -------------------------------------------------------------------
934fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Enum errors
935fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
936fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, EofInEnum) {
937fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectHasErrors(
938fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "enum TestEnum {",
939fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "0:15: Reached end of input in enum definition (missing '}').\n");
940fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
941fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
942fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, EnumValueMissingNumber) {
943fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectHasErrors(
944fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "enum TestEnum {\n"
945fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  FOO;\n"
946fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n",
947fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "1:5: Missing numeric value for enum constant.\n");
948fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
949fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
950fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// -------------------------------------------------------------------
951fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Service errors
952fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
953fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, EofInService) {
954fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectHasErrors(
955fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "service TestService {",
956fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "0:21: Reached end of input in service definition (missing '}').\n");
957fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
958fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
959fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, ServiceMethodPrimitiveParams) {
960fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectHasErrors(
961fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "service TestService {\n"
962fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  rpc Foo(int32) returns (string);\n"
963fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n",
964fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "1:10: Expected message type.\n"
965fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "1:26: Expected message type.\n");
966fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
967fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
968fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, EofInMethodOptions) {
969fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectHasErrors(
970fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "service TestService {\n"
971fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  rpc Foo(Bar) returns(Bar) {",
972fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "1:29: Reached end of input in method options (missing '}').\n"
973fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "1:29: Reached end of input in service definition (missing '}').\n");
974fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
975fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
976fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, PrimitiveMethodInput) {
977fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectHasErrors(
978fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "service TestService {\n"
979fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  rpc Foo(int32) returns(Bar);\n"
980fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n",
981fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "1:10: Expected message type.\n");
982fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
983fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
984fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, MethodOptionTypeError) {
985fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // This used to cause an infinite loop.
986fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectHasErrors(
987fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message Baz {}\n"
988fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "service Foo {\n"
989fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  rpc Bar(Baz) returns(Baz) { option invalid syntax; }\n"
990fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n",
991fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "2:45: Expected \"=\".\n");
992fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
993fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
994fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// -------------------------------------------------------------------
995fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Import and package errors
996fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
997fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, ImportNotQuoted) {
998fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectHasErrors(
999fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "import foo;\n",
1000fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "0:7: Expected a string naming the file to import.\n");
1001fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1002fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1003fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseErrorTest, MultiplePackagesInFile) {
1004fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectHasErrors(
1005fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "package foo;\n"
1006fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "package bar;\n",
1007fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "1:0: Multiple package definitions.\n");
1008fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1009fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1010fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ===================================================================
1011fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Test that errors detected by DescriptorPool correctly report line and
1012fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// column numbers.  We have one test for every call to RecordLocation() in
1013fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// parser.cc.
1014fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1015fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletypedef ParserTest ParserValidationErrorTest;
1016fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1017fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParserValidationErrorTest, PackageNameError) {
1018fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Create another file which defines symbol "foo".
1019fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  FileDescriptorProto other_file;
1020fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  other_file.set_name("bar.proto");
1021fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  other_file.add_message_type()->set_name("foo");
1022fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_TRUE(pool_.BuildFile(other_file) != NULL);
1023fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1024fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Now try to define it as a package.
1025fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectHasValidationErrors(
1026fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "package foo.bar;",
1027fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "0:8: \"foo\" is already defined (as something other than a package) "
1028fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "in file \"bar.proto\".\n");
1029fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1030fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1031fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParserValidationErrorTest, MessageNameError) {
1032fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectHasValidationErrors(
1033fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message Foo {}\n"
1034fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message Foo {}\n",
1035fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "1:8: \"Foo\" is already defined.\n");
1036fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1037fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1038fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParserValidationErrorTest, FieldNameError) {
1039fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectHasValidationErrors(
1040fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message Foo {\n"
1041fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  optional int32 bar = 1;\n"
1042fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  optional int32 bar = 2;\n"
1043fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n",
1044fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "2:17: \"bar\" is already defined in \"Foo\".\n");
1045fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1046fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1047fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParserValidationErrorTest, FieldTypeError) {
1048fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectHasValidationErrors(
1049fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message Foo {\n"
1050fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  optional Baz bar = 1;\n"
1051fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n",
1052fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "1:11: \"Baz\" is not defined.\n");
1053fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1054fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1055fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParserValidationErrorTest, FieldNumberError) {
1056fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectHasValidationErrors(
1057fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message Foo {\n"
1058fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  optional int32 bar = 0;\n"
1059fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n",
1060fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "1:23: Field numbers must be positive integers.\n");
1061fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1062fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1063fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParserValidationErrorTest, FieldExtendeeError) {
1064fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectHasValidationErrors(
1065fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "extend Baz { optional int32 bar = 1; }\n",
1066fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "0:7: \"Baz\" is not defined.\n");
1067fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1068fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1069fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParserValidationErrorTest, FieldDefaultValueError) {
1070fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectHasValidationErrors(
1071fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "enum Baz { QUX = 1; }\n"
1072fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message Foo {\n"
1073fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  optional Baz bar = 1 [default=NO_SUCH_VALUE];\n"
1074fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n",
1075fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "2:32: Enum type \"Baz\" has no value named \"NO_SUCH_VALUE\".\n");
1076fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1077fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1078fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParserValidationErrorTest, FileOptionNameError) {
1079fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectHasValidationErrors(
1080fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "option foo = 5;",
1081fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "0:7: Option \"foo\" unknown.\n");
1082fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1083fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1084fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParserValidationErrorTest, FileOptionValueError) {
1085fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectHasValidationErrors(
1086fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "option java_outer_classname = 5;",
1087fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "0:30: Value must be quoted string for string option "
1088fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "\"google.protobuf.FileOptions.java_outer_classname\".\n");
1089fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1090fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1091fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParserValidationErrorTest, FieldOptionNameError) {
1092fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectHasValidationErrors(
1093fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message Foo {\n"
1094fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  optional bool bar = 1 [foo=1];\n"
1095fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n",
1096fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "1:25: Option \"foo\" unknown.\n");
1097fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1098fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1099fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParserValidationErrorTest, FieldOptionValueError) {
1100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectHasValidationErrors(
1101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message Foo {\n"
1102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  optional int32 bar = 1 [ctype=1];\n"
1103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n",
1104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "1:32: Value must be identifier for enum-valued option "
1105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "\"google.protobuf.FieldOptions.ctype\".\n");
1106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParserValidationErrorTest, ExtensionRangeNumberError) {
1109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectHasValidationErrors(
1110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message Foo {\n"
1111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  extensions 0;\n"
1112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n",
1113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "1:13: Extension numbers must be positive integers.\n");
1114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParserValidationErrorTest, EnumNameError) {
1117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectHasValidationErrors(
1118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "enum Foo {A = 1;}\n"
1119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "enum Foo {B = 1;}\n",
1120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "1:5: \"Foo\" is already defined.\n");
1121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParserValidationErrorTest, EnumValueNameError) {
1124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectHasValidationErrors(
1125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "enum Foo {\n"
1126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  BAR = 1;\n"
1127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  BAR = 1;\n"
1128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n",
1129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "2:2: \"BAR\" is already defined.\n");
1130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParserValidationErrorTest, ServiceNameError) {
1133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectHasValidationErrors(
1134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "service Foo {}\n"
1135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "service Foo {}\n",
1136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "1:8: \"Foo\" is already defined.\n");
1137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParserValidationErrorTest, MethodNameError) {
1140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectHasValidationErrors(
1141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message Baz {}\n"
1142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "service Foo {\n"
1143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  rpc Bar(Baz) returns(Baz);\n"
1144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  rpc Bar(Baz) returns(Baz);\n"
1145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n",
1146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "3:6: \"Bar\" is already defined in \"Foo\".\n");
1147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParserValidationErrorTest, MethodInputTypeError) {
1150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectHasValidationErrors(
1151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message Baz {}\n"
1152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "service Foo {\n"
1153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  rpc Bar(Qux) returns(Baz);\n"
1154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n",
1155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "2:10: \"Qux\" is not defined.\n");
1156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParserValidationErrorTest, MethodOutputTypeError) {
1159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ExpectHasValidationErrors(
1160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "message Baz {}\n"
1161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "service Foo {\n"
1162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  rpc Bar(Baz) returns(Qux);\n"
1163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n",
1164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "2:23: \"Qux\" is not defined.\n");
1165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ===================================================================
1168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Test that the output from FileDescriptor::DebugString() (and all other
1169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// descriptor types) is parseable, and results in the same Descriptor
1170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// definitions again afoter parsing (not, however, that the order of messages
1171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// cannot be guaranteed to be the same)
1172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletypedef ParserTest ParseDecriptorDebugTest;
1174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass CompareDescriptorNames {
1176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
1177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  bool operator()(const DescriptorProto* left, const DescriptorProto* right) {
1178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return left->name() < right->name();
1179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
1180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
1181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Sorts nested DescriptorProtos of a DescriptoProto, by name.
1183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid SortMessages(DescriptorProto *descriptor_proto) {
1184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int size = descriptor_proto->nested_type_size();
1185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // recursively sort; we can't guarantee the order of nested messages either
1186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  for (int i = 0; i < size; ++i) {
1187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    SortMessages(descriptor_proto->mutable_nested_type(i));
1188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
1189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  DescriptorProto **data =
1190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    descriptor_proto->mutable_nested_type()->mutable_data();
1191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  sort(data, data + size, CompareDescriptorNames());
1192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Sorts DescriptorProtos belonging to a FileDescriptorProto, by name.
1195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid SortMessages(FileDescriptorProto *file_descriptor_proto) {
1196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int size = file_descriptor_proto->message_type_size();
1197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // recursively sort; we can't guarantee the order of nested messages either
1198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  for (int i = 0; i < size; ++i) {
1199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    SortMessages(file_descriptor_proto->mutable_message_type(i));
1200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
1201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  DescriptorProto **data =
1202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    file_descriptor_proto->mutable_message_type()->mutable_data();
1203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  sort(data, data + size, CompareDescriptorNames());
1204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ParseDecriptorDebugTest, TestAllDescriptorTypes) {
1207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const FileDescriptor* original_file =
1208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville     protobuf_unittest::TestAllTypes::descriptor()->file();
1209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  FileDescriptorProto expected;
1210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  original_file->CopyTo(&expected);
1211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Get the DebugString of the unittest.proto FileDecriptor, which includes
1213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // all other descriptor types
1214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  string debug_string = original_file->DebugString();
1215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Parse the debug string
1217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  SetupParser(debug_string.c_str());
1218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  FileDescriptorProto parsed;
1219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  parser_->Parse(input_.get(), &parsed);
1220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(io::Tokenizer::TYPE_END, input_->current().type);
1221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ASSERT_EQ("", error_collector_.text_);
1222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // We now have a FileDescriptorProto, but to compare with the expected we
1224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // need to link to a FileDecriptor, then output back to a proto. We'll
1225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // also need to give it the same name as the original.
1226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  parsed.set_name("google/protobuf/unittest.proto");
1227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // We need the imported dependency before we can build our parsed proto
1228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const FileDescriptor* import =
1229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville       protobuf_unittest_import::ImportMessage::descriptor()->file();
1230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  FileDescriptorProto import_proto;
1231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  import->CopyTo(&import_proto);
1232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ASSERT_TRUE(pool_.BuildFile(import_proto) != NULL);
1233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const FileDescriptor* actual = pool_.BuildFile(parsed);
1234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  parsed.Clear();
1235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  actual->CopyTo(&parsed);
1236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ASSERT_TRUE(actual != NULL);
1237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // The messages might be in different orders, making them hard to compare.
1239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // So, sort the messages in the descriptor protos (including nested messages,
1240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // recursively).
1241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  SortMessages(&expected);
1242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  SortMessages(&parsed);
1243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // I really wanted to use StringDiff here for the debug output on fail,
1245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // but the strings are too long for it, and if I increase its max size,
1246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // we get a memory allocation failure :(
1247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(expected.DebugString(), parsed.DebugString());
1248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ===================================================================
1251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // anonymous namespace
1253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1254fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace compiler
1255fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace protobuf
1256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace google
1257