// Protocol Buffers - Google's data interchange format
// Copyright 2008 Google Inc.  All rights reserved.
//
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file or at
// https://developers.google.com/open-source/licenses/bsd

syntax = "proto3";

// These proto descriptors have at one time been reported as an issue or defect.
// They are kept here to replicate the issue, and continue to verify the fix.

// Issue: Non-"Google.Protobuffers" namespace will ensure that protobuffer
// library types are qualified
package unittest_issues;

import "google/protobuf/struct.proto";

option csharp_namespace = "UnitTest.Issues.TestProtos";

// Issue 307: when generating doubly-nested types, any references
// should be of the form A.Types.B.Types.C.
message Issue307 {
  message NestedOnce {
    message NestedTwice {}
  }
}

// Old issue 13:
// http://code.google.com/p/protobuf-csharp-port/issues/detail?id=13 New issue
// 309: https://github.com/protocolbuffers/protobuf/issues/309

// message A {
//    optional int32 _A = 1;
// }

// message B {
//    optional int32 B_ = 1;
// }

// message AB {
//     optional int32 a_b = 1;
// }

// Similar issue with numeric names
// Java code failed too, so probably best for this to be a restriction.
// See https://github.com/protocolbuffers/protobuf/issues/308
// message NumberField {
//    optional int32 _01 = 1;
// }

// issue 19 - negative enum values

enum NegativeEnum {
  NEGATIVE_ENUM_ZERO = 0;
  FiveBelow = -5;
  MinusOne = -1;
}

message NegativeEnumMessage {
  NegativeEnum value = 1;
  repeated NegativeEnum values = 2 [packed = false];
  repeated NegativeEnum packed_values = 3 [packed = true];
}

// Issue 21: http://code.google.com/p/protobuf-csharp-port/issues/detail?id=21
// Decorate fields with [deprecated=true] as [System.Obsolete]

message DeprecatedChild {
  option deprecated = true;
}

enum DeprecatedEnum {
  option deprecated = true;

  DEPRECATED_ZERO = 0 [deprecated = true];
  one = 1;
}

message DeprecatedFieldsMessage {
  int32 PrimitiveValue = 1 [deprecated = true];
  repeated int32 PrimitiveArray = 2 [deprecated = true];

  DeprecatedChild MessageValue = 3 [deprecated = true];
  repeated DeprecatedChild MessageArray = 4 [deprecated = true];

  DeprecatedEnum EnumValue = 5 [deprecated = true];
  repeated DeprecatedEnum EnumArray = 6 [deprecated = true];
}

// Issue 45: http://code.google.com/p/protobuf-csharp-port/issues/detail?id=45
message ItemField {
  int32 item = 1;
}

message ReservedNames {
  // Force a nested type called Types
  message SomeNestedType {}

  int32 types = 1;
  int32 descriptor = 2;
}

message TestJsonFieldOrdering {
  // These fields are deliberately not declared in numeric
  // order, and the oneof fields aren't contiguous either.
  // This allows for reasonably robust tests of JSON output
  // ordering.
  // TestFieldOrderings in unittest_proto3.proto is similar,
  // but doesn't include oneofs.
  // TODO: Consider adding oneofs to TestFieldOrderings, although
  // that will require fixing other tests in multiple platforms.
  // Alternatively, consider just adding this to
  // unittest_proto3.proto if multiple platforms want it.

  int32 plain_int32 = 4;

  oneof o1 {
    string o1_string = 2;
    int32 o1_int32 = 5;
  }

  string plain_string = 1;

  oneof o2 {
    int32 o2_int32 = 6;
    string o2_string = 3;
  }
}

message TestJsonName {
  // Message for testing the effects for of the json_name option
  string name = 1;
  string description = 2 [json_name = "desc"];
  string guid = 3 [json_name = "exid"];
}

// Issue 3200: When merging two messages which use the same
// oneof case, which is itself a message type, the submessages should
// be merged.
message OneofMerging {
  message Nested {
    int32 x = 1;
    int32 y = 2;
  }

  oneof value {
    string text = 1;
    Nested nested = 2;
  }
}

message NullValueOutsideStruct {
  oneof value {
    string string_value = 1;
    google.protobuf.NullValue null_value = 2;
  }
}

message NullValueNotInOneof {
  google.protobuf.NullValue null_value = 2;
}

message MixedRegularAndOptional {
  string regular_field = 1;
  optional string optional_field = 2;
}

message OneofWithNoneField {
  oneof test {
    string x = 1;
    string none = 2;
  }
}

message OneofWithNoneName {
  oneof none {
    string x = 1;
    string y = 2;
  }
}

// Issue 8810
message DisambiguateCommonMembers {
  int32 disambiguate_common_members = 1;
  int32 types = 2;
  int32 descriptor = 3;
  int32 equals = 4;
  int32 to_string = 5;
  int32 get_hash_code = 6;
  int32 write_to = 7;
  int32 clone = 8;
  int32 calculate_size = 9;
  int32 merge_from = 10;
  int32 on_construction = 11;
  int32 parser = 12;
}

message Issue11987Message {
  int32 a = 1 [json_name = 'b'];
  int32 b = 2 [json_name = 'a'];
  int32 c = 3 [json_name = 'd'];
}
