// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

syntax = "proto2";

package goproto.proto.test;

option go_package = "github.com/golang/protobuf/v2/proto/testpb";

message TestAllTypes {
  message NestedMessage {
    optional int32 a = 1;
    optional TestAllTypes corecursive = 2;
  }

  enum NestedEnum {
    FOO = 0;
    BAR = 1;
    BAZ = 2;
    NEG = -1;  // Intentionally negative.
  }

  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 NestedMessage optional_nested_message = 18;
  optional NestedEnum    optional_nested_enum    = 21;

  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 NestedMessage repeated_nested_message = 48;
  repeated NestedEnum    repeated_nested_enum    = 51;

  map <   int32, int32>         map_int32_int32           = 56;
  map <   int64, int64>         map_int64_int64           = 57;
  map <  uint32, uint32>        map_uint32_uint32         = 58;
  map <  uint64, uint64>        map_uint64_uint64         = 59;
  map <  sint32, sint32>        map_sint32_sint32         = 60;
  map <  sint64, sint64>        map_sint64_sint64         = 61;
  map < fixed32, fixed32>       map_fixed32_fixed32       = 62;
  map < fixed64, fixed64>       map_fixed64_fixed64       = 63;
  map <sfixed32, sfixed32>      map_sfixed32_sfixed32     = 64;
  map <sfixed64, sfixed64>      map_sfixed64_sfixed64     = 65;
  map <   int32, float>         map_int32_float           = 66;
  map <   int32, double>        map_int32_double          = 67;
  map <    bool, bool>          map_bool_bool             = 68;
  map <  string, string>        map_string_string         = 69;
  map <  string, bytes>         map_string_bytes          = 70;
  map <  string, NestedMessage> map_string_nested_message = 71;
  map <  string, NestedEnum>    map_string_nested_enum    = 73;

  oneof oneof_field {
    uint32        oneof_uint32         = 111;
    NestedMessage oneof_nested_message = 112;
    string        oneof_string         = 113;
    bytes         oneof_bytes          = 114;
    bool          oneof_bool           = 115;
    uint64        oneof_uint64         = 116;
    float         oneof_float          = 117;
    double        oneof_double         = 118;
    NestedEnum    oneof_enum           = 119;
  }
}

message TestAllExtensions {
  extensions 1 to max;
}

extend TestAllExtensions {
  optional int32    optional_int32_extension    =  1;
  optional int64    optional_int64_extension    =  2;
  optional uint32   optional_uint32_extension   =  3;
  optional uint64   optional_uint64_extension   =  4;
  optional sint32   optional_sint32_extension   =  5;
  optional sint64   optional_sint64_extension   =  6;
  optional fixed32  optional_fixed32_extension  =  7;
  optional fixed64  optional_fixed64_extension  =  8;
  optional sfixed32 optional_sfixed32_extension =  9;
  optional sfixed64 optional_sfixed64_extension = 10;
  optional float    optional_float_extension    = 11;
  optional double   optional_double_extension   = 12;
  optional bool     optional_bool_extension     = 13;
  optional string   optional_string_extension   = 14;
  optional bytes    optional_bytes_extension    = 15;

  optional group OptionalGroup_extension = 16 {
    optional int32 a = 17;
  }

  optional TestAllTypes.NestedMessage optional_nested_message_extension = 18;
  optional TestAllTypes.NestedEnum optional_nested_enum_extension = 21;

  repeated int32    repeated_int32_extension    = 31;
  repeated int64    repeated_int64_extension    = 32;
  repeated uint32   repeated_uint32_extension   = 33;
  repeated uint64   repeated_uint64_extension   = 34;
  repeated sint32   repeated_sint32_extension   = 35;
  repeated sint64   repeated_sint64_extension   = 36;
  repeated fixed32  repeated_fixed32_extension  = 37;
  repeated fixed64  repeated_fixed64_extension  = 38;
  repeated sfixed32 repeated_sfixed32_extension = 39;
  repeated sfixed64 repeated_sfixed64_extension = 40;
  repeated float    repeated_float_extension    = 41;
  repeated double   repeated_double_extension   = 42;
  repeated bool     repeated_bool_extension     = 43;
  repeated string   repeated_string_extension   = 44;
  repeated bytes    repeated_bytes_extension    = 45;

  repeated group RepeatedGroup_extension = 46 {
    optional int32 a = 47;
  }

  repeated TestAllTypes.NestedMessage repeated_nested_message_extension = 48;
  repeated TestAllTypes.NestedEnum repeated_nested_enum_extension = 51;
}
