// Protocol Buffers - Google's data interchange format
// Copyright 2008 Google Inc.  All rights reserved.
// https://developers.google.com/protocol-buffers/
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
//     * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//     * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
//     * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

syntax = "proto2";

package A.B.C;

import "ruby_generated_code_proto2_import.proto";

message TestMessage {
  optional int32 optional_int32 = 1 [default = 1];
  optional int64 optional_int64 = 2 [default = 2];
  optional uint32 optional_uint32 = 3 [default = 3];
  optional uint64 optional_uint64 = 4 [default = 4];
  optional bool optional_bool = 5 [default = true];
  optional double optional_double = 6 [default = 6.0];
  optional float optional_float = 7 [default = 7.0];
  optional string optional_string = 8 [default = "default str"];
  optional bytes optional_bytes = 9 [default = "\0\1\2\100fubar"];
  optional TestEnum optional_enum = 10 [default = A];
  optional TestMessage optional_msg = 11;
  optional TestImportedMessage optional_proto2_submessage = 12;

  repeated int32 repeated_int32 = 21;
  repeated int64 repeated_int64 = 22;
  repeated uint32 repeated_uint32 = 23;
  repeated uint64 repeated_uint64 = 24;
  repeated bool repeated_bool = 25;
  repeated double repeated_double = 26;
  repeated float repeated_float = 27;
  repeated string repeated_string = 28;
  repeated bytes repeated_bytes = 29;
  repeated TestEnum repeated_enum = 30;
  repeated TestMessage repeated_msg = 31;

  required int32 required_int32 = 41;
  required int64 required_int64 = 42;
  required uint32 required_uint32 = 43;
  required uint64 required_uint64 = 44;
  required bool required_bool = 45;
  required double required_double = 46;
  required float required_float = 47;
  required string required_string = 48;
  required bytes required_bytes = 49;
  required TestEnum required_enum = 50;
  required TestMessage required_msg = 51;

  oneof my_oneof {
    int32 oneof_int32 = 61;
    int64 oneof_int64 = 62;
    uint32 oneof_uint32 = 63;
    uint64 oneof_uint64 = 64;
    bool oneof_bool = 65;
    double oneof_double = 66;
    float oneof_float = 67;
    string oneof_string = 68;
    bytes oneof_bytes = 69;
    TestEnum oneof_enum = 70;
    TestMessage oneof_msg = 71;
  }

  message NestedMessage {
    optional int32 foo = 1;
  }

  optional NestedMessage nested_message = 80;
}

enum TestEnum {
  Default = 0;
  A = 1;
  B = 2;
  C = 3;
}
