// 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 = "proto3";

package protobuf_unittest;

message Message3 {
  enum Enum {
    FOO = 0;
    BAR = 1;
    BAZ = 2;
    EXTRA_3 = 30;
  }

     int32 optional_int32    =  1;
     int64 optional_int64    =  2;
    uint32 optional_uint32   =  3;
    uint64 optional_uint64   =  4;
    sint32 optional_sint32   =  5;
    sint64 optional_sint64   =  6;
   fixed32 optional_fixed32  =  7;
   fixed64 optional_fixed64  =  8;
  sfixed32 optional_sfixed32 =  9;
  sfixed64 optional_sfixed64 = 10;
     float optional_float    = 11;
    double optional_double   = 12;
      bool optional_bool     = 13;
    string optional_string   = 14;
     bytes optional_bytes    = 15;
  // No 'group' in proto3.
  Message3 optional_message  = 18;
      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;
  // No 'group' in proto3.
  repeated Message3 repeated_message  = 48;
  repeated     Enum repeated_enum     = 49;

  oneof o {
       int32 oneof_int32    = 51;
       int64 oneof_int64    = 52;
      uint32 oneof_uint32   = 53;
      uint64 oneof_uint64   = 54;
      sint32 oneof_sint32   = 55;
      sint64 oneof_sint64   = 56;
     fixed32 oneof_fixed32  = 57;
     fixed64 oneof_fixed64  = 58;
    sfixed32 oneof_sfixed32 = 59;
    sfixed64 oneof_sfixed64 = 60;
       float oneof_float    = 61;
      double oneof_double   = 62;
        bool oneof_bool     = 63;
      string oneof_string   = 64;
       bytes oneof_bytes    = 65;
    // No 'group' in proto3.
    Message3 oneof_message  = 68;
        Enum oneof_enum     = 69;
  }

  // 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  , Message3> map_string_message    = 85;
  map<int32   , bytes   > map_int32_bytes       = 86;
  map<int32   , Enum    > map_int32_enum        = 87;
  map<int32   , Message3> map_int32_message     = 88;
}
