/*
 * Copyright (C) 2017 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

syntax = "proto2";

package protozero.test.protos;

import "src/protozero/test/example_proto/library.proto";
import "src/protozero/test/example_proto/other_package/test_messages.proto";
import "src/protozero/test/example_proto/subpackage/test_messages.proto";

// This file contains comprehensive set of supported message structures and
// data types. Unit tests depends on the plugin-processed version of this file.

// Tests importing message definition from another proto file.
message TransgalacticParcel {
  optional TransgalacticMessage message = 1;
  optional string tracking_code = 2;
  optional TransgalacticMessage.MessageType message_type = 3;
}

enum SmallEnum {
  TO_BE = 1;
  NOT_TO_BE = 0;
}

enum SignedEnum {
  POSITIVE = 1;
  NEUTRAL = 0;
  NEGATIVE = -1;
}

enum BigEnum {
  BEGIN = 10;
  END = 100500;
}

enum VeryNegativeEnum {
  DEF = 0;
  VAL = -2147483648;
}

message EveryField {
  optional int32 field_int32 = 1;
  optional int64 field_int64 = 2;
  optional uint32 field_uint32 = 3;
  optional uint64 field_uint64 = 4;
  optional sint32 field_sint32 = 5;
  optional sint64 field_sint64 = 6;
  optional fixed32 field_fixed32 = 7;
  optional fixed64 field_fixed64 = 8;
  optional sfixed32 field_sfixed32 = 9;
  optional sfixed64 field_sfixed64 = 10;
  optional float field_float = 11;
  optional double field_double = 12;
  optional bool field_bool = 13;
  repeated EveryField field_nested = 14;

  optional SmallEnum small_enum = 51;
  optional SignedEnum signed_enum = 52;
  optional BigEnum big_enum = 53;
  optional VeryNegativeEnum very_negative_enum = 54;

  optional string field_string = 500;
  optional bytes field_bytes = 505;

  enum NestedEnum {
    PING = 1;
    PONG = 2;
  }
  optional NestedEnum nested_enum = 600;

  repeated string repeated_string = 700;
  repeated fixed64 repeated_fixed64 = 701;
  repeated sfixed32 repeated_sfixed32 = 702;

  repeated int32 repeated_int32 = 999;
}

message NestedA {
  message NestedB {
    message NestedC {
      optional int32 value_c = 1;
    }
    optional NestedC value_b = 1;
  }
  repeated NestedB repeated_a = 2;
  optional NestedB.NestedC super_nested = 3;
}

message CamelCaseFields {
  // To check that any reasonable name converts to camel case correctly.
  optional bool foo_bar_baz = 1;
  optional bool barBaz = 2;
  optional bool MooMoo = 3;
  optional bool URLEncoder = 4;
  optional bool XMap = 5;
  optional bool UrLE_nco__der = 6;
  optional bool __bigBang = 7;
  optional bool U2 = 8;
  optional bool bangBig__ = 9;
}

message PackedRepeatedFields {
  repeated int32 field_int32 = 1 [packed = true];
  repeated int64 field_int64 = 4 [packed = true];
  repeated uint32 field_uint32 = 5 [packed = true];
  repeated uint64 field_uint64 = 6 [packed = true];
  // Repeated packed Zig-zag fields are currently unsupported by our protoc
  // plugin.
  // repeated sint32 field_sint32 = 7 [packed = true];
  // repeated sint64 field_sint64 = 8 [packed = true];
  repeated fixed32 field_fixed32 = 2 [packed = true];
  repeated fixed64 field_fixed64 = 9 [packed = true];
  repeated sfixed32 field_sfixed32 = 10 [packed = true];
  repeated sfixed64 field_sfixed64 = 3 [packed = true];
  repeated float field_float = 11 [packed = true];
  repeated double field_double = 12 [packed = true];
  // Repeated (even non-packed) bool fields are currently unsupported by our
  // protoc plugin.
  // repeated bool field_bool = 13 [packed = true];
  repeated SmallEnum small_enum = 51 [packed = true];
  repeated SignedEnum signed_enum = 52 [packed = true];
  repeated BigEnum big_enum = 53 [packed = true];
}

// The following two messages are for testing that unknown fields being
// preserved in the decode->reencode path.

message TestVersioning_V1 {
  enum Enumz_V1 {
    ONE = 1;
    TWO = 2;
  }
  message Sub1_V1 {
    optional int32 sub1_int = 1;
    optional string sub1_string = 2;
  }
  optional int32 root_int = 1;
  repeated Enumz_V1 enumz = 2;
  optional string root_string = 3;
  repeated string rep_string = 4;
  optional Sub1_V1 sub1 = 5;
  repeated Sub1_V1 sub1_rep = 6;
  optional Sub1_V1 sub1_lazy = 7 [lazy = true];
}

message TestVersioning_V2 {
  enum Enumz_V2 {
    ONE = 1;
    TWO = 2;
    THREE_V2 = 3;
  }
  message Sub1_V2 {
    optional int32 sub1_int = 1;
    optional string sub1_string = 2;
    optional int32 sub1_int_v2 = 3;      // New in v2.
    optional string sub1_string_v2 = 4;  // New in v2.
  }
  message Sub2_V2 {  // New in v2.
    optional int32 sub2_int = 1;
    optional string sub2_string = 2;
  }

  optional int32 root_int = 1;
  repeated Enumz_V2 enumz = 2;
  optional string root_string = 3;
  repeated string rep_string = 4;
  optional Sub1_V2 sub1 = 5;
  repeated Sub1_V2 sub1_rep = 6;
  optional Sub1_V2 sub1_lazy = 7 [lazy = true];

  // New fields introduced in V2.
  optional int32 root_int_v2 = 10;
  optional Sub2_V2 sub2 = 11;
  repeated Sub2_V2 sub2_rep = 12;
  optional Sub2_V2 sub2_lazy = 13 [lazy = true];
}

message DifferentPackages {
  optional subpackage.Message subpackage_message = 1;
  optional subpackage.Message.NestedMessage subpackage_nested_message = 2;
  optional subpackage.Enum subpackage_enum = 3;
  optional subpackage.Message.NestedEnum subpackage_nested_enum = 4;

  optional .other_package.Message otherpackage_message = 5;
  optional .other_package.Message.NestedMessage otherpackage_nested_message = 6;
  optional .other_package.Enum otherpackage_enum = 7;
  optional .other_package.Message.NestedEnum otherpackage_nested_enum = 8;
}
