// 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.
import "google/protobuf/csharp_options.proto";

// Issue: Non-"Google.Protobuffers" namespace will ensure that protobuffer library types are qualified
option (google.protobuf.csharp_file_options).namespace = "UnitTest.Issues.TestProtos";
option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestExtrasIssuesProtoFile";

package unittest_issues;
option optimize_for = SPEED;

// The following is a representative set of features
/*
enum EnumOptions {
    ONE = 0;
    TWO = 1;
    THREE = 2;
}

message TestBasicChild
{
    repeated EnumOptions options = 3;
    optional bytes binary = 4;
}

message TestBasicNoFields {
}

message TestBasicRescursive {
    optional TestBasicRescursive child = 1;
}

message TestBasicMessage {

    optional int64 number = 6;
    repeated int32 numbers = 2;
    optional string text = 3;
    repeated string textlines = 700;
    optional bool valid = 5;
    
    optional TestBasicChild child = 1;
    repeated group Children = 401 
    {
        repeated EnumOptions options = 3;
        optional bytes binary = 4;
    }

    extensions 100 to 199;
}

message  TestBasicExtension {
  required int32 number = 1;
}
  
extend TestBasicMessage {
  optional EnumOptions extension_enum = 101;
  optional string extension_text = 102;
  repeated int32 extension_number = 103 [packed = true];
  optional TestBasicExtension extension_message = 199;
}

// Issue for non-qualified type reference in new services generation
option (google.protobuf.csharp_file_options).service_generator_type = IRPCDISPATCH;

service TestGenericService {
  rpc Foo(TestBasicNoFields) returns (TestBasicMessage);
  rpc Bar(TestBasicNoFields) returns (TestBasicMessage);
}
*/
// Issue 13: http://code.google.com/p/protobuf-csharp-port/issues/detail?id=13
 
message A {
    optional int32 _A = 1;
}

message B {
    optional int32 B_ = 1;
}

message AB {
    optional int32 a_b = 1;
}

// Similar issue with numeric names
message NumberField {
    optional int32 _01 = 1;
}

// Issue 28: Circular message dependencies result in null defaults for DefaultInstance

message MyMessageAReferenceB {
    required MyMessageBReferenceA value = 1;
}

message MyMessageBReferenceA {
    required MyMessageAReferenceB value = 1;
}

// issue 19 - negative enum values

enum NegativeEnum {
    FiveBelow = -5;
    MinusOne = -1;
    Zero = 0;
}

message NegativeEnumMessage { 
    optional NegativeEnum value = 1;
    repeated NegativeEnum values = 2;
    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 {
}

enum DeprecatedEnum {
    one = 1;
}

message DeprecatedFieldsMessage {
    optional int32 PrimitiveValue = 1 [deprecated = true];
    repeated int32 PrimitiveArray = 2 [deprecated = true];

    optional DeprecatedChild MessageValue = 3 [deprecated = true];
    repeated DeprecatedChild MessageArray = 4 [deprecated = true];

    optional 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 {
  optional int32 item = 1;
}
