// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "base/test/values_test_util.h"
#include "components/proto_extras/test_proto/test_proto.equal.h"
#include "components/proto_extras/test_proto/test_proto.ostream.h"
#include "components/proto_extras/test_proto/test_proto.pb.h"
#include "components/proto_extras/test_proto/test_proto.test.h"
#include "components/proto_extras/test_proto/test_proto.to_value.h"
#include "components/proto_extras/test_proto/test_proto_dependency.pb.h"
#include "components/proto_extras/test_proto/test_proto_dependency.to_value.h"
#include "components/proto_extras/test_proto2/test_proto2.equal.h"
#include "components/proto_extras/test_proto2/test_proto2.ostream.h"
#include "components/proto_extras/test_proto2/test_proto2.pb.h"
#include "components/proto_extras/test_proto2/test_proto2.test.h"
#include "components/proto_extras/test_proto2/test_proto2.to_value.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace proto_extras {
namespace {

TEST(ProtoExtrasToValueTest, BasicField) {
  TestMessage message;
  EXPECT_THAT(message, EqualsTestMessage(TestMessage()));

  EXPECT_EQ(Serialize(message), base::test::ParseJson(R"!({
    "double_field": 0.0,
    "int32_field": 0,
    "enum_field": "UNKNOWN",
    "uint64_field": "0",
  })!"));

  message.set_double_field(1.0);
  message.set_int32_field(2);
  message.mutable_nested_message_field()->set_int32_field(3);
  message.set_enum_field(TestMessage::ENUM_B);
  message.set_string_field("abc");
  message.set_bytes_field("\x01\x02\x03");

  EXPECT_EQ(Serialize(message), base::test::ParseJson(R"!({
    "double_field": 1.0,
    "int32_field": 2,
    "nested_message_field": {
      "int32_field": 3
    },
    "enum_field": "ENUM_B",
    "string_field": "abc",
    "bytes_field": "AQID",
    "uint64_field": "0",
})!"));
}

TEST(ProtoExtrasToValueTest, Uint64Field) {
  TestMessage message;
  message.set_uint64_field(std::numeric_limits<uint64_t>::max());
  EXPECT_EQ(Serialize(message), base::test::ParseJson(R"!({
    "double_field": 0.0,
    "int32_field": 0,
    "enum_field": "UNKNOWN",
    "uint64_field": "18446744073709551615",
    })!"));
}

TEST(ProtoExtrasToValueTest, RepeatedField) {
  TestMessage message;

  // Default fields only if empty
  EXPECT_EQ(Serialize(message), base::test::ParseJson(R"!({
    "double_field": 0.0,
    "int32_field": 0,
    "enum_field": "UNKNOWN",
    "uint64_field": "0",
})!"));

  message.add_repeated_int32_field(1);
  message.add_repeated_int32_field(2);
  message.add_repeated_int32_field(3);

  EXPECT_EQ(Serialize(message), base::test::ParseJson(R"!({
    "double_field": 0.0,
    "int32_field": 0,
    "enum_field": "UNKNOWN",
    "repeated_int32_field": [1, 2, 3],
    "uint64_field": "0",
})!"));
}

TEST(ProtoExtrasToValueTest, DepedentFile) {
  TestMessage message;
  message.mutable_dependency_message()->set_int32_field(4);

  EXPECT_EQ(Serialize(message), base::test::ParseJson(R"!({
    "double_field": 0.0,
    "int32_field": 0,
    "enum_field": "UNKNOWN",
    "dependency_message": {
      "int32_field": 4,
    },
    "uint64_field": "0",
})!"));
}

TEST(ProtoExtrasToValueTest, OneofField) {
  TestMessage message;

  // Test with maybe_int32_field set
  message.set_maybe_int32_field(100);
  EXPECT_EQ(Serialize(message), base::test::ParseJson(R"!({
    "double_field": 0.0,
    "int32_field": 0,
    "enum_field": "UNKNOWN",
    "maybe_int32_field": 100,
    "uint64_field": "0",
})!"));

  // Test with maybe_string_field set
  message.set_maybe_string_field("hello oneof");
  EXPECT_EQ(Serialize(message), base::test::ParseJson(R"!({
    "double_field": 0.0,
    "int32_field": 0,
    "enum_field": "UNKNOWN",
    "maybe_string_field": "hello oneof",
    "uint64_field": "0",
})!"));

  // Test with maybe_dependency_message set
  message.mutable_maybe_dependency_message()->set_int32_field(200);
  EXPECT_EQ(Serialize(message), base::test::ParseJson(R"!({
    "double_field": 0.0,
    "int32_field": 0,
    "enum_field": "UNKNOWN",
    "maybe_dependency_message": {
      "int32_field": 200
    },
    "uint64_field": "0",
})!"));

  // Test with maybe_enum_field set
  message.set_maybe_enum_field(TestMessage::ENUM_A);
  EXPECT_EQ(Serialize(message), base::test::ParseJson(R"!({
    "double_field": 0.0,
    "int32_field": 0,
    "enum_field": "UNKNOWN",
    "maybe_enum_field": "ENUM_A",
    "uint64_field": "0",
})!"));

  // Test with no oneof field set (should be same as default fields only)
  TestMessage message_oneof_unset;
  EXPECT_EQ(Serialize(message_oneof_unset), base::test::ParseJson(R"!({
    "double_field": 0.0,
    "int32_field": 0,
    "enum_field": "UNKNOWN",
    "uint64_field": "0",
})!"));
}

TEST(ProtoExtrasToValueTest, MapField) {
  TestMessage message;
  (*message.mutable_primitive_map_field())[1] = "hello";
  DependencyMessage dependency_message;
  (*message.mutable_message_map_field())["hello"].set_int32_field(4);
  EXPECT_EQ(Serialize(message), base::test::ParseJson(R"!({
    "double_field": 0.0,
    "int32_field": 0,
    "enum_field": "UNKNOWN",
    "uint64_field": "0",
    "primitive_map_field": {
      "1": "hello"
    },
    "message_map_field": {
      "hello": {
        "int32_field": 4
      }
    }
  })!"));
}

TEST(ProtoExtrasToValueTest, UnknownFields) {
  TestMessage message;
  *message.mutable_unknown_fields() = "unknownfielddata";
  EXPECT_EQ(Serialize(message), base::test::ParseJson(R"!({
    "double_field": 0.0,
    "int32_field": 0,
    "enum_field": "UNKNOWN",
    "unknown_fields": "dW5rbm93bmZpZWxkZGF0YQ==",
    "uint64_field": "0",
  })!"));
}

TEST(ProtoExtrasProto2ToValueTest, EmbeddedMessageToValue) {
  EmbeddedMessage message;
  base::Value result = Serialize(message);
  EXPECT_TRUE(result.is_dict());
  EXPECT_EQ(0ul, result.GetDict().size());
  message.set_str_field("test");
  result = Serialize(message);
  EXPECT_TRUE(result.is_dict());
  ASSERT_TRUE(result.GetDict().FindString("str_field")) << result.DebugString();
  EXPECT_EQ("test", *result.GetDict().FindString("str_field"));
  EXPECT_EQ(1ul, result.GetDict().size());
}

TEST(ProtoExtrasToValueTest, EmptyEmbeddedMessage) {
  TestMessage message;
  message.mutable_empty_embedded_message();
  EXPECT_EQ(Serialize(message), base::test::ParseJson(R"!({
    "double_field": 0.0,
    "int32_field": 0,
    "enum_field": "UNKNOWN",
    "empty_embedded_message": {},
    "uint64_field": "0",
  })!"));
}

TEST(ProtoExtrasToValueTest, CordBytesField) {
  TestMessage message;
  message.set_cord_bytes_field("123");
  EXPECT_EQ(Serialize(message), base::test::ParseJson(R"!({
    "cord_bytes_field": "MTIz",
    "double_field": 0.0,
    "enum_field": "UNKNOWN",
    "int32_field": 0,
    "uint64_field": "0",
  })!"));
}

TEST(ProtoExtrasProto2ToValueTest, Basic) {
  TestMessageProto2 message;
  const std::string expected_empty_message_str = R"({})";
  EXPECT_EQ(Serialize(message),
            base::JSONReader::Read(expected_empty_message_str));
  message.mutable_embedded_message()->set_str_field("test");
  message.add_repeated_embedded_message()->set_str_field("1");
  message.add_repeated_embedded_message()->set_str_field("2");
  message.set_int32_field(1);
  message.set_int64_field(-1ll);
  message.set_bytes_field("bytesbytes");
  message.add_repeated_int32_field(-1);
  message.add_repeated_int32_field(100);
  message.set_outer_enum(OUTER_ENUM_OPTION2);
  message.set_maybe_bool(true);
  message.set_inner_enum(TestMessageProto2::INNER_ENUM_OPTION1);
  message.add_repeated_inner_enum(TestMessageProto2::INNER_ENUM_UNSPECIFIED);
  message.add_repeated_inner_enum(TestMessageProto2::INNER_ENUM_OPTION2);
  message.mutable_inner_message()->set_int_field(99);
  message.set_bool_field(true);
  message.set_uint64_field(0);
  *message.mutable_unknown_fields() = "unknownfielddata";

  std::string expected_json_str = R"({
      "bool_field": true,
      "bytes_field": "Ynl0ZXNieXRlcw==",
      "embedded_message": {
          "str_field": "test"
      },
      "inner_enum": "INNER_ENUM_OPTION1",
      "inner_message": {
          "int_field": 99
      },
      "int32_field": 1,
      "int64_field": "-1",
      "maybe_bool": true,
      "outer_enum": "OUTER_ENUM_OPTION2",
      "repeated_embedded_message": [ {
          "str_field": "1"
      }, {
          "str_field": "2"
      } ],
      "repeated_inner_enum": [ "INNER_ENUM_UNSPECIFIED", "INNER_ENUM_OPTION2" ],
      "repeated_int32_field": [ -1, 100 ],
      "uint64_field": "0",
      "unknown_fields": "dW5rbm93bmZpZWxkZGF0YQ=="
    })";
  EXPECT_EQ(Serialize(message), base::JSONReader::Read(expected_json_str));
}

TEST(ProtoExtrasProto2ToValueTest, OneofField) {
  TestMessageProto2 message;
  EXPECT_EQ(Serialize(message), base::JSONReader::Read(R"({})"));
  message.set_maybe_int(1);
  EXPECT_EQ(Serialize(message), base::JSONReader::Read(R"({
    "maybe_int": 1
})"));
  message.set_maybe_bool(true);
  EXPECT_EQ(Serialize(message), base::JSONReader::Read(R"({
    "maybe_bool": true
})"));
  message.mutable_maybe_message()->set_str_field("test");
  EXPECT_EQ(Serialize(message), base::JSONReader::Read(R"({
    "maybe_message": {
      "str_field": "test"
    }
})"));
  message.set_maybe_enum(OUTER_ENUM_OPTION1);
  EXPECT_EQ(Serialize(message), base::JSONReader::Read(R"({
    "maybe_enum": "OUTER_ENUM_OPTION1"
})"));
  message.set_maybe_bytes("test");
  EXPECT_EQ(Serialize(message), base::JSONReader::Read(R"({
    "maybe_bytes": "dGVzdA=="
})"));
}

TEST(ProtoExtrasProto2ToValueTest, Uint64Field) {
  TestMessageProto2 message;
  message.set_uint64_field(std::numeric_limits<uint64_t>::max());
  EXPECT_EQ(Serialize(message), base::test::ParseJson(R"!({
    "uint64_field": "18446744073709551615"
  })!"));
}

TEST(ProtoExtrasProto2ToValueTest, MapField) {
  TestMessageProto2 message;
  message.mutable_primitive_map_field()->insert({1, "hello"});
  (*message.mutable_message_map_field())["hello"].set_str_field("world");
  EXPECT_EQ(Serialize(message), base::test::ParseJson(R"!({
    "primitive_map_field": {
      "1": "hello"
    },
    "message_map_field": {
      "hello": {
        "str_field": "world"
      }
    }
  })!"));
}

TEST(ProtoExtrasProto2StreamTest, Basic) {
  TestMessageProto2 message;
  message.set_maybe_int(1);
  std::ostringstream stream;
  stream << message;
  EXPECT_EQ(base::JSONReader::Read(stream.str()),
            base::JSONReader::Read(R"({"maybe_int": 1})"));
}

TEST(ProtoExtrasEquality, Basic) {
  TestMessage msg1;
  TestMessage msg2;

  // Test default messages are equal.
  EXPECT_EQ(msg1, msg2);

  // Test setting a field makes them unequal.
  msg1.set_int32_field(1);
  EXPECT_NE(msg1, msg2);

  // Test setting the same field to the same value makes them equal.
  msg2.set_int32_field(1);
  EXPECT_EQ(msg1, msg2);

  // Test setting different values makes them unequal.
  msg2.set_int32_field(2);
  EXPECT_NE(msg1, msg2);
}

TEST(ProtoExtrasEquality, RepeatedField) {
  TestMessage msg1;
  TestMessage msg2;

  // Test repeated fields.
  msg1.add_repeated_int32_field(1);
  EXPECT_NE(msg1, msg2);
  msg2.add_repeated_int32_field(1);
  EXPECT_EQ(msg1, msg2);
  msg1.add_repeated_int32_field(2);
  EXPECT_NE(msg1, msg2);
  msg2.add_repeated_int32_field(3);
  EXPECT_NE(msg1, msg2);
  msg2.set_repeated_int32_field(1, 2);
  EXPECT_EQ(msg1, msg2);
}

TEST(ProtoExtrasEquality, OneofField) {
  TestMessage msg1;
  TestMessage msg2;

  // Test oneof fields.
  msg1.set_maybe_int32_field(100);
  EXPECT_NE(msg1, msg2);
  msg2.set_maybe_int32_field(100);
  EXPECT_EQ(msg1, msg2);
  msg2.set_maybe_string_field("test");
  EXPECT_NE(msg1, msg2);
  msg1.set_maybe_string_field("test");
  EXPECT_EQ(msg1, msg2);
}

TEST(ProtoExtrasEquality, NestedMessage) {
  TestMessage msg1;
  TestMessage msg2;

  // Test nested message
  msg1.mutable_nested_message_field()->set_int32_field(1);
  EXPECT_NE(msg1, msg2);
  msg2.mutable_nested_message_field()->set_int32_field(1);
  EXPECT_EQ(msg1, msg2);
  msg1.mutable_nested_message_field()->set_int32_field(2);
  EXPECT_NE(msg1, msg2);
}

TEST(ProtoExtrasEquality, EnumField) {
  TestMessage msg1;
  TestMessage msg2;
  // Test enum
  msg1.set_enum_field(TestMessage::ENUM_A);
  EXPECT_NE(msg1, msg2);
  msg2.set_enum_field(TestMessage::ENUM_A);
  EXPECT_EQ(msg1, msg2);
  msg2.set_enum_field(TestMessage::ENUM_B);
  EXPECT_NE(msg1, msg2);
}

TEST(ProtoExtrasEquality, MapField) {
  TestMessage msg1;
  TestMessage msg2;

  (*msg1.mutable_primitive_map_field())[1] = "hello";
  EXPECT_NE(msg1, msg2);
  (*msg2.mutable_primitive_map_field())[1] = "hello";
  EXPECT_EQ(msg1, msg2);
  (*msg1.mutable_primitive_map_field())[2] = "world";
  EXPECT_NE(msg1, msg2);
  (*msg2.mutable_primitive_map_field())[2] = "world1";
  EXPECT_NE(msg1, msg2);
  (*msg2.mutable_primitive_map_field())[2] = "world";
  EXPECT_EQ(msg1, msg2);

  (*msg1.mutable_message_map_field())["hello"].set_int32_field(1);
  EXPECT_NE(msg1, msg2);
  (*msg2.mutable_message_map_field())["hello"].set_int32_field(1);
  EXPECT_EQ(msg1, msg2);
  (*msg1.mutable_message_map_field())["hello2"].set_int32_field(2);
  EXPECT_NE(msg1, msg2);
  (*msg2.mutable_message_map_field())["hello2"].set_int32_field(1);
  EXPECT_NE(msg1, msg2);
  (*msg2.mutable_message_map_field())["hello2"].set_int32_field(2);
  EXPECT_EQ(msg1, msg2);
}

TEST(ProtoExtrasProtoEqualityProto2, Basic) {
  TestMessageProto2 msg1;
  TestMessageProto2 msg2;

  // Test default messages are equal.
  EXPECT_EQ(msg1, msg2);

  // Test setting a field makes them unequal.
  msg1.set_int32_field(1);
  EXPECT_NE(msg1, msg2);

  // Test setting the same field to the same value makes them equal.
  msg2.set_int32_field(1);
  EXPECT_EQ(msg1, msg2);

  // Test setting different values makes them unequal.
  msg2.set_int32_field(2);
  EXPECT_NE(msg1, msg2);

  msg2.set_int32_field(1);
  EXPECT_EQ(msg1, msg2);

  // Test other basic types
  msg1.set_int64_field(100);
  msg2.set_int64_field(200);
  EXPECT_NE(msg1, msg2);
  msg2.set_int64_field(100);
  EXPECT_EQ(msg1, msg2);

  msg1.set_bytes_field("abc");
  msg2.set_bytes_field("def");
  EXPECT_NE(msg1, msg2);
  msg2.set_bytes_field("abc");
  EXPECT_EQ(msg1, msg2);

  msg1.set_bool_field(true);
  msg2.set_bool_field(false);
  EXPECT_NE(msg1, msg2);
  msg2.set_bool_field(true);
  EXPECT_EQ(msg1, msg2);

  msg1.set_uint64_field(std::numeric_limits<uint64_t>::max());
  msg2.set_uint64_field(0);
  EXPECT_NE(msg1, msg2);
  msg2.set_uint64_field(std::numeric_limits<uint64_t>::max());
  EXPECT_EQ(msg1, msg2);
}

TEST(ProtoExtrasProtoEqualityProto2, RepeatedField) {
  TestMessageProto2 msg1;
  TestMessageProto2 msg2;

  // Test repeated int32
  msg1.add_repeated_int32_field(1);
  EXPECT_NE(msg1, msg2);
  msg2.add_repeated_int32_field(1);
  EXPECT_EQ(msg1, msg2);
  msg1.add_repeated_int32_field(2);
  EXPECT_NE(msg1, msg2);
  msg2.add_repeated_int32_field(3);
  EXPECT_NE(msg1, msg2);
  msg2.set_repeated_int32_field(1, 2);
  EXPECT_EQ(msg1, msg2);

  // Test repeated embedded message
  msg1.add_repeated_embedded_message()->set_str_field("a");
  EXPECT_NE(msg1, msg2);
  msg2.add_repeated_embedded_message()->set_str_field("a");
  EXPECT_EQ(msg1, msg2);
  msg1.add_repeated_embedded_message()->set_str_field("b");
  EXPECT_NE(msg1, msg2);
  msg2.add_repeated_embedded_message()->set_str_field("c");
  EXPECT_NE(msg1, msg2);
  msg2.mutable_repeated_embedded_message(1)->set_str_field("b");
  EXPECT_EQ(msg1, msg2);

  // Test repeated inner enum
  msg1.add_repeated_inner_enum(TestMessageProto2::INNER_ENUM_OPTION1);
  EXPECT_NE(msg1, msg2);
  msg2.add_repeated_inner_enum(TestMessageProto2::INNER_ENUM_OPTION1);
  EXPECT_EQ(msg1, msg2);
  msg1.add_repeated_inner_enum(TestMessageProto2::INNER_ENUM_OPTION2);
  EXPECT_NE(msg1, msg2);
  msg2.add_repeated_inner_enum(TestMessageProto2::INNER_ENUM_UNSPECIFIED);
  EXPECT_NE(msg1, msg2);
  msg2.set_repeated_inner_enum(1, TestMessageProto2::INNER_ENUM_OPTION2);
  EXPECT_EQ(msg1, msg2);
}

TEST(ProtoExtrasProtoEqualityProto2, OneofField) {
  TestMessageProto2 msg1;
  TestMessageProto2 msg2;

  // Test oneof fields.
  msg1.set_maybe_int(100);
  EXPECT_NE(msg1, msg2);
  msg2.set_maybe_int(100);
  EXPECT_EQ(msg1, msg2);

  msg2.set_maybe_bool(true);
  EXPECT_NE(msg1, msg2);
  msg1.set_maybe_bool(true);
  EXPECT_EQ(msg1, msg2);

  msg2.mutable_maybe_message()->set_str_field("test");
  EXPECT_NE(msg1, msg2);
  msg1.mutable_maybe_message()->set_str_field("test");
  EXPECT_EQ(msg1, msg2);

  msg2.set_maybe_enum(OUTER_ENUM_OPTION1);
  EXPECT_NE(msg1, msg2);
  msg1.set_maybe_enum(OUTER_ENUM_OPTION1);
  EXPECT_EQ(msg1, msg2);

  msg2.set_maybe_bytes("bytes");
  EXPECT_NE(msg1, msg2);
  msg1.set_maybe_bytes("bytes");
  EXPECT_EQ(msg1, msg2);
}

TEST(ProtoExtrasProtoEqualityProto2, NestedMessage) {
  TestMessageProto2 msg1;
  TestMessageProto2 msg2;

  // Test embedded message
  msg1.mutable_embedded_message()->set_str_field("a");
  EXPECT_NE(msg1, msg2);
  msg2.mutable_embedded_message()->set_str_field("a");
  EXPECT_EQ(msg1, msg2);
  msg1.mutable_embedded_message()->set_str_field("b");
  EXPECT_NE(msg1, msg2);
  msg2.mutable_embedded_message()->set_str_field("b");
  EXPECT_EQ(msg1, msg2);

  // Test inner message
  msg1.mutable_inner_message()->set_int_field(1);
  EXPECT_NE(msg1, msg2);
  msg2.mutable_inner_message()->set_int_field(1);
  EXPECT_EQ(msg1, msg2);
  msg1.mutable_inner_message()->set_int_field(2);
  EXPECT_NE(msg1, msg2);
}

TEST(ProtoExtrasProtoEqualityProto2, EnumField) {
  TestMessageProto2 msg1;
  TestMessageProto2 msg2;

  // Test outer enum
  msg1.set_outer_enum(OUTER_ENUM_OPTION1);
  EXPECT_NE(msg1, msg2);
  msg2.set_outer_enum(OUTER_ENUM_OPTION1);
  EXPECT_EQ(msg1, msg2);
  msg2.set_outer_enum(OUTER_ENUM_OPTION2);
  EXPECT_NE(msg1, msg2);

  msg2.set_outer_enum(OUTER_ENUM_OPTION1);

  // Test inner enum
  msg1.set_inner_enum(TestMessageProto2::INNER_ENUM_OPTION1);
  EXPECT_NE(msg1, msg2);
  msg2.set_inner_enum(TestMessageProto2::INNER_ENUM_OPTION1);
  EXPECT_EQ(msg1, msg2);
  msg2.set_inner_enum(TestMessageProto2::INNER_ENUM_OPTION2);
  EXPECT_NE(msg1, msg2);
}

TEST(ProtoExtrasProtoEqualityProto2, MapField) {
  TestMessageProto2 msg1;
  TestMessageProto2 msg2;

  (*msg1.mutable_primitive_map_field())[1] = "hello";
  EXPECT_NE(msg1, msg2);
  (*msg2.mutable_primitive_map_field())[1] = "hello";
  EXPECT_EQ(msg1, msg2);
  (*msg1.mutable_primitive_map_field())[2] = "world";
  EXPECT_NE(msg1, msg2);
  (*msg2.mutable_primitive_map_field())[2] = "world1";
  EXPECT_NE(msg1, msg2);
  (*msg2.mutable_primitive_map_field())[2] = "world";
  EXPECT_EQ(msg1, msg2);

  (*msg1.mutable_message_map_field())["hello"].set_str_field("world");
  EXPECT_NE(msg1, msg2);
  (*msg2.mutable_message_map_field())["hello"].set_str_field("world");
  EXPECT_EQ(msg1, msg2);
  (*msg1.mutable_message_map_field())["hello2"].set_str_field("world2");
  EXPECT_NE(msg1, msg2);
  (*msg2.mutable_message_map_field())["hello2"].set_str_field("world1");
  EXPECT_NE(msg1, msg2);
  (*msg2.mutable_message_map_field())["hello2"].set_str_field("world2");
  EXPECT_EQ(msg1, msg2);
}

TEST(ProtoExtrasProto2ToValueTest, EmptyEmbeddedMessageToValue) {
  TestMessageProto2 message;
  message.mutable_empty_embedded_message();
  base::Value result = Serialize(message);
  ASSERT_TRUE(result.is_dict());
  EXPECT_EQ(Serialize(message), base::test::ParseJson(R"!({
    "empty_embedded_message": {}
  })!"));
}

}  // namespace
}  // namespace proto_extras
