// Protocol Buffers - Google's data interchange format
// Copyright 2015 Google Inc.  All rights reserved.
//
// 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.

syntax = "proto2";

package protobuf_unittest;

message Message2 {
  enum Enum {
    FOO = 0;
    BAR = 1;
    BAZ = 2;
    EXTRA_2 = 20;
  }

  optional    int32 optional_int32    =  1;
  optional    int64 optional_int64    =  2;
  optional   uint32 optional_uint32   =  3;
  optional   uint64 optional_uint64   =  4;
  optional   sint32 optional_sint32   =  5;
  optional   sint64 optional_sint64   =  6;
  optional  fixed32 optional_fixed32  =  7;
  optional  fixed64 optional_fixed64  =  8;
  optional sfixed32 optional_sfixed32 =  9;
  optional sfixed64 optional_sfixed64 = 10;
  optional    float optional_float    = 11;
  optional   double optional_double   = 12;
  optional     bool optional_bool     = 13;
  optional   string optional_string   = 14;
  optional    bytes optional_bytes    = 15;
  optional group OptionalGroup = 16 {
    optional int32 a = 17;
  }
  optional Message2  optional_message = 18;
  optional Enum         optional_enum = 19;

  repeated    int32 repeated_int32    = 31;
  repeated    int64 repeated_int64    = 32;
  repeated   uint32 repeated_uint32   = 33;
  repeated   uint64 repeated_uint64   = 34;
  repeated   sint32 repeated_sint32   = 35;
  repeated   sint64 repeated_sint64   = 36;
  repeated  fixed32 repeated_fixed32  = 37;
  repeated  fixed64 repeated_fixed64  = 38;
  repeated sfixed32 repeated_sfixed32 = 39;
  repeated sfixed64 repeated_sfixed64 = 40;
  repeated    float repeated_float    = 41;
  repeated   double repeated_double   = 42;
  repeated     bool repeated_bool     = 43;
  repeated   string repeated_string   = 44;
  repeated    bytes repeated_bytes    = 45;
  repeated group RepeatedGroup = 46 {
    optional int32 a = 47;
  }
  repeated Message2 repeated_message  = 48;
  repeated Enum     repeated_enum     = 49;

  oneof o {
       int32 oneof_int32    = 51 [default = 100];
       int64 oneof_int64    = 52 [default = 101];
      uint32 oneof_uint32   = 53 [default = 102];
      uint64 oneof_uint64   = 54 [default = 103];
      sint32 oneof_sint32   = 55 [default = 104];
      sint64 oneof_sint64   = 56 [default = 105];
     fixed32 oneof_fixed32  = 57 [default = 106];
     fixed64 oneof_fixed64  = 58 [default = 107];
    sfixed32 oneof_sfixed32 = 59 [default = 108];
    sfixed64 oneof_sfixed64 = 60 [default = 109];
       float oneof_float    = 61 [default = 110];
      double oneof_double   = 62 [default = 111];
        bool oneof_bool     = 63 [default = true];
      string oneof_string   = 64 [default = "string"];
       bytes oneof_bytes    = 65 [default = "data"];
       group OneofGroup     = 66 {
         optional int32 a = 67;
         optional int32 b = 167;
       }
     Message2 oneof_message = 68;
     Enum        oneof_enum = 69 [default = BAZ];
  }

  // Some token map cases, too many combinations to list them all.
  map<int32   , int32   > map_int32_int32       = 70;
  map<int64   , int64   > map_int64_int64       = 71;
  map<uint32  , uint32  > map_uint32_uint32     = 72;
  map<uint64  , uint64  > map_uint64_uint64     = 73;
  map<sint32  , sint32  > map_sint32_sint32     = 74;
  map<sint64  , sint64  > map_sint64_sint64     = 75;
  map<fixed32 , fixed32 > map_fixed32_fixed32   = 76;
  map<fixed64 , fixed64 > map_fixed64_fixed64   = 77;
  map<sfixed32, sfixed32> map_sfixed32_sfixed32 = 78;
  map<sfixed64, sfixed64> map_sfixed64_sfixed64 = 79;
  map<int32   , float   > map_int32_float       = 80;
  map<int32   , double  > map_int32_double      = 81;
  map<bool    , bool    > map_bool_bool         = 82;
  map<string  , string  > map_string_string     = 83;
  map<string  , bytes   > map_string_bytes      = 84;
  map<string  , Message2> map_string_message    = 85;
  map<int32   , bytes   > map_int32_bytes       = 86;
  map<int32   , Enum    > map_int32_enum        = 87;
  map<int32   , Message2> map_int32_message     = 88;
}
