// Protocol Buffers - Google's data interchange format
// Copyright 2008 Google Inc.  All rights reserved.
// https://developers.google.com/protocol-buffers/
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
//     * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//     * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
//     * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

// Author: kenton@google.com (Kenton Varda)
//  Based on original Protocol Buffers design by
//  Sanjay Ghemawat, Jeff Dean, and others.
//
// A proto file we will use for unit testing.

syntax = "proto2";

package protobuf_unittest;

import "google/protobuf/any.proto";
import "google/protobuf/struct.proto";

message TestFlagsAndStrings {
  required int32 A = 1;
  repeated group RepeatedGroup = 2 {
    required string f = 3;
  }
}

message TestBase64ByteArrays {
  required bytes a = 1;
}

message TestJavaScriptJSON {
  optional int32 a = 1;
  optional float final = 2;
  optional string in = 3;
  optional string Var = 4;
}

message TestJavaScriptOrderJSON1 {
  optional int32 d = 1;
  optional int32 c = 2;
  optional bool x = 3;
  optional int32 b = 4;
  optional int32 a = 5;
}

message TestJavaScriptOrderJSON2 {
  optional int32 d = 1;
  optional int32 c = 2;
  optional bool x = 3;
  optional int32 b = 4;
  optional int32 a = 5;
  repeated TestJavaScriptOrderJSON1 z = 6;
}

message TestLargeInt {
  required int64 a = 1;
  required uint64 b = 2;
}

message TestNumbers {
  enum MyType {
    OK = 0;
    WARNING = 1;
    ERROR = 2;
  }
  optional MyType a = 1;
  optional int32 b = 2;
  optional float c = 3;
  optional bool d = 4;
  optional double e = 5;
  optional uint32 f = 6;
}

message TestCamelCase {
  optional string normal_field = 1;
  optional int32 CAPITAL_FIELD = 2;
  optional int32 CamelCaseField = 3;
}

message TestBoolMap {
  map<bool, int32> bool_map = 1;
}

message TestRecursion {
  optional int32 value = 1;
  optional TestRecursion child = 2;
}

message TestStringMap {
  map<string, string> string_map = 1;
}

message TestStringSerializer {
  optional string scalar_string = 1;
  repeated string repeated_string = 2;
  map<string, string> string_map = 3;
}

message TestMessageWithExtension {
  extensions 100 to max;
}

message TestExtension {
  extend TestMessageWithExtension {
    optional TestExtension ext = 100;
  }
  optional string value = 1;
}

enum EnumValue {
  PROTOCOL = 0;
  BUFFER = 1;
  DEFAULT = 2;
}

message TestDefaultEnumValue {
  optional EnumValue enum_value = 1 [default = DEFAULT];
}
