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

#include <google/protobuf/map_test_util.h>
#include <google/protobuf/map_test_util_impl.h>
#include <google/protobuf/descriptor.h>
#include <google/protobuf/message.h>

namespace google {
namespace protobuf {

void MapTestUtil::SetMapFields(unittest::TestMap* message) {
  MapTestUtilImpl::SetMapFields<unittest::MapEnum, unittest::MAP_ENUM_BAR,
                                unittest::MAP_ENUM_BAZ>(message);
}

void MapTestUtil::SetArenaMapFields(unittest::TestArenaMap* message) {
  MapTestUtilImpl::SetArenaMapFields<unittest::MapEnum, unittest::MAP_ENUM_BAR,
                                     unittest::MAP_ENUM_BAZ>(message);
}

void MapTestUtil::SetMapFieldsInitialized(unittest::TestMap* message) {
  MapTestUtilImpl::SetMapFieldsInitialized(message);
}

void MapTestUtil::ModifyMapFields(unittest::TestMap* message) {
  MapTestUtilImpl::ModifyMapFields<unittest::MapEnum, unittest::MAP_ENUM_FOO>(
      message);
}

void MapTestUtil::ExpectClear(const unittest::TestMap& message) {
  MapTestUtilImpl::ExpectClear(message);
}

void MapTestUtil::ExpectMapFieldsSet(const unittest::TestMap& message) {
  MapTestUtilImpl::ExpectMapFieldsSet<unittest::MapEnum, unittest::MAP_ENUM_BAR,
                                      unittest::MAP_ENUM_BAZ>(message);
}

void MapTestUtil::ExpectArenaMapFieldsSet(
    const unittest::TestArenaMap& message) {
  MapTestUtilImpl::ExpectArenaMapFieldsSet<
      unittest::MapEnum, unittest::MAP_ENUM_BAR, unittest::MAP_ENUM_BAZ>(
      message);
}

void MapTestUtil::ExpectMapFieldsSetInitialized(
    const unittest::TestMap& message) {
  MapTestUtilImpl::ExpectMapFieldsSetInitialized<unittest::MapEnum,
                                                 unittest::MAP_ENUM_FOO>(
      message);
}

void MapTestUtil::ExpectMapFieldsModified(
    const unittest::TestMap& message) {
  MapTestUtilImpl::ExpectMapFieldsModified<
      unittest::MapEnum, unittest::MAP_ENUM_BAR, unittest::MAP_ENUM_FOO>(
      message);
}

void MapTestUtil::ExpectMapsSize(
    const unittest::TestMap& message, int size) {
  const Descriptor* descriptor = message.GetDescriptor();

  EXPECT_EQ(size, message.GetReflection()->FieldSize(
    message, descriptor->FindFieldByName("map_int32_int32")));
  EXPECT_EQ(size, message.GetReflection()->FieldSize(
    message, descriptor->FindFieldByName("map_int64_int64")));
  EXPECT_EQ(size, message.GetReflection()->FieldSize(
    message, descriptor->FindFieldByName("map_uint32_uint32")));
  EXPECT_EQ(size, message.GetReflection()->FieldSize(
    message, descriptor->FindFieldByName("map_uint64_uint64")));
  EXPECT_EQ(size, message.GetReflection()->FieldSize(
    message, descriptor->FindFieldByName("map_sint32_sint32")));
  EXPECT_EQ(size, message.GetReflection()->FieldSize(
    message, descriptor->FindFieldByName("map_sint64_sint64")));
  EXPECT_EQ(size, message.GetReflection()->FieldSize(
    message, descriptor->FindFieldByName("map_fixed32_fixed32")));
  EXPECT_EQ(size, message.GetReflection()->FieldSize(
    message, descriptor->FindFieldByName("map_fixed64_fixed64")));
  EXPECT_EQ(size, message.GetReflection()->FieldSize(
    message, descriptor->FindFieldByName("map_sfixed32_sfixed32")));
  EXPECT_EQ(size, message.GetReflection()->FieldSize(
    message, descriptor->FindFieldByName("map_sfixed64_sfixed64")));
  EXPECT_EQ(size, message.GetReflection()->FieldSize(
    message, descriptor->FindFieldByName("map_int32_float")));
  EXPECT_EQ(size, message.GetReflection()->FieldSize(
    message, descriptor->FindFieldByName("map_int32_double")));
  EXPECT_EQ(size, message.GetReflection()->FieldSize(
    message, descriptor->FindFieldByName("map_bool_bool")));
  EXPECT_EQ(size, message.GetReflection()->FieldSize(
    message, descriptor->FindFieldByName("map_string_string")));
  EXPECT_EQ(size, message.GetReflection()->FieldSize(
    message, descriptor->FindFieldByName("map_int32_bytes")));
  EXPECT_EQ(size, message.GetReflection()->FieldSize(
    message, descriptor->FindFieldByName("map_int32_foreign_message")));
}

std::vector<const Message*> MapTestUtil::GetMapEntries(
    const unittest::TestMap& message, int index) {
  const Descriptor* descriptor = message.GetDescriptor();
  std::vector<const Message*> result;

  result.push_back(&message.GetReflection()->GetRepeatedMessage(
    message, descriptor->FindFieldByName("map_int32_int32"), index));
  result.push_back(&message.GetReflection()->GetRepeatedMessage(
    message, descriptor->FindFieldByName("map_int64_int64"), index));
  result.push_back(&message.GetReflection()->GetRepeatedMessage(
    message, descriptor->FindFieldByName("map_uint32_uint32"), index));
  result.push_back(&message.GetReflection()->GetRepeatedMessage(
    message, descriptor->FindFieldByName("map_uint64_uint64"), index));
  result.push_back(&message.GetReflection()->GetRepeatedMessage(
    message, descriptor->FindFieldByName("map_sint32_sint32"), index));
  result.push_back(&message.GetReflection()->GetRepeatedMessage(
    message, descriptor->FindFieldByName("map_sint64_sint64"), index));
  result.push_back(&message.GetReflection()->GetRepeatedMessage(
    message, descriptor->FindFieldByName("map_fixed32_fixed32"), index));
  result.push_back(&message.GetReflection()->GetRepeatedMessage(
    message, descriptor->FindFieldByName("map_fixed64_fixed64"), index));
  result.push_back(&message.GetReflection()->GetRepeatedMessage(
    message, descriptor->FindFieldByName("map_sfixed32_sfixed32"), index));
  result.push_back(&message.GetReflection()->GetRepeatedMessage(
    message, descriptor->FindFieldByName("map_sfixed64_sfixed64"), index));
  result.push_back(&message.GetReflection()->GetRepeatedMessage(
    message, descriptor->FindFieldByName("map_int32_float"), index));
  result.push_back(&message.GetReflection()->GetRepeatedMessage(
    message, descriptor->FindFieldByName("map_int32_double"), index));
  result.push_back(&message.GetReflection()->GetRepeatedMessage(
    message, descriptor->FindFieldByName("map_bool_bool"), index));
  result.push_back(&message.GetReflection()->GetRepeatedMessage(
    message, descriptor->FindFieldByName("map_string_string"), index));
  result.push_back(&message.GetReflection()->GetRepeatedMessage(
    message, descriptor->FindFieldByName("map_int32_bytes"), index));
  result.push_back(&message.GetReflection()->GetRepeatedMessage(
    message, descriptor->FindFieldByName("map_int32_enum"), index));
  result.push_back(&message.GetReflection()->GetRepeatedMessage(
    message, descriptor->FindFieldByName("map_int32_foreign_message"), index));

  return result;
}

std::vector<const Message*> MapTestUtil::GetMapEntriesFromRelease(
    unittest::TestMap* message) {
  const Descriptor* descriptor = message->GetDescriptor();
  std::vector<const Message*> result;

  result.push_back(message->GetReflection()->ReleaseLast(
    message, descriptor->FindFieldByName("map_int32_int32")));
  result.push_back(message->GetReflection()->ReleaseLast(
    message, descriptor->FindFieldByName("map_int64_int64")));
  result.push_back(message->GetReflection()->ReleaseLast(
    message, descriptor->FindFieldByName("map_uint32_uint32")));
  result.push_back(message->GetReflection()->ReleaseLast(
    message, descriptor->FindFieldByName("map_uint64_uint64")));
  result.push_back(message->GetReflection()->ReleaseLast(
    message, descriptor->FindFieldByName("map_sint32_sint32")));
  result.push_back(message->GetReflection()->ReleaseLast(
    message, descriptor->FindFieldByName("map_sint64_sint64")));
  result.push_back(message->GetReflection()->ReleaseLast(
    message, descriptor->FindFieldByName("map_fixed32_fixed32")));
  result.push_back(message->GetReflection()->ReleaseLast(
    message, descriptor->FindFieldByName("map_fixed64_fixed64")));
  result.push_back(message->GetReflection()->ReleaseLast(
    message, descriptor->FindFieldByName("map_sfixed32_sfixed32")));
  result.push_back(message->GetReflection()->ReleaseLast(
    message, descriptor->FindFieldByName("map_sfixed64_sfixed64")));
  result.push_back(message->GetReflection()->ReleaseLast(
    message, descriptor->FindFieldByName("map_int32_float")));
  result.push_back(message->GetReflection()->ReleaseLast(
    message, descriptor->FindFieldByName("map_int32_double")));
  result.push_back(message->GetReflection()->ReleaseLast(
    message, descriptor->FindFieldByName("map_bool_bool")));
  result.push_back(message->GetReflection()->ReleaseLast(
    message, descriptor->FindFieldByName("map_string_string")));
  result.push_back(message->GetReflection()->ReleaseLast(
    message, descriptor->FindFieldByName("map_int32_bytes")));
  result.push_back(message->GetReflection()->ReleaseLast(
    message, descriptor->FindFieldByName("map_int32_enum")));
  result.push_back(message->GetReflection()->ReleaseLast(
    message, descriptor->FindFieldByName("map_int32_foreign_message")));

  return result;
}

MapReflectionTester::MapReflectionTester(
    const Descriptor* base_descriptor)
  : base_descriptor_(base_descriptor) {
  const DescriptorPool* pool = base_descriptor->file()->pool();

  map_enum_foo_ = pool->FindEnumValueByName("protobuf_unittest.MAP_ENUM_FOO");
  map_enum_bar_ = pool->FindEnumValueByName("protobuf_unittest.MAP_ENUM_BAR");
  map_enum_baz_ = pool->FindEnumValueByName("protobuf_unittest.MAP_ENUM_BAZ");

  foreign_c_ = pool->FindFieldByName(
      "protobuf_unittest.ForeignMessage.c");
  map_int32_int32_key_ = pool->FindFieldByName(
      "protobuf_unittest.TestMap.MapInt32Int32Entry.key");
  map_int32_int32_val_ = pool->FindFieldByName(
      "protobuf_unittest.TestMap.MapInt32Int32Entry.value");
  map_int64_int64_key_ = pool->FindFieldByName(
      "protobuf_unittest.TestMap.MapInt64Int64Entry.key");
  map_int64_int64_val_ = pool->FindFieldByName(
      "protobuf_unittest.TestMap.MapInt64Int64Entry.value");
  map_uint32_uint32_key_ = pool->FindFieldByName(
      "protobuf_unittest.TestMap.MapUint32Uint32Entry.key");
  map_uint32_uint32_val_ = pool->FindFieldByName(
      "protobuf_unittest.TestMap.MapUint32Uint32Entry.value");
  map_uint64_uint64_key_ = pool->FindFieldByName(
      "protobuf_unittest.TestMap.MapUint64Uint64Entry.key");
  map_uint64_uint64_val_ = pool->FindFieldByName(
      "protobuf_unittest.TestMap.MapUint64Uint64Entry.value");
  map_sint32_sint32_key_ = pool->FindFieldByName(
      "protobuf_unittest.TestMap.MapSint32Sint32Entry.key");
  map_sint32_sint32_val_ = pool->FindFieldByName(
      "protobuf_unittest.TestMap.MapSint32Sint32Entry.value");
  map_sint64_sint64_key_ = pool->FindFieldByName(
      "protobuf_unittest.TestMap.MapSint64Sint64Entry.key");
  map_sint64_sint64_val_ = pool->FindFieldByName(
      "protobuf_unittest.TestMap.MapSint64Sint64Entry.value");
  map_fixed32_fixed32_key_ = pool->FindFieldByName(
      "protobuf_unittest.TestMap.MapFixed32Fixed32Entry.key");
  map_fixed32_fixed32_val_ = pool->FindFieldByName(
      "protobuf_unittest.TestMap.MapFixed32Fixed32Entry.value");
  map_fixed64_fixed64_key_ = pool->FindFieldByName(
      "protobuf_unittest.TestMap.MapFixed64Fixed64Entry.key");
  map_fixed64_fixed64_val_ = pool->FindFieldByName(
      "protobuf_unittest.TestMap.MapFixed64Fixed64Entry.value");
  map_sfixed32_sfixed32_key_ = pool->FindFieldByName(
      "protobuf_unittest.TestMap.MapSfixed32Sfixed32Entry.key");
  map_sfixed32_sfixed32_val_ = pool->FindFieldByName(
      "protobuf_unittest.TestMap.MapSfixed32Sfixed32Entry.value");
  map_sfixed64_sfixed64_key_ = pool->FindFieldByName(
      "protobuf_unittest.TestMap.MapSfixed64Sfixed64Entry.key");
  map_sfixed64_sfixed64_val_ = pool->FindFieldByName(
      "protobuf_unittest.TestMap.MapSfixed64Sfixed64Entry.value");
  map_int32_float_key_ = pool->FindFieldByName(
      "protobuf_unittest.TestMap.MapInt32FloatEntry.key");
  map_int32_float_val_ = pool->FindFieldByName(
      "protobuf_unittest.TestMap.MapInt32FloatEntry.value");
  map_int32_double_key_ = pool->FindFieldByName(
      "protobuf_unittest.TestMap.MapInt32DoubleEntry.key");
  map_int32_double_val_ = pool->FindFieldByName(
      "protobuf_unittest.TestMap.MapInt32DoubleEntry.value");
  map_bool_bool_key_ = pool->FindFieldByName(
      "protobuf_unittest.TestMap.MapBoolBoolEntry.key");
  map_bool_bool_val_ = pool->FindFieldByName(
      "protobuf_unittest.TestMap.MapBoolBoolEntry.value");
  map_string_string_key_ = pool->FindFieldByName(
      "protobuf_unittest.TestMap.MapStringStringEntry.key");
  map_string_string_val_ = pool->FindFieldByName(
      "protobuf_unittest.TestMap.MapStringStringEntry.value");
  map_int32_bytes_key_ = pool->FindFieldByName(
      "protobuf_unittest.TestMap.MapInt32BytesEntry.key");
  map_int32_bytes_val_ = pool->FindFieldByName(
      "protobuf_unittest.TestMap.MapInt32BytesEntry.value");
  map_int32_enum_key_ = pool->FindFieldByName(
      "protobuf_unittest.TestMap.MapInt32EnumEntry.key");
  map_int32_enum_val_ = pool->FindFieldByName(
      "protobuf_unittest.TestMap.MapInt32EnumEntry.value");
  map_int32_foreign_message_key_ = pool->FindFieldByName(
      "protobuf_unittest.TestMap.MapInt32ForeignMessageEntry.key");
  map_int32_foreign_message_val_ = pool->FindFieldByName(
      "protobuf_unittest.TestMap.MapInt32ForeignMessageEntry.value");

  EXPECT_FALSE(map_enum_foo_ == NULL);
  EXPECT_FALSE(map_enum_bar_ == NULL);
  EXPECT_FALSE(map_enum_baz_ == NULL);
  EXPECT_FALSE(map_int32_int32_key_ == NULL);
  EXPECT_FALSE(map_int32_int32_val_ == NULL);
  EXPECT_FALSE(map_int64_int64_key_ == NULL);
  EXPECT_FALSE(map_int64_int64_val_ == NULL);
  EXPECT_FALSE(map_uint32_uint32_key_ == NULL);
  EXPECT_FALSE(map_uint32_uint32_val_ == NULL);
  EXPECT_FALSE(map_uint64_uint64_key_ == NULL);
  EXPECT_FALSE(map_uint64_uint64_val_ == NULL);
  EXPECT_FALSE(map_sint32_sint32_key_ == NULL);
  EXPECT_FALSE(map_sint32_sint32_val_ == NULL);
  EXPECT_FALSE(map_sint64_sint64_key_ == NULL);
  EXPECT_FALSE(map_sint64_sint64_val_ == NULL);
  EXPECT_FALSE(map_fixed32_fixed32_key_ == NULL);
  EXPECT_FALSE(map_fixed32_fixed32_val_ == NULL);
  EXPECT_FALSE(map_fixed64_fixed64_key_ == NULL);
  EXPECT_FALSE(map_fixed64_fixed64_val_ == NULL);
  EXPECT_FALSE(map_sfixed32_sfixed32_key_ == NULL);
  EXPECT_FALSE(map_sfixed32_sfixed32_val_ == NULL);
  EXPECT_FALSE(map_sfixed64_sfixed64_key_ == NULL);
  EXPECT_FALSE(map_sfixed64_sfixed64_val_ == NULL);
  EXPECT_FALSE(map_int32_float_key_ == NULL);
  EXPECT_FALSE(map_int32_float_val_ == NULL);
  EXPECT_FALSE(map_int32_double_key_ == NULL);
  EXPECT_FALSE(map_int32_double_val_ == NULL);
  EXPECT_FALSE(map_bool_bool_key_ == NULL);
  EXPECT_FALSE(map_bool_bool_val_ == NULL);
  EXPECT_FALSE(map_string_string_key_ == NULL);
  EXPECT_FALSE(map_string_string_val_ == NULL);
  EXPECT_FALSE(map_int32_bytes_key_ == NULL);
  EXPECT_FALSE(map_int32_bytes_val_ == NULL);
  EXPECT_FALSE(map_int32_enum_key_ == NULL);
  EXPECT_FALSE(map_int32_enum_val_ == NULL);
  EXPECT_FALSE(map_int32_foreign_message_key_ == NULL);
  EXPECT_FALSE(map_int32_foreign_message_val_ == NULL);
}

// Shorthand to get a FieldDescriptor for a field of unittest::TestMap.
const FieldDescriptor* MapReflectionTester::F(const string& name) {
  const FieldDescriptor* result = NULL;
  result = base_descriptor_->FindFieldByName(name);
  GOOGLE_CHECK(result != NULL);
  return result;
}

void MapReflectionTester::SetMapFieldsViaReflection(
    Message* message) {
  const Reflection* reflection = message->GetReflection();
  Message* sub_message = NULL;
  Message* sub_foreign_message = NULL;

  // Add first element.
  sub_message = reflection->AddMessage(message, F("map_int32_int32"));
  sub_message->GetReflection()
      ->SetInt32(sub_message, map_int32_int32_key_, 0);
  sub_message->GetReflection()
      ->SetInt32(sub_message, map_int32_int32_val_, 0);

  sub_message = reflection->AddMessage(message, F("map_int64_int64"));
  sub_message->GetReflection()
      ->SetInt64(sub_message, map_int64_int64_key_, 0);
  sub_message->GetReflection()
      ->SetInt64(sub_message, map_int64_int64_val_, 0);

  sub_message = reflection->AddMessage(message, F("map_uint32_uint32"));
  sub_message->GetReflection()
      ->SetUInt32(sub_message, map_uint32_uint32_key_, 0);
  sub_message->GetReflection()
      ->SetUInt32(sub_message, map_uint32_uint32_val_, 0);

  sub_message = reflection->AddMessage(message, F("map_uint64_uint64"));
  sub_message->GetReflection()
      ->SetUInt64(sub_message, map_uint64_uint64_key_, 0);
  sub_message->GetReflection()
      ->SetUInt64(sub_message, map_uint64_uint64_val_, 0);

  sub_message = reflection->AddMessage(message, F("map_sint32_sint32"));
  sub_message->GetReflection()
      ->SetInt32(sub_message, map_sint32_sint32_key_, 0);
  sub_message->GetReflection()
      ->SetInt32(sub_message, map_sint32_sint32_val_, 0);

  sub_message = reflection->AddMessage(message, F("map_sint64_sint64"));
  sub_message->GetReflection()
      ->SetInt64(sub_message, map_sint64_sint64_key_, 0);
  sub_message->GetReflection()
      ->SetInt64(sub_message, map_sint64_sint64_val_, 0);

  sub_message = reflection->AddMessage(message, F("map_fixed32_fixed32"));
  sub_message->GetReflection()
      ->SetUInt32(sub_message, map_fixed32_fixed32_key_, 0);
  sub_message->GetReflection()
      ->SetUInt32(sub_message, map_fixed32_fixed32_val_, 0);

  sub_message = reflection->AddMessage(message, F("map_fixed64_fixed64"));
  sub_message->GetReflection()
      ->SetUInt64(sub_message, map_fixed64_fixed64_key_, 0);
  sub_message->GetReflection()
      ->SetUInt64(sub_message, map_fixed64_fixed64_val_, 0);

  sub_message = reflection->AddMessage(message, F("map_sfixed32_sfixed32"));
  sub_message->GetReflection()
      ->SetInt32(sub_message, map_sfixed32_sfixed32_key_, 0);
  sub_message->GetReflection()
      ->SetInt32(sub_message, map_sfixed32_sfixed32_val_, 0);

  sub_message = reflection->AddMessage(message, F("map_sfixed64_sfixed64"));
  sub_message->GetReflection()
      ->SetInt64(sub_message, map_sfixed64_sfixed64_key_, 0);
  sub_message->GetReflection()
      ->SetInt64(sub_message, map_sfixed64_sfixed64_val_, 0);

  sub_message = reflection->AddMessage(message, F("map_int32_float"));
  sub_message->GetReflection()
      ->SetInt32(sub_message, map_int32_float_key_, 0);
  sub_message->GetReflection()
      ->SetFloat(sub_message, map_int32_float_val_, 0.0);

  sub_message = reflection->AddMessage(message, F("map_int32_double"));
  sub_message->GetReflection()
      ->SetInt32(sub_message, map_int32_double_key_, 0);
  sub_message->GetReflection()
      ->SetDouble(sub_message, map_int32_double_val_, 0.0);

  sub_message = reflection->AddMessage(message, F("map_bool_bool"));
  sub_message->GetReflection()
      ->SetBool(sub_message, map_bool_bool_key_, false);
  sub_message->GetReflection()
      ->SetBool(sub_message, map_bool_bool_val_, false);

  sub_message = reflection->AddMessage(message, F("map_string_string"));
  sub_message->GetReflection()
      ->SetString(sub_message, map_string_string_key_, "0");
  sub_message->GetReflection()
      ->SetString(sub_message, map_string_string_val_, "0");

  sub_message = reflection->AddMessage(message, F("map_int32_bytes"));
  sub_message->GetReflection()
      ->SetInt32(sub_message, map_int32_bytes_key_, 0);
  sub_message->GetReflection()
      ->SetString(sub_message, map_int32_bytes_val_, "0");

  sub_message = reflection->AddMessage(message, F("map_int32_enum"));
  sub_message->GetReflection()
      ->SetInt32(sub_message, map_int32_enum_key_, 0);
  sub_message->GetReflection()
      ->SetEnum(sub_message, map_int32_enum_val_, map_enum_bar_);

  sub_message = reflection
      ->AddMessage(message, F("map_int32_foreign_message"));
  sub_message->GetReflection()
      ->SetInt32(sub_message, map_int32_foreign_message_key_, 0);
  sub_foreign_message = sub_message->GetReflection()->
      MutableMessage(sub_message, map_int32_foreign_message_val_, NULL);
  sub_foreign_message->GetReflection()->
      SetInt32(sub_foreign_message, foreign_c_, 0);

  // Add second element
  sub_message = reflection->AddMessage(message, F("map_int32_int32"));
  sub_message->GetReflection()
      ->SetInt32(sub_message, map_int32_int32_key_, 1);
  sub_message->GetReflection()
      ->SetInt32(sub_message, map_int32_int32_val_, 1);

  sub_message = reflection->AddMessage(message, F("map_int64_int64"));
  sub_message->GetReflection()
      ->SetInt64(sub_message, map_int64_int64_key_, 1);
  sub_message->GetReflection()
      ->SetInt64(sub_message, map_int64_int64_val_, 1);

  sub_message = reflection->AddMessage(message, F("map_uint32_uint32"));
  sub_message->GetReflection()
      ->SetUInt32(sub_message, map_uint32_uint32_key_, 1);
  sub_message->GetReflection()
      ->SetUInt32(sub_message, map_uint32_uint32_val_, 1);

  sub_message = reflection->AddMessage(message, F("map_uint64_uint64"));
  sub_message->GetReflection()
      ->SetUInt64(sub_message, map_uint64_uint64_key_, 1);
  sub_message->GetReflection()
      ->SetUInt64(sub_message, map_uint64_uint64_val_, 1);

  sub_message = reflection->AddMessage(message, F("map_sint32_sint32"));
  sub_message->GetReflection()
      ->SetInt32(sub_message, map_sint32_sint32_key_, 1);
  sub_message->GetReflection()
      ->SetInt32(sub_message, map_sint32_sint32_val_, 1);

  sub_message = reflection->AddMessage(message, F("map_sint64_sint64"));
  sub_message->GetReflection()
      ->SetInt64(sub_message, map_sint64_sint64_key_, 1);
  sub_message->GetReflection()
      ->SetInt64(sub_message, map_sint64_sint64_val_, 1);

  sub_message = reflection->AddMessage(message, F("map_fixed32_fixed32"));
  sub_message->GetReflection()
      ->SetUInt32(sub_message, map_fixed32_fixed32_key_, 1);
  sub_message->GetReflection()
      ->SetUInt32(sub_message, map_fixed32_fixed32_val_, 1);

  sub_message = reflection->AddMessage(message, F("map_fixed64_fixed64"));
  sub_message->GetReflection()
      ->SetUInt64(sub_message, map_fixed64_fixed64_key_, 1);
  sub_message->GetReflection()
      ->SetUInt64(sub_message, map_fixed64_fixed64_val_, 1);

  sub_message = reflection->AddMessage(message, F("map_sfixed32_sfixed32"));
  sub_message->GetReflection()
      ->SetInt32(sub_message, map_sfixed32_sfixed32_key_, 1);
  sub_message->GetReflection()
      ->SetInt32(sub_message, map_sfixed32_sfixed32_val_, 1);

  sub_message = reflection->AddMessage(message, F("map_sfixed64_sfixed64"));
  sub_message->GetReflection()
      ->SetInt64(sub_message, map_sfixed64_sfixed64_key_, 1);
  sub_message->GetReflection()
      ->SetInt64(sub_message, map_sfixed64_sfixed64_val_, 1);

  sub_message = reflection->AddMessage(message, F("map_int32_float"));
  sub_message->GetReflection()
      ->SetInt32(sub_message, map_int32_float_key_, 1);
  sub_message->GetReflection()
      ->SetFloat(sub_message, map_int32_float_val_, 1.0);

  sub_message = reflection->AddMessage(message, F("map_int32_double"));
  sub_message->GetReflection()
      ->SetInt32(sub_message, map_int32_double_key_, 1);
  sub_message->GetReflection()
      ->SetDouble(sub_message, map_int32_double_val_, 1.0);

  sub_message = reflection->AddMessage(message, F("map_bool_bool"));
  sub_message->GetReflection()
      ->SetBool(sub_message, map_bool_bool_key_, true);
  sub_message->GetReflection()
      ->SetBool(sub_message, map_bool_bool_val_, true);

  sub_message = reflection->AddMessage(message, F("map_string_string"));
  sub_message->GetReflection()
      ->SetString(sub_message, map_string_string_key_, "1");
  sub_message->GetReflection()
      ->SetString(sub_message, map_string_string_val_, "1");

  sub_message = reflection->AddMessage(message, F("map_int32_bytes"));
  sub_message->GetReflection()
      ->SetInt32(sub_message, map_int32_bytes_key_, 1);
  sub_message->GetReflection()
      ->SetString(sub_message, map_int32_bytes_val_, "1");

  sub_message = reflection->AddMessage(message, F("map_int32_enum"));
  sub_message->GetReflection()
      ->SetInt32(sub_message, map_int32_enum_key_, 1);
  sub_message->GetReflection()
      ->SetEnum(sub_message, map_int32_enum_val_, map_enum_baz_);

  sub_message = reflection
      ->AddMessage(message, F("map_int32_foreign_message"));
  sub_message->GetReflection()
      ->SetInt32(sub_message, map_int32_foreign_message_key_, 1);
  sub_foreign_message = sub_message->GetReflection()->
      MutableMessage(sub_message, map_int32_foreign_message_val_, NULL);
  sub_foreign_message->GetReflection()->
      SetInt32(sub_foreign_message, foreign_c_, 1);
}

void MapReflectionTester::SetMapFieldsViaMapReflection(
    Message* message) {
  const Reflection* reflection = message->GetReflection();

  Message* sub_foreign_message = NULL;
  MapValueRef map_val;

  // Add first element.
  MapKey map_key;
  map_key.SetInt32Value(0);
  EXPECT_TRUE(reflection->InsertOrLookupMapValue(
      message, F("map_int32_int32"), map_key, &map_val));
  map_val.SetInt32Value(0);

  map_key.SetInt64Value(0);
  EXPECT_TRUE(reflection->InsertOrLookupMapValue(
      message, F("map_int64_int64"), map_key, &map_val));
  map_val.SetInt64Value(0);

  map_key.SetUInt32Value(0);
  EXPECT_TRUE(reflection->InsertOrLookupMapValue(
      message, F("map_uint32_uint32"), map_key, &map_val));
  map_val.SetUInt32Value(0);

  map_key.SetUInt64Value(0);
  EXPECT_TRUE(reflection->InsertOrLookupMapValue(
      message, F("map_uint64_uint64"), map_key, &map_val));
  map_val.SetUInt64Value(0);

  map_key.SetInt32Value(0);
  EXPECT_TRUE(reflection->InsertOrLookupMapValue(
      message, F("map_sint32_sint32"), map_key, &map_val));
  map_val.SetInt32Value(0);

  map_key.SetInt64Value(0);
  EXPECT_TRUE(reflection->InsertOrLookupMapValue(
      message, F("map_sint64_sint64"), map_key, &map_val));
  map_val.SetInt64Value(0);

  map_key.SetUInt32Value(0);
  EXPECT_TRUE(reflection->InsertOrLookupMapValue(
      message, F("map_fixed32_fixed32"), map_key, &map_val));
  map_val.SetUInt32Value(0);

  map_key.SetUInt64Value(0);
  EXPECT_TRUE(reflection->InsertOrLookupMapValue(
      message, F("map_fixed64_fixed64"), map_key, &map_val));
  map_val.SetUInt64Value(0);

  map_key.SetInt32Value(0);
  EXPECT_TRUE(reflection->InsertOrLookupMapValue(
      message, F("map_sfixed32_sfixed32"), map_key, &map_val));
  map_val.SetInt32Value(0);

  map_key.SetInt64Value(0);
  EXPECT_TRUE(reflection->InsertOrLookupMapValue(
      message, F("map_sfixed64_sfixed64"), map_key, &map_val));
  map_val.SetInt64Value(0);

  map_key.SetInt32Value(0);
  EXPECT_TRUE(reflection->InsertOrLookupMapValue(
      message, F("map_int32_float"), map_key, &map_val));
  map_val.SetFloatValue(0.0);

  map_key.SetInt32Value(0);
  EXPECT_TRUE(reflection->InsertOrLookupMapValue(
      message, F("map_int32_double"), map_key, &map_val));
  map_val.SetDoubleValue(0.0);

  map_key.SetBoolValue(false);
  EXPECT_TRUE(reflection->InsertOrLookupMapValue(
      message, F("map_bool_bool"), map_key, &map_val));
  map_val.SetBoolValue(false);

  map_key.SetStringValue("0");
  EXPECT_TRUE(reflection->InsertOrLookupMapValue(
      message, F("map_string_string"), map_key, &map_val));
  map_val.SetStringValue("0");

  map_key.SetInt32Value(0);
  EXPECT_TRUE(reflection->InsertOrLookupMapValue(
      message, F("map_int32_bytes"), map_key, &map_val));
  map_val.SetStringValue("0");

  map_key.SetInt32Value(0);
  EXPECT_TRUE(reflection->InsertOrLookupMapValue(
      message, F("map_int32_enum"), map_key, &map_val));
  map_val.SetEnumValue(map_enum_bar_->number());

  map_key.SetInt32Value(0);
  EXPECT_TRUE(reflection->InsertOrLookupMapValue(
      message, F("map_int32_foreign_message"), map_key, &map_val));
  sub_foreign_message = map_val.MutableMessageValue();
  sub_foreign_message->GetReflection()->SetInt32(
      sub_foreign_message, foreign_c_, 0);

  // Add second element
  map_key.SetInt32Value(1);
  EXPECT_TRUE(reflection->InsertOrLookupMapValue(
      message, F("map_int32_int32"), map_key, &map_val));
  map_val.SetInt32Value(1);
  EXPECT_FALSE(reflection->InsertOrLookupMapValue(
      message, F("map_int32_int32"), map_key, &map_val));

  map_key.SetInt64Value(1);
  EXPECT_TRUE(reflection->InsertOrLookupMapValue(
      message, F("map_int64_int64"), map_key, &map_val));
  map_val.SetInt64Value(1);
  EXPECT_FALSE(reflection->InsertOrLookupMapValue(
      message, F("map_int64_int64"), map_key, &map_val));

  map_key.SetUInt32Value(1);
  reflection->InsertOrLookupMapValue(
      message, F("map_uint32_uint32"), map_key, &map_val);
  map_val.SetUInt32Value(1);

  map_key.SetUInt64Value(1);
  reflection->InsertOrLookupMapValue(
      message, F("map_uint64_uint64"), map_key, &map_val);
  map_val.SetUInt64Value(1);

  map_key.SetInt32Value(1);
  reflection->InsertOrLookupMapValue(
      message, F("map_sint32_sint32"), map_key, &map_val);
  map_val.SetInt32Value(1);

  map_key.SetInt64Value(1);
  reflection->InsertOrLookupMapValue(
      message, F("map_sint64_sint64"), map_key, &map_val);
  map_val.SetInt64Value(1);

  map_key.SetUInt32Value(1);
  reflection->InsertOrLookupMapValue(
      message, F("map_fixed32_fixed32"), map_key, &map_val);
  map_val.SetUInt32Value(1);

  map_key.SetUInt64Value(1);
  reflection->InsertOrLookupMapValue(
      message, F("map_fixed64_fixed64"), map_key, &map_val);
  map_val.SetUInt64Value(1);

  map_key.SetInt32Value(1);
  reflection->InsertOrLookupMapValue(
      message, F("map_sfixed32_sfixed32"), map_key, &map_val);
  map_val.SetInt32Value(1);

  map_key.SetInt64Value(1);
  reflection->InsertOrLookupMapValue(
      message, F("map_sfixed64_sfixed64"), map_key, &map_val);
  map_val.SetInt64Value(1);

  map_key.SetInt32Value(1);
  reflection->InsertOrLookupMapValue(
      message, F("map_int32_float"), map_key, &map_val);
  map_val.SetFloatValue(1.0);

  map_key.SetInt32Value(1);
  reflection->InsertOrLookupMapValue(
      message, F("map_int32_double"), map_key, &map_val);
  map_val.SetDoubleValue(1.0);

  map_key.SetBoolValue(true);
  reflection->InsertOrLookupMapValue(
      message, F("map_bool_bool"), map_key, &map_val);
  map_val.SetBoolValue(true);

  map_key.SetStringValue("1");
  reflection->InsertOrLookupMapValue(
      message, F("map_string_string"), map_key, &map_val);
  map_val.SetStringValue("1");

  map_key.SetInt32Value(1);
  reflection->InsertOrLookupMapValue(
      message, F("map_int32_bytes"), map_key, &map_val);
  map_val.SetStringValue("1");

  map_key.SetInt32Value(1);
  reflection->InsertOrLookupMapValue(
      message, F("map_int32_enum"), map_key, &map_val);
  map_val.SetEnumValue(map_enum_baz_->number());

  map_key.SetInt32Value(1);
  EXPECT_TRUE(reflection->InsertOrLookupMapValue(
      message, F("map_int32_foreign_message"), map_key, &map_val));
  sub_foreign_message = map_val.MutableMessageValue();
  sub_foreign_message->GetReflection()->SetInt32(
      sub_foreign_message, foreign_c_, 1);
}

void MapReflectionTester::ClearMapFieldsViaReflection(
    Message* message) {
  const Reflection* reflection = message->GetReflection();

  reflection->ClearField(message, F("map_int32_int32"));
  reflection->ClearField(message, F("map_int64_int64"));
  reflection->ClearField(message, F("map_uint32_uint32"));
  reflection->ClearField(message, F("map_uint64_uint64"));
  reflection->ClearField(message, F("map_sint32_sint32"));
  reflection->ClearField(message, F("map_sint64_sint64"));
  reflection->ClearField(message, F("map_fixed32_fixed32"));
  reflection->ClearField(message, F("map_fixed64_fixed64"));
  reflection->ClearField(message, F("map_sfixed32_sfixed32"));
  reflection->ClearField(message, F("map_sfixed64_sfixed64"));
  reflection->ClearField(message, F("map_int32_float"));
  reflection->ClearField(message, F("map_int32_double"));
  reflection->ClearField(message, F("map_bool_bool"));
  reflection->ClearField(message, F("map_string_string"));
  reflection->ClearField(message, F("map_int32_bytes"));
  reflection->ClearField(message, F("map_int32_enum"));
  reflection->ClearField(message, F("map_int32_foreign_message"));
}

void MapReflectionTester::ModifyMapFieldsViaReflection(
    Message* message) {
  const Reflection* reflection = message->GetReflection();
  MapValueRef map_val;
  Message* sub_foreign_message;

  // Modify the second element
  MapKey map_key;
  map_key.SetInt32Value(1);
  EXPECT_FALSE(reflection->InsertOrLookupMapValue(
      message, F("map_int32_int32"), map_key, &map_val));
  map_val.SetInt32Value(2);

  map_key.SetInt64Value(1);
  EXPECT_FALSE(reflection->InsertOrLookupMapValue(
      message, F("map_int64_int64"), map_key, &map_val));
  map_val.SetInt64Value(2);

  map_key.SetUInt32Value(1);
  EXPECT_FALSE(reflection->InsertOrLookupMapValue(
      message, F("map_uint32_uint32"), map_key, &map_val));
  map_val.SetUInt32Value(2);

  map_key.SetUInt64Value(1);
  reflection->InsertOrLookupMapValue(
      message, F("map_uint64_uint64"), map_key, &map_val);
  map_val.SetUInt64Value(2);

  map_key.SetInt32Value(1);
  reflection->InsertOrLookupMapValue(
      message, F("map_sint32_sint32"), map_key, &map_val);
  map_val.SetInt32Value(2);

  map_key.SetInt64Value(1);
  reflection->InsertOrLookupMapValue(
      message, F("map_sint64_sint64"), map_key, &map_val);
  map_val.SetInt64Value(2);

  map_key.SetUInt32Value(1);
  reflection->InsertOrLookupMapValue(
      message, F("map_fixed32_fixed32"), map_key, &map_val);
  map_val.SetUInt32Value(2);

  map_key.SetUInt64Value(1);
  reflection->InsertOrLookupMapValue(
      message, F("map_fixed64_fixed64"), map_key, &map_val);
  map_val.SetUInt64Value(2);

  map_key.SetInt32Value(1);
  reflection->InsertOrLookupMapValue(
      message, F("map_sfixed32_sfixed32"), map_key, &map_val);
  map_val.SetInt32Value(2);

  map_key.SetInt64Value(1);
  reflection->InsertOrLookupMapValue(
      message, F("map_sfixed64_sfixed64"), map_key, &map_val);
  map_val.SetInt64Value(2);

  map_key.SetInt32Value(1);
  reflection->InsertOrLookupMapValue(
      message, F("map_int32_float"), map_key, &map_val);
  map_val.SetFloatValue(2.0);

  map_key.SetInt32Value(1);
  reflection->InsertOrLookupMapValue(
      message, F("map_int32_double"), map_key, &map_val);
  map_val.SetDoubleValue(2.0);

  map_key.SetBoolValue(true);
  reflection->InsertOrLookupMapValue(
      message, F("map_bool_bool"), map_key, &map_val);
  map_val.SetBoolValue(false);

  map_key.SetStringValue("1");
  reflection->InsertOrLookupMapValue(
      message, F("map_string_string"), map_key, &map_val);
  map_val.SetStringValue("2");

  map_key.SetInt32Value(1);
  reflection->InsertOrLookupMapValue(
      message, F("map_int32_bytes"), map_key, &map_val);
  map_val.SetStringValue("2");

  map_key.SetInt32Value(1);
  reflection->InsertOrLookupMapValue(
      message, F("map_int32_enum"), map_key, &map_val);
  map_val.SetEnumValue(map_enum_foo_->number());

  map_key.SetInt32Value(1);
  EXPECT_FALSE(reflection->InsertOrLookupMapValue(
      message, F("map_int32_foreign_message"), map_key, &map_val));
  sub_foreign_message = map_val.MutableMessageValue();
  sub_foreign_message->GetReflection()->SetInt32(
      sub_foreign_message, foreign_c_, 2);
}

void MapReflectionTester::RemoveLastMapsViaReflection(
    Message* message) {
  const Reflection* reflection = message->GetReflection();

  vector<const FieldDescriptor*> output;
  reflection->ListFields(*message, &output);
  for (int i = 0; i < output.size(); ++i) {
    const FieldDescriptor* field = output[i];
    if (!field->is_repeated()) continue;
    reflection->RemoveLast(message, field);
  }
}

void MapReflectionTester::ReleaseLastMapsViaReflection(
    Message* message) {
  const Reflection* reflection = message->GetReflection();

  vector<const FieldDescriptor*> output;
  reflection->ListFields(*message, &output);
  for (int i = 0; i < output.size(); ++i) {
    const FieldDescriptor* field = output[i];
    if (!field->is_repeated()) continue;
    if (field->cpp_type() != FieldDescriptor::CPPTYPE_MESSAGE) continue;

    Message* released = reflection->ReleaseLast(message, field);
    ASSERT_TRUE(released != NULL) << "ReleaseLast returned NULL for: "
                                  << field->name();
    delete released;
  }
}

void MapReflectionTester::SwapMapsViaReflection(Message* message) {
  const Reflection* reflection = message->GetReflection();
  vector<const FieldDescriptor*> output;
  reflection->ListFields(*message, &output);
  for (int i = 0; i < output.size(); ++i) {
    const FieldDescriptor* field = output[i];
    if (!field->is_repeated()) continue;
    reflection->SwapElements(message, field, 0, 1);
  }
}

void MapReflectionTester::
    MutableUnknownFieldsOfMapFieldsViaReflection(Message* message) {
  const Reflection* reflection = message->GetReflection();
  Message* sub_message = NULL;

  sub_message = reflection->AddMessage(message, F("map_int32_int32"));
  EXPECT_TRUE(sub_message->GetReflection()->MutableUnknownFields(sub_message) !=
              NULL);
  sub_message = reflection->AddMessage(message, F("map_int64_int64"));
  EXPECT_TRUE(sub_message->GetReflection()->MutableUnknownFields(sub_message) !=
              NULL);
  sub_message = reflection->AddMessage(message, F("map_uint32_uint32"));
  EXPECT_TRUE(sub_message->GetReflection()->MutableUnknownFields(sub_message) !=
              NULL);
  sub_message = reflection->AddMessage(message, F("map_uint64_uint64"));
  EXPECT_TRUE(sub_message->GetReflection()->MutableUnknownFields(sub_message) !=
              NULL);
  sub_message = reflection->AddMessage(message, F("map_sint32_sint32"));
  EXPECT_TRUE(sub_message->GetReflection()->MutableUnknownFields(sub_message) !=
              NULL);
  sub_message = reflection->AddMessage(message, F("map_sint64_sint64"));
  EXPECT_TRUE(sub_message->GetReflection()->MutableUnknownFields(sub_message) !=
              NULL);
  sub_message = reflection->AddMessage(message, F("map_fixed32_fixed32"));
  EXPECT_TRUE(sub_message->GetReflection()->MutableUnknownFields(sub_message) !=
              NULL);
  sub_message = reflection->AddMessage(message, F("map_fixed64_fixed64"));
  EXPECT_TRUE(sub_message->GetReflection()->MutableUnknownFields(sub_message) !=
              NULL);
  sub_message = reflection->AddMessage(message, F("map_sfixed32_sfixed32"));
  EXPECT_TRUE(sub_message->GetReflection()->MutableUnknownFields(sub_message) !=
              NULL);
  sub_message = reflection->AddMessage(message, F("map_sfixed64_sfixed64"));
  EXPECT_TRUE(sub_message->GetReflection()->MutableUnknownFields(sub_message) !=
              NULL);
  sub_message = reflection->AddMessage(message, F("map_int32_float"));
  EXPECT_TRUE(sub_message->GetReflection()->MutableUnknownFields(sub_message) !=
              NULL);
  sub_message = reflection->AddMessage(message, F("map_int32_double"));
  EXPECT_TRUE(sub_message->GetReflection()->MutableUnknownFields(sub_message) !=
              NULL);
  sub_message = reflection->AddMessage(message, F("map_bool_bool"));
  EXPECT_TRUE(sub_message->GetReflection()->MutableUnknownFields(sub_message) !=
              NULL);
  sub_message = reflection->AddMessage(message, F("map_string_string"));
  EXPECT_TRUE(sub_message->GetReflection()->MutableUnknownFields(sub_message) !=
              NULL);
  sub_message = reflection->AddMessage(message, F("map_int32_bytes"));
  EXPECT_TRUE(sub_message->GetReflection()->MutableUnknownFields(sub_message) !=
              NULL);
  sub_message = reflection->AddMessage(message, F("map_int32_enum"));
  EXPECT_TRUE(sub_message->GetReflection()->MutableUnknownFields(sub_message) !=
              NULL);
  sub_message = reflection->AddMessage(message, F("map_int32_foreign_message"));
  EXPECT_TRUE(sub_message->GetReflection()->MutableUnknownFields(sub_message) !=
              NULL);
}

void MapReflectionTester::ExpectMapFieldsSetViaReflection(
    const Message& message) {
  string scratch;
  const Reflection* reflection = message.GetReflection();
  const Message* sub_message;
  MapKey map_key;

  // -----------------------------------------------------------------

  ASSERT_EQ(2, reflection->FieldSize(message, F("map_int32_int32")));
  ASSERT_EQ(2, reflection->FieldSize(message, F("map_int64_int64")));
  ASSERT_EQ(2, reflection->FieldSize(message, F("map_uint32_uint32")));
  ASSERT_EQ(2, reflection->FieldSize(message, F("map_uint64_uint64")));
  ASSERT_EQ(2, reflection->FieldSize(message, F("map_sint32_sint32")));
  ASSERT_EQ(2, reflection->FieldSize(message, F("map_sint64_sint64")));
  ASSERT_EQ(2, reflection->FieldSize(message, F("map_fixed32_fixed32")));
  ASSERT_EQ(2, reflection->FieldSize(message, F("map_fixed64_fixed64")));
  ASSERT_EQ(2, reflection->FieldSize(message, F("map_sfixed32_sfixed32")));
  ASSERT_EQ(2, reflection->FieldSize(message, F("map_sfixed64_sfixed64")));
  ASSERT_EQ(2, reflection->FieldSize(message, F("map_int32_float")));
  ASSERT_EQ(2, reflection->FieldSize(message, F("map_int32_double")));
  ASSERT_EQ(2, reflection->FieldSize(message, F("map_bool_bool")));
  ASSERT_EQ(2, reflection->FieldSize(message, F("map_string_string")));
  ASSERT_EQ(2, reflection->FieldSize(message, F("map_int32_bytes")));
  ASSERT_EQ(2, reflection->FieldSize(message, F("map_int32_enum")));
  ASSERT_EQ(2, reflection->FieldSize(message, F("map_int32_foreign_message")));

  {
    std::map<int32, int32> map;
    map[0] = 0;
    map[1] = 1;
    for (int i = 0; i < 2; i++) {
      // Check with RepeatedField Reflection
      sub_message =
          &reflection->GetRepeatedMessage(message, F("map_int32_int32"), i);
      int32 key = sub_message->GetReflection()->GetInt32(
          *sub_message, map_int32_int32_key_);
      int32 val = sub_message->GetReflection()->GetInt32(
          *sub_message, map_int32_int32_val_);
      EXPECT_EQ(map[key], val);
      // Check with Map Reflection
      map_key.SetInt32Value(key);
      EXPECT_TRUE(reflection->ContainsMapKey(
          message, F("map_int32_int32"), map_key));
    }
  }
  {
    std::map<int64, int64> map;
    map[0] = 0;
    map[1] = 1;
    for (int i = 0; i < 2; i++) {
      // Check with RepeatedField Reflection
      sub_message =
          &reflection->GetRepeatedMessage(message, F("map_int64_int64"), i);
      int64 key = sub_message->GetReflection()->GetInt64(
          *sub_message, map_int64_int64_key_);
      int64 val = sub_message->GetReflection()->GetInt64(
          *sub_message, map_int64_int64_val_);
      EXPECT_EQ(map[key], val);
      // Check with Map Reflection
      map_key.SetInt64Value(key);
      EXPECT_TRUE(reflection->ContainsMapKey(
          message, F("map_int64_int64"), map_key));
    }
  }
  {
    std::map<uint32, uint32> map;
    map[0] = 0;
    map[1] = 1;
    for (int i = 0; i < 2; i++) {
      // Check with RepeatedField Reflection
      sub_message =
          &reflection->GetRepeatedMessage(message, F("map_uint32_uint32"), i);
      uint32 key = sub_message->GetReflection()->GetUInt32(
          *sub_message, map_uint32_uint32_key_);
      uint32 val = sub_message->GetReflection()->GetUInt32(
          *sub_message, map_uint32_uint32_val_);
      EXPECT_EQ(map[key], val);
      // Check with Map Reflection
      map_key.SetUInt32Value(key);
      EXPECT_TRUE(reflection->ContainsMapKey(
          message, F("map_uint32_uint32"), map_key));
    }
  }
  {
    std::map<uint64, uint64> map;
    map[0] = 0;
    map[1] = 1;
    for (int i = 0; i < 2; i++) {
      sub_message =
          &reflection->GetRepeatedMessage(message, F("map_uint64_uint64"), i);
      uint64 key = sub_message->GetReflection()->GetUInt64(
          *sub_message, map_uint64_uint64_key_);
      uint64 val = sub_message->GetReflection()->GetUInt64(
          *sub_message, map_uint64_uint64_val_);
      EXPECT_EQ(map[key], val);
      // Check with Map Reflection
      map_key.SetUInt64Value(key);
      EXPECT_TRUE(reflection->ContainsMapKey(
          message, F("map_uint64_uint64"), map_key));
    }
  }
  {
    std::map<int32, int32> map;
    map[0] = 0;
    map[1] = 1;
    for (int i = 0; i < 2; i++) {
      sub_message =
          &reflection->GetRepeatedMessage(message, F("map_sint32_sint32"), i);
      int32 key = sub_message->GetReflection()->GetInt32(
          *sub_message, map_sint32_sint32_key_);
      int32 val = sub_message->GetReflection()->GetInt32(
          *sub_message, map_sint32_sint32_val_);
      EXPECT_EQ(map[key], val);
      // Check with Map Reflection
      map_key.SetInt32Value(key);
      EXPECT_EQ(true, reflection->ContainsMapKey(
          message, F("map_sint32_sint32"), map_key));
    }
  }
  {
    std::map<int64, int64> map;
    map[0] = 0;
    map[1] = 1;
    for (int i = 0; i < 2; i++) {
      sub_message =
          &reflection->GetRepeatedMessage(message, F("map_sint64_sint64"), i);
      int64 key = sub_message->GetReflection()->GetInt64(
          *sub_message, map_sint64_sint64_key_);
      int64 val = sub_message->GetReflection()->GetInt64(
          *sub_message, map_sint64_sint64_val_);
      EXPECT_EQ(map[key], val);
      // Check with Map Reflection
      map_key.SetInt64Value(key);
      EXPECT_EQ(true, reflection->ContainsMapKey(
          message, F("map_sint64_sint64"), map_key));
    }
  }
  {
    std::map<uint32, uint32> map;
    map[0] = 0;
    map[1] = 1;
    for (int i = 0; i < 2; i++) {
      sub_message =
          &reflection->GetRepeatedMessage(message, F("map_fixed32_fixed32"), i);
      uint32 key = sub_message->GetReflection()->GetUInt32(
          *sub_message, map_fixed32_fixed32_key_);
      uint32 val = sub_message->GetReflection()->GetUInt32(
          *sub_message, map_fixed32_fixed32_val_);
      EXPECT_EQ(map[key], val);
      // Check with Map Reflection
      map_key.SetUInt32Value(key);
      EXPECT_EQ(true, reflection->ContainsMapKey(
          message, F("map_fixed32_fixed32"), map_key));
    }
  }
  {
    std::map<uint64, uint64> map;
    map[0] = 0;
    map[1] = 1;
    for (int i = 0; i < 2; i++) {
      sub_message =
          &reflection->GetRepeatedMessage(message, F("map_fixed64_fixed64"), i);
      uint64 key = sub_message->GetReflection()->GetUInt64(
          *sub_message, map_fixed64_fixed64_key_);
      uint64 val = sub_message->GetReflection()->GetUInt64(
          *sub_message, map_fixed64_fixed64_val_);
      EXPECT_EQ(map[key], val);
      // Check with Map Reflection
      map_key.SetUInt64Value(key);
      EXPECT_EQ(true, reflection->ContainsMapKey(
          message, F("map_fixed64_fixed64"), map_key));
    }
  }
  {
    std::map<int32, int32> map;
    map[0] = 0;
    map[1] = 1;
    for (int i = 0; i < 2; i++) {
      sub_message = &reflection->GetRepeatedMessage(
          message, F("map_sfixed32_sfixed32"), i);
      int32 key = sub_message->GetReflection()->GetInt32(
          *sub_message, map_sfixed32_sfixed32_key_);
      int32 val = sub_message->GetReflection()->GetInt32(
          *sub_message, map_sfixed32_sfixed32_val_);
      EXPECT_EQ(map[key], val);
      // Check with Map Reflection
      map_key.SetInt32Value(key);
      EXPECT_EQ(true, reflection->ContainsMapKey(
          message, F("map_sfixed32_sfixed32"), map_key));
    }
  }
  {
    std::map<int64, int64> map;
    map[0] = 0;
    map[1] = 1;
    for (int i = 0; i < 2; i++) {
      sub_message = &reflection->GetRepeatedMessage(
          message, F("map_sfixed64_sfixed64"), i);
      int64 key = sub_message->GetReflection()->GetInt64(
          *sub_message, map_sfixed64_sfixed64_key_);
      int64 val = sub_message->GetReflection()->GetInt64(
          *sub_message, map_sfixed64_sfixed64_val_);
      EXPECT_EQ(map[key], val);
      // Check with Map Reflection
      map_key.SetInt64Value(key);
      EXPECT_EQ(true, reflection->ContainsMapKey(
          message, F("map_sfixed64_sfixed64"), map_key));
    }
  }
  {
    std::map<int32, float> map;
    map[0] = 0.0;
    map[1] = 1.0;
    for (int i = 0; i < 2; i++) {
      sub_message =
          &reflection->GetRepeatedMessage(message, F("map_int32_float"), i);
      int32  key = sub_message->GetReflection()->GetInt32(
          *sub_message, map_int32_float_key_);
      float val = sub_message->GetReflection()->GetFloat(
          *sub_message, map_int32_float_val_);
      EXPECT_EQ(map[key], val);
      // Check with Map Reflection
      map_key.SetInt32Value(key);
      EXPECT_EQ(true, reflection->ContainsMapKey(
          message, F("map_int32_float"), map_key));
    }
  }
  {
    std::map<int32, double> map;
    map[0] = 0.0;
    map[1] = 1.0;
    for (int i = 0; i < 2; i++) {
      sub_message =
          &reflection->GetRepeatedMessage(message, F("map_int32_double"), i);
      int32  key = sub_message->GetReflection()->GetInt32(
          *sub_message, map_int32_double_key_);
      double val = sub_message->GetReflection()->GetDouble(
          *sub_message, map_int32_double_val_);
      EXPECT_EQ(map[key], val);
      // Check with Map Reflection
      map_key.SetInt32Value(key);
      EXPECT_EQ(true, reflection->ContainsMapKey(
          message, F("map_int32_double"), map_key));
    }
  }
  {
    std::map<bool, bool> map;
    map[false] = false;
    map[true] = true;
    for (int i = 0; i < 2; i++) {
      sub_message =
          &reflection->GetRepeatedMessage(message, F("map_bool_bool"), i);
      bool key = sub_message->GetReflection()->GetBool(
          *sub_message, map_bool_bool_key_);
      bool val = sub_message->GetReflection()->GetBool(
          *sub_message, map_bool_bool_val_);
      EXPECT_EQ(map[key], val);
      // Check with Map Reflection
      map_key.SetBoolValue(key);
      EXPECT_EQ(true, reflection->ContainsMapKey(
          message, F("map_bool_bool"), map_key));
    }
  }
  {
    std::map<string, string> map;
    map["0"] = "0";
    map["1"] = "1";
    for (int i = 0; i < 2; i++) {
      sub_message =
          &reflection->GetRepeatedMessage(message, F("map_string_string"), i);
      string  key = sub_message->GetReflection()->GetString(
          *sub_message, map_string_string_key_);
      string val = sub_message->GetReflection()->GetString(
          *sub_message, map_string_string_val_);
      EXPECT_EQ(map[key], val);
      // Check with Map Reflection
      map_key.SetStringValue(key);
      EXPECT_EQ(true, reflection->ContainsMapKey(
          message, F("map_string_string"), map_key));
    }
  }
  {
    std::map<int32, string> map;
    map[0] = "0";
    map[1] = "1";
    for (int i = 0; i < 2; i++) {
      sub_message =
          &reflection->GetRepeatedMessage(message, F("map_int32_bytes"), i);
      int32  key = sub_message->GetReflection()->GetInt32(
          *sub_message, map_int32_bytes_key_);
      string val = sub_message->GetReflection()->GetString(
          *sub_message, map_int32_bytes_val_);
      EXPECT_EQ(map[key], val);
      // Check with Map Reflection
      map_key.SetInt32Value(key);
      EXPECT_EQ(true, reflection->ContainsMapKey(
          message, F("map_int32_bytes"), map_key));
    }
  }
  {
    std::map<int32, const EnumValueDescriptor*> map;
    map[0] = map_enum_bar_;
    map[1] = map_enum_baz_;
    for (int i = 0; i < 2; i++) {
      sub_message = &reflection->GetRepeatedMessage(
          message, F("map_int32_enum"), i);
      int32 key = sub_message->GetReflection()->GetInt32(
          *sub_message, map_int32_enum_key_);
      const EnumValueDescriptor* val = sub_message->GetReflection()->GetEnum(
          *sub_message, map_int32_enum_val_);
      EXPECT_EQ(map[key], val);
      // Check with Map Reflection
      map_key.SetInt32Value(key);
      EXPECT_EQ(true, reflection->ContainsMapKey(
          message, F("map_int32_enum"), map_key));
    }
  }
  {
    std::map<int32, int32> map;
    map[0] = 0;
    map[1] = 1;
    for (int i = 0; i < 2; i++) {
      sub_message = &reflection->GetRepeatedMessage(
          message, F("map_int32_foreign_message"), i);
      int32  key = sub_message->GetReflection()->GetInt32(
          *sub_message, map_int32_foreign_message_key_);
      const Message& foreign_message = sub_message->GetReflection()->GetMessage(
          *sub_message, map_int32_foreign_message_val_);
      int32 val = foreign_message.GetReflection()->GetInt32(
          foreign_message, foreign_c_);
      EXPECT_EQ(map[key], val);
      // Check with Map Reflection
      map_key.SetInt32Value(key);
      EXPECT_EQ(true, reflection->ContainsMapKey(
          message, F("map_int32_foreign_message"), map_key));
    }
  }
}

void MapReflectionTester::ExpectMapFieldsSetViaReflectionIterator(
    Message* message) {
  string scratch;
  string serialized;
  const Reflection* reflection = message->GetReflection();

  ASSERT_EQ(2, reflection->FieldSize(*message, F("map_int32_int32")));
  ASSERT_EQ(2, reflection->FieldSize(*message, F("map_int64_int64")));
  ASSERT_EQ(2, reflection->FieldSize(*message, F("map_uint32_uint32")));
  ASSERT_EQ(2, reflection->FieldSize(*message, F("map_uint64_uint64")));
  ASSERT_EQ(2, reflection->FieldSize(*message, F("map_sint32_sint32")));
  ASSERT_EQ(2, reflection->FieldSize(*message, F("map_sint64_sint64")));
  ASSERT_EQ(2, reflection->FieldSize(*message, F("map_fixed32_fixed32")));
  ASSERT_EQ(2, reflection->FieldSize(*message, F("map_fixed64_fixed64")));
  ASSERT_EQ(2, reflection->FieldSize(*message, F("map_sfixed32_sfixed32")));
  ASSERT_EQ(2, reflection->FieldSize(*message, F("map_sfixed64_sfixed64")));
  ASSERT_EQ(2, reflection->FieldSize(*message, F("map_int32_float")));
  ASSERT_EQ(2, reflection->FieldSize(*message, F("map_int32_double")));
  ASSERT_EQ(2, reflection->FieldSize(*message, F("map_bool_bool")));
  ASSERT_EQ(2, reflection->FieldSize(*message, F("map_string_string")));
  ASSERT_EQ(2, reflection->FieldSize(*message, F("map_int32_bytes")));
  ASSERT_EQ(2, reflection->FieldSize(*message, F("map_int32_enum")));
  ASSERT_EQ(2, reflection->FieldSize(*message, F("map_int32_foreign_message")));

  {
    std::map<int32, int32> map;
    map[0] = 0;
    map[1] = 1;
    int size = 0;
    for (MapIterator iter = reflection->MapBegin(message, F("map_int32_int32"));
         iter != reflection->MapEnd(message, F("map_int32_int32"));
         ++iter, ++size) {
      // Check const methods do not invalidate map.
      message->DebugString();
      message->ShortDebugString();
      message->SerializeToString(&serialized);
      message->SpaceUsed();
      message->ByteSize();
      EXPECT_EQ(map[iter.GetKey().GetInt32Value()],
                iter.GetValueRef().GetInt32Value());
    }
    EXPECT_EQ(size, 2);
  }
  {
    std::map<int64, int64> map;
    map[0] = 0;
    map[1] = 1;
    for (MapIterator iter = reflection->MapBegin(message, F("map_int64_int64"));
         iter != reflection->MapEnd(message, F("map_int64_int64")); ++iter) {
      EXPECT_EQ(map[iter.GetKey().GetInt64Value()],
                iter.GetValueRef().GetInt64Value());
    }
  }
  {
    std::map<uint32, uint32> map;
    map[0] = 0;
    map[1] = 1;
    for (MapIterator iter = reflection->MapBegin(
             message, F("map_uint32_uint32"));
         iter != reflection->MapEnd(message, F("map_uint32_uint32"));
         ++iter) {
      EXPECT_EQ(map[iter.GetKey().GetUInt32Value()],
                iter.GetValueRef().GetUInt32Value());
    }
  }
  {
    std::map<uint64, uint64> map;
    map[0] = 0;
    map[1] = 1;
    for (MapIterator iter = reflection->MapBegin(
             message, F("map_uint64_uint64"));
         iter != reflection->MapEnd(message, F("map_uint64_uint64"));
         ++iter) {
      EXPECT_EQ(map[iter.GetKey().GetUInt64Value()],
                iter.GetValueRef().GetUInt64Value());
    }
  }
  {
    std::map<int32, int32> map;
    map[0] = 0;
    map[1] = 1;
    for (MapIterator iter = reflection->MapBegin(
             message, F("map_sint32_sint32"));
         iter != reflection->MapEnd(message, F("map_sint32_sint32"));
         ++iter) {
      EXPECT_EQ(map[iter.GetKey().GetInt32Value()],
                iter.GetValueRef().GetInt32Value());
    }
  }
  {
    std::map<int64, int64> map;
    map[0] = 0;
    map[1] = 1;
    for (MapIterator iter = reflection->MapBegin(
             message, F("map_sint64_sint64"));
         iter != reflection->MapEnd(message, F("map_sint64_sint64")); ++iter) {
      EXPECT_EQ(map[iter.GetKey().GetInt64Value()],
                iter.GetValueRef().GetInt64Value());
    }
  }
  {
    std::map<uint32, uint32> map;
    map[0] = 0;
    map[1] = 1;
    for (MapIterator iter = reflection->MapBegin(
             message, F("map_fixed32_fixed32"));
         iter != reflection->MapEnd(message, F("map_fixed32_fixed32"));
         ++iter) {
      EXPECT_EQ(map[iter.GetKey().GetUInt32Value()],
                iter.GetValueRef().GetUInt32Value());
    }
  }
  {
    std::map<uint64, uint64> map;
    map[0] = 0;
    map[1] = 1;
    for (MapIterator iter = reflection->MapBegin(
             message, F("map_fixed64_fixed64"));
         iter != reflection->MapEnd(message, F("map_fixed64_fixed64"));
         ++iter) {
      EXPECT_EQ(map[iter.GetKey().GetUInt64Value()],
                iter.GetValueRef().GetUInt64Value());
    }
  }
  {
    std::map<int32, int32> map;
    map[0] = 0;
    map[1] = 1;
    for (MapIterator iter = reflection->MapBegin(
             message, F("map_sfixed32_sfixed32"));
         iter != reflection->MapEnd(message, F("map_sfixed32_sfixed32"));
         ++iter) {
      EXPECT_EQ(map[iter.GetKey().GetInt32Value()],
                iter.GetValueRef().GetInt32Value());
    }
  }
  {
    std::map<int32, float> map;
    map[0] = 0.0;
    map[1] = 1.0;
    for (MapIterator iter = reflection->MapBegin(message, F("map_int32_float"));
         iter != reflection->MapEnd(message, F("map_int32_float")); ++iter) {
      EXPECT_EQ(map[iter.GetKey().GetInt32Value()],
                iter.GetValueRef().GetFloatValue());
    }
  }
  {
    std::map<int32, double> map;
    map[0] = 0.0;
    map[1] = 1.0;
    for (MapIterator iter = reflection->MapBegin(
             message, F("map_int32_double"));
         iter != reflection->MapEnd(message, F("map_int32_double")); ++iter) {
      EXPECT_EQ(map[iter.GetKey().GetInt32Value()],
                iter.GetValueRef().GetDoubleValue());
    }
  }
  {
    std::map<bool, bool> map;
    map[false] = false;
    map[true] = true;
    for (MapIterator iter = reflection->MapBegin(message, F("map_bool_bool"));
         iter != reflection->MapEnd(message, F("map_bool_bool")); ++iter) {
      EXPECT_EQ(map[iter.GetKey().GetBoolValue()],
                iter.GetValueRef().GetBoolValue());
    }
  }
  {
    std::map<string, string> map;
    map["0"] = "0";
    map["1"] = "1";
    int size = 0;
    for (MapIterator iter = reflection->MapBegin(
             message, F("map_string_string"));
         iter != reflection->MapEnd(message, F("map_string_string"));
         ++iter, ++size) {
      // Check const methods do not invalidate map.
      message->DebugString();
      message->ShortDebugString();
      message->SerializeToString(&serialized);
      message->SpaceUsed();
      message->ByteSize();
      EXPECT_EQ(map[iter.GetKey().GetStringValue()],
                iter.GetValueRef().GetStringValue());
    }
    EXPECT_EQ(size, 2);
  }
  {
    std::map<int32, string> map;
    map[0] = "0";
    map[1] = "1";
    for (MapIterator iter = reflection->MapBegin(message, F("map_int32_bytes"));
         iter != reflection->MapEnd(message, F("map_int32_bytes")); ++iter) {
      EXPECT_EQ(map[iter.GetKey().GetInt32Value()],
                iter.GetValueRef().GetStringValue());
    }
  }
  {
    std::map<int32, const EnumValueDescriptor*> map;
    map[0] = map_enum_bar_;
    map[1] = map_enum_baz_;
    for (MapIterator iter = reflection->MapBegin(message, F("map_int32_enum"));
         iter != reflection->MapEnd(message, F("map_int32_enum")); ++iter) {
      EXPECT_EQ(map[iter.GetKey().GetInt32Value()]->number(),
                iter.GetValueRef().GetEnumValue());
    }
  }
  {
    std::map<int32, int32> map;
    map[0] = 0;
    map[1] = 1;
    int size = 0;
    for (MapIterator iter = reflection->MapBegin(
             message, F("map_int32_foreign_message"));
         iter != reflection->MapEnd(message, F("map_int32_foreign_message"));
         ++iter, ++size) {
      // Check const methods do not invalidate map.
      message->DebugString();
      message->ShortDebugString();
      message->SerializeToString(&serialized);
      message->SpaceUsed();
      message->ByteSize();
      const Message& sub_message = iter.GetValueRef().GetMessageValue();
      EXPECT_EQ(map[iter.GetKey().GetInt32Value()],
                sub_message.GetReflection()->GetInt32(sub_message, foreign_c_));
    }
    EXPECT_EQ(size, 2);
  }
}

void MapReflectionTester::ExpectClearViaReflection(
    const Message& message) {
  const Reflection* reflection = message.GetReflection();
  // Map fields are empty.
  EXPECT_EQ(0, reflection->FieldSize(message, F("map_int32_int32")));
  EXPECT_EQ(0, reflection->FieldSize(message, F("map_int64_int64")));
  EXPECT_EQ(0, reflection->FieldSize(message, F("map_uint32_uint32")));
  EXPECT_EQ(0, reflection->FieldSize(message, F("map_uint64_uint64")));
  EXPECT_EQ(0, reflection->FieldSize(message, F("map_sint32_sint32")));
  EXPECT_EQ(0, reflection->FieldSize(message, F("map_sint64_sint64")));
  EXPECT_EQ(0, reflection->FieldSize(message, F("map_fixed32_fixed32")));
  EXPECT_EQ(0, reflection->FieldSize(message, F("map_fixed64_fixed64")));
  EXPECT_EQ(0, reflection->FieldSize(message, F("map_sfixed32_sfixed32")));
  EXPECT_EQ(0, reflection->FieldSize(message, F("map_sfixed64_sfixed64")));
  EXPECT_EQ(0, reflection->FieldSize(message, F("map_int32_float")));
  EXPECT_EQ(0, reflection->FieldSize(message, F("map_int32_double")));
  EXPECT_EQ(0, reflection->FieldSize(message, F("map_bool_bool")));
  EXPECT_EQ(0, reflection->FieldSize(message, F("map_string_string")));
  EXPECT_EQ(0, reflection->FieldSize(message, F("map_int32_bytes")));
  EXPECT_EQ(0, reflection->FieldSize(message, F("map_int32_enum")));
  EXPECT_EQ(0, reflection->FieldSize(message, F("map_int32_foreign_message")));
}

void MapReflectionTester::ExpectClearViaReflectionIterator(
    Message* message) {
  const Reflection* reflection = message->GetReflection();
  EXPECT_TRUE(reflection->MapBegin(message, F("map_int32_int32")) ==
              reflection->MapEnd(message, F("map_int32_int32")));
  EXPECT_TRUE(reflection->MapBegin(message, F("map_int64_int64")) ==
              reflection->MapEnd(message, F("map_int64_int64")));
  EXPECT_TRUE(reflection->MapBegin(message, F("map_uint32_uint32")) ==
              reflection->MapEnd(message, F("map_uint32_uint32")));
  EXPECT_TRUE(reflection->MapBegin(message, F("map_uint64_uint64")) ==
              reflection->MapEnd(message, F("map_uint64_uint64")));
  EXPECT_TRUE(reflection->MapBegin(message, F("map_sint32_sint32")) ==
              reflection->MapEnd(message, F("map_sint32_sint32")));
  EXPECT_TRUE(reflection->MapBegin(message, F("map_sint64_sint64")) ==
              reflection->MapEnd(message, F("map_sint64_sint64")));
  EXPECT_TRUE(reflection->MapBegin(message, F("map_fixed32_fixed32")) ==
              reflection->MapEnd(message, F("map_fixed32_fixed32")));
  EXPECT_TRUE(reflection->MapBegin(message, F("map_fixed64_fixed64")) ==
              reflection->MapEnd(message, F("map_fixed64_fixed64")));
  EXPECT_TRUE(reflection->MapBegin(message, F("map_sfixed32_sfixed32")) ==
              reflection->MapEnd(message, F("map_sfixed32_sfixed32")));
  EXPECT_TRUE(reflection->MapBegin(message, F("map_sfixed64_sfixed64")) ==
              reflection->MapEnd(message, F("map_sfixed64_sfixed64")));
  EXPECT_TRUE(reflection->MapBegin(message, F("map_int32_float")) ==
              reflection->MapEnd(message, F("map_int32_float")));
  EXPECT_TRUE(reflection->MapBegin(message, F("map_int32_double")) ==
              reflection->MapEnd(message, F("map_int32_double")));
  EXPECT_TRUE(reflection->MapBegin(message, F("map_bool_bool")) ==
              reflection->MapEnd(message, F("map_bool_bool")));
  EXPECT_TRUE(reflection->MapBegin(message, F("map_string_string")) ==
              reflection->MapEnd(message, F("map_string_string")));
  EXPECT_TRUE(reflection->MapBegin(message, F("map_int32_bytes")) ==
              reflection->MapEnd(message, F("map_int32_bytes")));
  EXPECT_TRUE(reflection->MapBegin(message, F("map_int32_enum")) ==
              reflection->MapEnd(message, F("map_int32_enum")));
  EXPECT_TRUE(reflection->MapBegin(message, F("map_int32_foreign_message")) ==
              reflection->MapEnd(message, F("map_int32_foreign_message")));
}

void MapReflectionTester::ExpectMapEntryClearViaReflection(
    Message* message) {
  const Reflection* reflection = message->GetReflection();
  const Message* sub_message;

  {
    const FieldDescriptor* descriptor = F("map_int32_int32");
    const FieldDescriptor* key_descriptor =
        descriptor->message_type()->FindFieldByName("key");
    const FieldDescriptor* value_descriptor =
        descriptor->message_type()->FindFieldByName("value");
    sub_message = reflection->AddMessage(message, F("map_int32_int32"));
    EXPECT_EQ(0, sub_message->GetReflection()->GetInt32(*sub_message,
                                                        key_descriptor));
    EXPECT_EQ(0, sub_message->GetReflection()->GetInt32(*sub_message,
                                                        value_descriptor));
  }
  {
    const FieldDescriptor* descriptor = F("map_int64_int64");
    const FieldDescriptor* key_descriptor =
        descriptor->message_type()->FindFieldByName("key");
    const FieldDescriptor* value_descriptor =
        descriptor->message_type()->FindFieldByName("value");
    sub_message = reflection->AddMessage(message, F("map_int64_int64"));
    EXPECT_EQ(0, sub_message->GetReflection()->GetInt64(*sub_message,
                                                        key_descriptor));
    EXPECT_EQ(0, sub_message->GetReflection()->GetInt64(*sub_message,
                                                        value_descriptor));
  }
  {
    const FieldDescriptor* descriptor = F("map_uint32_uint32");
    const FieldDescriptor* key_descriptor =
        descriptor->message_type()->FindFieldByName("key");
    const FieldDescriptor* value_descriptor =
        descriptor->message_type()->FindFieldByName("value");
    sub_message = reflection->AddMessage(message, F("map_uint32_uint32"));
    EXPECT_EQ(0, sub_message->GetReflection()->GetUInt32(*sub_message,
                                                         key_descriptor));
    EXPECT_EQ(0, sub_message->GetReflection()->GetUInt32(*sub_message,
                                                         value_descriptor));
  }
  {
    const FieldDescriptor* descriptor = F("map_uint64_uint64");
    const FieldDescriptor* key_descriptor =
        descriptor->message_type()->FindFieldByName("key");
    const FieldDescriptor* value_descriptor =
        descriptor->message_type()->FindFieldByName("value");
    sub_message = reflection->AddMessage(message, F("map_uint64_uint64"));
    EXPECT_EQ(0, sub_message->GetReflection()->GetUInt64(*sub_message,
                                                         key_descriptor));
    EXPECT_EQ(0, sub_message->GetReflection()->GetUInt64(*sub_message,
                                                         value_descriptor));
  }
  {
    const FieldDescriptor* descriptor = F("map_sint32_sint32");
    const FieldDescriptor* key_descriptor =
        descriptor->message_type()->FindFieldByName("key");
    const FieldDescriptor* value_descriptor =
        descriptor->message_type()->FindFieldByName("value");
    sub_message = reflection->AddMessage(message, F("map_sint32_sint32"));
    EXPECT_EQ(0, sub_message->GetReflection()->GetInt32(*sub_message,
                                                        key_descriptor));
    EXPECT_EQ(0, sub_message->GetReflection()->GetInt32(*sub_message,
                                                        value_descriptor));
  }
  {
    const FieldDescriptor* descriptor = F("map_sint64_sint64");
    const FieldDescriptor* key_descriptor =
        descriptor->message_type()->FindFieldByName("key");
    const FieldDescriptor* value_descriptor =
        descriptor->message_type()->FindFieldByName("value");
    sub_message = reflection->AddMessage(message, F("map_sint64_sint64"));
    EXPECT_EQ(0, sub_message->GetReflection()->GetInt64(*sub_message,
                                                        key_descriptor));
    EXPECT_EQ(0, sub_message->GetReflection()->GetInt64(*sub_message,
                                                        value_descriptor));
  }
  {
    const FieldDescriptor* descriptor = F("map_fixed32_fixed32");
    const FieldDescriptor* key_descriptor =
        descriptor->message_type()->FindFieldByName("key");
    const FieldDescriptor* value_descriptor =
        descriptor->message_type()->FindFieldByName("value");
    sub_message = reflection->AddMessage(message, F("map_fixed32_fixed32"));
    EXPECT_EQ(0, sub_message->GetReflection()->GetUInt32(*sub_message,
                                                         key_descriptor));
    EXPECT_EQ(0, sub_message->GetReflection()->GetUInt32(*sub_message,
                                                         value_descriptor));
  }
  {
    const FieldDescriptor* descriptor = F("map_fixed64_fixed64");
    const FieldDescriptor* key_descriptor =
        descriptor->message_type()->FindFieldByName("key");
    const FieldDescriptor* value_descriptor =
        descriptor->message_type()->FindFieldByName("value");
    sub_message = reflection->AddMessage(message, F("map_fixed64_fixed64"));
    EXPECT_EQ(0, sub_message->GetReflection()->GetUInt64(*sub_message,
                                                         key_descriptor));
    EXPECT_EQ(0, sub_message->GetReflection()->GetUInt64(*sub_message,
                                                         value_descriptor));
  }
  {
    const FieldDescriptor* descriptor = F("map_sfixed32_sfixed32");
    const FieldDescriptor* key_descriptor =
        descriptor->message_type()->FindFieldByName("key");
    const FieldDescriptor* value_descriptor =
        descriptor->message_type()->FindFieldByName("value");
    sub_message = reflection->AddMessage(message, F("map_sfixed32_sfixed32"));
    EXPECT_EQ(0, sub_message->GetReflection()->GetInt32(*sub_message,
                                                        key_descriptor));
    EXPECT_EQ(0, sub_message->GetReflection()->GetInt32(*sub_message,
                                                        value_descriptor));
  }
  {
    const FieldDescriptor* descriptor = F("map_sfixed64_sfixed64");
    const FieldDescriptor* key_descriptor =
        descriptor->message_type()->FindFieldByName("key");
    const FieldDescriptor* value_descriptor =
        descriptor->message_type()->FindFieldByName("value");
    sub_message = reflection->AddMessage(message, F("map_sfixed64_sfixed64"));
    EXPECT_EQ(0, sub_message->GetReflection()->GetInt64(*sub_message,
                                                        key_descriptor));
    EXPECT_EQ(0, sub_message->GetReflection()->GetInt64(*sub_message,
                                                        value_descriptor));
  }
  {
    const FieldDescriptor* descriptor = F("map_int32_float");
    const FieldDescriptor* key_descriptor =
        descriptor->message_type()->FindFieldByName("key");
    const FieldDescriptor* value_descriptor =
        descriptor->message_type()->FindFieldByName("value");
    sub_message = reflection->AddMessage(message, F("map_int32_float"));
    EXPECT_EQ(0, sub_message->GetReflection()->GetInt32(*sub_message,
                                                        key_descriptor));
    EXPECT_EQ(0, sub_message->GetReflection()->GetFloat(*sub_message,
                                                        value_descriptor));
  }
  {
    const FieldDescriptor* descriptor = F("map_int32_double");
    const FieldDescriptor* key_descriptor =
        descriptor->message_type()->FindFieldByName("key");
    const FieldDescriptor* value_descriptor =
        descriptor->message_type()->FindFieldByName("value");
    sub_message = reflection->AddMessage(message, F("map_int32_double"));
    EXPECT_EQ(0, sub_message->GetReflection()->GetInt32(*sub_message,
                                                        key_descriptor));
    EXPECT_EQ(0, sub_message->GetReflection()->GetDouble(*sub_message,
                                                         value_descriptor));
  }
  {
    const FieldDescriptor* descriptor = F("map_bool_bool");
    const FieldDescriptor* key_descriptor =
        descriptor->message_type()->FindFieldByName("key");
    const FieldDescriptor* value_descriptor =
        descriptor->message_type()->FindFieldByName("value");
    sub_message = reflection->AddMessage(message, F("map_bool_bool"));
    EXPECT_EQ(false, sub_message->GetReflection()->GetBool(*sub_message,
                                                           key_descriptor));
    EXPECT_EQ(false, sub_message->GetReflection()->GetBool(*sub_message,
                                                           value_descriptor));
  }
  {
    const FieldDescriptor* descriptor = F("map_string_string");
    const FieldDescriptor* key_descriptor =
        descriptor->message_type()->FindFieldByName("key");
    const FieldDescriptor* value_descriptor =
        descriptor->message_type()->FindFieldByName("value");
    sub_message = reflection->AddMessage(message, F("map_string_string"));
    EXPECT_EQ("", sub_message->GetReflection()->GetString(*sub_message,
                                                          key_descriptor));
    EXPECT_EQ("", sub_message->GetReflection()->GetString(*sub_message,
                                                          value_descriptor));
  }
  {
    const FieldDescriptor* descriptor = F("map_int32_bytes");
    const FieldDescriptor* key_descriptor =
        descriptor->message_type()->FindFieldByName("key");
    const FieldDescriptor* value_descriptor =
        descriptor->message_type()->FindFieldByName("value");
    sub_message = reflection->AddMessage(message, F("map_int32_bytes"));
    EXPECT_EQ(0, sub_message->GetReflection()->GetInt32(*sub_message,
                                                        key_descriptor));
    EXPECT_EQ("", sub_message->GetReflection()->GetString(*sub_message,
                                                        value_descriptor));
  }
  {
    const FieldDescriptor* descriptor = F("map_int32_enum");
    const FieldDescriptor* key_descriptor =
        descriptor->message_type()->FindFieldByName("key");
    const FieldDescriptor* value_descriptor =
        descriptor->message_type()->FindFieldByName("value");
    sub_message = reflection->AddMessage(message, F("map_int32_enum"));
    EXPECT_EQ(0, sub_message->GetReflection()->GetInt32(*sub_message,
                                                        key_descriptor));
    EXPECT_EQ(0, sub_message->GetReflection()
                     ->GetEnum(*sub_message, value_descriptor)
                     ->number());
  }
  // Map using message as value has been tested in other place. Thus, we don't
  // test it here.
}

}  // namespace protobuf
}  // namespace google
