// Test description and protos to work with it.

syntax = "proto2";

import "tensorflow/core/framework/types.proto";

package tensorflow.contrib.proto;

// A TestCase holds a proto and assertions about how it should decode.
message TestCase {
  // Batches of primitive values.
  repeated TestValue values = 1;
  // The batch shapes.
  repeated int32 shapes = 2;
  // Expected sizes for each field.
  repeated int32 sizes = 3;
  // Expected values for each field.
  repeated FieldSpec fields = 4;
};

// FieldSpec describes the expected output for a single field.
message FieldSpec {
  optional string name = 1;
  optional tensorflow.DataType dtype = 2;
  optional TestValue value = 3;
};

// NOTE: This definition must be kept in sync with PackedTestValue.
message TestValue {
  repeated double double_value = 1;
  repeated float float_value = 2;
  repeated int64 int64_value = 3;
  repeated uint64 uint64_value = 4;
  repeated int32 int32_value = 5;
  repeated fixed64 fixed64_value = 6;
  repeated fixed32 fixed32_value = 7;
  repeated bool bool_value = 8;
  repeated string string_value = 9;
  repeated bytes bytes_value = 12;
  repeated uint32 uint32_value = 13;
  repeated sfixed32 sfixed32_value = 15;
  repeated sfixed64 sfixed64_value = 16;
  repeated sint32 sint32_value = 17;
  repeated sint64 sint64_value = 18;
  repeated PrimitiveValue message_value = 19;

  // Optional fields with explicitly-specified defaults.
  optional double double_value_with_default = 20 [default = 1.0];
  optional float float_value_with_default = 21 [default = 2.0];
  optional int64 int64_value_with_default = 22 [default = 3];
  optional uint64 uint64_value_with_default = 23 [default = 4];
  optional int32 int32_value_with_default = 24 [default = 5];
  optional fixed64 fixed64_value_with_default = 25 [default = 6];
  optional fixed32 fixed32_value_with_default = 26 [default = 7];
  optional bool bool_value_with_default = 27 [default = true];
  optional string string_value_with_default = 28 [default = "a"];
  optional bytes bytes_value_with_default = 29
      [default = "a longer default string"];
  optional uint32 uint32_value_with_default = 30 [default = 9];
  optional sfixed32 sfixed32_value_with_default = 31 [default = 10];
  optional sfixed64 sfixed64_value_with_default = 32 [default = 11];
  optional sint32 sint32_value_with_default = 33 [default = 12];
  optional sint64 sint64_value_with_default = 34 [default = 13];
}

// A PackedTestValue looks exactly the same as a TestValue in the text format,
// but the binary serializion is different. We test the packed representations
// by loading the same test cases using this definition instead of TestValue.
//
// NOTE: This definition must be kept in sync with TestValue in every way except
// the packed=true declaration.
message PackedTestValue {
  repeated double double_value = 1 [packed = true];
  repeated float float_value = 2 [packed = true];
  repeated int64 int64_value = 3 [packed = true];
  repeated uint64 uint64_value = 4 [packed = true];
  repeated int32 int32_value = 5 [packed = true];
  repeated fixed64 fixed64_value = 6 [packed = true];
  repeated fixed32 fixed32_value = 7 [packed = true];
  repeated bool bool_value = 8 [packed = true];
  repeated string string_value = 9;
  repeated bytes bytes_value = 12;
  repeated uint32 uint32_value = 13 [packed = true];
  repeated sfixed32 sfixed32_value = 15 [packed = true];
  repeated sfixed64 sfixed64_value = 16 [packed = true];
  repeated sint32 sint32_value = 17 [packed = true];
  repeated sint64 sint64_value = 18 [packed = true];
  repeated PrimitiveValue message_value = 19;

  optional double double_value_with_default = 20 [default = 1.0];
  optional float float_value_with_default = 21 [default = 2.0];
  optional int64 int64_value_with_default = 22 [default = 3];
  optional uint64 uint64_value_with_default = 23 [default = 4];
  optional int32 int32_value_with_default = 24 [default = 5];
  optional fixed64 fixed64_value_with_default = 25 [default = 6];
  optional fixed32 fixed32_value_with_default = 26 [default = 7];
  optional bool bool_value_with_default = 27 [default = true];
  optional string string_value_with_default = 28 [default = "a"];
  optional bytes bytes_value_with_default = 29
      [default = "a longer default string"];
  optional uint32 uint32_value_with_default = 30 [default = 9];
  optional sfixed32 sfixed32_value_with_default = 31 [default = 10];
  optional sfixed64 sfixed64_value_with_default = 32 [default = 11];
  optional sint32 sint32_value_with_default = 33 [default = 12];
  optional sint64 sint64_value_with_default = 34 [default = 13];
}

message PrimitiveValue {
  optional double double_value = 1;
  optional float float_value = 2;
  optional int64 int64_value = 3;
  optional uint64 uint64_value = 4;
  optional int32 int32_value = 5;
  optional fixed64 fixed64_value = 6;
  optional fixed32 fixed32_value = 7;
  optional bool bool_value = 8;
  optional string string_value = 9;
  optional bytes bytes_value = 12;
  optional uint32 uint32_value = 13;
  optional sfixed32 sfixed32_value = 15;
  optional sfixed64 sfixed64_value = 16;
  optional sint32 sint32_value = 17;
  optional sint64 sint64_value = 18;
}

// Message containing fields with field numbers higher than any field above.
// An instance of this message is prepended to each binary message in the test
// to exercise the code path that handles fields encoded out of order of field
// number.
message ExtraFields {
  optional string string_value = 1776;
  optional bool bool_value = 1777;
}

// The messages below are for yet-to-be created tests.

message EnumValue {
  enum Color {
    RED = 0;
    ORANGE = 1;
    YELLOW = 2;
    GREEN = 3;
    BLUE = 4;
    INDIGO = 5;
    VIOLET = 6;
  };
  optional Color enum_value = 14;
  repeated Color repeated_enum_value = 15;
}


message InnerMessageValue {
  optional float float_value = 2;
  repeated bytes bytes_values = 8;
}

message MiddleMessageValue {
  repeated int32 int32_values = 5;
  optional InnerMessageValue message_value = 11;
  optional uint32 uint32_value = 13;
}

message MessageValue {
  optional double double_value = 1;
  optional MiddleMessageValue message_value = 11;
}

message RepeatedMessageValue {
  message NestedMessageValue {
    optional float float_value = 2;
    repeated bytes bytes_values = 8;
  }

  repeated NestedMessageValue message_values = 11;
}
