// Copyright 2019 The Pigweed Authors
//
// 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
//
//     https://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 = "proto3";

// This is a test .proto file for pw_protobuf's codegen implementation.

package pw.protobuf.test;

// Top-level enum definition.
enum Bool {
  TRUE = 0;
  FALSE = 1;
  FILE_NOT_FOUND = 2;
}

// Prefixed enum
enum Error {
  ERROR_NONE = 0;
  ERROR_NOT_FOUND = 1;
  ERROR_UNKNOWN = 2;
}

// Single-value enum
enum AlwaysBlue { BLUE = 0; }

// A message!
message Pigweed {
  // Nested messages and enums.
  message Pigweed {
    enum Binary {
      ZERO = 0;
      ONE = 1;
    }

    Bool status = 1;
  }

  message Protobuf {
    enum Binary {
      ONE = 0;
      ZERO = 1;
    }

    // We must go deeper.
    message Compiler {
      enum Status {
        OK = 0;
        ERROR = 1;
        FUBAR = 2;
      }

      string file_name = 1;
      Status status = 2;
      Binary protobuf_bin = 3;
      Pigweed.Binary pigweed_bin = 4;
    }

    Binary binary_value = 1;
  }

  // Regular types.
  uint32 magic_number = 1;
  sint32 ziggy = 2;
  fixed64 cycles = 3;
  float ratio = 4;
  string error_message = 5;

  DeviceInfo device_info = 6;

  // Nested messages and enums as fields.
  Pigweed pigweed = 7;
  Protobuf.Binary bin = 8;

  Proto proto = 9;
  repeated Proto.ID id = 10;

  // Fixed-length bytes field, a string with no maximum size specified in
  // full_test.options, and a scalar with a forced callback.
  bytes data = 11;
  string description = 12;
  uint32 special_property = 13;
  int32 bungle = 14;
}

// Another message.
message Proto {
  enum Binary {
    OFF = 0;
    ON = 1;
  }

  message ID {
    uint32 id = 1;
  }

  // Circular dependency with Pigweed.
  Pigweed pigweed = 1;

  // Same name, different namespace.
  Binary bin = 2;
  Pigweed.Pigweed.Binary pigweed_pigweed_bin = 3;
  Pigweed.Protobuf.Binary pigweed_protobuf_bin = 4;

  Pigweed.Protobuf.Compiler meta = 5;
}

// Yet another message.
message DeviceInfo {
  enum DeviceStatus {
    OK = 0;
    ASSERT = 1;
    FAULT = 2;
    PANIC = 3;
  }

  string device_name = 1;
  fixed32 device_id = 2;
  DeviceStatus status = 3;

  repeated KeyValuePair attributes = 4;
}

// Ensure recursive submessages work.
message Crate {
  string name = 1;
  repeated Crate smaller_crates = 2;
}

// Two messages that should properly overlay without collisions.
message BaseMessage {
  uint32 length = 1;
  reserved 2;
}

message Overlay {
  reserved 1;
  uint32 height = 2;
}

// Ensure that reserved words are suffixed with underscores.
message IntegerMetadata {
  int32 bits = 1;
  // `signed` should become `signed_` in the C++ code.
  bool signed = 2;
  // The field name `null` shouldn't be modified in the C++ code, but the enum
  // value used for internally referring to the field should be generated as
  // `IntegerMetadata::Fields::NULL_` to avoid conflicting with `NULL`.
  bool null = 3;
}

// Enum values are handled differently from normal identifiers because they are
// automatically case-converted in the generated code. Therefore, we append an
// underscore if the output format exactly matches a reserved word or a
// standard-library macro. This enum tests that underscores are appended in
// cases where they're actually necessary but not when they can be skipped due
// to case conversion.
enum ReservedWord {
  NULL = 0;
  int = 1;
  return = 2;
  break = 3;
  for  // The linter wants a line break here.
    = 4;
  do  // The linter wants a line break here.
    = 5;
  // Note: This obviously isn't anywhere near a complete list of C++ keywords
  //       and standard-library macros.
}

// Messages and enums named either `Message` or `Fields` should be appended with
// underscores in generated C++ code so that they don't conflict with the
// codegen internals. This is only a problem if such types are defined within
// the scopes of other messages, as generated message structs automatically have
// nested types `struct Message` and `enum class Fields`. However, we simply
// apply the transformation in all contexts for consistency and simplicity.
message Function {
  message Message {
    string content = 1;
  }

  enum Fields {
    NONE = 0;
    COMPLEX_NUMBERS = 1;
    INTEGERS_MOD_5 = 2;
    MEROMORPHIC_FUNCTIONS_ON_COMPLEX_PLANE = 3;
    OTHER = 4;
  }

  Message description = 1;
  Fields domain_field = 2;
  Fields codomain_field = 3;
}

// This might be useful.
message KeyValuePair {
  string key = 1;
  string value = 2;
}

// Corner cases of code generation.
message CornerCases {
  // Generates ReadUint32() and WriteUint32() that call the parent definition.
  uint32 _uint32 = 1;
}
