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
option csharp_namespace = "UnitTest.Issues.TestProtos";

package unittest_issues;

import "google/protobuf/struct.proto";

// 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 {
}

enum DeprecatedEnum {
    DEPRECATED_ZERO = 0;
    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;
}
