// 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.

// Author: jschorr@google.com (Joseph Schorr)
//  Based on original Protocol Buffers design by
//  Sanjay Ghemawat, Jeff Dean, and others.

#include "google/protobuf/text_format.h"

#include <math.h>
#include <stdlib.h>

#include <atomic>
#include <limits>
#include <memory>
#include <string>

#include "google/protobuf/stubs/logging.h"
#include "google/protobuf/stubs/common.h"
#include "google/protobuf/testing/file.h"
#include "google/protobuf/testing/file.h"
#include "google/protobuf/any.pb.h"
#include <gmock/gmock.h>
#include "google/protobuf/testing/googletest.h"
#include <gtest/gtest.h>
#include "google/protobuf/stubs/logging.h"
#include "absl/strings/escaping.h"
#include "absl/strings/str_cat.h"
#include "absl/strings/str_format.h"
#include "absl/strings/str_replace.h"
#include "absl/strings/substitute.h"
#include "google/protobuf/io/tokenizer.h"
#include "google/protobuf/io/zero_copy_stream_impl.h"
#include "google/protobuf/map_unittest.pb.h"
#include "google/protobuf/test_util.h"
#include "google/protobuf/test_util2.h"
#include "google/protobuf/unittest.pb.h"
#include "google/protobuf/unittest_mset.pb.h"
#include "google/protobuf/unittest_mset_wire_format.pb.h"
#include "google/protobuf/unittest_proto3.pb.h"


// Must be included last.
#include "google/protobuf/port_def.inc"

namespace google {
namespace protobuf {

// Can't use an anonymous namespace here due to brokenness of Tru64 compiler.
namespace text_format_unittest {

using ::google::protobuf::internal::kDebugStringSilentMarker;
using ::testing::AllOf;
using ::testing::HasSubstr;

// A basic string with different escapable characters for testing.
const std::string kEscapeTestString =
    "\"A string with ' characters \n and \r newlines and \t tabs and \001 "
    "slashes \\ and  multiple   spaces";

// A representation of the above string with all the characters escaped.
const std::string kEscapeTestStringEscaped =
    "\"\\\"A string with \\' characters \\n and \\r newlines "
    "and \\t tabs and \\001 slashes \\\\ and  multiple   spaces\"";

class TextFormatTest : public testing::Test {
 public:
  static void SetUpTestSuite() {
    GOOGLE_CHECK_OK(File::GetContents(
        TestUtil::GetTestDataPath(
            "third_party/protobuf/"
            "testdata/text_format_unittest_data_oneof_implemented.txt"),
        &static_proto_text_format_, true));
  }

  TextFormatTest() : proto_text_format_(static_proto_text_format_) {}

 protected:
  // Text format read from text_format_unittest_data.txt.
  const std::string proto_text_format_;
  unittest::TestAllTypes proto_;

 private:
  static std::string static_proto_text_format_;
};
std::string TextFormatTest::static_proto_text_format_;

class TextFormatExtensionsTest : public testing::Test {
 public:
  static void SetUpTestSuite() {
    GOOGLE_CHECK_OK(File::GetContents(
        TestUtil::GetTestDataPath("third_party/protobuf/testdata/"
                                  "text_format_unittest_extensions_data.txt"),
        &static_proto_text_format_, true));
  }

  TextFormatExtensionsTest() : proto_text_format_(static_proto_text_format_) {}

 protected:
  // Debug string read from text_format_unittest_data.txt.
  const std::string proto_text_format_;
  unittest::TestAllExtensions proto_;

 private:
  static std::string static_proto_text_format_;
};
std::string TextFormatExtensionsTest::static_proto_text_format_;

TEST_F(TextFormatTest, Basic) {
  TestUtil::SetAllFields(&proto_);
  std::string actual_proto_text_format;
  TextFormat::PrintToString(proto_, &actual_proto_text_format);
  EXPECT_EQ(actual_proto_text_format, proto_text_format_);
}

TEST_F(TextFormatExtensionsTest, Extensions) {
  TestUtil::SetAllExtensions(&proto_);
  std::string actual_proto_text_format;
  TextFormat::PrintToString(proto_, &actual_proto_text_format);
  EXPECT_EQ(actual_proto_text_format, proto_text_format_);
}

TEST_F(TextFormatTest, ShortDebugString) {
  proto_.set_optional_int32(1);
  proto_.set_optional_string("hello");
  proto_.mutable_optional_nested_message()->set_bb(2);
  proto_.mutable_optional_foreign_message();

  EXPECT_EQ(proto_.ShortDebugString(),
            absl::StrCat("optional_int32: ", kDebugStringSilentMarker,
                         "1 "
                         "optional_string: \"hello\" "
                         "optional_nested_message { bb: 2 } "
                         "optional_foreign_message { }"));
}


TEST_F(TextFormatTest, ShortPrimitiveRepeateds) {
  proto_.set_optional_int32(123);
  proto_.add_repeated_int32(456);
  proto_.add_repeated_int32(789);
  proto_.add_repeated_string("foo");
  proto_.add_repeated_string("bar");
  proto_.add_repeated_nested_message()->set_bb(2);
  proto_.add_repeated_nested_message()->set_bb(3);
  proto_.add_repeated_nested_enum(unittest::TestAllTypes::FOO);
  proto_.add_repeated_nested_enum(unittest::TestAllTypes::BAR);

  TextFormat::Printer printer;
  printer.SetUseShortRepeatedPrimitives(true);
  std::string text;
  EXPECT_TRUE(printer.PrintToString(proto_, &text));

  EXPECT_EQ(
      "optional_int32: 123\n"
      "repeated_int32: [456, 789]\n"
      "repeated_string: \"foo\"\n"
      "repeated_string: \"bar\"\n"
      "repeated_nested_message {\n  bb: 2\n}\n"
      "repeated_nested_message {\n  bb: 3\n}\n"
      "repeated_nested_enum: [FOO, BAR]\n",
      text);

  // Verify that any existing data in the string is cleared when PrintToString()
  // is called.
  text = "just some data here...\n\nblah blah";
  EXPECT_TRUE(printer.PrintToString(proto_, &text));

  EXPECT_EQ(
      "optional_int32: 123\n"
      "repeated_int32: [456, 789]\n"
      "repeated_string: \"foo\"\n"
      "repeated_string: \"bar\"\n"
      "repeated_nested_message {\n  bb: 2\n}\n"
      "repeated_nested_message {\n  bb: 3\n}\n"
      "repeated_nested_enum: [FOO, BAR]\n",
      text);

  // Try in single-line mode.
  printer.SetSingleLineMode(true);
  EXPECT_TRUE(printer.PrintToString(proto_, &text));

  EXPECT_EQ(
      "optional_int32: 123 "
      "repeated_int32: [456, 789] "
      "repeated_string: \"foo\" "
      "repeated_string: \"bar\" "
      "repeated_nested_message { bb: 2 } "
      "repeated_nested_message { bb: 3 } "
      "repeated_nested_enum: [FOO, BAR] ",
      text);
}


TEST_F(TextFormatTest, StringEscape) {
  // Set the string value to test.
  proto_.set_optional_string(kEscapeTestString);

  // Get the DebugString from the proto.
  std::string debug_string = proto_.DebugString();
  std::string utf8_debug_string = proto_.Utf8DebugString();

  // Hardcode a correct value to test against.
  std::string correct_string =
      absl::StrCat("optional_string: ", kDebugStringSilentMarker,
                   kEscapeTestStringEscaped, "\n");

  // Compare.
  EXPECT_EQ(correct_string, debug_string);
  // UTF-8 string is the same as non-UTF-8 because
  // the protocol buffer contains no UTF-8 text.
  EXPECT_EQ(correct_string, utf8_debug_string);

  std::string expected_short_debug_string = absl::StrCat(
      "optional_string: ", kDebugStringSilentMarker, kEscapeTestStringEscaped);
  EXPECT_EQ(expected_short_debug_string, proto_.ShortDebugString());
}

TEST_F(TextFormatTest, Utf8DebugString) {
  // Set the string value to test.
  proto_.set_optional_string("\350\260\267\346\255\214");
  proto_.set_optional_bytes("\350\260\267\346\255\214");

  // Get the DebugString from the proto.
  std::string debug_string = proto_.DebugString();
  std::string utf8_debug_string = proto_.Utf8DebugString();

  // Hardcode a correct value to test against.
  std::string correct_utf8_string =
      absl::StrCat("optional_string: ", kDebugStringSilentMarker,
                   "\"\350\260\267\346\255\214\"\n"
                   "optional_bytes: \"\\350\\260\\267\\346\\255\\214\"\n");
  std::string correct_string =
      absl::StrCat("optional_string: ", kDebugStringSilentMarker,
                   "\"\\350\\260\\267\\346\\255\\214\"\n"
                   "optional_bytes: \"\\350\\260\\267\\346\\255\\214\"\n");

  // Compare.
  EXPECT_EQ(correct_utf8_string, utf8_debug_string);
  EXPECT_EQ(correct_string, debug_string);
}

TEST_F(TextFormatTest, PrintUnknownFields) {
  // Test printing of unknown fields in a message.

  unittest::TestEmptyMessage message;
  UnknownFieldSet* unknown_fields = message.mutable_unknown_fields();

  unknown_fields->AddVarint(5, 1);
  unknown_fields->AddFixed32(5, 2);
  unknown_fields->AddFixed64(5, 3);
  unknown_fields->AddLengthDelimited(5, "4");
  unknown_fields->AddGroup(5)->AddVarint(10, 5);

  unknown_fields->AddVarint(8, 1);
  unknown_fields->AddVarint(8, 2);
  unknown_fields->AddVarint(8, 3);

  EXPECT_EQ(absl::StrCat("5: ", kDebugStringSilentMarker,
                         "1\n"
                         "5: 0x00000002\n"
                         "5: 0x0000000000000003\n"
                         "5: \"4\"\n"
                         "5 {\n"
                         "  10: 5\n"
                         "}\n"
                         "8: 1\n"
                         "8: 2\n"
                         "8: 3\n"),
            message.DebugString());
}

TEST_F(TextFormatTest, PrintUnknownFieldsHidden) {
  // Test printing of unknown fields in a message when suppressed.

  unittest::OneString message;
  message.set_data("data");
  UnknownFieldSet* unknown_fields = message.mutable_unknown_fields();

  unknown_fields->AddVarint(5, 1);
  unknown_fields->AddFixed32(5, 2);
  unknown_fields->AddFixed64(5, 3);
  unknown_fields->AddLengthDelimited(5, "4");
  unknown_fields->AddGroup(5)->AddVarint(10, 5);

  unknown_fields->AddVarint(8, 1);
  unknown_fields->AddVarint(8, 2);
  unknown_fields->AddVarint(8, 3);

  TextFormat::Printer printer;
  printer.SetHideUnknownFields(true);
  std::string output;
  printer.PrintToString(message, &output);

  EXPECT_EQ("data: \"data\"\n", output);
}

TEST_F(TextFormatTest, PrintUnknownMessage) {
  // Test heuristic printing of messages in an UnknownFieldSet.

  protobuf_unittest::TestAllTypes message;

  // Cases which should not be interpreted as sub-messages.

  // 'a' is a valid FIXED64 tag, so for the string to be parseable as a message
  // it should be followed by 8 bytes.  Since this string only has two
  // subsequent bytes, it should be treated as a string.
  message.add_repeated_string("abc");

  // 'd' happens to be a valid ENDGROUP tag.  So,
  // UnknownFieldSet::MergeFromCodedStream() will successfully parse "def", but
  // the ConsumedEntireMessage() check should fail.
  message.add_repeated_string("def");

  // A zero-length string should never be interpreted as a message even though
  // it is technically valid as one.
  message.add_repeated_string("");

  // Case which should be interpreted as a sub-message.

  // An actual nested message with content should always be interpreted as a
  // nested message.
  message.add_repeated_nested_message()->set_bb(123);

  std::string data;
  message.SerializeToString(&data);

  std::string text;
  UnknownFieldSet unknown_fields;
  EXPECT_TRUE(unknown_fields.ParseFromString(data));
  EXPECT_TRUE(TextFormat::PrintUnknownFieldsToString(unknown_fields, &text));
  // Field 44 and 48 can be printed in any order.
  EXPECT_THAT(text, testing::HasSubstr("44: \"abc\"\n"
                                       "44: \"def\"\n"
                                       "44: \"\"\n"));
  EXPECT_THAT(text, testing::HasSubstr("48 {\n"
                                       "  1: 123\n"
                                       "}\n"));
}

TEST_F(TextFormatTest, PrintDeeplyNestedUnknownMessage) {
  // Create a deeply nested message.
  static constexpr int kNestingDepth = 25000;
  static constexpr int kUnknownFieldNumber = 1;
  std::vector<int> lengths;
  lengths.reserve(kNestingDepth);
  lengths.push_back(0);
  for (int i = 0; i < kNestingDepth - 1; ++i) {
    lengths.push_back(
        internal::WireFormatLite::TagSize(
            kUnknownFieldNumber, internal::WireFormatLite::TYPE_BYTES) +
        internal::WireFormatLite::LengthDelimitedSize(lengths.back()));
  }
  std::string serialized;
  {
    io::StringOutputStream zero_copy_stream(&serialized);
    io::CodedOutputStream coded_stream(&zero_copy_stream);
    for (int i = kNestingDepth - 1; i >= 0; --i) {
      internal::WireFormatLite::WriteTag(
          kUnknownFieldNumber,
          internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED, &coded_stream);
      coded_stream.WriteVarint32(lengths[i]);
    }
  }

  // Parse the data and verify that we can print it without overflowing the
  // stack.
  unittest::TestEmptyMessage message;
  ASSERT_TRUE(message.ParseFromString(serialized));
  std::string text;
  EXPECT_TRUE(TextFormat::PrintToString(message, &text));
}

TEST_F(TextFormatTest, PrintMessageWithIndent) {
  // Test adding an initial indent to printing.

  protobuf_unittest::TestAllTypes message;

  message.add_repeated_string("abc");
  message.add_repeated_string("def");
  message.add_repeated_nested_message()->set_bb(123);

  std::string text;
  TextFormat::Printer printer;
  printer.SetInitialIndentLevel(1);
  EXPECT_TRUE(printer.PrintToString(message, &text));
  EXPECT_EQ(
      "  repeated_string: \"abc\"\n"
      "  repeated_string: \"def\"\n"
      "  repeated_nested_message {\n"
      "    bb: 123\n"
      "  }\n",
      text);
}

TEST_F(TextFormatTest, PrintMessageSingleLine) {
  // Test printing a message on a single line.

  protobuf_unittest::TestAllTypes message;

  message.add_repeated_string("abc");
  message.add_repeated_string("def");
  message.add_repeated_nested_message()->set_bb(123);

  std::string text;
  TextFormat::Printer printer;
  printer.SetInitialIndentLevel(1);
  printer.SetSingleLineMode(true);
  EXPECT_TRUE(printer.PrintToString(message, &text));
  EXPECT_EQ(
      "  repeated_string: \"abc\" repeated_string: \"def\" "
      "repeated_nested_message { bb: 123 } ",
      text);
}

TEST_F(TextFormatTest, PrintBufferTooSmall) {
  // Test printing a message to a buffer that is too small.

  protobuf_unittest::TestAllTypes message;

  message.add_repeated_string("abc");
  message.add_repeated_string("def");

  char buffer[1] = "";
  io::ArrayOutputStream output_stream(buffer, 1);
  EXPECT_FALSE(TextFormat::Print(message, &output_stream));
  EXPECT_EQ(buffer[0], 'r');
  EXPECT_EQ(output_stream.ByteCount(), 1);
}

// A printer that appends 'u' to all unsigned int32.
class CustomUInt32FieldValuePrinter : public TextFormat::FieldValuePrinter {
 public:
  std::string PrintUInt32(uint32_t val) const override {
    return absl::StrCat(FieldValuePrinter::PrintUInt32(val), "u");
  }
};

TEST_F(TextFormatTest, DefaultCustomFieldPrinter) {
  protobuf_unittest::TestAllTypes message;

  message.set_optional_uint32(42);
  message.add_repeated_uint32(1);
  message.add_repeated_uint32(2);
  message.add_repeated_uint32(3);

  TextFormat::Printer printer;
  printer.SetDefaultFieldValuePrinter(new CustomUInt32FieldValuePrinter());
  // Let's see if that works well together with the repeated primitives:
  printer.SetUseShortRepeatedPrimitives(true);
  std::string text;
  printer.PrintToString(message, &text);
  EXPECT_EQ("optional_uint32: 42u\nrepeated_uint32: [1u, 2u, 3u]\n", text);
}

class CustomInt32FieldValuePrinter : public TextFormat::FieldValuePrinter {
 public:
  std::string PrintInt32(int32_t val) const override {
    return absl::StrCat("value-is(", FieldValuePrinter::PrintInt32(val), ")");
  }
};

TEST_F(TextFormatTest, FieldSpecificCustomPrinter) {
  protobuf_unittest::TestAllTypes message;

  message.set_optional_int32(42);  // This will be handled by our Printer.
  message.add_repeated_int32(42);  // This will be printed as number.

  TextFormat::Printer printer;
  EXPECT_TRUE(printer.RegisterFieldValuePrinter(
      message.GetDescriptor()->FindFieldByName("optional_int32"),
      new CustomInt32FieldValuePrinter()));
  std::string text;
  printer.PrintToString(message, &text);
  EXPECT_EQ("optional_int32: value-is(42)\nrepeated_int32: 42\n", text);
}

TEST_F(TextFormatTest, FieldSpecificCustomPrinterRegisterSameFieldTwice) {
  protobuf_unittest::TestAllTypes message;
  TextFormat::Printer printer;
  const FieldDescriptor* const field =
      message.GetDescriptor()->FindFieldByName("optional_int32");
  ASSERT_TRUE(printer.RegisterFieldValuePrinter(
      field, new CustomInt32FieldValuePrinter()));
  const TextFormat::FieldValuePrinter* const rejected =
      new CustomInt32FieldValuePrinter();
  ASSERT_FALSE(printer.RegisterFieldValuePrinter(field, rejected));
  delete rejected;
}

TEST_F(TextFormatTest, ErrorCasesRegisteringFieldValuePrinterShouldFail) {
  protobuf_unittest::TestAllTypes message;
  TextFormat::Printer printer;
  // nullptr printer.
  EXPECT_FALSE(printer.RegisterFieldValuePrinter(
      message.GetDescriptor()->FindFieldByName("optional_int32"),
      static_cast<const TextFormat::FieldValuePrinter*>(nullptr)));
  EXPECT_FALSE(printer.RegisterFieldValuePrinter(
      message.GetDescriptor()->FindFieldByName("optional_int32"),
      static_cast<const TextFormat::FastFieldValuePrinter*>(nullptr)));
  // Because registration fails, the ownership of this printer is never taken.
  TextFormat::FieldValuePrinter my_field_printer;
  // nullptr field
  EXPECT_FALSE(printer.RegisterFieldValuePrinter(nullptr, &my_field_printer));
}

class CustomMessageFieldValuePrinter : public TextFormat::FieldValuePrinter {
 public:
  std::string PrintInt32(int32_t v) const override {
    return absl::StrCat(FieldValuePrinter::PrintInt32(v), "  # x",
                        absl::Hex(v));
  }

  std::string PrintMessageStart(const Message& message, int field_index,
                                int field_count,
                                bool single_line_mode) const override {
    if (single_line_mode) {
      return " { ";
    }
    return absl::StrCat(" {  # ", message.GetDescriptor()->name(), ": ",
                        field_index, "\n");
  }
};

TEST_F(TextFormatTest, CustomPrinterForComments) {
  protobuf_unittest::TestAllTypes message;
  message.mutable_optional_nested_message();
  message.mutable_optional_import_message()->set_d(42);
  message.add_repeated_nested_message();
  message.add_repeated_nested_message();
  message.add_repeated_import_message()->set_d(43);
  message.add_repeated_import_message()->set_d(44);
  TextFormat::Printer printer;
  CustomMessageFieldValuePrinter my_field_printer;
  printer.SetDefaultFieldValuePrinter(new CustomMessageFieldValuePrinter());
  std::string text;
  printer.PrintToString(message, &text);
  EXPECT_EQ(
      "optional_nested_message {  # NestedMessage: -1\n"
      "}\n"
      "optional_import_message {  # ImportMessage: -1\n"
      "  d: 42  # x2a\n"
      "}\n"
      "repeated_nested_message {  # NestedMessage: 0\n"
      "}\n"
      "repeated_nested_message {  # NestedMessage: 1\n"
      "}\n"
      "repeated_import_message {  # ImportMessage: 0\n"
      "  d: 43  # x2b\n"
      "}\n"
      "repeated_import_message {  # ImportMessage: 1\n"
      "  d: 44  # x2c\n"
      "}\n",
      text);
}

class CustomMessageContentFieldValuePrinter
    : public TextFormat::FastFieldValuePrinter {
 public:
  bool PrintMessageContent(
      const Message& message, int field_index, int field_count,
      bool single_line_mode,
      TextFormat::BaseTextGenerator* generator) const override {
    if (message.ByteSizeLong() > 0) {
      generator->PrintString(
          absl::Substitute("# REDACTED, $0 bytes\n", message.ByteSizeLong()));
    }
    return true;
  }
};

TEST_F(TextFormatTest, CustomPrinterForMessageContent) {
  protobuf_unittest::TestAllTypes message;
  message.mutable_optional_nested_message();
  message.mutable_optional_import_message()->set_d(42);
  message.add_repeated_nested_message();
  message.add_repeated_nested_message();
  message.add_repeated_import_message()->set_d(43);
  message.add_repeated_import_message()->set_d(44);
  TextFormat::Printer printer;
  CustomMessageContentFieldValuePrinter my_field_printer;
  printer.SetDefaultFieldValuePrinter(
      new CustomMessageContentFieldValuePrinter());
  std::string text;
  printer.PrintToString(message, &text);
  EXPECT_EQ(
      "optional_nested_message {\n"
      "}\n"
      "optional_import_message {\n"
      "  # REDACTED, 2 bytes\n"
      "}\n"
      "repeated_nested_message {\n"
      "}\n"
      "repeated_nested_message {\n"
      "}\n"
      "repeated_import_message {\n"
      "  # REDACTED, 2 bytes\n"
      "}\n"
      "repeated_import_message {\n"
      "  # REDACTED, 2 bytes\n"
      "}\n",
      text);
}

class CustomMultilineCommentPrinter : public TextFormat::FieldValuePrinter {
 public:
  std::string PrintMessageStart(const Message& message, int field_index,
                                int field_count,
                                bool single_line_comment) const override {
    return absl::StrCat(" {  # 1\n", "  # 2\n");
  }
};

TEST_F(TextFormatTest, CustomPrinterForMultilineComments) {
  protobuf_unittest::TestAllTypes message;
  message.mutable_optional_nested_message();
  message.mutable_optional_import_message()->set_d(42);
  TextFormat::Printer printer;
  CustomMessageFieldValuePrinter my_field_printer;
  printer.SetDefaultFieldValuePrinter(new CustomMultilineCommentPrinter());
  std::string text;
  printer.PrintToString(message, &text);
  EXPECT_EQ(
      "optional_nested_message {  # 1\n"
      "  # 2\n"
      "}\n"
      "optional_import_message {  # 1\n"
      "  # 2\n"
      "  d: 42\n"
      "}\n",
      text);
}

// Achieve effects similar to SetUseShortRepeatedPrimitives for messages, using
// RegisterFieldValuePrinter. Use this to test the version of PrintFieldName
// that accepts repeated field index and count.
class CompactRepeatedFieldPrinter : public TextFormat::FastFieldValuePrinter {
 public:
  void PrintFieldName(const Message& message, int field_index, int field_count,
                      const Reflection* reflection,
                      const FieldDescriptor* field,
                      TextFormat::BaseTextGenerator* generator) const override {
    if (field_index == 0 || field_index == -1) {
      generator->PrintString(field->name());
    }
  }
  // To prevent compiler complaining about Woverloaded-virtual
  void PrintFieldName(const Message& message, const Reflection* reflection,
                      const FieldDescriptor* field,
                      TextFormat::BaseTextGenerator* generator) const override {
  }
  void PrintMessageStart(
      const Message& message, int field_index, int field_count,
      bool single_line_mode,
      TextFormat::BaseTextGenerator* generator) const override {
    if (field_index == 0 || field_index == -1) {
      if (single_line_mode) {
        generator->PrintLiteral(" { ");
      } else {
        generator->PrintLiteral(" {\n");
      }
    }
  }
  void PrintMessageEnd(
      const Message& message, int field_index, int field_count,
      bool single_line_mode,
      TextFormat::BaseTextGenerator* generator) const override {
    if (field_index == field_count - 1 || field_index == -1) {
      if (single_line_mode) {
        generator->PrintLiteral("} ");
      } else {
        generator->PrintLiteral("}\n");
      }
    }
  }
};

TEST_F(TextFormatTest, CompactRepeatedFieldPrinter) {
  TextFormat::Printer printer;
  ASSERT_TRUE(printer.RegisterFieldValuePrinter(
      unittest::TestAllTypes::default_instance()
          .descriptor()
          ->FindFieldByNumber(
              unittest::TestAllTypes::kRepeatedNestedMessageFieldNumber),
      new CompactRepeatedFieldPrinter));

  protobuf_unittest::TestAllTypes message;
  message.add_repeated_nested_message()->set_bb(1);
  message.add_repeated_nested_message()->set_bb(2);
  message.add_repeated_nested_message()->set_bb(3);

  std::string text;
  ASSERT_TRUE(printer.PrintToString(message, &text));
  EXPECT_EQ(
      "repeated_nested_message {\n"
      "  bb: 1\n"
      "  bb: 2\n"
      "  bb: 3\n"
      "}\n",
      text);
}

// Print strings into multiple line, with indentation. Use this to test
// BaseTextGenerator::Indent and BaseTextGenerator::Outdent.
class MultilineStringPrinter : public TextFormat::FastFieldValuePrinter {
 public:
  void PrintString(const std::string& val,
                   TextFormat::BaseTextGenerator* generator) const override {
    generator->Indent();
    int last_pos = 0;
    int newline_pos = val.find('\n');
    while (newline_pos != std::string::npos) {
      generator->PrintLiteral("\n");
      TextFormat::FastFieldValuePrinter::PrintString(
          val.substr(last_pos, newline_pos + 1 - last_pos), generator);
      last_pos = newline_pos + 1;
      newline_pos = val.find('\n', last_pos);
    }
    if (last_pos < val.size()) {
      generator->PrintLiteral("\n");
      TextFormat::FastFieldValuePrinter::PrintString(val.substr(last_pos),
                                                     generator);
    }
    generator->Outdent();
  }
};

TEST_F(TextFormatTest, MultilineStringPrinter) {
  TextFormat::Printer printer;
  ASSERT_TRUE(printer.RegisterFieldValuePrinter(
      unittest::TestAllTypes::default_instance()
          .descriptor()
          ->FindFieldByNumber(
              unittest::TestAllTypes::kOptionalStringFieldNumber),
      new MultilineStringPrinter));

  protobuf_unittest::TestAllTypes message;
  message.set_optional_string("first line\nsecond line\nthird line");

  std::string text;
  ASSERT_TRUE(printer.PrintToString(message, &text));
  EXPECT_EQ(
      "optional_string: \n"
      "  \"first line\\n\"\n"
      "  \"second line\\n\"\n"
      "  \"third line\"\n",
      text);
}

class CustomNestedMessagePrinter : public TextFormat::MessagePrinter {
 public:
  CustomNestedMessagePrinter() {}
  ~CustomNestedMessagePrinter() override {}
  void Print(const Message& message, bool single_line_mode,
             TextFormat::BaseTextGenerator* generator) const override {
    generator->PrintLiteral("// custom\n");
    if (printer_ != nullptr) {
      printer_->PrintMessage(message, generator);
    }
  }

  void SetPrinter(TextFormat::Printer* printer) { printer_ = printer; }

 private:
  TextFormat::Printer* printer_ = nullptr;
};

TEST_F(TextFormatTest, CustomMessagePrinter) {
  TextFormat::Printer printer;
  auto* custom_printer = new CustomNestedMessagePrinter;
  printer.RegisterMessagePrinter(
      unittest::TestAllTypes::NestedMessage::default_instance().descriptor(),
      custom_printer);

  unittest::TestAllTypes message;
  std::string text;
  EXPECT_TRUE(printer.PrintToString(message, &text));
  EXPECT_EQ("", text);

  message.mutable_optional_nested_message()->set_bb(1);
  EXPECT_TRUE(printer.PrintToString(message, &text));
  EXPECT_EQ("optional_nested_message {\n  // custom\n}\n", text);

  custom_printer->SetPrinter(&printer);
  EXPECT_TRUE(printer.PrintToString(message, &text));
  EXPECT_EQ("optional_nested_message {\n  // custom\n  bb: 1\n}\n", text);
}

TEST_F(TextFormatTest, ParseBasic) {
  io::ArrayInputStream input_stream(proto_text_format_.data(),
                                    proto_text_format_.size());
  TextFormat::Parse(&input_stream, &proto_);
  TestUtil::ExpectAllFieldsSet(proto_);
}

TEST_F(TextFormatExtensionsTest, ParseExtensions) {
  io::ArrayInputStream input_stream(proto_text_format_.data(),
                                    proto_text_format_.size());
  TextFormat::Parse(&input_stream, &proto_);
  TestUtil::ExpectAllExtensionsSet(proto_);
}

TEST_F(TextFormatTest, ParseEnumFieldFromNumber) {
  // Create a parse string with a numerical value for an enum field.
  std::string parse_string =
      absl::Substitute("optional_nested_enum: $0", unittest::TestAllTypes::BAZ);
  EXPECT_TRUE(TextFormat::ParseFromString(parse_string, &proto_));
  EXPECT_TRUE(proto_.has_optional_nested_enum());
  EXPECT_EQ(unittest::TestAllTypes::BAZ, proto_.optional_nested_enum());
}

TEST_F(TextFormatTest, ParseEnumFieldFromNegativeNumber) {
  ASSERT_LT(unittest::SPARSE_E, 0);
  std::string parse_string =
      absl::Substitute("sparse_enum: $0", unittest::SPARSE_E);
  unittest::SparseEnumMessage proto;
  EXPECT_TRUE(TextFormat::ParseFromString(parse_string, &proto));
  EXPECT_TRUE(proto.has_sparse_enum());
  EXPECT_EQ(unittest::SPARSE_E, proto.sparse_enum());
}

TEST_F(TextFormatTest, PrintUnknownEnumFieldProto3) {
  proto3_unittest::TestAllTypes proto;

  proto.add_repeated_nested_enum(
      static_cast<proto3_unittest::TestAllTypes::NestedEnum>(10));
  proto.add_repeated_nested_enum(
      static_cast<proto3_unittest::TestAllTypes::NestedEnum>(-10));
  proto.add_repeated_nested_enum(
      static_cast<proto3_unittest::TestAllTypes::NestedEnum>(2147483647));
  proto.add_repeated_nested_enum(
      static_cast<proto3_unittest::TestAllTypes::NestedEnum>(-2147483648));

  EXPECT_EQ(absl::StrCat("repeated_nested_enum: ", kDebugStringSilentMarker,
                         "10\n"
                         "repeated_nested_enum: -10\n"
                         "repeated_nested_enum: 2147483647\n"
                         "repeated_nested_enum: -2147483648\n"),
            proto.DebugString());
}

TEST_F(TextFormatTest, ParseUnknownEnumFieldProto3) {
  proto3_unittest::TestAllTypes proto;
  std::string parse_string =
      "repeated_nested_enum: [10, -10, 2147483647, -2147483648]";
  EXPECT_TRUE(TextFormat::ParseFromString(parse_string, &proto));
  ASSERT_EQ(4, proto.repeated_nested_enum_size());
  EXPECT_EQ(10, proto.repeated_nested_enum(0));
  EXPECT_EQ(-10, proto.repeated_nested_enum(1));
  EXPECT_EQ(2147483647, proto.repeated_nested_enum(2));
  EXPECT_EQ(-2147483648, proto.repeated_nested_enum(3));
}

TEST_F(TextFormatTest, ParseStringEscape) {
  // Create a parse string with escaped characters in it.
  std::string parse_string =
      "optional_string: " + kEscapeTestStringEscaped + "\n";

  io::ArrayInputStream input_stream(parse_string.data(), parse_string.size());
  TextFormat::Parse(&input_stream, &proto_);

  // Compare.
  EXPECT_EQ(kEscapeTestString, proto_.optional_string());
}

TEST_F(TextFormatTest, ParseConcatenatedString) {
  // Create a parse string with multiple parts on one line.
  std::string parse_string = "optional_string: \"foo\" \"bar\"\n";

  io::ArrayInputStream input_stream1(parse_string.data(), parse_string.size());
  TextFormat::Parse(&input_stream1, &proto_);

  // Compare.
  EXPECT_EQ("foobar", proto_.optional_string());

  // Create a parse string with multiple parts on separate lines.
  parse_string =
      "optional_string: \"foo\"\n"
      "\"bar\"\n";

  io::ArrayInputStream input_stream2(parse_string.data(), parse_string.size());
  TextFormat::Parse(&input_stream2, &proto_);

  // Compare.
  EXPECT_EQ("foobar", proto_.optional_string());
}

TEST_F(TextFormatTest, ParseFloatWithSuffix) {
  // Test that we can parse a floating-point value with 'f' appended to the
  // end.  This is needed for backwards-compatibility with proto1.

  // Have it parse a float with the 'f' suffix.
  std::string parse_string = "optional_float: 1.0f\n";

  io::ArrayInputStream input_stream(parse_string.data(), parse_string.size());

  TextFormat::Parse(&input_stream, &proto_);

  // Compare.
  EXPECT_EQ(1.0, proto_.optional_float());
}

TEST_F(TextFormatTest, ParseShortRepeatedForm) {
  std::string parse_string =
      // Mixed short-form and long-form are simply concatenated.
      "repeated_int32: 1\n"
      "repeated_int32: [456, 789]\n"
      "repeated_nested_enum: [  FOO ,BAR, # comment\n"
      "                         3]\n"
      // Note that while the printer won't print repeated strings in short-form,
      // the parser will accept them.
      "repeated_string: [ \"foo\", 'bar' ]\n"
      // Repeated message
      "repeated_nested_message: [ { bb: 1 }, { bb : 2 }]\n"
      // Repeated group
      "RepeatedGroup [{ a: 3 },{ a: 4 }]\n";

  ASSERT_TRUE(TextFormat::ParseFromString(parse_string, &proto_));

  ASSERT_EQ(3, proto_.repeated_int32_size());
  EXPECT_EQ(1, proto_.repeated_int32(0));
  EXPECT_EQ(456, proto_.repeated_int32(1));
  EXPECT_EQ(789, proto_.repeated_int32(2));

  ASSERT_EQ(3, proto_.repeated_nested_enum_size());
  EXPECT_EQ(unittest::TestAllTypes::FOO, proto_.repeated_nested_enum(0));
  EXPECT_EQ(unittest::TestAllTypes::BAR, proto_.repeated_nested_enum(1));
  EXPECT_EQ(unittest::TestAllTypes::BAZ, proto_.repeated_nested_enum(2));

  ASSERT_EQ(2, proto_.repeated_string_size());
  EXPECT_EQ("foo", proto_.repeated_string(0));
  EXPECT_EQ("bar", proto_.repeated_string(1));

  ASSERT_EQ(2, proto_.repeated_nested_message_size());
  EXPECT_EQ(1, proto_.repeated_nested_message(0).bb());
  EXPECT_EQ(2, proto_.repeated_nested_message(1).bb());

  ASSERT_EQ(2, proto_.repeatedgroup_size());
  EXPECT_EQ(3, proto_.repeatedgroup(0).a());
  EXPECT_EQ(4, proto_.repeatedgroup(1).a());
}

TEST_F(TextFormatTest, ParseShortRepeatedWithTrailingComma) {
  std::string parse_string = "repeated_int32: [456,]\n";
  ASSERT_FALSE(TextFormat::ParseFromString(parse_string, &proto_));
  parse_string = "repeated_nested_enum: [  FOO , ]";
  ASSERT_FALSE(TextFormat::ParseFromString(parse_string, &proto_));
  parse_string = "repeated_string: [ \"foo\", ]";
  ASSERT_FALSE(TextFormat::ParseFromString(parse_string, &proto_));
  parse_string = "repeated_nested_message: [ { bb: 1 }, ]";
  ASSERT_FALSE(TextFormat::ParseFromString(parse_string, &proto_));
  parse_string = "RepeatedGroup [{ a: 3 },]\n";
}

TEST_F(TextFormatTest, ParseShortRepeatedEmpty) {
  std::string parse_string =
      "repeated_int32: []\n"
      "repeated_nested_enum: []\n"
      "repeated_string: []\n"
      "repeated_nested_message: []\n"
      "RepeatedGroup []\n";

  ASSERT_TRUE(TextFormat::ParseFromString(parse_string, &proto_));

  EXPECT_EQ(0, proto_.repeated_int32_size());
  EXPECT_EQ(0, proto_.repeated_nested_enum_size());
  EXPECT_EQ(0, proto_.repeated_string_size());
  EXPECT_EQ(0, proto_.repeated_nested_message_size());
  EXPECT_EQ(0, proto_.repeatedgroup_size());
}

TEST_F(TextFormatTest, ParseShortRepeatedConcatenatedWithEmpty) {
  std::string parse_string =
      // Starting with empty [] should have no impact.
      "repeated_int32: []\n"
      "repeated_nested_enum: []\n"
      "repeated_string: []\n"
      "repeated_nested_message: []\n"
      "RepeatedGroup []\n"
      // Mixed short-form and long-form are simply concatenated.
      "repeated_int32: 1\n"
      "repeated_int32: [456, 789]\n"
      "repeated_nested_enum: [  FOO ,BAR, # comment\n"
      "                         3]\n"
      // Note that while the printer won't print repeated strings in short-form,
      // the parser will accept them.
      "repeated_string: [ \"foo\", 'bar' ]\n"
      // Repeated message
      "repeated_nested_message: [ { bb: 1 }, { bb : 2 }]\n"
      // Repeated group
      "RepeatedGroup [{ a: 3 },{ a: 4 }]\n"
      // Adding empty [] should have no impact.
      "repeated_int32: []\n"
      "repeated_nested_enum: []\n"
      "repeated_string: []\n"
      "repeated_nested_message: []\n"
      "RepeatedGroup []\n";

  ASSERT_TRUE(TextFormat::ParseFromString(parse_string, &proto_));

  ASSERT_EQ(3, proto_.repeated_int32_size());
  EXPECT_EQ(1, proto_.repeated_int32(0));
  EXPECT_EQ(456, proto_.repeated_int32(1));
  EXPECT_EQ(789, proto_.repeated_int32(2));

  ASSERT_EQ(3, proto_.repeated_nested_enum_size());
  EXPECT_EQ(unittest::TestAllTypes::FOO, proto_.repeated_nested_enum(0));
  EXPECT_EQ(unittest::TestAllTypes::BAR, proto_.repeated_nested_enum(1));
  EXPECT_EQ(unittest::TestAllTypes::BAZ, proto_.repeated_nested_enum(2));

  ASSERT_EQ(2, proto_.repeated_string_size());
  EXPECT_EQ("foo", proto_.repeated_string(0));
  EXPECT_EQ("bar", proto_.repeated_string(1));

  ASSERT_EQ(2, proto_.repeated_nested_message_size());
  EXPECT_EQ(1, proto_.repeated_nested_message(0).bb());
  EXPECT_EQ(2, proto_.repeated_nested_message(1).bb());

  ASSERT_EQ(2, proto_.repeatedgroup_size());
  EXPECT_EQ(3, proto_.repeatedgroup(0).a());
  EXPECT_EQ(4, proto_.repeatedgroup(1).a());
}

TEST_F(TextFormatTest, ParseShortRepeatedUnknownEmpty) {
  std::string parse_string =
      "repeated_string: \"before\"\n"
      "unknown_field: []\n"
      "repeated_string: \"after\"\n";
  TextFormat::Parser parser;
  parser.AllowUnknownField(true);

  ASSERT_TRUE(parser.ParseFromString(parse_string, &proto_));

  EXPECT_EQ(2, proto_.repeated_string_size());
}


TEST_F(TextFormatTest, Comments) {
  // Test that comments are ignored.

  std::string parse_string =
      "optional_int32: 1  # a comment\n"
      "optional_int64: 2  # another comment";

  io::ArrayInputStream input_stream(parse_string.data(), parse_string.size());

  TextFormat::Parse(&input_stream, &proto_);

  // Compare.
  EXPECT_EQ(1, proto_.optional_int32());
  EXPECT_EQ(2, proto_.optional_int64());
}

TEST_F(TextFormatTest, OptionalColon) {
  // Test that we can place a ':' after the field name of a nested message,
  // even though we don't have to.

  std::string parse_string = "optional_nested_message: { bb: 1}\n";

  io::ArrayInputStream input_stream(parse_string.data(), parse_string.size());

  TextFormat::Parse(&input_stream, &proto_);

  // Compare.
  EXPECT_TRUE(proto_.has_optional_nested_message());
  EXPECT_EQ(1, proto_.optional_nested_message().bb());
}

// Some platforms (e.g. Windows) insist on padding the exponent to three
// digits when one or two would be just fine.
static std::string RemoveRedundantZeros(absl::string_view text) {
  return absl::StrReplaceAll(text, {{"e+0", "e+"}, {"e-0", "e-"}});
}

TEST_F(TextFormatTest, PrintExotic) {
  unittest::TestAllTypes message;

  message.add_repeated_int64(int64_t{-9223372036854775807} - 1);
  message.add_repeated_uint64(uint64_t{18446744073709551615u});
  message.add_repeated_double(123.456);
  message.add_repeated_double(1.23e21);
  message.add_repeated_double(1.23e-18);
  message.add_repeated_double(std::numeric_limits<double>::infinity());
  message.add_repeated_double(-std::numeric_limits<double>::infinity());
  message.add_repeated_double(std::numeric_limits<double>::quiet_NaN());
  message.add_repeated_double(-std::numeric_limits<double>::quiet_NaN());
  message.add_repeated_double(std::numeric_limits<double>::signaling_NaN());
  message.add_repeated_double(-std::numeric_limits<double>::signaling_NaN());
  message.add_repeated_string(std::string("\000\001\a\b\f\n\r\t\v\\\'\"", 12));

  // Fun story:  We used to use 1.23e22 instead of 1.23e21 above, but this
  //   seemed to trigger an odd case on MinGW/GCC 3.4.5 where GCC's parsing of
  //   the value differed from strtod()'s parsing.  That is to say, the
  //   following assertion fails on MinGW:
  //     assert(1.23e22 == strtod("1.23e22", nullptr));
  //   As a result, SimpleDtoa() would print the value as
  //   "1.2300000000000001e+22" to make sure strtod() produce the exact same
  //   result.  Our goal is to test runtime parsing, not compile-time parsing,
  //   so this wasn't our problem.  It was found that using 1.23e21 did not
  //   have this problem, so we switched to that instead.

  EXPECT_EQ(
      absl::StrCat("repeated_int64: ", kDebugStringSilentMarker,
                   "-9223372036854775808\n"
                   "repeated_uint64: 18446744073709551615\n"
                   "repeated_double: 123.456\n"
                   "repeated_double: 1.23e+21\n"
                   "repeated_double: 1.23e-18\n"
                   "repeated_double: inf\n"
                   "repeated_double: -inf\n"
                   "repeated_double: nan\n"
                   "repeated_double: nan\n"
                   "repeated_double: nan\n"
                   "repeated_double: nan\n"
                   "repeated_string: "
                   "\"\\000\\001\\007\\010\\014\\n\\r\\t\\013\\\\\\'\\\"\"\n"),
      RemoveRedundantZeros(message.DebugString()));
}

TEST_F(TextFormatTest, PrintFloatPrecision) {
  unittest::TestAllTypes message;

  message.add_repeated_float(1.0);
  message.add_repeated_float(1.2);
  message.add_repeated_float(1.23);
  message.add_repeated_float(1.234);
  message.add_repeated_float(1.2345);
  message.add_repeated_float(1.23456);
  message.add_repeated_float(1.2e10);
  message.add_repeated_float(1.23e10);
  message.add_repeated_float(1.234e10);
  message.add_repeated_float(1.2345e10);
  message.add_repeated_float(1.23456e10);
  message.add_repeated_double(1.2);
  message.add_repeated_double(1.23);
  message.add_repeated_double(1.234);
  message.add_repeated_double(1.2345);
  message.add_repeated_double(1.23456);
  message.add_repeated_double(1.234567);
  message.add_repeated_double(1.2345678);
  message.add_repeated_double(1.23456789);
  message.add_repeated_double(1.234567898);
  message.add_repeated_double(1.2345678987);
  message.add_repeated_double(1.23456789876);
  message.add_repeated_double(1.234567898765);
  message.add_repeated_double(1.2345678987654);
  message.add_repeated_double(1.23456789876543);
  message.add_repeated_double(1.2e100);
  message.add_repeated_double(1.23e100);
  message.add_repeated_double(1.234e100);
  message.add_repeated_double(1.2345e100);
  message.add_repeated_double(1.23456e100);
  message.add_repeated_double(1.234567e100);
  message.add_repeated_double(1.2345678e100);
  message.add_repeated_double(1.23456789e100);
  message.add_repeated_double(1.234567898e100);
  message.add_repeated_double(1.2345678987e100);
  message.add_repeated_double(1.23456789876e100);
  message.add_repeated_double(1.234567898765e100);
  message.add_repeated_double(1.2345678987654e100);
  message.add_repeated_double(1.23456789876543e100);

  EXPECT_EQ(absl::StrCat("repeated_float: ", kDebugStringSilentMarker,
                         "1\n"
                         "repeated_float: 1.2\n"
                         "repeated_float: 1.23\n"
                         "repeated_float: 1.234\n"
                         "repeated_float: 1.2345\n"
                         "repeated_float: 1.23456\n"
                         "repeated_float: 1.2e+10\n"
                         "repeated_float: 1.23e+10\n"
                         "repeated_float: 1.234e+10\n"
                         "repeated_float: 1.2345e+10\n"
                         "repeated_float: 1.23456e+10\n"
                         "repeated_double: 1.2\n"
                         "repeated_double: 1.23\n"
                         "repeated_double: 1.234\n"
                         "repeated_double: 1.2345\n"
                         "repeated_double: 1.23456\n"
                         "repeated_double: 1.234567\n"
                         "repeated_double: 1.2345678\n"
                         "repeated_double: 1.23456789\n"
                         "repeated_double: 1.234567898\n"
                         "repeated_double: 1.2345678987\n"
                         "repeated_double: 1.23456789876\n"
                         "repeated_double: 1.234567898765\n"
                         "repeated_double: 1.2345678987654\n"
                         "repeated_double: 1.23456789876543\n"
                         "repeated_double: 1.2e+100\n"
                         "repeated_double: 1.23e+100\n"
                         "repeated_double: 1.234e+100\n"
                         "repeated_double: 1.2345e+100\n"
                         "repeated_double: 1.23456e+100\n"
                         "repeated_double: 1.234567e+100\n"
                         "repeated_double: 1.2345678e+100\n"
                         "repeated_double: 1.23456789e+100\n"
                         "repeated_double: 1.234567898e+100\n"
                         "repeated_double: 1.2345678987e+100\n"
                         "repeated_double: 1.23456789876e+100\n"
                         "repeated_double: 1.234567898765e+100\n"
                         "repeated_double: 1.2345678987654e+100\n"
                         "repeated_double: 1.23456789876543e+100\n"),
            RemoveRedundantZeros(message.DebugString()));
}

TEST_F(TextFormatTest, AllowPartial) {
  unittest::TestRequired message;
  TextFormat::Parser parser;
  parser.AllowPartialMessage(true);
  EXPECT_TRUE(parser.ParseFromString("a: 1", &message));
  EXPECT_EQ(1, message.a());
  EXPECT_FALSE(message.has_b());
  EXPECT_FALSE(message.has_c());
}

TEST_F(TextFormatTest, ParseExotic) {
  unittest::TestAllTypes message;
  ASSERT_TRUE(TextFormat::ParseFromString(
      "repeated_int32: -1\n"
      "repeated_int32: -2147483648\n"
      "repeated_int64: -1\n"
      "repeated_int64: -9223372036854775808\n"
      "repeated_uint32: 4294967295\n"
      "repeated_uint32: 2147483648\n"
      "repeated_uint64: 18446744073709551615\n"
      "repeated_uint64: 9223372036854775808\n"
      "repeated_double: 123.0\n"
      "repeated_double: 123.5\n"
      "repeated_double: 0.125\n"
      "repeated_double: 1.23E17\n"
      "repeated_double: 1.235E+22\n"
      "repeated_double: 1.235e-18\n"
      "repeated_double: 123.456789\n"
      "repeated_double: inf\n"
      "repeated_double: Infinity\n"
      "repeated_double: -inf\n"
      "repeated_double: -Infinity\n"
      "repeated_double: nan\n"
      "repeated_double: NaN\n"
      "repeated_string: \"\\000\\001\\a\\b\\f\\n\\r\\t\\v\\\\\\'\\\"\"\n",
      &message));

  ASSERT_EQ(2, message.repeated_int32_size());
  EXPECT_EQ(-1, message.repeated_int32(0));
  EXPECT_EQ(-2147483648, message.repeated_int32(1));

  ASSERT_EQ(2, message.repeated_int64_size());
  EXPECT_EQ(-1, message.repeated_int64(0));
  EXPECT_EQ(int64_t{-9223372036854775807} - 1, message.repeated_int64(1));

  ASSERT_EQ(2, message.repeated_uint32_size());
  EXPECT_EQ(4294967295u, message.repeated_uint32(0));
  EXPECT_EQ(2147483648u, message.repeated_uint32(1));

  ASSERT_EQ(2, message.repeated_uint64_size());
  EXPECT_EQ(uint64_t{18446744073709551615u}, message.repeated_uint64(0));
  EXPECT_EQ(uint64_t{9223372036854775808u}, message.repeated_uint64(1));

  ASSERT_EQ(13, message.repeated_double_size());
  EXPECT_EQ(123.0, message.repeated_double(0));
  EXPECT_EQ(123.5, message.repeated_double(1));
  EXPECT_EQ(0.125, message.repeated_double(2));
  EXPECT_EQ(1.23E17, message.repeated_double(3));
  EXPECT_EQ(1.235E22, message.repeated_double(4));
  EXPECT_EQ(1.235E-18, message.repeated_double(5));
  EXPECT_EQ(123.456789, message.repeated_double(6));
  EXPECT_EQ(message.repeated_double(7),
            std::numeric_limits<double>::infinity());
  EXPECT_EQ(message.repeated_double(8),
            std::numeric_limits<double>::infinity());
  EXPECT_EQ(message.repeated_double(9),
            -std::numeric_limits<double>::infinity());
  EXPECT_EQ(message.repeated_double(10),
            -std::numeric_limits<double>::infinity());
  EXPECT_TRUE(std::isnan(message.repeated_double(11)));
  EXPECT_TRUE(std::isnan(message.repeated_double(12)));

  // Note:  Since these string literals have \0's in them, we must explicitly
  // pass their sizes to string's constructor.
  ASSERT_EQ(1, message.repeated_string_size());
  EXPECT_EQ(std::string("\000\001\a\b\f\n\r\t\v\\\'\"", 12),
            message.repeated_string(0));

  ASSERT_TRUE(
      TextFormat::ParseFromString("repeated_float: 3.4028235e+38\n"
                                  "repeated_float: -3.4028235e+38\n"
                                  "repeated_float: 3.402823567797337e+38\n"
                                  "repeated_float: -3.402823567797337e+38\n",
                                  &message));
  EXPECT_EQ(message.repeated_float(0), std::numeric_limits<float>::max());
  EXPECT_EQ(message.repeated_float(1), -std::numeric_limits<float>::max());
  EXPECT_EQ(message.repeated_float(2), std::numeric_limits<float>::infinity());
  EXPECT_EQ(message.repeated_float(3), -std::numeric_limits<float>::infinity());

}

TEST_F(TextFormatTest, PrintFieldsInIndexOrder) {
  protobuf_unittest::TestFieldOrderings message;
  // Fields are listed in index order instead of field number.
  message.set_my_string("str");  // Field number 11
  message.set_my_int(12345);     // Field number 1
  message.set_my_float(0.999);   // Field number 101
  // Extensions are listed based on the order of extension number.
  // Extension number 12.
  message
      .MutableExtension(
          protobuf_unittest::TestExtensionOrderings2::test_ext_orderings2)
      ->set_my_string("ext_str2");
  // Extension number 13.
  message
      .MutableExtension(
          protobuf_unittest::TestExtensionOrderings1::test_ext_orderings1)
      ->set_my_string("ext_str1");
  // Extension number 14.
  message
      .MutableExtension(protobuf_unittest::TestExtensionOrderings2::
                            TestExtensionOrderings3::test_ext_orderings3)
      ->set_my_string("ext_str3");
  // Extension number 50.
  *message.MutableExtension(protobuf_unittest::my_extension_string) = "ext_str0";

  TextFormat::Printer printer;
  std::string text;

  // By default, print in field number order.
  // my_int: 12345
  // my_string: "str"
  // [protobuf_unittest.TestExtensionOrderings2.test_ext_orderings2] {
  //   my_string: "ext_str2"
  // }
  // [protobuf_unittest.TestExtensionOrderings1.test_ext_orderings1] {
  //   my_string: "ext_str1"
  // }
  // [protobuf_unittest.TestExtensionOrderings2.TestExtensionOrderings3.test_ext_orderings3]
  // {
  //   my_string: "ext_str3"
  // }
  // [protobuf_unittest.my_extension_string]: "ext_str0"
  // my_float: 0.999
  printer.PrintToString(message, &text);
  EXPECT_EQ(
      "my_int: 12345\nmy_string: "
      "\"str\"\n[protobuf_unittest.TestExtensionOrderings2.test_ext_orderings2] "
      "{\n  my_string: "
      "\"ext_str2\"\n}\n[protobuf_unittest.TestExtensionOrderings1.test_ext_"
      "orderings1] {\n  my_string: "
      "\"ext_str1\"\n}\n[protobuf_unittest.TestExtensionOrderings2."
      "TestExtensionOrderings3.test_ext_orderings3] {\n  my_string: "
      "\"ext_str3\"\n}\n[protobuf_unittest.my_extension_string]: "
      "\"ext_str0\"\nmy_float: 0.999\n",
      text);

  // Print in index order.
  // my_string: "str"
  // my_int: 12345
  // my_float: 0.999
  // [protobuf_unittest.TestExtensionOrderings2.test_ext_orderings2] {
  //   my_string: "ext_str2"
  // }
  // [protobuf_unittest.TestExtensionOrderings1.test_ext_orderings1] {
  //   my_string: "ext_str1"
  // }
  // [protobuf_unittest.TestExtensionOrderings2.TestExtensionOrderings3.test_ext_orderings3]
  // {
  //   my_string: "ext_str3"
  // }
  // [protobuf_unittest.my_extension_string]: "ext_str0"
  printer.SetPrintMessageFieldsInIndexOrder(true);
  printer.PrintToString(message, &text);
  EXPECT_EQ(
      "my_string: \"str\"\nmy_int: 12345\nmy_float: "
      "0.999\n[protobuf_unittest.TestExtensionOrderings2.test_ext_orderings2] "
      "{\n  my_string: "
      "\"ext_str2\"\n}\n[protobuf_unittest.TestExtensionOrderings1.test_ext_"
      "orderings1] {\n  my_string: "
      "\"ext_str1\"\n}\n[protobuf_unittest.TestExtensionOrderings2."
      "TestExtensionOrderings3.test_ext_orderings3] {\n  my_string: "
      "\"ext_str3\"\n}\n[protobuf_unittest.my_extension_string]: \"ext_str0\"\n",
      text);
}

class TextFormatParserTest : public testing::Test {
 protected:
  void ExpectFailure(const std::string& input, const std::string& message,
                     int line, int col) {
    std::unique_ptr<unittest::TestAllTypes> proto(new unittest::TestAllTypes);
    ExpectFailure(input, message, line, col, proto.get());
  }

  void ExpectFailure(const std::string& input, const std::string& message,
                     int line, int col, Message* proto) {
    ExpectMessage(input, message, line, col, proto, false);
  }

  void ExpectMessage(const std::string& input, const std::string& message,
                     int line, int col, Message* proto, bool expected_result) {
    MockErrorCollector error_collector;
    parser_.RecordErrorsTo(&error_collector);
    EXPECT_EQ(expected_result, parser_.ParseFromString(input, proto))
        << input << " -> " << proto->DebugString();
    EXPECT_EQ(absl::StrCat(line, ":", col, ": ", message, "\n"),
              error_collector.text_);
    parser_.RecordErrorsTo(nullptr);
  }

  void ExpectSuccessAndTree(const std::string& input, Message* proto,
                            TextFormat::ParseInfoTree* info_tree) {
    MockErrorCollector error_collector;
    parser_.RecordErrorsTo(&error_collector);
    parser_.WriteLocationsTo(info_tree);
    EXPECT_TRUE(parser_.ParseFromString(input, proto));
    parser_.WriteLocationsTo(nullptr);
    parser_.RecordErrorsTo(nullptr);
  }

  void ExpectLocation(TextFormat::ParseInfoTree* tree, const Descriptor* d,
                      const std::string& field_name, int index, int start_line,
                      int start_column, int end_line, int end_column) {
    TextFormat::ParseLocationRange range =
        tree->GetLocationRange(d->FindFieldByName(field_name), index);
    EXPECT_EQ(start_line, range.start.line);
    EXPECT_EQ(start_column, range.start.column);
    EXPECT_EQ(end_line, range.end.line);
    EXPECT_EQ(end_column, range.end.column);
    TextFormat::ParseLocation start_location =
        tree->GetLocation(d->FindFieldByName(field_name), index);
    EXPECT_EQ(start_line, start_location.line);
    EXPECT_EQ(start_column, start_location.column);
  }

  // An error collector which simply concatenates all its errors into a big
  // block of text which can be checked.
  class MockErrorCollector : public io::ErrorCollector {
   public:
    MockErrorCollector() {}
    ~MockErrorCollector() override {}

    std::string text_;

    // implements ErrorCollector -------------------------------------
    void AddError(int line, int column, const std::string& message) override {
      absl::SubstituteAndAppend(&text_, "$0:$1: $2\n", line + 1, column + 1,
                                message);
    }

    void AddWarning(int line, int column, const std::string& message) override {
      AddError(line, column, "WARNING:" + message);
    }
  };

  TextFormat::Parser parser_;
};

TEST_F(TextFormatParserTest, ParseInfoTreeBuilding) {
  std::unique_ptr<unittest::TestAllTypes> message(new unittest::TestAllTypes);
  const Descriptor* d = message->GetDescriptor();

  std::string stringData =
      "optional_int32: 1\n"
      "optional_int64: 2\n"
      "  optional_double: 2.4\n"
      "repeated_int32: 5\n"
      "repeated_int32: 10\n"
      "optional_nested_message <\n"
      "  bb: 78\n"
      ">\n"
      "repeated_nested_message <\n"
      "  bb: 79\n"
      ">\n"
      "repeated_nested_message <\n"
      "  bb: 80\n"
      ">";

  TextFormat::ParseInfoTree tree;
  ExpectSuccessAndTree(stringData, message.get(), &tree);

  // Verify that the tree has the correct positions.
  ExpectLocation(&tree, d, "optional_int32", -1, 0, 0, 0, 17);
  ExpectLocation(&tree, d, "optional_int64", -1, 1, 0, 1, 17);
  ExpectLocation(&tree, d, "optional_double", -1, 2, 2, 2, 22);

  ExpectLocation(&tree, d, "repeated_int32", 0, 3, 0, 3, 17);
  ExpectLocation(&tree, d, "repeated_int32", 1, 4, 0, 4, 18);

  ExpectLocation(&tree, d, "optional_nested_message", -1, 5, 0, 7, 1);
  ExpectLocation(&tree, d, "repeated_nested_message", 0, 8, 0, 10, 1);
  ExpectLocation(&tree, d, "repeated_nested_message", 1, 11, 0, 13, 1);

  // Check for fields not set. For an invalid field, the start and end locations
  // returned should be -1, -1.
  ExpectLocation(&tree, d, "repeated_int64", 0, -1, -1, -1, -1);
  ExpectLocation(&tree, d, "repeated_int32", 6, -1, -1, -1, -1);
  ExpectLocation(&tree, d, "some_unknown_field", -1, -1, -1, -1, -1);

  // Verify inside the nested message.
  const FieldDescriptor* nested_field =
      d->FindFieldByName("optional_nested_message");

  TextFormat::ParseInfoTree* nested_tree =
      tree.GetTreeForNested(nested_field, -1);
  ExpectLocation(nested_tree, nested_field->message_type(), "bb", -1, 6, 2, 6,
                 8);

  // Verify inside another nested message.
  nested_field = d->FindFieldByName("repeated_nested_message");
  nested_tree = tree.GetTreeForNested(nested_field, 0);
  ExpectLocation(nested_tree, nested_field->message_type(), "bb", -1, 9, 2, 9,
                 8);

  nested_tree = tree.GetTreeForNested(nested_field, 1);
  ExpectLocation(nested_tree, nested_field->message_type(), "bb", -1, 12, 2, 12,
                 8);

  // Verify a nullptr tree for an unknown nested field.
  TextFormat::ParseInfoTree* unknown_nested_tree =
      tree.GetTreeForNested(nested_field, 2);

  EXPECT_EQ(nullptr, unknown_nested_tree);
}

TEST_F(TextFormatParserTest, ParseFieldValueFromString) {
  std::unique_ptr<unittest::TestAllTypes> message(new unittest::TestAllTypes);
  const Descriptor* d = message->GetDescriptor();

#define EXPECT_FIELD(name, value, valuestring)                             \
  EXPECT_TRUE(TextFormat::ParseFieldValueFromString(                       \
      valuestring, d->FindFieldByName("optional_" #name), message.get())); \
  EXPECT_EQ(value, message->optional_##name());                            \
  EXPECT_TRUE(message->has_optional_##name());

#define EXPECT_BOOL_FIELD(name, value, valuestring)                        \
  EXPECT_TRUE(TextFormat::ParseFieldValueFromString(                       \
      valuestring, d->FindFieldByName("optional_" #name), message.get())); \
  EXPECT_TRUE(message->optional_##name() == value);                        \
  EXPECT_TRUE(message->has_optional_##name());

#define EXPECT_FLOAT_FIELD(name, value, valuestring)                       \
  EXPECT_TRUE(TextFormat::ParseFieldValueFromString(                       \
      valuestring, d->FindFieldByName("optional_" #name), message.get())); \
  EXPECT_FLOAT_EQ(value, message->optional_##name());                      \
  EXPECT_TRUE(message->has_optional_##name());

#define EXPECT_DOUBLE_FIELD(name, value, valuestring)                      \
  EXPECT_TRUE(TextFormat::ParseFieldValueFromString(                       \
      valuestring, d->FindFieldByName("optional_" #name), message.get())); \
  EXPECT_DOUBLE_EQ(value, message->optional_##name());                     \
  EXPECT_TRUE(message->has_optional_##name());

#define EXPECT_INVALID(name, valuestring)             \
  EXPECT_FALSE(TextFormat::ParseFieldValueFromString( \
      valuestring, d->FindFieldByName("optional_" #name), message.get()));

  // int32
  EXPECT_FIELD(int32, 1, "1");
  EXPECT_FIELD(int32, -1, "-1");
  EXPECT_FIELD(int32, 0x1234, "0x1234");
  EXPECT_INVALID(int32, "a");
  EXPECT_INVALID(int32, "999999999999999999999999999999999999");
  EXPECT_INVALID(int32, "1,2");

  // int64
  EXPECT_FIELD(int64, 1, "1");
  EXPECT_FIELD(int64, -1, "-1");
  EXPECT_FIELD(int64, 0x1234567812345678LL, "0x1234567812345678");
  EXPECT_INVALID(int64, "a");
  EXPECT_INVALID(int64, "999999999999999999999999999999999999");
  EXPECT_INVALID(int64, "1,2");

  // uint64
  EXPECT_FIELD(uint64, 1, "1");
  EXPECT_FIELD(uint64, 0xf234567812345678ULL, "0xf234567812345678");
  EXPECT_INVALID(uint64, "-1");
  EXPECT_INVALID(uint64, "a");
  EXPECT_INVALID(uint64, "999999999999999999999999999999999999");
  EXPECT_INVALID(uint64, "1,2");

  // fixed32
  EXPECT_FIELD(fixed32, 1, "1");
  EXPECT_FIELD(fixed32, 0x12345678, "0x12345678");
  EXPECT_INVALID(fixed32, "-1");
  EXPECT_INVALID(fixed32, "a");
  EXPECT_INVALID(fixed32, "999999999999999999999999999999999999");
  EXPECT_INVALID(fixed32, "1,2");

  // fixed64
  EXPECT_FIELD(fixed64, 1, "1");
  EXPECT_FIELD(fixed64, 0x1234567812345678ULL, "0x1234567812345678");
  EXPECT_INVALID(fixed64, "-1");
  EXPECT_INVALID(fixed64, "a");
  EXPECT_INVALID(fixed64, "999999999999999999999999999999999999");
  EXPECT_INVALID(fixed64, "1,2");

  // bool
  EXPECT_BOOL_FIELD(bool, true, "true");
  EXPECT_BOOL_FIELD(bool, false, "false");
  EXPECT_BOOL_FIELD(bool, true, "1");
  EXPECT_BOOL_FIELD(bool, true, "t");
  EXPECT_BOOL_FIELD(bool, false, "0");
  EXPECT_BOOL_FIELD(bool, false, "f");
  EXPECT_FIELD(bool, true, "True");
  EXPECT_FIELD(bool, false, "False");
  EXPECT_INVALID(bool, "tRue");
  EXPECT_INVALID(bool, "faLse");
  EXPECT_INVALID(bool, "2");
  EXPECT_INVALID(bool, "-0");
  EXPECT_INVALID(bool, "on");
  EXPECT_INVALID(bool, "a");

  // float
  EXPECT_FIELD(float, 1, "1");
  EXPECT_FLOAT_FIELD(float, 1.5, "1.5");
  EXPECT_FLOAT_FIELD(float, 1.5e3, "1.5e3");
  EXPECT_FLOAT_FIELD(float, -4.55, "-4.55");
  EXPECT_INVALID(float, "a");
  EXPECT_INVALID(float, "1,2");

  // double
  EXPECT_FIELD(double, 1, "1");
  EXPECT_FIELD(double, -1, "-1");
  EXPECT_DOUBLE_FIELD(double, 2.3, "2.3");
  EXPECT_DOUBLE_FIELD(double, 3e5, "3e5");
  EXPECT_INVALID(double, "a");
  EXPECT_INVALID(double, "1,2");
  // Rejects hex and oct numbers for a double field.
  EXPECT_INVALID(double, "0xf");
  EXPECT_INVALID(double, "012");

  // string
  EXPECT_FIELD(string, "hello", "\"hello\"");
  EXPECT_FIELD(string, "-1.87", "'-1.87'");
  EXPECT_INVALID(string, "hello");  // without quote for value

  // enum
  EXPECT_FIELD(nested_enum, unittest::TestAllTypes::BAR, "BAR");
  EXPECT_FIELD(nested_enum, unittest::TestAllTypes::BAZ,
               absl::StrCat(unittest::TestAllTypes::BAZ));
  EXPECT_INVALID(nested_enum, "FOOBAR");

  // message
  EXPECT_TRUE(TextFormat::ParseFieldValueFromString(
      "<bb:12>", d->FindFieldByName("optional_nested_message"), message.get()));
  EXPECT_EQ(12, message->optional_nested_message().bb());
  EXPECT_TRUE(message->has_optional_nested_message());
  EXPECT_INVALID(nested_message, "any");

#undef EXPECT_FIELD
#undef EXPECT_BOOL_FIELD
#undef EXPECT_FLOAT_FIELD
#undef EXPECT_DOUBLE_FIELD
#undef EXPECT_INVALID
}

TEST_F(TextFormatParserTest, InvalidToken) {
  ExpectFailure("optional_bool: true\n-5\n", "Expected identifier, got: -", 2,
                1);

  ExpectFailure("optional_bool: true!\n", "Expected identifier, got: !", 1, 20);
  ExpectFailure("\"some string\"", "Expected identifier, got: \"some string\"",
                1, 1);
}

TEST_F(TextFormatParserTest, InvalidFieldName) {
  ExpectFailure(
      "invalid_field: somevalue\n",
      "Message type \"protobuf_unittest.TestAllTypes\" has no field named "
      "\"invalid_field\".",
      1, 14);
}

TEST_F(TextFormatParserTest, InvalidCapitalization) {
  // We require that group names be exactly as they appear in the .proto.
  ExpectFailure(
      "optionalgroup {\na: 15\n}\n",
      "Message type \"protobuf_unittest.TestAllTypes\" has no field named "
      "\"optionalgroup\".",
      1, 15);
  ExpectFailure(
      "OPTIONALgroup {\na: 15\n}\n",
      "Message type \"protobuf_unittest.TestAllTypes\" has no field named "
      "\"OPTIONALgroup\".",
      1, 15);
  ExpectFailure(
      "Optional_Double: 10.0\n",
      "Message type \"protobuf_unittest.TestAllTypes\" has no field named "
      "\"Optional_Double\".",
      1, 16);
}

TEST_F(TextFormatParserTest, AllowIgnoreCapitalizationError) {
  TextFormat::Parser parser;
  protobuf_unittest::TestAllTypes proto;

  // These fields have a mismatching case.
  EXPECT_FALSE(parser.ParseFromString("Optional_Double: 10.0", &proto));
  EXPECT_FALSE(parser.ParseFromString("oPtIoNaLgRoUp { a: 15 }", &proto));

  // ... but are parsed correctly if we match case insensitive.
  parser.AllowCaseInsensitiveField(true);
  EXPECT_TRUE(parser.ParseFromString("Optional_Double: 10.0", &proto));
  EXPECT_EQ(10.0, proto.optional_double());
  EXPECT_TRUE(parser.ParseFromString("oPtIoNaLgRoUp { a: 15 }", &proto));
  EXPECT_EQ(15, proto.optionalgroup().a());
}

TEST_F(TextFormatParserTest, InvalidFieldValues) {
  // Invalid values for a double/float field.
  ExpectFailure("optional_double: \"hello\"\n",
                "Expected double, got: \"hello\"", 1, 18);
  ExpectFailure("optional_double: true\n", "Expected double, got: true", 1, 18);
  ExpectFailure("optional_double: !\n", "Expected double, got: !", 1, 18);
  ExpectFailure("optional_double {\n  \n}\n", "Expected \":\", found \"{\".", 1,
                17);

  // Invalid values for a signed integer field.
  ExpectFailure("optional_int32: \"hello\"\n",
                "Expected integer, got: \"hello\"", 1, 17);
  ExpectFailure("optional_int32: true\n", "Expected integer, got: true", 1, 17);
  ExpectFailure("optional_int32: 4.5\n", "Expected integer, got: 4.5", 1, 17);
  ExpectFailure("optional_int32: !\n", "Expected integer, got: !", 1, 17);
  ExpectFailure("optional_int32 {\n \n}\n", "Expected \":\", found \"{\".", 1,
                16);
  ExpectFailure("optional_int32: 0x80000000\n",
                "Integer out of range (0x80000000)", 1, 17);
  ExpectFailure("optional_int64: 0x8000000000000000\n",
                "Integer out of range (0x8000000000000000)", 1, 17);
  ExpectFailure("optional_int32: -0x80000001\n",
                "Integer out of range (0x80000001)", 1, 18);
  ExpectFailure("optional_int64: -0x8000000000000001\n",
                "Integer out of range (0x8000000000000001)", 1, 18);

  // Invalid values for an unsigned integer field.
  ExpectFailure("optional_uint64: \"hello\"\n",
                "Expected integer, got: \"hello\"", 1, 18);
  ExpectFailure("optional_uint64: true\n", "Expected integer, got: true", 1,
                18);
  ExpectFailure("optional_uint64: 4.5\n", "Expected integer, got: 4.5", 1, 18);
  ExpectFailure("optional_uint64: -5\n", "Expected integer, got: -", 1, 18);
  ExpectFailure("optional_uint64: !\n", "Expected integer, got: !", 1, 18);
  ExpectFailure("optional_uint64 {\n \n}\n", "Expected \":\", found \"{\".", 1,
                17);
  ExpectFailure("optional_uint32: 0x100000000\n",
                "Integer out of range (0x100000000)", 1, 18);
  ExpectFailure("optional_uint64: 0x10000000000000000\n",
                "Integer out of range (0x10000000000000000)", 1, 18);

  // Invalid values for a boolean field.
  ExpectFailure("optional_bool: \"hello\"\n",
                "Expected identifier, got: \"hello\"", 1, 16);
  ExpectFailure("optional_bool: 5\n", "Integer out of range (5)", 1, 16);
  ExpectFailure("optional_bool: -7.5\n", "Expected identifier, got: -", 1, 16);
  ExpectFailure("optional_bool: !\n", "Expected identifier, got: !", 1, 16);

  ExpectFailure(
      "optional_bool: meh\n",
      "Invalid value for boolean field \"optional_bool\". Value: \"meh\".", 2,
      1);

  ExpectFailure("optional_bool {\n \n}\n", "Expected \":\", found \"{\".", 1,
                15);

  // Invalid values for a string field.
  ExpectFailure("optional_string: true\n", "Expected string, got: true", 1, 18);
  ExpectFailure("optional_string: 5\n", "Expected string, got: 5", 1, 18);
  ExpectFailure("optional_string: -7.5\n", "Expected string, got: -", 1, 18);
  ExpectFailure("optional_string: !\n", "Expected string, got: !", 1, 18);
  ExpectFailure("optional_string {\n \n}\n", "Expected \":\", found \"{\".", 1,
                17);

  // Invalid values for an enumeration field.
  ExpectFailure("optional_nested_enum: \"hello\"\n",
                "Expected integer or identifier, got: \"hello\"", 1, 23);

  // Valid token, but enum value is not defined.
  ExpectFailure("optional_nested_enum: 5\n",
                "Unknown enumeration value of \"5\" for field "
                "\"optional_nested_enum\".",
                2, 1);
  // We consume the negative sign, so the error position starts one character
  // later.
  ExpectFailure("optional_nested_enum: -7.5\n", "Expected integer, got: 7.5", 1,
                24);
  ExpectFailure("optional_nested_enum: !\n",
                "Expected integer or identifier, got: !", 1, 23);

  ExpectFailure("optional_nested_enum: grah\n",
                "Unknown enumeration value of \"grah\" for field "
                "\"optional_nested_enum\".",
                2, 1);

  ExpectFailure("optional_nested_enum {\n \n}\n",
                "Expected \":\", found \"{\".", 1, 22);
}

TEST_F(TextFormatParserTest, MessageDelimiters) {
  // Non-matching delimiters.
  ExpectFailure("OptionalGroup <\n \n}\n", "Expected \">\", found \"}\".", 3,
                1);

  // Invalid delimiters.
  ExpectFailure("OptionalGroup [\n \n]\n", "Expected \"{\", found \"[\".", 1,
                15);

  // Unending message.
  ExpectFailure("optional_nested_message {\n \nbb: 118\n",
                "Expected identifier, got: ", 4, 1);
}

TEST_F(TextFormatParserTest, UnknownExtension) {
  // Non-matching delimiters.
  ExpectFailure("[blahblah]: 123",
                "Extension \"blahblah\" is not defined or is not an "
                "extension of \"protobuf_unittest.TestAllTypes\".",
                1, 11);
}

TEST_F(TextFormatParserTest, MissingRequired) {
  unittest::TestRequired message;
  ExpectFailure("a: 1", "Message missing required fields: b, c", 0, 1,
                &message);
}

TEST_F(TextFormatParserTest, ParseDuplicateRequired) {
  unittest::TestRequired message;
  ExpectFailure("a: 1 b: 2 c: 3 a: 1",
                "Non-repeated field \"a\" is specified multiple times.", 1, 17,
                &message);
}

TEST_F(TextFormatParserTest, ParseDuplicateOptional) {
  unittest::ForeignMessage message;
  ExpectFailure("c: 1 c: 2",
                "Non-repeated field \"c\" is specified multiple times.", 1, 7,
                &message);
}

TEST_F(TextFormatParserTest, MergeDuplicateRequired) {
  unittest::TestRequired message;
  TextFormat::Parser parser;
  EXPECT_TRUE(parser.MergeFromString("a: 1 b: 2 c: 3 a: 4", &message));
  EXPECT_EQ(4, message.a());
}

TEST_F(TextFormatParserTest, MergeDuplicateOptional) {
  unittest::ForeignMessage message;
  TextFormat::Parser parser;
  EXPECT_TRUE(parser.MergeFromString("c: 1 c: 2", &message));
  EXPECT_EQ(2, message.c());
}

TEST_F(TextFormatParserTest, ExplicitDelimiters) {
  unittest::TestRequired message;
  EXPECT_TRUE(TextFormat::ParseFromString("a:1,b:2;c:3", &message));
  EXPECT_EQ(1, message.a());
  EXPECT_EQ(2, message.b());
  EXPECT_EQ(3, message.c());
}

TEST_F(TextFormatParserTest, PrintErrorsToStderr) {
  std::vector<std::string> errors;

  {
    ScopedMemoryLog log;
    unittest::TestAllTypes proto;
    EXPECT_FALSE(TextFormat::ParseFromString("no_such_field: 1", &proto));
    errors = log.GetMessages(ERROR);
  }

  ASSERT_EQ(1, errors.size());
  EXPECT_EQ(
      "Error parsing text-format protobuf_unittest.TestAllTypes: "
      "1:14: Message type \"protobuf_unittest.TestAllTypes\" has no field "
      "named \"no_such_field\".",
      errors[0]);
}

TEST_F(TextFormatParserTest, FailsOnTokenizationError) {
  std::vector<std::string> errors;

  {
    ScopedMemoryLog log;
    unittest::TestAllTypes proto;
    EXPECT_FALSE(TextFormat::ParseFromString("\020", &proto));
    errors = log.GetMessages(ERROR);
  }

  ASSERT_EQ(1, errors.size());
  EXPECT_EQ(
      "Error parsing text-format protobuf_unittest.TestAllTypes: "
      "1:1: Invalid control characters encountered in text.",
      errors[0]);
}

TEST_F(TextFormatParserTest, ParseDeprecatedField) {
  unittest::TestDeprecatedFields message;
  ExpectMessage("deprecated_int32: 42",
                "WARNING:text format contains deprecated field "
                "\"deprecated_int32\"",
                1, 17, &message, true);
  ExpectMessage("deprecated_message {\n#blah\n#blah\n#blah\n}\n",
                "WARNING:text format contains deprecated field "
                "\"deprecated_message\"",
                1, 20, &message, true);
}

TEST_F(TextFormatParserTest, SetRecursionLimit) {
  const char* format = "child: { $0 }";
  std::string input;
  for (int i = 0; i < 100; ++i) input = absl::Substitute(format, input);

  unittest::NestedTestAllTypes message;
  ExpectSuccessAndTree(input, &message, nullptr);

  input = absl::Substitute(format, input);
  parser_.SetRecursionLimit(100);
  ExpectMessage(input,
                "Message is too deep, the parser exceeded the configured "
                "recursion limit of 100.",
                1, 908, &message, false);

  parser_.SetRecursionLimit(101);
  ExpectSuccessAndTree(input, &message, nullptr);
}

TEST_F(TextFormatParserTest, SetRecursionLimitUnknownFieldValue) {
  const char* format = "[$0]";
  std::string input = "\"test_value\"";
  for (int i = 0; i < 99; ++i) input = absl::Substitute(format, input);
  std::string not_deep_input = absl::StrCat("unknown_nested_array: ", input);

  parser_.AllowUnknownField(true);
  parser_.SetRecursionLimit(100);

  unittest::NestedTestAllTypes message;
  ExpectSuccessAndTree(not_deep_input, &message, nullptr);

  input = absl::Substitute(format, input);
  std::string deep_input = absl::StrCat("unknown_nested_array: ", input);
  ExpectMessage(
      deep_input,
      "WARNING:Message type \"protobuf_unittest.NestedTestAllTypes\" has no "
      "field named \"unknown_nested_array\".\n1:123: Message is too deep, the "
      "parser exceeded the configured recursion limit of 100.",
      1, 21, &message, false);

  parser_.SetRecursionLimit(101);
  ExpectSuccessAndTree(deep_input, &message, nullptr);
}

TEST_F(TextFormatParserTest, SetRecursionLimitUnknownFieldMessage) {
  const char* format = "unknown_child: { $0 }";
  std::string input;
  for (int i = 0; i < 100; ++i) input = absl::Substitute(format, input);

  parser_.AllowUnknownField(true);
  parser_.SetRecursionLimit(100);

  unittest::NestedTestAllTypes message;
  ExpectSuccessAndTree(input, &message, nullptr);

  input = absl::Substitute(format, input);
  ExpectMessage(
      input,
      "WARNING:Message type \"protobuf_unittest.NestedTestAllTypes\" has no "
      "field named \"unknown_child\".\n1:1716: Message is too deep, the parser "
      "exceeded the configured recursion limit of 100.",
      1, 14, &message, false);

  parser_.SetRecursionLimit(101);
  ExpectSuccessAndTree(input, &message, nullptr);
}

TEST_F(TextFormatParserTest, ParseAnyFieldWithAdditionalWhiteSpaces) {
  Any any;
  std::string parse_string =
      "[type.googleapis.com/protobuf_unittest.TestAllTypes] \t :  \t {\n"
      "  optional_int32: 321\n"
      "  optional_string: \"teststr0\"\n"
      "}\n";

  ASSERT_TRUE(TextFormat::ParseFromString(parse_string, &any));

  TextFormat::Printer printer;
  printer.SetExpandAny(true);
  std::string text;
  ASSERT_TRUE(printer.PrintToString(any, &text));
  EXPECT_EQ(text,
            "[type.googleapis.com/protobuf_unittest.TestAllTypes] {\n"
            "  optional_int32: 321\n"
            "  optional_string: \"teststr0\"\n"
            "}\n");
}

TEST_F(TextFormatParserTest, ParseExtensionFieldWithAdditionalWhiteSpaces) {
  unittest::TestAllExtensions proto;
  std::string parse_string =
      "[protobuf_unittest.optional_int32_extension]   : \t 101\n"
      "[protobuf_unittest.optional_int64_extension] \t : 102\n";

  ASSERT_TRUE(TextFormat::ParseFromString(parse_string, &proto));

  TextFormat::Printer printer;
  std::string text;
  ASSERT_TRUE(printer.PrintToString(proto, &text));
  EXPECT_EQ(text,
            "[protobuf_unittest.optional_int32_extension]: 101\n"
            "[protobuf_unittest.optional_int64_extension]: 102\n");
}

TEST_F(TextFormatParserTest, ParseNormalFieldWithAdditionalWhiteSpaces) {
  unittest::TestAllTypes proto;
  std::string parse_string =
      "repeated_int32  : \t 1\n"
      "repeated_int32: 2\n"
      "repeated_nested_message: {\n"
      "  bb: 3\n"
      "}\n"
      "repeated_nested_message  : \t {\n"
      "  bb: 4\n"
      "}\n"
      "repeated_nested_message     {\n"
      "  bb: 5\n"
      "}\n";

  ASSERT_TRUE(TextFormat::ParseFromString(parse_string, &proto));

  TextFormat::Printer printer;
  std::string text;
  ASSERT_TRUE(printer.PrintToString(proto, &text));
  EXPECT_EQ(text,
            "repeated_int32: 1\n"
            "repeated_int32: 2\n"
            "repeated_nested_message {\n"
            "  bb: 3\n"
            "}\n"
            "repeated_nested_message {\n"
            "  bb: 4\n"
            "}\n"
            "repeated_nested_message {\n"
            "  bb: 5\n"
            "}\n");
}

TEST_F(TextFormatParserTest, ParseSkippedFieldWithAdditionalWhiteSpaces) {
  protobuf_unittest::TestAllTypes proto;
  TextFormat::Parser parser;
  parser.AllowUnknownField(true);
  EXPECT_TRUE(
      parser.ParseFromString("optional_int32: 321\n"
                             "unknown_field1   : \t 12345\n"
                             "[somewhere.unknown_extension1]   {\n"
                             "  unknown_field2 \t :   12345\n"
                             "}\n"
                             "[somewhere.unknown_extension2]    : \t {\n"
                             "  unknown_field3     \t :   12345\n"
                             "  [somewhere.unknown_extension3]    \t :   {\n"
                             "    unknown_field4:   10\n"
                             "  }\n"
                             "  [somewhere.unknown_extension4] \t {\n"
                             "  }\n"
                             "}\n",
                             &proto));
  std::string text;
  TextFormat::Printer printer;
  ASSERT_TRUE(printer.PrintToString(proto, &text));
  EXPECT_EQ(text, "optional_int32: 321\n");
}

class TextFormatMessageSetTest : public testing::Test {
 protected:
  static const char proto_text_format_[];
};
const char TextFormatMessageSetTest::proto_text_format_[] =
    "message_set {\n"
    "  [protobuf_unittest.TestMessageSetExtension1] {\n"
    "    i: 23\n"
    "  }\n"
    "  [protobuf_unittest.TestMessageSetExtension2] {\n"
    "    str: \"foo\"\n"
    "  }\n"
    "}\n";

TEST_F(TextFormatMessageSetTest, Serialize) {
  protobuf_unittest::TestMessageSetContainer proto;
  protobuf_unittest::TestMessageSetExtension1* item_a =
      proto.mutable_message_set()->MutableExtension(
          protobuf_unittest::TestMessageSetExtension1::message_set_extension);
  item_a->set_i(23);
  protobuf_unittest::TestMessageSetExtension2* item_b =
      proto.mutable_message_set()->MutableExtension(
          protobuf_unittest::TestMessageSetExtension2::message_set_extension);
  item_b->set_str("foo");
  std::string actual_proto_text_format;
  TextFormat::PrintToString(proto, &actual_proto_text_format);
  EXPECT_EQ(proto_text_format_, actual_proto_text_format);
}

TEST_F(TextFormatMessageSetTest, Deserialize) {
  protobuf_unittest::TestMessageSetContainer proto;
  ASSERT_TRUE(TextFormat::ParseFromString(proto_text_format_, &proto));
  EXPECT_EQ(
      23,
      proto.message_set()
          .GetExtension(
              protobuf_unittest::TestMessageSetExtension1::message_set_extension)
          .i());
  EXPECT_EQ(
      "foo",
      proto.message_set()
          .GetExtension(
              protobuf_unittest::TestMessageSetExtension2::message_set_extension)
          .str());

  // Ensure that these are the only entries present.
  std::vector<const FieldDescriptor*> descriptors;
  proto.message_set().GetReflection()->ListFields(proto.message_set(),
                                                  &descriptors);
  EXPECT_EQ(2, descriptors.size());
}

TEST(TextFormatUnknownFieldTest, TestUnknownField) {
  protobuf_unittest::TestAllTypes proto;
  TextFormat::Parser parser;
  // Unknown field is not permitted by default.
  EXPECT_FALSE(parser.ParseFromString("unknown_field: 12345", &proto));
  EXPECT_FALSE(parser.ParseFromString("12345678: 12345", &proto));

  parser.AllowUnknownField(true);
  EXPECT_TRUE(parser.ParseFromString("unknown_field: 12345", &proto));
  EXPECT_TRUE(parser.ParseFromString("unknown_field: -12345", &proto));
  EXPECT_TRUE(parser.ParseFromString("unknown_field: 1.2345", &proto));
  EXPECT_TRUE(parser.ParseFromString("unknown_field: -1.2345", &proto));
  EXPECT_TRUE(parser.ParseFromString("unknown_field: 1.2345f", &proto));
  EXPECT_TRUE(parser.ParseFromString("unknown_field: -1.2345f", &proto));
  EXPECT_TRUE(parser.ParseFromString("unknown_field: inf", &proto));
  EXPECT_TRUE(parser.ParseFromString("unknown_field: -inf", &proto));
  EXPECT_TRUE(parser.ParseFromString("unknown_field: TYPE_STRING", &proto));
  EXPECT_TRUE(
      parser.ParseFromString("unknown_field: \"string value\"", &proto));
  // Invalid field value
  EXPECT_FALSE(parser.ParseFromString("unknown_field: -TYPE_STRING", &proto));
  // Two or more unknown fields
  EXPECT_TRUE(
      parser.ParseFromString("unknown_field1: TYPE_STRING\n"
                             "unknown_field2: 12345",
                             &proto));
  // Unknown nested message
  EXPECT_TRUE(
      parser.ParseFromString("unknown_message1: {}\n"
                             "unknown_message2 {\n"
                             "  unknown_field: 12345\n"
                             "}\n"
                             "unknown_message3 <\n"
                             "  unknown_nested_message {\n"
                             "    unknown_field: 12345\n"
                             "  }\n"
                             ">",
                             &proto));
  // Unmatched delimiters for message body
  EXPECT_FALSE(parser.ParseFromString("unknown_message: {>", &proto));
  // Unknown extension
  EXPECT_TRUE(
      parser.ParseFromString("[somewhere.unknown_extension1]: 12345\n"
                             "[somewhere.unknown_extension2] {\n"
                             "  unknown_field: 12345\n"
                             "}",
                             &proto));
  // Unknown fields between known fields
  ASSERT_TRUE(
      parser.ParseFromString("optional_int32: 1\n"
                             "unknown_field: 12345\n"
                             "optional_string: \"string\"\n"
                             "unknown_message { unknown: 0 }\n"
                             "optional_nested_message { bb: 2 }",
                             &proto));
  EXPECT_EQ(1, proto.optional_int32());
  EXPECT_EQ("string", proto.optional_string());
  EXPECT_EQ(2, proto.optional_nested_message().bb());

  // Unknown field with numeric tag number instead of identifier.
  EXPECT_TRUE(parser.ParseFromString("12345678: 12345", &proto));

  // Nested unknown extensions.
  EXPECT_TRUE(
      parser.ParseFromString("[test.extension1] <\n"
                             "  unknown_nested_message <\n"
                             "    [test.extension2] <\n"
                             "      unknown_field: 12345\n"
                             "    >\n"
                             "  >\n"
                             ">",
                             &proto));
  EXPECT_TRUE(
      parser.ParseFromString("[test.extension1] {\n"
                             "  unknown_nested_message {\n"
                             "    [test.extension2] {\n"
                             "      unknown_field: 12345\n"
                             "    }\n"
                             "  }\n"
                             "}",
                             &proto));
  EXPECT_TRUE(
      parser.ParseFromString("[test.extension1] <\n"
                             "  some_unknown_fields: <\n"
                             "    unknown_field: 12345\n"
                             "  >\n"
                             ">",
                             &proto));
  EXPECT_TRUE(
      parser.ParseFromString("[test.extension1] {\n"
                             "  some_unknown_fields: {\n"
                             "    unknown_field: 12345\n"
                             "  }\n"
                             "}",
                             &proto));

  // Unknown field with compact repetition.
  EXPECT_TRUE(parser.ParseFromString("unknown_field: [1, 2]", &proto));
  // Unknown field with compact repetition of some unknown enum.
  EXPECT_TRUE(parser.ParseFromString("unknown_field: [VAL1, VAL2]", &proto));
  // Unknown field with compact repetition with sub-message.
  EXPECT_TRUE(parser.ParseFromString("unknown_field: [{a:1}, <b:2>]", &proto));
}

TEST(TextFormatUnknownFieldTest, TestAnyInUnknownField) {
  protobuf_unittest::TestAllTypes proto;
  TextFormat::Parser parser;
  parser.AllowUnknownField(true);
  EXPECT_TRUE(
      parser.ParseFromString("unknown {\n"
                             "  [type.googleapis.com/foo.bar] {\n"
                             "  }\n"
                             "}",
                             &proto));
}

TEST(TextFormatUnknownFieldTest, TestUnknownExtension) {
  protobuf_unittest::TestAllTypes proto;
  TextFormat::Parser parser;
  std::string message_with_ext =
      "[test.extension1] {\n"
      "  some_unknown_fields: {\n"
      "    unknown_field: 12345\n"
      "  }\n"
      "}";
  // Unknown extensions are not permitted by default.
  EXPECT_FALSE(parser.ParseFromString(message_with_ext, &proto));
  // AllowUnknownField implies AllowUnknownExtension.
  parser.AllowUnknownField(true);
  EXPECT_TRUE(parser.ParseFromString(message_with_ext, &proto));

  parser.AllowUnknownField(false);
  EXPECT_FALSE(parser.ParseFromString(message_with_ext, &proto));
  parser.AllowUnknownExtension(true);
  EXPECT_TRUE(parser.ParseFromString(message_with_ext, &proto));
  // Unknown fields are still not accepted.
  EXPECT_FALSE(parser.ParseFromString("unknown_field: 1", &proto));
}

TEST(TextFormatFloatingPointTest, PreservesNegative0) {
  proto3_unittest::TestAllTypes in_message;
  in_message.set_optional_float(-0.0f);
  in_message.set_optional_double(-0.0);
  TextFormat::Printer printer;
  std::string serialized;
  EXPECT_TRUE(printer.PrintToString(in_message, &serialized));
  proto3_unittest::TestAllTypes out_message;
  TextFormat::Parser parser;
  EXPECT_TRUE(parser.ParseFromString(serialized, &out_message));
  EXPECT_EQ(in_message.optional_float(), out_message.optional_float());
  EXPECT_EQ(std::signbit(in_message.optional_float()),
            std::signbit(out_message.optional_float()));
  EXPECT_EQ(in_message.optional_double(), out_message.optional_double());
  EXPECT_EQ(std::signbit(in_message.optional_double()),
            std::signbit(out_message.optional_double()));
}

}  // namespace text_format_unittest
}  // namespace protobuf
}  // namespace google

#include "google/protobuf/port_undef.inc"
