blob: 6341d6c3b939169fda46d0e7fc5b3c2515034a6f [file] [log] [blame]
// 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;
}