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

package goproto.proto.test3;

import "internal/testprotos/test3/test_import.proto";

option go_package = "google.golang.org/protobuf/internal/testprotos/test3";

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

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

  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;
  NestedMessage  optional_nested_message  = 18;
  ForeignMessage optional_foreign_message = 19;
  ImportMessage  optional_import_message  = 20;
  NestedEnum     optional_nested_enum     = 21;
  ForeignEnum    optional_foreign_enum    = 22;
  ImportEnum     optional_import_enum     = 23;

  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 NestedMessage  repeated_nested_message  = 48;
  repeated ForeignMessage repeated_foreign_message = 49;
  repeated ImportMessage  repeated_importmessage   = 50;
  repeated NestedEnum     repeated_nested_enum     = 51;
  repeated ForeignEnum    repeated_foreign_enum    = 52;
  repeated ImportEnum     repeated_importenum      = 53;

  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 ForeignMessage {
  int32 c = 1;
  int32 d = 2;
}

enum ForeignEnum {
  FOREIGN_ZERO = 0;
  FOREIGN_FOO = 4;
  FOREIGN_BAR = 5;
  FOREIGN_BAZ = 6;
}
