1b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Protocol Buffers - Google's data interchange format 2b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Copyright 2008 Google Inc. All rights reserved. 3b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// https://developers.google.com/protocol-buffers/ 4b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// 5b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Redistribution and use in source and binary forms, with or without 6b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// modification, are permitted provided that the following conditions are 7b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// met: 8b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// 9b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// * Redistributions of source code must retain the above copyright 10b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// notice, this list of conditions and the following disclaimer. 11b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// * Redistributions in binary form must reproduce the above 12b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// copyright notice, this list of conditions and the following disclaimer 13b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// in the documentation and/or other materials provided with the 14b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// distribution. 15b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// * Neither the name of Google Inc. nor the names of its 16b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// contributors may be used to endorse or promote products derived from 17b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// this software without specific prior written permission. 18b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// 19b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 31b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// A hack to include windows.h first, which ensures the GetMessage macro can 32b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// be undefined when we include <google/protobuf/stubs/common.h> 33b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#if defined(_WIN32) 34b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#define _WINSOCKAPI_ // to avoid re-definition in WinSock2.h 35b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#define NOMINMAX // to avoid defining min/max macros 36b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <windows.h> 37b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#endif // _WIN32 38b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 39b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <algorithm> 40b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/stubs/hash.h> 41b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <map> 42b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <memory> 43b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#ifndef _SHARED_PTR_H 44b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/stubs/shared_ptr.h> 45b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#endif 46b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <set> 47b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <sstream> 48b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <vector> 49b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 50b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/stubs/casts.h> 51b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/stubs/logging.h> 52b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/stubs/common.h> 53b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/stubs/scoped_ptr.h> 54b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/stubs/stringprintf.h> 55b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/testing/file.h> 56b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/arena_test_util.h> 57b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/map_proto2_unittest.pb.h> 58b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/map_unittest.pb.h> 59b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/map_test_util.h> 60b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/test_util.h> 61b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/unittest.pb.h> 62b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/descriptor.pb.h> 63b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/descriptor.h> 64b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/descriptor_database.h> 65b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/dynamic_message.h> 66b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/map.h> 67b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/map_field_inl.h> 68b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/message.h> 69b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/reflection.h> 70b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/reflection_ops.h> 71b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/text_format.h> 72b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/wire_format.h> 73b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/wire_format_lite_inl.h> 74b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/io/coded_stream.h> 75b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/io/tokenizer.h> 76b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/io/zero_copy_stream_impl.h> 77b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/util/time_util.h> 78b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/stubs/strutil.h> 79b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/stubs/substitute.h> 80b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/testing/googletest.h> 81b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <gtest/gtest.h> 82b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 83b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammernamespace google { 84b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 85b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerusing google::protobuf::unittest::ForeignMessage; 86b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerusing google::protobuf::unittest::TestAllTypes; 87b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerusing google::protobuf::unittest::TestMap; 88b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerusing google::protobuf::unittest::TestRecursiveMapMessage; 89b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 90b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammernamespace protobuf { 91b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammernamespace internal { 92b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 93b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Map API Test ===================================================== 94b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 95b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Parameterized tests on whether to use old style maps. 96b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerclass MapImplTest : public testing::TestWithParam<bool> { 97b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer protected: 98b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapImplTest() 99b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer : map_ptr_(new Map<int32, int32>(GetParam())), 100b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer map_(*map_ptr_), 101b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const_map_(*map_ptr_) { 102b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(map_.empty()); 103b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(0, map_.size()); 104b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 105b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ~MapImplTest() {} 106b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 107b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer void ExpectSingleElement(int32 key, int32 value) { 108b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_FALSE(map_.empty()); 109b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(1, map_.size()); 110b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectElement(key, value); 111b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 112b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 113b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer void ExpectElements(const std::map<int32, int32>& map) { 114b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_FALSE(map_.empty()); 115b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(map.size(), map_.size()); 116b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (std::map<int32, int32>::const_iterator it = map.begin(); 117b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer it != map.end(); ++it) { 118b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectElement(it->first, it->second); 119b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 120b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 121b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 122b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer void ExpectElement(int32 key, int32 value) { 123b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Test map size is correct. 124b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(value, map_[key]); 125b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(1, map_.count(key)); 126b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 127b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Check mutable at and find work correctly. 128b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(value, map_.at(key)); 129b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Map<int32, int32>::iterator it = map_.find(key); 130b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 131b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // interator dereferenceable 132b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(key, (*it).first); 133b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(value, (*it).second); 134b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(key, it->first); 135b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(value, it->second); 136b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 137b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // iterator mutable 138b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ((*it).second) = value + 1; 139b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(value + 1, map_[key]); 140b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ((*it).second) = value; 141b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(value, map_[key]); 142b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 143b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer it->second = value + 1; 144b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(value + 1, map_[key]); 145b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer it->second = value; 146b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(value, map_[key]); 147b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 148b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // copy constructor 149b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Map<int32, int32>::iterator it_copy = it; 150b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(key, it_copy->first); 151b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(value, it_copy->second); 152b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 153b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Immutable API ================================================ 154b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 155b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Check immutable at and find work correctly. 156b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(value, const_map_.at(key)); 157b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Map<int32, int32>::const_iterator const_it = const_map_.find(key); 158b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 159b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // interator dereferenceable 160b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(key, (*const_it).first); 161b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(value, (*const_it).second); 162b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(key, const_it->first); 163b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(value, const_it->second); 164b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 165b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // copy constructor 166b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Map<int32, int32>::const_iterator const_it_copy = const_it; 167b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(key, const_it_copy->first); 168b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(value, const_it_copy->second); 169b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 170b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 171b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer google::protobuf::scoped_ptr<Map<int32, int32> > map_ptr_; 172b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Map<int32, int32>& map_; 173b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Map<int32, int32>& const_map_; 174b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}; 175b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 176b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST_P(MapImplTest, OperatorBracket) { 177b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 key = 0; 178b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 value1 = 100; 179b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 value2 = 101; 180b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 181b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(0, map_[key]); 182b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 183b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer map_[key] = value1; 184b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectSingleElement(key, value1); 185b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 186b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer map_[key] = value2; 187b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectSingleElement(key, value2); 188b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 189b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 190b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST_P(MapImplTest, OperatorBracketNonExist) { 191b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 key = 0; 192b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 default_value = 0; 193b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 194b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(default_value, map_[key]); 195b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectSingleElement(key, default_value); 196b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 197b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 198b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST_P(MapImplTest, MutableAt) { 199b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 key = 0; 200b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 value1 = 100; 201b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 value2 = 101; 202b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 203b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer map_[key] = value1; 204b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectSingleElement(key, value1); 205b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 206b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer map_.at(key) = value2; 207b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectSingleElement(key, value2); 208b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 209b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 210b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#ifdef PROTOBUF_HAS_DEATH_TEST 211b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 212b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST_P(MapImplTest, MutableAtNonExistDeathTest) { 213b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_DEATH(map_.at(0), ""); 214b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 215b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 216b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST_P(MapImplTest, ImmutableAtNonExistDeathTest) { 217b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_DEATH(const_map_.at(0), ""); 218b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 219b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 220b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST_P(MapImplTest, UsageErrors) { 221b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapKey key; 222b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer key.SetInt64Value(1); 223b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_DEATH(key.GetUInt64Value(), 224b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Protocol Buffer map usage error:\n" 225b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "MapKey::GetUInt64Value type does not match\n" 226b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer " Expected : uint64\n" 227b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer " Actual : int64"); 228b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 229b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapValueRef value; 230b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_DEATH(value.SetFloatValue(0.1), 231b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Protocol Buffer map usage error:\n" 232b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "MapValueRef::type MapValueRef is not initialized."); 233b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 234b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 235b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#endif // PROTOBUF_HAS_DEATH_TEST 236b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 237b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST_P(MapImplTest, CountNonExist) { 238b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(0, map_.count(0)); 239b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 240b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 241b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST_P(MapImplTest, MutableFindNonExist) { 242b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(map_.end() == map_.find(0)); 243b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 244b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 245b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST_P(MapImplTest, ImmutableFindNonExist) { 246b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(const_map_.end() == const_map_.find(0)); 247b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 248b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 249b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST_P(MapImplTest, ConstEnd) { 250b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(const_map_.end() == const_map_.cend()); 251b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 252b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 253b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST_P(MapImplTest, GetReferenceFromIterator) { 254b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (int i = 0; i < 10; i++) { 255b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer map_[i] = i; 256b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 257b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 258b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (Map<int32, int32>::const_iterator it = map_.cbegin(); 259b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer it != map_.cend();) { 260b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Map<int32, int32>::const_reference entry = *it++; 261b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(entry.first, entry.second); 262b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 263b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 264b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (Map<int32, int32>::const_iterator it = const_map_.begin(); 265b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer it != const_map_.end();) { 266b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Map<int32, int32>::const_reference entry = *it++; 267b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(entry.first, entry.second); 268b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 269b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 270b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (Map<int32, int32>::iterator it = map_.begin(); it != map_.end();) { 271b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Map<int32, int32>::reference entry = *it++; 272b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(entry.first + 1, ++entry.second); 273b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 274b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 275b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 276b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST_P(MapImplTest, IteratorBasic) { 277b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer map_[0] = 0; 278b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 279b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Default constructible (per forward iterator requirements). 280b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Map<int, int>::const_iterator cit; 281b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Map<int, int>::iterator it; 282b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 283b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer it = map_.begin(); 284b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer cit = it; // Converts to const_iterator 285b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 286b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Can compare between them. 287b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(it == cit); 288b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_FALSE(cit != it); 289b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 290b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Pre increment. 291b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_FALSE(it == ++cit); 292b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 293b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Post increment. 294b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_FALSE(it++ == cit); 295b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(it == cit); 296b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 297b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 298b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammertemplate <typename Iterator> 299b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerstatic int64 median(Iterator i0, Iterator i1) { 300b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer vector<int64> v(i0, i1); 301b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer std::nth_element(v.begin(), v.begin() + v.size() / 2, v.end()); 302b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return v[v.size() / 2]; 303b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 304b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 305b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerstatic int64 Now() { 306b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return google::protobuf::util::TimeUtil::TimestampToNanoseconds( 307b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer google::protobuf::util::TimeUtil::GetCurrentTime()); 308b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 309b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 310b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Arbitrary odd integers for creating test data. 311b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerstatic int k0 = 812398771; 312b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerstatic int k1 = 1312938717; 313b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerstatic int k2 = 1321555333; 314b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 315b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// A naive begin() implementation will cause begin() to get slower and slower 316b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// if one erases elements at the "front" of the hash map, and we'd like to 317b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// avoid that, as std::unordered_map does. 318b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST_P(MapImplTest, BeginIsFast) { 319b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Disable this test for both new and old implementations. 320b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (/*GetParam()*/true) return; 321b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Map<int32, int32> map(false); // This test uses new-style maps only. 322b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const int kTestSize = 250000; 323b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Create a random-looking map of size n. Use non-negative integer keys. 324b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer uint32 frog = 123983; 325b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int last_key = 0; 326b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int counter = 0; 327b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer while (map.size() < kTestSize) { 328b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer frog *= static_cast<uint32>(k0); 329b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer frog ^= frog >> 17; 330b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer frog += counter++; 331b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer last_key = 332b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer static_cast<int>(frog) >= 0 ? static_cast<int>(frog) : last_key ^ 1; 333b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer GOOGLE_DCHECK_GE(last_key, 0); 334b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer map[last_key] = last_key ^ 1; 335b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 336b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer vector<int64> times; 337b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // We're going to do map.erase(map.begin()) over and over again. But, 338b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // just in case one iteration is fast compared to the granularity of 339b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // our time keeping, we measure kChunkSize iterations per outer-loop iter. 340b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const int kChunkSize = 1000; 341b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer GOOGLE_CHECK_EQ(kTestSize % kChunkSize, 0); 342b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer do { 343b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const int64 start = Now(); 344b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (int i = 0; i < kChunkSize; i++) { 345b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer map.erase(map.begin()); 346b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 347b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const int64 end = Now(); 348b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (end > start) { 349b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer times.push_back(end - start); 350b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 351b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } while (!map.empty()); 352b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (times.size() < .99 * kTestSize / kChunkSize) { 353b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer GOOGLE_LOG(WARNING) << "Now() isn't helping us measure time"; 354b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return; 355b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 356b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int64 x0 = median(times.begin(), times.begin() + 9); 357b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int64 x1 = median(times.begin() + times.size() - 9, times.end()); 358b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer GOOGLE_LOG(INFO) << "x0=" << x0 << ", x1=" << x1; 359b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // x1 will greatly exceed x0 if the code we just executed took O(n^2) time. 360b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // And we'll probably time out and never get here. So, this test is 361b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // intentionally loose: we check that x0 and x1 are within a factor of 8. 362b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_GE(x1, x0 / 8); 363b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_GE(x0, x1 / 8); 364b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 365b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 366b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Try to create kTestSize keys that will land in just a few buckets, and 367b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// time the insertions, to get a rough estimate of whether an O(n^2) worst case 368b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// was triggered. This test is a hacky, but probably better than nothing. 369b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST_P(MapImplTest, HashFlood) { 370b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const int kTestSize = 1024; // must be a power of 2 371b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer std::set<int> s; 372b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (int i = 0; s.size() < kTestSize; i++) { 373b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if ((map_.hash_function()(i) & (kTestSize - 1)) < 3) { 374b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer s.insert(i); 375b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 376b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 377b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Create hash table with kTestSize entries that hash flood a table with 378b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // 1024 (or 512 or 2048 or ...) entries. This assumes that map_ uses powers 379b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // of 2 for table sizes, and that it's sufficient to "flood" with respect to 380b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // the low bits of the output of map_.hash_function(). 381b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer vector<int64> times; 382b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer std::set<int>::iterator it = s.begin(); 383b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int count = 0; 384b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer do { 385b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const int64 start = Now(); 386b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer map_[*it] = 0; 387b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const int64 end = Now(); 388b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (end > start) { 389b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer times.push_back(end - start); 390b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 391b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ++count; 392b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ++it; 393b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } while (it != s.end()); 394b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (times.size() < .99 * count) return; 395b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int64 x0 = median(times.begin(), times.begin() + 9); 396b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int64 x1 = median(times.begin() + times.size() - 9, times.end()); 397b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // x1 will greatly exceed x0 if the code we just executed took O(n^2) time. 398b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // But we want to allow O(n log n). A factor of 20 should be generous enough. 399b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_LE(x1, x0 * 20); 400b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 401b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 402b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammertemplate <typename T, typename U> 403b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerstatic void TestValidityForAllKeysExcept(int key_to_avoid, 404b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const T& check_map, 405b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const U& map) { 406b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer typedef typename U::value_type value_type; // a key-value pair 407b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (typename U::const_iterator it = map.begin(); it != map.end(); ++it) { 408b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const int key = it->first; 409b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (key == key_to_avoid) continue; 410b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // All iterators relevant to this key, whether old (from check_map) or new, 411b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // must point to the same memory. So, test pointer equality here. 412b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const value_type* check_val = &*check_map.find(key)->second; 413b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(check_val, &*it); 414b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(check_val, &*map.find(key)); 415b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 416b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 417b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 418b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// EXPECT i0 and i1 to be the same. Advancing them should have the same effect, 419b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// too. 420b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammertemplate <typename Iter> 421b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerstatic void TestEqualIterators(Iter i0, Iter i1, Iter end) { 422b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const int kMaxAdvance = 10; 423b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (int i = 0; i < kMaxAdvance; i++) { 424b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(i0 == end, i1 == end); 425b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (i0 == end) return; 426b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(&*i0, &*i1) << "iter " << i; 427b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ++i0; 428b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ++i1; 429b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 430b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 431b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 432b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammertemplate <typename IteratorType> 433b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerstatic void TestOldVersusNewIterator(int skip, Map<int, int>* m) { 434b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const int initial_size = m->size(); 435b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer IteratorType it = m->begin(); 436b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (int i = 0; i < skip && it != m->end(); it++, i++) {} 437b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (it == m->end()) return; 438b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const IteratorType old = it; 439b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer GOOGLE_LOG(INFO) << "skip=" << skip << ", old->first=" << old->first; 440b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const int target_size = 441b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer initial_size < 100 ? initial_size * 5 : initial_size * 5 / 4; 442b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (int i = 0; m->size() <= target_size; i++) { 443b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer (*m)[i] = 0; 444b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 445b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Iterator 'old' should still work just fine despite the growth of *m. 446b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const IteratorType after_growth = m->find(old->first); 447b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer TestEqualIterators<IteratorType>(old, after_growth, m->end()); 448b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 449b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Now shrink the number of elements. Do this with a mix of erases and 450b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // inserts to increase the chance that the hashtable will resize to a lower 451b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // number of buckets. (But, in any case, the test is still useful.) 452b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (int i = 0; i < 2 * (target_size - initial_size); i++) { 453b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (i != old->first) { 454b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer m->erase(i); 455b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 456b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (((i ^ m->begin()->first) & 15) == 0) { 457b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer (*m)[i * 342] = i; 458b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 459b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 460b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Now, the table has grown and shrunk; test again. 461b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer TestEqualIterators<IteratorType>(old, m->find(old->first), m->end()); 462b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer TestEqualIterators<IteratorType>(old, after_growth, m->end()); 463b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 464b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 465b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Create and test an n-element Map, with emphasis on iterator correctness. 466b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerstatic void StressTestIterators(int n, bool test_old_style_proto2_maps) { 467b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer GOOGLE_LOG(INFO) << "StressTestIterators " << n; 468b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer GOOGLE_CHECK_GT(n, 0); 469b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Create a random-looking map of size n. Use non-negative integer keys. 470b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Map<int, int> m(test_old_style_proto2_maps); 471b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer uint32 frog = 123987 + n; 472b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int last_key = 0; 473b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int counter = 0; 474b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer while (m.size() < n) { 475b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer frog *= static_cast<uint32>(k0); 476b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer frog ^= frog >> 17; 477b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer frog += counter++; 478b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer last_key = 479b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer static_cast<int>(frog) >= 0 ? static_cast<int>(frog) : last_key ^ 1; 480b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer GOOGLE_DCHECK_GE(last_key, 0); 481b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer m[last_key] = last_key ^ 1; 482b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 483b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Test it. 484b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ASSERT_EQ(n, m.size()); 485b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Create maps of pointers and iterators. 486b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // These should remain valid even if we modify m. 487b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer hash_map<int, Map<int, int>::value_type*> mp(n); 488b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer hash_map<int, Map<int, int>::iterator> mi(n); 489b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (Map<int, int>::iterator it = m.begin(); it != m.end(); ++it) { 490b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mp[it->first] = &*it; 491b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mi[it->first] = it; 492b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 493b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ASSERT_EQ(m.size(), mi.size()); 494b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ASSERT_EQ(m.size(), mp.size()); 495b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer m.erase(last_key); 496b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ASSERT_EQ(n - 1, m.size()); 497b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer TestValidityForAllKeysExcept(last_key, mp, m); 498b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer TestValidityForAllKeysExcept(last_key, mi, m); 499b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 500b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer m[last_key] = 0; 501b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ASSERT_EQ(n, m.size()); 502b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Test old iterator vs new iterator, with table modification in between. 503b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer TestOldVersusNewIterator<Map<int, int>::const_iterator>(n % 3, &m); 504b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer TestOldVersusNewIterator<Map<int, int>::iterator>(n % (1 + (n / 40)), &m); 505b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Finally, ensure erase(iterator) doesn't reorder anything, becuase that is 506b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // what its documentation says. 507b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer m[last_key] = m[last_key ^ 999] = 0; 508b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer vector<Map<int, int>::iterator> v; 509b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer v.reserve(m.size()); 510b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int position_of_last_key = 0; 511b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (Map<int, int>::iterator it = m.begin(); it != m.end(); ++it) { 512b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (it->first == last_key) { 513b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer position_of_last_key = v.size(); 514b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 515b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer v.push_back(it); 516b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 517b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ASSERT_EQ(m.size(), v.size()); 518b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Map<int, int>::iterator erase_result = m.erase(m.find(last_key)); 519b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int index = 0; 520b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (Map<int, int>::iterator it = m.begin(); it != m.end(); ++it, ++index) { 521b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (index == position_of_last_key) { 522b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(&*erase_result, &*v[++index]); 523b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 524b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ASSERT_EQ(&*it, &*v[index]); 525b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 526b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 527b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 528b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST_P(MapImplTest, IteratorInvalidation) { 529b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // As multiple underlying hash_map implementations do not follow the 530b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // validation requirement, the test is disabled for old-style maps. 531b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (GetParam()) return; 532b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Create a set of pseudo-random sizes to test. 533b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#ifndef NDEBUG 534b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const int kMaxSizeToTest = 100 * 1000; 535b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#else 536b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const int kMaxSizeToTest = 1000 * 1000; 537b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#endif 538b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer std::set<int> s; 539b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int n = kMaxSizeToTest; 540b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int frog = k1 + n; 541b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer while (n > 1 && s.size() < 25) { 542b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer s.insert(n); 543b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer n = static_cast<int>(n * 100 / (101.0 + (frog & 63))); 544b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer frog *= k2; 545b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer frog ^= frog >> 17; 546b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 547b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Ensure we test a few small sizes. 548b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer s.insert(1); 549b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer s.insert(2); 550b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer s.insert(3); 551b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Now, the real work. 552b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (std::set<int>::iterator i = s.begin(); i != s.end(); ++i) { 553b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer StressTestIterators(*i, GetParam()); 554b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 555b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 556b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 557b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Test that erase() revalidates iterators. 558b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST_P(MapImplTest, EraseRevalidates) { 559b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // As multiple underlying hash_map implementations do not follow the 560b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // validation requirement, the test is disabled for old-style maps. 561b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (GetParam()) return; 562b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer map_[3] = map_[13] = map_[20] = 0; 563b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const int initial_size = map_.size(); 564b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(3, initial_size); 565b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer vector<Map<int, int>::iterator> v; 566b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (Map<int, int>::iterator it = map_.begin(); it != map_.end(); ++it) { 567b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer v.push_back(it); 568b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 569b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(initial_size, v.size()); 570b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (int i = 0; map_.size() <= initial_size * 20; i++) { 571b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer map_[i] = 0; 572b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 573b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const int larger_size = map_.size(); 574b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // We've greatly increased the size of the map, so it is highly likely that 575b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // the following will corrupt m if erase() doesn't properly revalidate 576b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // iterators passed to it. Finishing this routine without crashing indicates 577b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // success. 578b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (int i = 0; i < v.size(); i++) { 579b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer map_.erase(v[i]); 580b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 581b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(larger_size - v.size(), map_.size()); 582b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 583b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 584b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammertemplate <typename T> 585b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerbool IsConstHelper(T& /*t*/) { // NOLINT. We want to catch non-const refs here. 586b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return false; 587b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 588b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammertemplate <typename T> 589b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerbool IsConstHelper(const T& /*t*/) { 590b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return true; 591b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 592b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 593b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST_P(MapImplTest, IteratorConstness) { 594b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer map_[0] = 0; 595b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(IsConstHelper(*map_.cbegin())); 596b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(IsConstHelper(*const_map_.begin())); 597b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_FALSE(IsConstHelper(*map_.begin())); 598b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 599b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 600b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerbool IsForwardIteratorHelper(std::forward_iterator_tag /*tag*/) { return true; } 601b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammertemplate <typename T> 602b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerbool IsForwardIteratorHelper(T /*t*/) { 603b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return false; 604b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 605b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 606b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST_P(MapImplTest, IteratorCategory) { 607b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(IsForwardIteratorHelper( 608b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer std::iterator_traits<Map<int, int>::iterator>::iterator_category())); 609b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(IsForwardIteratorHelper(std::iterator_traits< 610b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Map<int, int>::const_iterator>::iterator_category())); 611b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 612b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 613b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST_P(MapImplTest, InsertSingle) { 614b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 key = 0; 615b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 value1 = 100; 616b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 value2 = 101; 617b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 618b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Insert a non-existed key. 619b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer std::pair<Map<int32, int32>::iterator, bool> result1 = 620b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer map_.insert(Map<int32, int32>::value_type(key, value1)); 621b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectSingleElement(key, value1); 622b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 623b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Map<int32, int32>::iterator it1 = result1.first; 624b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(key, it1->first); 625b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(value1, it1->second); 626b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(result1.second); 627b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 628b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Insert an existed key. 629b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer std::pair<Map<int32, int32>::iterator, bool> result2 = 630b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer map_.insert(Map<int32, int32>::value_type(key, value2)); 631b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectSingleElement(key, value1); 632b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 633b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Map<int32, int32>::iterator it2 = result2.first; 634b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(it1 == it2); 635b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_FALSE(result2.second); 636b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 637b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 638b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST_P(MapImplTest, InsertByIterator) { 639b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 key1 = 0; 640b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 key2 = 1; 641b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 value1a = 100; 642b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 value1b = 101; 643b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 value2a = 200; 644b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 value2b = 201; 645b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 646b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer std::map<int32, int32> map1; 647b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer map1[key1] = value1a; 648b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer map1[key2] = value2a; 649b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 650b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer map_.insert(map1.begin(), map1.end()); 651b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectElements(map1); 652b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 653b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer std::map<int32, int32> map2; 654b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer map2[key1] = value1b; 655b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer map2[key2] = value2b; 656b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 657b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer map_.insert(map2.begin(), map2.end()); 658b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectElements(map1); 659b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 660b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 661b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST_P(MapImplTest, EraseSingleByKey) { 662b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 key = 0; 663b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 value = 100; 664b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 665b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer map_[key] = value; 666b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectSingleElement(key, value); 667b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 668b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Erase an existing key. 669b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(1, map_.erase(key)); 670b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(map_.empty()); 671b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(0, map_.size()); 672b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(map_.end() == map_.find(key)); 673b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(map_.begin() == map_.end()); 674b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 675b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Erase a non-existing key. 676b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(0, map_.erase(key)); 677b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 678b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 679b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST_P(MapImplTest, EraseMutipleByKey) { 680b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // erase in one specific order to trigger corner cases 681b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (int i = 0; i < 5; i++) { 682b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer map_[i] = i; 683b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 684b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 685b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer map_.erase(0); 686b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(4, map_.size()); 687b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(map_.end() == map_.find(0)); 688b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 689b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer map_.erase(1); 690b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(3, map_.size()); 691b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(map_.end() == map_.find(1)); 692b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 693b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer map_.erase(3); 694b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(2, map_.size()); 695b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(map_.end() == map_.find(3)); 696b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 697b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer map_.erase(4); 698b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(1, map_.size()); 699b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(map_.end() == map_.find(4)); 700b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 701b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer map_.erase(2); 702b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(0, map_.size()); 703b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(map_.end() == map_.find(2)); 704b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 705b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 706b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST_P(MapImplTest, EraseSingleByIterator) { 707b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 key = 0; 708b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 value = 100; 709b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 710b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer map_[key] = value; 711b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectSingleElement(key, value); 712b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 713b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Map<int32, int32>::iterator it = map_.find(key); 714b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer map_.erase(it); 715b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(map_.empty()); 716b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(0, map_.size()); 717b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(map_.end() == map_.find(key)); 718b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(map_.begin() == map_.end()); 719b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 720b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 721b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST_P(MapImplTest, ValidIteratorAfterErase) { 722b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (int i = 0; i < 10; i++) { 723b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer map_[i] = i; 724b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 725b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 726b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int count = 0; 727b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 728b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (Map<int32, int32>::iterator it = map_.begin(); it != map_.end();) { 729b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer count++; 730b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (it->first % 2 == 1) { 731b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer map_.erase(it++); 732b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } else { 733b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ++it; 734b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 735b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 736b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 737b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(10, count); 738b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(5, map_.size()); 739b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 740b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 741b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST_P(MapImplTest, EraseByIterator) { 742b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 key1 = 0; 743b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 key2 = 1; 744b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 value1 = 100; 745b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 value2 = 101; 746b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 747b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer std::map<int32, int32> map; 748b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer map[key1] = value1; 749b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer map[key2] = value2; 750b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 751b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer map_.insert(map.begin(), map.end()); 752b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectElements(map); 753b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 754b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer map_.erase(map_.begin(), map_.end()); 755b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(map_.empty()); 756b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(0, map_.size()); 757b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(map_.end() == map_.find(key1)); 758b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(map_.end() == map_.find(key2)); 759b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(map_.begin() == map_.end()); 760b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 761b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 762b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST_P(MapImplTest, Clear) { 763b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 key = 0; 764b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 value = 100; 765b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 766b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer map_[key] = value; 767b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectSingleElement(key, value); 768b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 769b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer map_.clear(); 770b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 771b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(map_.empty()); 772b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(0, map_.size()); 773b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(map_.end() == map_.find(key)); 774b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(map_.begin() == map_.end()); 775b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 776b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 777b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerstatic void CopyConstructorHelper(Arena* arena, Map<int32, int32>* m) { 778b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 key1 = 0; 779b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 key2 = 1; 780b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 value1 = 100; 781b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 value2 = 101; 782b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 783b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer std::map<int32, int32> map; 784b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer map[key1] = value1; 785b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer map[key2] = value2; 786b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 787b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer m->insert(map.begin(), map.end()); 788b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 789b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Map<int32, int32> other(*m); 790b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 791b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(2, other.size()); 792b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(value1, other.at(key1)); 793b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(value2, other.at(key2)); 794b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 795b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 796b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST_P(MapImplTest, CopyConstructorWithArena) { 797b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Arena a; 798b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer CopyConstructorHelper(&a, &map_); 799b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 800b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 801b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST_P(MapImplTest, CopyConstructorWithoutArena) { 802b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer CopyConstructorHelper(NULL, &map_); 803b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 804b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 805b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST_P(MapImplTest, IterConstructor) { 806b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 key1 = 0; 807b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 key2 = 1; 808b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 value1 = 100; 809b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 value2 = 101; 810b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 811b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer std::map<int32, int32> map; 812b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer map[key1] = value1; 813b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer map[key2] = value2; 814b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 815b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Map<int32, int32> new_map(map.begin(), map.end(), 816b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer GetParam()); 817b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 818b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(2, new_map.size()); 819b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(value1, new_map.at(key1)); 820b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(value2, new_map.at(key2)); 821b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 822b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 823b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST_P(MapImplTest, Assigner) { 824b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 key1 = 0; 825b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 key2 = 1; 826b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 value1 = 100; 827b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 value2 = 101; 828b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 829b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer std::map<int32, int32> map; 830b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer map[key1] = value1; 831b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer map[key2] = value2; 832b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 833b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer map_.insert(map.begin(), map.end()); 834b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 835b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Map<int32, int32> other(GetParam()); 836b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 key_other = 123; 837b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 value_other = 321; 838b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer other[key_other] = value_other; 839b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(1, other.size()); 840b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 841b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer other = map_; 842b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 843b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(2, other.size()); 844b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(value1, other.at(key1)); 845b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(value2, other.at(key2)); 846b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(other.find(key_other) == other.end()); 847b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 848b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Self assign 849b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer other = other; 850b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(2, other.size()); 851b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(value1, other.at(key1)); 852b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(value2, other.at(key2)); 853b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 854b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Try assignment to a map with a different choice of "style." 855b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Map<int32, int32> m(!GetParam()); 856b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer m = other; 857b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(2, m.size()); 858b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(value1, m.at(key1)); 859b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(value2, m.at(key2)); 860b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 861b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 862b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST_P(MapImplTest, Rehash) { 863b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const int test_size = 50; 864b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer std::map<int32, int32> reference_map; 865b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (int i = 0; i < test_size; i++) { 866b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reference_map[i] = i; 867b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 868b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (int i = 0; i < test_size; i++) { 869b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer map_[i] = reference_map[i]; 870b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(reference_map[i], map_[i]); 871b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 872b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (int i = 0; i < test_size; i++) { 873b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer map_.erase(i); 874b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(map_.end() == map_.find(i)); 875b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 876b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(map_.empty()); 877b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 878b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 879b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST_P(MapImplTest, EqualRange) { 880b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int key = 100, key_missing = 101; 881b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer map_[key] = 100; 882b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 883b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer std::pair<google::protobuf::Map<int32, int32>::iterator, 884b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer google::protobuf::Map<int32, int32>::iterator> range = map_.equal_range(key); 885b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(map_.find(key) == range.first); 886b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(++map_.find(key) == range.second); 887b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 888b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer range = map_.equal_range(key_missing); 889b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(map_.end() == range.first); 890b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(map_.end() == range.second); 891b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 892b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer std::pair<google::protobuf::Map<int32, int32>::const_iterator, 893b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer google::protobuf::Map<int32, int32>::const_iterator> const_range = 894b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const_map_.equal_range(key); 895b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(const_map_.find(key) == const_range.first); 896b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(++const_map_.find(key) == const_range.second); 897b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 898b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const_range = const_map_.equal_range(key_missing); 899b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(const_map_.end() == const_range.first); 900b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(const_map_.end() == const_range.second); 901b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 902b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 903b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST_P(MapImplTest, ConvertToStdMap) { 904b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer map_[100] = 101; 905b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer std::map<int32, int32> std_map(map_.begin(), map_.end()); 906b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(1, std_map.size()); 907b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(101, std_map[100]); 908b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 909b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 910b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST_P(MapImplTest, ConvertToStdVectorOfPairs) { 911b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer map_[100] = 101; 912b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer std::vector<std::pair<int32, int32> > std_vec(map_.begin(), map_.end()); 913b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(1, std_vec.size()); 914b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(100, std_vec[0].first); 915b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(101, std_vec[0].second); 916b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 917b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 918b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerINSTANTIATE_TEST_CASE_P(BoolSequence, MapImplTest, testing::Bool()); 919b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 920b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Map Field Reflection Test ======================================== 921b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 922b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerstatic int Func(int i, int j) { 923b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return i * j; 924b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 925b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 926b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerstatic string StrFunc(int i, int j) { 927b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string str; 928b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer SStringPrintf(&str, "%d", Func(i, j)); 929b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return str; 930b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 931b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 932b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerstatic int Int(const string& value) { 933b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int result = 0; 934b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer std::istringstream(value) >> result; 935b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return result; 936b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 937b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 938b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerclass MapFieldReflectionTest : public testing::Test { 939b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer protected: 940b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer typedef FieldDescriptor FD; 941b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}; 942b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 943b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST_F(MapFieldReflectionTest, RegularFields) { 944b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer TestMap message; 945b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Reflection* refl = message.GetReflection(); 946b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Descriptor* desc = message.GetDescriptor(); 947b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 948b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Map<int32, int32>* map_int32_int32 = message.mutable_map_int32_int32(); 949b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Map<int32, double>* map_int32_double = message.mutable_map_int32_double(); 950b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Map<string, string>* map_string_string = message.mutable_map_string_string(); 951b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Map<int32, ForeignMessage>* map_int32_foreign_message = 952b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message.mutable_map_int32_foreign_message(); 953b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 954b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (int i = 0; i < 10; ++i) { 955b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer (*map_int32_int32)[i] = Func(i, 1); 956b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer (*map_int32_double)[i] = Func(i, 2); 957b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer (*map_string_string)[StrFunc(i, 1)] = StrFunc(i, 5); 958b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer (*map_int32_foreign_message)[i].set_c(Func(i, 6)); 959b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 960b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 961b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Get FieldDescriptors for all the fields of interest. 962b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const FieldDescriptor* fd_map_int32_int32 = 963b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer desc->FindFieldByName("map_int32_int32"); 964b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const FieldDescriptor* fd_map_int32_double = 965b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer desc->FindFieldByName("map_int32_double"); 966b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const FieldDescriptor* fd_map_string_string = 967b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer desc->FindFieldByName("map_string_string"); 968b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const FieldDescriptor* fd_map_int32_foreign_message = 969b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer desc->FindFieldByName("map_int32_foreign_message"); 970b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 971b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const FieldDescriptor* fd_map_int32_in32_key = 972b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer fd_map_int32_int32->message_type()->FindFieldByName("key"); 973b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const FieldDescriptor* fd_map_int32_in32_value = 974b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer fd_map_int32_int32->message_type()->FindFieldByName("value"); 975b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const FieldDescriptor* fd_map_int32_double_key = 976b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer fd_map_int32_double->message_type()->FindFieldByName("key"); 977b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const FieldDescriptor* fd_map_int32_double_value = 978b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer fd_map_int32_double->message_type()->FindFieldByName("value"); 979b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const FieldDescriptor* fd_map_string_string_key = 980b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer fd_map_string_string->message_type()->FindFieldByName("key"); 981b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const FieldDescriptor* fd_map_string_string_value = 982b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer fd_map_string_string->message_type()->FindFieldByName("value"); 983b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const FieldDescriptor* fd_map_int32_foreign_message_key = 984b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer fd_map_int32_foreign_message->message_type()->FindFieldByName("key"); 985b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const FieldDescriptor* fd_map_int32_foreign_message_value = 986b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer fd_map_int32_foreign_message->message_type()->FindFieldByName("value"); 987b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 988b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Get RepeatedPtrField objects for all fields of interest. 989b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const RepeatedPtrField<Message>& mf_int32_int32 = 990b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer refl->GetRepeatedPtrField<Message>(message, fd_map_int32_int32); 991b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const RepeatedPtrField<Message>& mf_int32_double = 992b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer refl->GetRepeatedPtrField<Message>(message, fd_map_int32_double); 993b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const RepeatedPtrField<Message>& mf_string_string = 994b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer refl->GetRepeatedPtrField<Message>(message, fd_map_string_string); 995b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const RepeatedPtrField<Message>& 996b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mf_int32_foreign_message = 997b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer refl->GetRepeatedPtrField<Message>( 998b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message, fd_map_int32_foreign_message); 999b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1000b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Get mutable RepeatedPtrField objects for all fields of interest. 1001b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RepeatedPtrField<Message>* mmf_int32_int32 = 1002b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer refl->MutableRepeatedPtrField<Message>(&message, fd_map_int32_int32); 1003b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RepeatedPtrField<Message>* mmf_int32_double = 1004b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer refl->MutableRepeatedPtrField<Message>(&message, fd_map_int32_double); 1005b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RepeatedPtrField<Message>* mmf_string_string = 1006b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer refl->MutableRepeatedPtrField<Message>(&message, fd_map_string_string); 1007b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RepeatedPtrField<Message>* mmf_int32_foreign_message = 1008b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer refl->MutableRepeatedPtrField<Message>( 1009b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer &message, fd_map_int32_foreign_message); 1010b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1011b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Make sure we can do gets through the RepeatedPtrField objects. 1012b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (int i = 0; i < 10; ++i) { 1013b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer { 1014b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Check gets through const objects. 1015b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Message& message_int32_int32 = mf_int32_int32.Get(i); 1016b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 key_int32_int32 = message_int32_int32.GetReflection()->GetInt32( 1017b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message_int32_int32, fd_map_int32_in32_key); 1018b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 value_int32_int32 = message_int32_int32.GetReflection()->GetInt32( 1019b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message_int32_int32, fd_map_int32_in32_value); 1020b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(value_int32_int32, Func(key_int32_int32, 1)); 1021b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1022b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Message& message_int32_double = mf_int32_double.Get(i); 1023b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 key_int32_double = message_int32_double.GetReflection()->GetInt32( 1024b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message_int32_double, fd_map_int32_double_key); 1025b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer double value_int32_double = 1026b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message_int32_double.GetReflection()->GetDouble( 1027b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message_int32_double, fd_map_int32_double_value); 1028b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(value_int32_double, Func(key_int32_double, 2)); 1029b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1030b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Message& message_string_string = mf_string_string.Get(i); 1031b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string key_string_string = 1032b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message_string_string.GetReflection()->GetString( 1033b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message_string_string, fd_map_string_string_key); 1034b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string value_string_string = 1035b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message_string_string.GetReflection()->GetString( 1036b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message_string_string, fd_map_string_string_value); 1037b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(value_string_string, StrFunc(Int(key_string_string), 5)); 1038b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1039b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Message& message_int32_message = mf_int32_foreign_message.Get(i); 1040b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 key_int32_message = message_int32_message.GetReflection()->GetInt32( 1041b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message_int32_message, fd_map_int32_foreign_message_key); 1042b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const ForeignMessage& value_int32_message = 1043b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer down_cast<const ForeignMessage&>( 1044b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message_int32_message.GetReflection() 1045b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ->GetMessage(message_int32_message, 1046b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer fd_map_int32_foreign_message_value)); 1047b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(value_int32_message.c(), Func(key_int32_message, 6)); 1048b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1049b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1050b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer { 1051b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Check gets through mutable objects. 1052b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Message& message_int32_int32 = mmf_int32_int32->Get(i); 1053b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 key_int32_int32 = message_int32_int32.GetReflection()->GetInt32( 1054b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message_int32_int32, fd_map_int32_in32_key); 1055b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 value_int32_int32 = message_int32_int32.GetReflection()->GetInt32( 1056b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message_int32_int32, fd_map_int32_in32_value); 1057b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(value_int32_int32, Func(key_int32_int32, 1)); 1058b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1059b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Message& message_int32_double = mmf_int32_double->Get(i); 1060b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 key_int32_double = message_int32_double.GetReflection()->GetInt32( 1061b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message_int32_double, fd_map_int32_double_key); 1062b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer double value_int32_double = 1063b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message_int32_double.GetReflection()->GetDouble( 1064b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message_int32_double, fd_map_int32_double_value); 1065b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(value_int32_double, Func(key_int32_double, 2)); 1066b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1067b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Message& message_string_string = mmf_string_string->Get(i); 1068b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string key_string_string = 1069b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message_string_string.GetReflection()->GetString( 1070b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message_string_string, fd_map_string_string_key); 1071b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string value_string_string = 1072b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message_string_string.GetReflection()->GetString( 1073b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message_string_string, fd_map_string_string_value); 1074b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(value_string_string, StrFunc(Int(key_string_string), 5)); 1075b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1076b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Message& message_int32_message = mmf_int32_foreign_message->Get(i); 1077b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 key_int32_message = message_int32_message.GetReflection()->GetInt32( 1078b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message_int32_message, fd_map_int32_foreign_message_key); 1079b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const ForeignMessage& value_int32_message = 1080b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer down_cast<const ForeignMessage&>( 1081b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message_int32_message.GetReflection() 1082b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ->GetMessage(message_int32_message, 1083b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer fd_map_int32_foreign_message_value)); 1084b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(value_int32_message.c(), Func(key_int32_message, 6)); 1085b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1086b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1087b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1088b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Do sets through the RepeatedPtrField objects. 1089b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (int i = 0; i < 10; i++) { 1090b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer { 1091b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Message* message_int32_int32 = mmf_int32_int32->Mutable(i); 1092b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 key_int32_int32 = message_int32_int32->GetReflection()->GetInt32( 1093b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer *message_int32_int32, fd_map_int32_in32_key); 1094b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message_int32_int32->GetReflection()->SetInt32(message_int32_int32, 1095b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer fd_map_int32_in32_value, 1096b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Func(key_int32_int32, -1)); 1097b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1098b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Message* message_int32_double = mmf_int32_double->Mutable(i); 1099b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 key_int32_double = message_int32_double->GetReflection()->GetInt32( 1100b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer *message_int32_double, fd_map_int32_double_key); 1101b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message_int32_double->GetReflection()->SetDouble( 1102b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message_int32_double, fd_map_int32_double_value, 1103b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Func(key_int32_double, -2)); 1104b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1105b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Message* message_string_string = mmf_string_string->Mutable(i); 1106b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string key_string_string = 1107b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message_string_string->GetReflection()->GetString( 1108b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer *message_string_string, fd_map_string_string_key); 1109b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message_string_string->GetReflection()->SetString( 1110b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message_string_string, fd_map_string_string_value, 1111b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer StrFunc(Int(key_string_string), -5)); 1112b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1113b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Message* message_int32_message = mmf_int32_foreign_message->Mutable(i); 1114b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 key_int32_message = 1115b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message_int32_message->GetReflection()->GetInt32( 1116b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer *message_int32_message, fd_map_int32_foreign_message_key); 1117b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ForeignMessage* value_int32_message = down_cast<ForeignMessage*>( 1118b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message_int32_message->GetReflection() 1119b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ->MutableMessage(message_int32_message, 1120b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer fd_map_int32_foreign_message_value)); 1121b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer value_int32_message->set_c(Func(key_int32_message, -6)); 1122b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1123b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1124b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1125b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Check gets through mutable objects. 1126b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (int i = 0; i < 10; i++) { 1127b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(Func(i, -1), message.map_int32_int32().at(i)); 1128b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(Func(i, -2), message.map_int32_double().at(i)); 1129b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(StrFunc(i, -5), message.map_string_string().at(StrFunc(i, 1))); 1130b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(Func(i, -6), message.map_int32_foreign_message().at(i).c()); 1131b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1132b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 1133b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1134b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST_F(MapFieldReflectionTest, RepeatedFieldRefForRegularFields) { 1135b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer TestMap message; 1136b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Reflection* refl = message.GetReflection(); 1137b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Descriptor* desc = message.GetDescriptor(); 1138b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1139b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Map<int32, int32>* map_int32_int32 = message.mutable_map_int32_int32(); 1140b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Map<int32, double>* map_int32_double = message.mutable_map_int32_double(); 1141b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Map<string, string>* map_string_string = message.mutable_map_string_string(); 1142b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Map<int32, ForeignMessage>* map_int32_foreign_message = 1143b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message.mutable_map_int32_foreign_message(); 1144b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1145b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (int i = 0; i < 10; ++i) { 1146b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer (*map_int32_int32)[i] = Func(i, 1); 1147b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer (*map_int32_double)[i] = Func(i, 2); 1148b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer (*map_string_string)[StrFunc(i, 1)] = StrFunc(i, 5); 1149b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer (*map_int32_foreign_message)[i].set_c(Func(i, 6)); 1150b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1151b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1152b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Get FieldDescriptors for all the fields of interest. 1153b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const FieldDescriptor* fd_map_int32_int32 = 1154b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer desc->FindFieldByName("map_int32_int32"); 1155b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const FieldDescriptor* fd_map_int32_double = 1156b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer desc->FindFieldByName("map_int32_double"); 1157b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const FieldDescriptor* fd_map_string_string = 1158b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer desc->FindFieldByName("map_string_string"); 1159b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const FieldDescriptor* fd_map_int32_foreign_message = 1160b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer desc->FindFieldByName("map_int32_foreign_message"); 1161b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1162b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const FieldDescriptor* fd_map_int32_in32_key = 1163b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer fd_map_int32_int32->message_type()->FindFieldByName("key"); 1164b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const FieldDescriptor* fd_map_int32_in32_value = 1165b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer fd_map_int32_int32->message_type()->FindFieldByName("value"); 1166b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const FieldDescriptor* fd_map_int32_double_key = 1167b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer fd_map_int32_double->message_type()->FindFieldByName("key"); 1168b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const FieldDescriptor* fd_map_int32_double_value = 1169b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer fd_map_int32_double->message_type()->FindFieldByName("value"); 1170b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const FieldDescriptor* fd_map_string_string_key = 1171b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer fd_map_string_string->message_type()->FindFieldByName("key"); 1172b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const FieldDescriptor* fd_map_string_string_value = 1173b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer fd_map_string_string->message_type()->FindFieldByName("value"); 1174b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const FieldDescriptor* fd_map_int32_foreign_message_key = 1175b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer fd_map_int32_foreign_message->message_type()->FindFieldByName("key"); 1176b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const FieldDescriptor* fd_map_int32_foreign_message_value = 1177b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer fd_map_int32_foreign_message->message_type()->FindFieldByName("value"); 1178b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1179b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Get RepeatedFieldRef objects for all fields of interest. 1180b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const RepeatedFieldRef<Message> mf_int32_int32 = 1181b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer refl->GetRepeatedFieldRef<Message>(message, fd_map_int32_int32); 1182b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const RepeatedFieldRef<Message> mf_int32_double = 1183b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer refl->GetRepeatedFieldRef<Message>(message, fd_map_int32_double); 1184b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const RepeatedFieldRef<Message> mf_string_string = 1185b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer refl->GetRepeatedFieldRef<Message>(message, fd_map_string_string); 1186b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const RepeatedFieldRef<Message> mf_int32_foreign_message = 1187b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer refl->GetRepeatedFieldRef<Message>(message, fd_map_int32_foreign_message); 1188b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1189b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Get mutable RepeatedFieldRef objects for all fields of interest. 1190b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const MutableRepeatedFieldRef<Message> mmf_int32_int32 = 1191b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer refl->GetMutableRepeatedFieldRef<Message>(&message, fd_map_int32_int32); 1192b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const MutableRepeatedFieldRef<Message> mmf_int32_double = 1193b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer refl->GetMutableRepeatedFieldRef<Message>(&message, fd_map_int32_double); 1194b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const MutableRepeatedFieldRef<Message> mmf_string_string = 1195b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer refl->GetMutableRepeatedFieldRef<Message>(&message, fd_map_string_string); 1196b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const MutableRepeatedFieldRef<Message> 1197b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mmf_int32_foreign_message = 1198b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer refl->GetMutableRepeatedFieldRef<Message>( 1199b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer &message, fd_map_int32_foreign_message); 1200b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1201b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Get entry default instances 1202b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer google::protobuf::scoped_ptr<Message> entry_int32_int32( 1203b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MessageFactory::generated_factory() 1204b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ->GetPrototype(fd_map_int32_int32->message_type()) 1205b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ->New()); 1206b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer google::protobuf::scoped_ptr<Message> entry_int32_double( 1207b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MessageFactory::generated_factory() 1208b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ->GetPrototype(fd_map_int32_double->message_type()) 1209b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ->New()); 1210b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer google::protobuf::scoped_ptr<Message> entry_string_string( 1211b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MessageFactory::generated_factory() 1212b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ->GetPrototype(fd_map_string_string->message_type()) 1213b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ->New()); 1214b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer google::protobuf::scoped_ptr<Message> entry_int32_foreign_message( 1215b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MessageFactory::generated_factory() 1216b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ->GetPrototype(fd_map_int32_foreign_message->message_type()) 1217b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ->New()); 1218b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1219b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(10, mf_int32_int32.size()); 1220b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(10, mmf_int32_int32.size()); 1221b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(10, mf_int32_double.size()); 1222b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(10, mmf_int32_double.size()); 1223b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(10, mf_string_string.size()); 1224b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(10, mmf_string_string.size()); 1225b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(10, mf_int32_foreign_message.size()); 1226b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(10, mmf_int32_foreign_message.size()); 1227b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1228b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_FALSE(mf_int32_int32.empty()); 1229b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_FALSE(mmf_int32_int32.empty()); 1230b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_FALSE(mf_int32_double.empty()); 1231b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_FALSE(mmf_int32_double.empty()); 1232b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_FALSE(mf_string_string.empty()); 1233b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_FALSE(mmf_string_string.empty()); 1234b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_FALSE(mf_int32_foreign_message.empty()); 1235b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_FALSE(mmf_int32_foreign_message.empty()); 1236b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1237b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Make sure we can do gets through the RepeatedFieldRef objects. 1238b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (int i = 0; i < 10; ++i) { 1239b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer { 1240b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Check gets through const objects. 1241b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Message& message_int32_int32 = 1242b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mf_int32_int32.Get(i, entry_int32_int32.get()); 1243b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 key_int32_int32 = message_int32_int32.GetReflection()->GetInt32( 1244b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message_int32_int32, fd_map_int32_in32_key); 1245b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 value_int32_int32 = message_int32_int32.GetReflection()->GetInt32( 1246b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message_int32_int32, fd_map_int32_in32_value); 1247b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(value_int32_int32, Func(key_int32_int32, 1)); 1248b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1249b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Message& message_int32_double = 1250b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mf_int32_double.Get(i, entry_int32_double.get()); 1251b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 key_int32_double = message_int32_double.GetReflection()->GetInt32( 1252b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message_int32_double, fd_map_int32_double_key); 1253b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer double value_int32_double = 1254b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message_int32_double.GetReflection()->GetDouble( 1255b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message_int32_double, fd_map_int32_double_value); 1256b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(value_int32_double, Func(key_int32_double, 2)); 1257b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1258b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Message& message_string_string = 1259b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mf_string_string.Get(i, entry_string_string.get()); 1260b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string key_string_string = 1261b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message_string_string.GetReflection()->GetString( 1262b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message_string_string, fd_map_string_string_key); 1263b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string value_string_string = 1264b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message_string_string.GetReflection()->GetString( 1265b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message_string_string, fd_map_string_string_value); 1266b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(value_string_string, StrFunc(Int(key_string_string), 5)); 1267b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1268b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Message& message_int32_message = 1269b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mf_int32_foreign_message.Get(i, entry_int32_foreign_message.get()); 1270b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 key_int32_message = message_int32_message.GetReflection()->GetInt32( 1271b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message_int32_message, fd_map_int32_foreign_message_key); 1272b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const ForeignMessage& value_int32_message = 1273b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer down_cast<const ForeignMessage&>( 1274b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message_int32_message.GetReflection() 1275b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ->GetMessage(message_int32_message, 1276b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer fd_map_int32_foreign_message_value)); 1277b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(value_int32_message.c(), Func(key_int32_message, 6)); 1278b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1279b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1280b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer { 1281b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Check gets through mutable objects. 1282b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Message& message_int32_int32 = 1283b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mmf_int32_int32.Get(i, entry_int32_int32.get()); 1284b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 key_int32_int32 = message_int32_int32.GetReflection()->GetInt32( 1285b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message_int32_int32, fd_map_int32_in32_key); 1286b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 value_int32_int32 = message_int32_int32.GetReflection()->GetInt32( 1287b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message_int32_int32, fd_map_int32_in32_value); 1288b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(value_int32_int32, Func(key_int32_int32, 1)); 1289b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1290b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Message& message_int32_double = 1291b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mmf_int32_double.Get(i, entry_int32_double.get()); 1292b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 key_int32_double = message_int32_double.GetReflection()->GetInt32( 1293b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message_int32_double, fd_map_int32_double_key); 1294b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer double value_int32_double = 1295b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message_int32_double.GetReflection()->GetDouble( 1296b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message_int32_double, fd_map_int32_double_value); 1297b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(value_int32_double, Func(key_int32_double, 2)); 1298b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1299b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Message& message_string_string = 1300b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mmf_string_string.Get(i, entry_string_string.get()); 1301b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string key_string_string = 1302b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message_string_string.GetReflection()->GetString( 1303b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message_string_string, fd_map_string_string_key); 1304b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string value_string_string = 1305b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message_string_string.GetReflection()->GetString( 1306b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message_string_string, fd_map_string_string_value); 1307b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(value_string_string, StrFunc(Int(key_string_string), 5)); 1308b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1309b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Message& message_int32_message = 1310b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mmf_int32_foreign_message.Get(i, entry_int32_foreign_message.get()); 1311b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 key_int32_message = message_int32_message.GetReflection()->GetInt32( 1312b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message_int32_message, fd_map_int32_foreign_message_key); 1313b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const ForeignMessage& value_int32_message = 1314b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer down_cast<const ForeignMessage&>( 1315b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message_int32_message.GetReflection() 1316b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ->GetMessage(message_int32_message, 1317b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer fd_map_int32_foreign_message_value)); 1318b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(value_int32_message.c(), Func(key_int32_message, 6)); 1319b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1320b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1321b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1322b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Make sure we can do sets through the RepeatedFieldRef objects. 1323b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (int i = 0; i < 10; i++) { 1324b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Message& message_int32_int32 = 1325b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mmf_int32_int32.Get(i, entry_int32_int32.get()); 1326b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int key = message_int32_int32.GetReflection()->GetInt32( 1327b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message_int32_int32, fd_map_int32_in32_key); 1328b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1329b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer entry_int32_int32->GetReflection()->SetInt32( 1330b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer entry_int32_int32.get(), fd_map_int32_int32->message_type()->field(0), 1331b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer key); 1332b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer entry_int32_int32->GetReflection()->SetInt32( 1333b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer entry_int32_int32.get(), fd_map_int32_int32->message_type()->field(1), 1334b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Func(key, -1)); 1335b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer entry_int32_double->GetReflection()->SetInt32( 1336b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer entry_int32_double.get(), fd_map_int32_double->message_type()->field(0), 1337b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer key); 1338b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer entry_int32_double->GetReflection()->SetDouble( 1339b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer entry_int32_double.get(), fd_map_int32_double->message_type()->field(1), 1340b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Func(key, -2)); 1341b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer entry_string_string->GetReflection()->SetString( 1342b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer entry_string_string.get(), 1343b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer fd_map_string_string->message_type()->field(0), StrFunc(key, 1)); 1344b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer entry_string_string->GetReflection()->SetString( 1345b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer entry_string_string.get(), 1346b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer fd_map_string_string->message_type()->field(1), StrFunc(key, -5)); 1347b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer entry_int32_foreign_message->GetReflection()->SetInt32( 1348b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer entry_int32_foreign_message.get(), 1349b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer fd_map_int32_foreign_message->message_type()->field(0), key); 1350b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Message* value_message = 1351b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer entry_int32_foreign_message->GetReflection()->MutableMessage( 1352b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer entry_int32_foreign_message.get(), 1353b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer fd_map_int32_foreign_message->message_type()->field(1)); 1354b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer value_message->GetReflection()->SetInt32( 1355b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer value_message, value_message->GetDescriptor()->FindFieldByName("c"), 1356b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Func(key, -6)); 1357b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1358b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mmf_int32_int32.Set(i, *entry_int32_int32); 1359b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mmf_int32_double.Set(i, *entry_int32_double); 1360b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mmf_string_string.Set(i, *entry_string_string); 1361b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mmf_int32_foreign_message.Set(i, *entry_int32_foreign_message); 1362b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1363b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1364b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (int i = 0; i < 10; i++) { 1365b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(Func(i, -1), message.map_int32_int32().at(i)); 1366b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(Func(i, -2), message.map_int32_double().at(i)); 1367b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(StrFunc(i, -5), message.map_string_string().at(StrFunc(i, 1))); 1368b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(Func(i, -6), message.map_int32_foreign_message().at(i).c()); 1369b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1370b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1371b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Test iterators. 1372b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer { 1373b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int index = 0; 1374b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer hash_map<int32, int32> result; 1375b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (RepeatedFieldRef<Message>::iterator it = mf_int32_int32.begin(); 1376b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer it != mf_int32_int32.end(); ++it) { 1377b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Message& message = *it; 1378b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 key = 1379b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message.GetReflection()->GetInt32(message, fd_map_int32_in32_key); 1380b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 value = 1381b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message.GetReflection()->GetInt32(message, fd_map_int32_in32_value); 1382b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer result[key] = value; 1383b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ++index; 1384b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1385b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(10, index); 1386b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (hash_map<int32, int32>::const_iterator it = result.begin(); 1387b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer it != result.end(); ++it) { 1388b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(message.map_int32_int32().at(it->first), it->second); 1389b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1390b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1391b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1392b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer { 1393b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int index = 0; 1394b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer hash_map<int32, double> result; 1395b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (RepeatedFieldRef<Message>::iterator it = mf_int32_double.begin(); 1396b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer it != mf_int32_double.end(); ++it) { 1397b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Message& message = *it; 1398b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 key = 1399b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message.GetReflection()->GetInt32(message, fd_map_int32_double_key); 1400b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer double value = message.GetReflection()->GetDouble( 1401b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message, fd_map_int32_double_value); 1402b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer result[key] = value; 1403b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ++index; 1404b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1405b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(10, index); 1406b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (hash_map<int32, double>::const_iterator it = result.begin(); 1407b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer it != result.end(); ++it) { 1408b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(message.map_int32_double().at(it->first), it->second); 1409b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1410b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1411b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1412b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer { 1413b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int index = 0; 1414b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer hash_map<string, string> result; 1415b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (RepeatedFieldRef<Message>::iterator it = mf_string_string.begin(); 1416b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer it != mf_string_string.end(); ++it) { 1417b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Message& message = *it; 1418b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string key = 1419b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message.GetReflection()->GetString(message, fd_map_string_string_key); 1420b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string value = message.GetReflection()->GetString( 1421b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message, fd_map_string_string_value); 1422b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer result[key] = value; 1423b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ++index; 1424b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1425b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(10, index); 1426b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (hash_map<string, string>::const_iterator it = result.begin(); 1427b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer it != result.end(); ++it) { 1428b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(message.map_string_string().at(it->first), it->second); 1429b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1430b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1431b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1432b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer { 1433b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int index = 0; 1434b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer std::map<int32, ForeignMessage> result; 1435b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (RepeatedFieldRef<Message>::iterator it = 1436b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mf_int32_foreign_message.begin(); 1437b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer it != mf_int32_foreign_message.end(); ++it) { 1438b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Message& message = *it; 1439b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 key = message.GetReflection()->GetInt32( 1440b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message, fd_map_int32_foreign_message_key); 1441b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const ForeignMessage& sub_message = down_cast<const ForeignMessage&>( 1442b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message.GetReflection() 1443b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ->GetMessage(message, fd_map_int32_foreign_message_value)); 1444b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer result[key].MergeFrom(sub_message); 1445b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ++index; 1446b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1447b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(10, index); 1448b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (std::map<int32, ForeignMessage>::const_iterator it = result.begin(); 1449b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer it != result.end(); ++it) { 1450b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(message.map_int32_foreign_message().at(it->first).c(), 1451b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer it->second.c()); 1452b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1453b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1454b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1455b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Test MutableRepeatedFieldRef::Add() 1456b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer entry_int32_int32->GetReflection()->SetInt32( 1457b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer entry_int32_int32.get(), fd_map_int32_int32->message_type()->field(0), 1458b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 4321); 1459b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer entry_int32_int32->GetReflection()->SetInt32( 1460b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer entry_int32_int32.get(), fd_map_int32_int32->message_type()->field(1), 1461b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1234); 1462b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mmf_int32_int32.Add(*entry_int32_int32); 1463b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(1234, message.map_int32_int32().at(4321)); 1464b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1465b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer entry_int32_double->GetReflection()->SetInt32( 1466b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer entry_int32_double.get(), fd_map_int32_double->message_type()->field(0), 1467b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 4321); 1468b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer entry_int32_double->GetReflection()->SetDouble( 1469b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer entry_int32_double.get(), fd_map_int32_double->message_type()->field(1), 1470b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1234.0); 1471b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mmf_int32_double.Add(*entry_int32_double); 1472b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(1234.0, message.map_int32_double().at(4321)); 1473b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1474b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer entry_string_string->GetReflection()->SetString( 1475b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer entry_string_string.get(), 1476b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer fd_map_string_string->message_type()->field(0), "4321"); 1477b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer entry_string_string->GetReflection()->SetString( 1478b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer entry_string_string.get(), fd_map_string_string->message_type()->field(1), 1479b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "1234"); 1480b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mmf_string_string.Add(*entry_string_string); 1481b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ("1234", message.map_string_string().at("4321")); 1482b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1483b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer entry_int32_foreign_message->GetReflection()->SetInt32( 1484b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer entry_int32_foreign_message.get(), 1485b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer fd_map_int32_foreign_message->message_type()->field(0), 4321); 1486b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Message* value_message = 1487b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer entry_int32_foreign_message->GetReflection()->MutableMessage( 1488b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer entry_int32_foreign_message.get(), 1489b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer fd_map_int32_foreign_message->message_type()->field(1)); 1490b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ForeignMessage foreign_message; 1491b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer foreign_message.set_c(1234); 1492b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer value_message->CopyFrom(foreign_message); 1493b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1494b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mmf_int32_foreign_message.Add(*entry_int32_foreign_message); 1495b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(1234, message.map_int32_foreign_message().at(4321).c()); 1496b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1497b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Test Reflection::AddAllocatedMessage 1498b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Message* free_entry_string_string = MessageFactory::generated_factory() 1499b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ->GetPrototype(fd_map_string_string->message_type()) 1500b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ->New(); 1501b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer entry_string_string->GetReflection()->SetString( 1502b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer free_entry_string_string, 1503b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer fd_map_string_string->message_type()->field(0), "4321"); 1504b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer entry_string_string->GetReflection()->SetString( 1505b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer free_entry_string_string, fd_map_string_string->message_type()->field(1), 1506b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "1234"); 1507b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer refl->AddAllocatedMessage(&message, fd_map_string_string, 1508b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer free_entry_string_string); 1509b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1510b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Test MutableRepeatedFieldRef::RemoveLast() 1511b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mmf_int32_int32.RemoveLast(); 1512b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mmf_int32_double.RemoveLast(); 1513b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mmf_string_string.RemoveLast(); 1514b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mmf_int32_foreign_message.RemoveLast(); 1515b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(10, message.map_int32_int32().size()); 1516b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(10, message.map_int32_double().size()); 1517b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(11, message.map_string_string().size()); 1518b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(10, message.map_int32_foreign_message().size()); 1519b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1520b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Test MutableRepeatedFieldRef::SwapElements() 1521b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer { 1522b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Message& message0a = mmf_int32_int32.Get(0, entry_int32_int32.get()); 1523b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 int32_value0a = 1524b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message0a.GetReflection()->GetInt32(message0a, fd_map_int32_in32_value); 1525b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Message& message9a = mmf_int32_int32.Get(9, entry_int32_int32.get()); 1526b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 int32_value9a = 1527b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message9a.GetReflection()->GetInt32(message9a, fd_map_int32_in32_value); 1528b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1529b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mmf_int32_int32.SwapElements(0, 9); 1530b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1531b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Message& message0b = mmf_int32_int32.Get(0, entry_int32_int32.get()); 1532b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 int32_value0b = 1533b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message0b.GetReflection()->GetInt32(message0b, fd_map_int32_in32_value); 1534b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Message& message9b = mmf_int32_int32.Get(9, entry_int32_int32.get()); 1535b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 int32_value9b = 1536b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message9b.GetReflection()->GetInt32(message9b, fd_map_int32_in32_value); 1537b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1538b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(int32_value9a, int32_value0b); 1539b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(int32_value0a, int32_value9b); 1540b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1541b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1542b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer { 1543b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Message& message0a = 1544b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mmf_int32_double.Get(0, entry_int32_double.get()); 1545b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer double double_value0a = message0a.GetReflection()->GetDouble( 1546b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message0a, fd_map_int32_double_value); 1547b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Message& message9a = 1548b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mmf_int32_double.Get(9, entry_int32_double.get()); 1549b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer double double_value9a = message9a.GetReflection()->GetDouble( 1550b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message9a, fd_map_int32_double_value); 1551b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1552b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mmf_int32_double.SwapElements(0, 9); 1553b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1554b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Message& message0b = 1555b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mmf_int32_double.Get(0, entry_int32_double.get()); 1556b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer double double_value0b = message0b.GetReflection()->GetDouble( 1557b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message0b, fd_map_int32_double_value); 1558b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Message& message9b = 1559b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mmf_int32_double.Get(9, entry_int32_double.get()); 1560b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer double double_value9b = message9b.GetReflection()->GetDouble( 1561b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message9b, fd_map_int32_double_value); 1562b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1563b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(double_value9a, double_value0b); 1564b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(double_value0a, double_value9b); 1565b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1566b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1567b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer { 1568b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Message& message0a = 1569b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mmf_string_string.Get(0, entry_string_string.get()); 1570b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string string_value0a = message0a.GetReflection()->GetString( 1571b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message0a, fd_map_string_string_value); 1572b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Message& message9a = 1573b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mmf_string_string.Get(9, entry_string_string.get()); 1574b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string string_value9a = message9a.GetReflection()->GetString( 1575b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message9a, fd_map_string_string_value); 1576b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1577b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mmf_string_string.SwapElements(0, 9); 1578b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1579b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Message& message0b = 1580b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mmf_string_string.Get(0, entry_string_string.get()); 1581b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string string_value0b = message0b.GetReflection()->GetString( 1582b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message0b, fd_map_string_string_value); 1583b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Message& message9b = 1584b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mmf_string_string.Get(9, entry_string_string.get()); 1585b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string string_value9b = message9b.GetReflection()->GetString( 1586b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message9b, fd_map_string_string_value); 1587b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1588b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(string_value9a, string_value0b); 1589b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(string_value0a, string_value9b); 1590b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1591b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1592b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer { 1593b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Message& message0a = 1594b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mmf_int32_foreign_message.Get(0, entry_int32_foreign_message.get()); 1595b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const ForeignMessage& sub_message0a = down_cast<const ForeignMessage&>( 1596b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message0a.GetReflection() 1597b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ->GetMessage(message0a, fd_map_int32_foreign_message_value)); 1598b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 int32_value0a = sub_message0a.c(); 1599b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Message& message9a = 1600b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mmf_int32_foreign_message.Get(9, entry_int32_foreign_message.get()); 1601b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const ForeignMessage& sub_message9a = down_cast<const ForeignMessage&>( 1602b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message9a.GetReflection() 1603b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ->GetMessage(message9a, fd_map_int32_foreign_message_value)); 1604b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 int32_value9a = sub_message9a.c(); 1605b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1606b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mmf_int32_foreign_message.SwapElements(0, 9); 1607b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1608b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Message& message0b = 1609b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mmf_int32_foreign_message.Get(0, entry_int32_foreign_message.get()); 1610b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const ForeignMessage& sub_message0b = down_cast<const ForeignMessage&>( 1611b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message0b.GetReflection() 1612b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ->GetMessage(message0b, fd_map_int32_foreign_message_value)); 1613b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 int32_value0b = sub_message0b.c(); 1614b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Message& message9b = 1615b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mmf_int32_foreign_message.Get(9, entry_int32_foreign_message.get()); 1616b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const ForeignMessage& sub_message9b = down_cast<const ForeignMessage&>( 1617b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message9b.GetReflection() 1618b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ->GetMessage(message9b, fd_map_int32_foreign_message_value)); 1619b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int32 int32_value9b = sub_message9b.c(); 1620b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1621b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(int32_value9a, int32_value0b); 1622b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(int32_value0a, int32_value9b); 1623b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1624b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 1625b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1626b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST_F(MapFieldReflectionTest, RepeatedFieldRefMergeFromAndSwap) { 1627b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Set-up message content. 1628b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer TestMap m0, m1, m2; 1629b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (int i = 0; i < 10; ++i) { 1630b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer (*m0.mutable_map_int32_int32())[i] = Func(i, 1); 1631b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer (*m0.mutable_map_int32_double())[i] = Func(i, 2); 1632b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer (*m0.mutable_map_string_string())[StrFunc(i, 1)] = StrFunc(i, 5); 1633b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer (*m0.mutable_map_int32_foreign_message())[i].set_c(Func(i, 6)); 1634b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer (*m1.mutable_map_int32_int32())[i + 10] = Func(i, 11); 1635b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer (*m1.mutable_map_int32_double())[i + 10] = Func(i, 12); 1636b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer (*m1.mutable_map_string_string())[StrFunc(i + 10, 1)] = StrFunc(i, 15); 1637b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer (*m1.mutable_map_int32_foreign_message())[i + 10].set_c(Func(i, 16)); 1638b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer (*m2.mutable_map_int32_int32())[i + 20] = Func(i, 21); 1639b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer (*m2.mutable_map_int32_double())[i + 20] = Func(i, 22); 1640b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer (*m2.mutable_map_string_string())[StrFunc(i + 20, 1)] = StrFunc(i, 25); 1641b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer (*m2.mutable_map_int32_foreign_message())[i + 20].set_c(Func(i, 26)); 1642b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1643b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1644b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Reflection* refl = m0.GetReflection(); 1645b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Descriptor* desc = m0.GetDescriptor(); 1646b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1647b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Get FieldDescriptors for all the fields of interest. 1648b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const FieldDescriptor* fd_map_int32_int32 = 1649b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer desc->FindFieldByName("map_int32_int32"); 1650b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const FieldDescriptor* fd_map_int32_double = 1651b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer desc->FindFieldByName("map_int32_double"); 1652b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const FieldDescriptor* fd_map_string_string = 1653b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer desc->FindFieldByName("map_string_string"); 1654b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const FieldDescriptor* fd_map_int32_foreign_message = 1655b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer desc->FindFieldByName("map_int32_foreign_message"); 1656b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1657b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Get MutableRepeatedFieldRef objects for all fields of interest. 1658b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const MutableRepeatedFieldRef<Message> mmf_int32_int32 = 1659b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer refl->GetMutableRepeatedFieldRef<Message>( 1660b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer &m0, fd_map_int32_int32); 1661b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const MutableRepeatedFieldRef<Message> mmf_int32_double = 1662b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer refl->GetMutableRepeatedFieldRef<Message>( 1663b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer &m0, fd_map_int32_double); 1664b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const MutableRepeatedFieldRef<Message> mmf_string_string = 1665b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer refl->GetMutableRepeatedFieldRef<Message>( 1666b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer &m0, fd_map_string_string); 1667b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const MutableRepeatedFieldRef<Message> 1668b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mmf_int32_foreign_message = 1669b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer refl->GetMutableRepeatedFieldRef<Message>( 1670b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer &m0, fd_map_int32_foreign_message); 1671b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1672b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Test MutableRepeatedRef::CopyFrom 1673b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mmf_int32_int32.CopyFrom( 1674b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer refl->GetRepeatedFieldRef<Message>( 1675b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer m1, fd_map_int32_int32)); 1676b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mmf_int32_double.CopyFrom( 1677b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer refl->GetRepeatedFieldRef<Message>( 1678b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer m1, fd_map_int32_double)); 1679b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mmf_string_string.CopyFrom( 1680b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer refl->GetRepeatedFieldRef<Message>( 1681b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer m1, fd_map_string_string)); 1682b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mmf_int32_foreign_message.CopyFrom( 1683b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer refl->GetRepeatedFieldRef<Message>( 1684b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer m1, fd_map_int32_foreign_message)); 1685b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1686b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (int i = 0; i < 10; ++i) { 1687b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(Func(i, 11), m0.map_int32_int32().at(i + 10)); 1688b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(Func(i, 12), m0.map_int32_double().at(i + 10)); 1689b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(StrFunc(i, 15), m0.map_string_string().at(StrFunc(i + 10, 1))); 1690b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(Func(i, 16), m0.map_int32_foreign_message().at(i + 10).c()); 1691b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1692b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1693b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Test MutableRepeatedRef::MergeFrom 1694b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mmf_int32_int32.MergeFrom( 1695b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer refl->GetRepeatedFieldRef<Message>( 1696b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer m2, fd_map_int32_int32)); 1697b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mmf_int32_double.MergeFrom( 1698b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer refl->GetRepeatedFieldRef<Message>( 1699b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer m2, fd_map_int32_double)); 1700b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mmf_string_string.MergeFrom( 1701b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer refl->GetRepeatedFieldRef<Message>( 1702b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer m2, fd_map_string_string)); 1703b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mmf_int32_foreign_message.MergeFrom( 1704b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer refl->GetRepeatedFieldRef<Message>( 1705b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer m2, fd_map_int32_foreign_message)); 1706b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (int i = 0; i < 10; ++i) { 1707b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(Func(i, 21), m0.map_int32_int32().at(i + 20)); 1708b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(Func(i, 22), m0.map_int32_double().at(i + 20)); 1709b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(StrFunc(i, 25), m0.map_string_string().at(StrFunc(i + 20, 1))); 1710b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(Func(i, 26), m0.map_int32_foreign_message().at(i + 20).c()); 1711b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1712b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1713b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Test MutableRepeatedRef::Swap 1714b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Swap between m0 and m2. 1715b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mmf_int32_int32.Swap( 1716b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer refl->GetMutableRepeatedFieldRef<Message>( 1717b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer &m2, fd_map_int32_int32)); 1718b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mmf_int32_double.Swap( 1719b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer refl->GetMutableRepeatedFieldRef<Message>( 1720b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer &m2, fd_map_int32_double)); 1721b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mmf_string_string.Swap( 1722b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer refl->GetMutableRepeatedFieldRef<Message>( 1723b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer &m2, fd_map_string_string)); 1724b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mmf_int32_foreign_message.Swap( 1725b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer refl->GetMutableRepeatedFieldRef<Message>( 1726b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer &m2, fd_map_int32_foreign_message)); 1727b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (int i = 0; i < 10; ++i) { 1728b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Check the content of m0. 1729b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(Func(i, 21), m0.map_int32_int32().at(i + 20)); 1730b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(Func(i, 22), m0.map_int32_double().at(i + 20)); 1731b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(StrFunc(i, 25), m0.map_string_string().at(StrFunc(i + 20, 1))); 1732b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(Func(i, 26), m0.map_int32_foreign_message().at(i + 20).c()); 1733b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1734b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Check the content of m2. 1735b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(Func(i, 11), m2.map_int32_int32().at(i + 10)); 1736b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(Func(i, 12), m2.map_int32_double().at(i + 10)); 1737b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(StrFunc(i, 15), m2.map_string_string().at(StrFunc(i + 10, 1))); 1738b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(Func(i, 16), m2.map_int32_foreign_message().at(i + 10).c()); 1739b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(Func(i, 21), m2.map_int32_int32().at(i + 20)); 1740b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(Func(i, 22), m2.map_int32_double().at(i + 20)); 1741b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(StrFunc(i, 25), m2.map_string_string().at(StrFunc(i + 20, 1))); 1742b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(Func(i, 26), m2.map_int32_foreign_message().at(i + 20).c()); 1743b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1744b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1745b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // TODO(teboring): add test for duplicated key 1746b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 1747b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1748b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Generated Message Test =========================================== 1749b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1750b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(GeneratedMapFieldTest, Accessors) { 1751b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap message; 1752b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1753b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::SetMapFields(&message); 1754b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::ExpectMapFieldsSet(message); 1755b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1756b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::ModifyMapFields(&message); 1757b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::ExpectMapFieldsModified(message); 1758b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 1759b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1760b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(GeneratedMapFieldTest, SetMapFieldsInitialized) { 1761b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap message; 1762b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1763b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::SetMapFieldsInitialized(&message); 1764b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::ExpectMapFieldsSetInitialized(message); 1765b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 1766b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1767b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(GeneratedMapFieldTest, Proto2SetMapFieldsInitialized) { 1768b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestEnumMap message; 1769b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(unittest::PROTO2_MAP_ENUM_FOO, 1770b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer (*message.mutable_known_map_field())[0]); 1771b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 1772b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1773b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(GeneratedMapFieldTest, Clear) { 1774b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap message; 1775b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1776b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::SetMapFields(&message); 1777b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message.Clear(); 1778b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::ExpectClear(message); 1779b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 1780b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1781b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(GeneratedMapFieldTest, ClearMessageMap) { 1782b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMessageMap message; 1783b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1784b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Creates a TestAllTypes with default value 1785b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer TestUtil::ExpectClear((*message.mutable_map_int32_message())[0]); 1786b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 1787b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1788b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(GeneratedMapFieldTest, CopyFrom) { 1789b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap message1, message2; 1790b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1791b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::SetMapFields(&message1); 1792b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message2.CopyFrom(message1); 1793b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::ExpectMapFieldsSet(message2); 1794b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1795b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Copying from self should be a no-op. 1796b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message2.CopyFrom(message2); 1797b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::ExpectMapFieldsSet(message2); 1798b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 1799b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1800b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(GeneratedMapFieldTest, CopyFromMessageMap) { 1801b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMessageMap message1, message2; 1802b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1803b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer (*message1.mutable_map_int32_message())[0].add_repeated_int32(100); 1804b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer (*message2.mutable_map_int32_message())[0].add_repeated_int32(101); 1805b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1806b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message1.CopyFrom(message2); 1807b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1808b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Checks repeated field is overwritten. 1809b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(1, message1.map_int32_message().at(0).repeated_int32_size()); 1810b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(101, message1.map_int32_message().at(0).repeated_int32(0)); 1811b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 1812b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1813b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(GeneratedMapFieldTest, SwapWithEmpty) { 1814b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap message1, message2; 1815b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1816b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::SetMapFields(&message1); 1817b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::ExpectMapFieldsSet(message1); 1818b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::ExpectClear(message2); 1819b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1820b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message1.Swap(&message2); 1821b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::ExpectMapFieldsSet(message2); 1822b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::ExpectClear(message1); 1823b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 1824b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1825b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(GeneratedMapFieldTest, SwapWithSelf) { 1826b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap message; 1827b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1828b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::SetMapFields(&message); 1829b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::ExpectMapFieldsSet(message); 1830b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1831b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message.Swap(&message); 1832b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::ExpectMapFieldsSet(message); 1833b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 1834b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1835b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(GeneratedMapFieldTest, SwapWithOther) { 1836b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap message1, message2; 1837b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1838b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::SetMapFields(&message1); 1839b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::SetMapFields(&message2); 1840b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::ModifyMapFields(&message2); 1841b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1842b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message1.Swap(&message2); 1843b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::ExpectMapFieldsModified(message1); 1844b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::ExpectMapFieldsSet(message2); 1845b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 1846b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1847b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(GeneratedMapFieldTest, CopyConstructor) { 1848b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap message1; 1849b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::SetMapFields(&message1); 1850b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1851b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap message2(message1); 1852b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::ExpectMapFieldsSet(message2); 1853b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 1854b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1855b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(GeneratedMapFieldTest, CopyAssignmentOperator) { 1856b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap message1; 1857b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::SetMapFields(&message1); 1858b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1859b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap message2; 1860b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message2 = message1; 1861b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::ExpectMapFieldsSet(message2); 1862b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1863b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Make sure that self-assignment does something sane. 1864b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message2.operator=(message2); 1865b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::ExpectMapFieldsSet(message2); 1866b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 1867b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1868b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#if !defined(PROTOBUF_TEST_NO_DESCRIPTORS) || \ 1869b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer !defined(GOOGLE_PROTOBUF_NO_RTTI) 1870b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(GeneratedMapFieldTest, UpcastCopyFrom) { 1871b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Test the CopyFrom method that takes in the generic const Message& 1872b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // parameter. 1873b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap message1, message2; 1874b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1875b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::SetMapFields(&message1); 1876b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1877b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Message* source = implicit_cast<const Message*>(&message1); 1878b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message2.CopyFrom(*source); 1879b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1880b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::ExpectMapFieldsSet(message2); 1881b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 1882b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#endif 1883b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1884b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#ifndef PROTOBUF_TEST_NO_DESCRIPTORS 1885b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1886b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(GeneratedMapFieldTest, CopyFromDynamicMessage) { 1887b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Test copying from a DynamicMessage, which must fall back to using 1888b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // reflection. 1889b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap message2; 1890b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1891b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Construct a new version of the dynamic message via the factory. 1892b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer DynamicMessageFactory factory; 1893b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer google::protobuf::scoped_ptr<Message> message1; 1894b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message1.reset( 1895b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer factory.GetPrototype(unittest::TestMap::descriptor())->New()); 1896b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapReflectionTester reflection_tester( 1897b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap::descriptor()); 1898b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reflection_tester.SetMapFieldsViaReflection(message1.get()); 1899b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reflection_tester.ExpectMapFieldsSetViaReflection(*message1); 1900b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reflection_tester.ExpectMapFieldsSetViaReflectionIterator(message1.get()); 1901b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message2.CopyFrom(*message1); 1902b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::ExpectMapFieldsSet(message2); 1903b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 1904b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1905b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(GeneratedMapFieldTest, CopyFromDynamicMessageMapReflection) { 1906b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap message2; 1907b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1908b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Construct a new version of the dynamic message via the factory. 1909b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer DynamicMessageFactory factory; 1910b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer google::protobuf::scoped_ptr<Message> message1; 1911b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message1.reset( 1912b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer factory.GetPrototype(unittest::TestMap::descriptor())->New()); 1913b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapReflectionTester reflection_tester( 1914b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap::descriptor()); 1915b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reflection_tester.SetMapFieldsViaMapReflection(message1.get()); 1916b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reflection_tester.ExpectMapFieldsSetViaReflection(*message1); 1917b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reflection_tester.ExpectMapFieldsSetViaReflectionIterator(message1.get()); 1918b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message2.CopyFrom(*message1); 1919b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::ExpectMapFieldsSet(message2); 1920b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 1921b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1922b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(GeneratedMapFieldTest, DynamicMessageCopyFrom) { 1923b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Test copying to a DynamicMessage, which must fall back to using reflection. 1924b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap message2; 1925b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::SetMapFields(&message2); 1926b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1927b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Construct a new version of the dynamic message via the factory. 1928b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer DynamicMessageFactory factory; 1929b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer google::protobuf::scoped_ptr<Message> message1; 1930b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message1.reset( 1931b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer factory.GetPrototype(unittest::TestMap::descriptor())->New()); 1932b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1933b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapReflectionTester reflection_tester( 1934b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap::descriptor()); 1935b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message1->MergeFrom(message2); 1936b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reflection_tester.ExpectMapFieldsSetViaReflection(*message1); 1937b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reflection_tester.ExpectMapFieldsSetViaReflectionIterator(message1.get()); 1938b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 1939b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1940b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(GeneratedMapFieldTest, DynamicMessageCopyFromMapReflection) { 1941b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapReflectionTester reflection_tester( 1942b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap::descriptor()); 1943b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap message2; 1944b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reflection_tester.SetMapFieldsViaMapReflection(&message2); 1945b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1946b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Construct a dynamic message via the factory. 1947b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer DynamicMessageFactory factory; 1948b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer google::protobuf::scoped_ptr<Message> message1; 1949b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message1.reset( 1950b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer factory.GetPrototype(unittest::TestMap::descriptor())->New()); 1951b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1952b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message1->MergeFrom(message2); 1953b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reflection_tester.ExpectMapFieldsSetViaReflectionIterator(message1.get()); 1954b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reflection_tester.ExpectMapFieldsSetViaReflection(*message1); 1955b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 1956b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1957b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(GeneratedMapFieldTest, SyncDynamicMapWithRepeatedField) { 1958b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Construct a dynamic message via the factory. 1959b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapReflectionTester reflection_tester( 1960b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap::descriptor()); 1961b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer DynamicMessageFactory factory; 1962b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer google::protobuf::scoped_ptr<Message> message; 1963b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message.reset( 1964b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer factory.GetPrototype(unittest::TestMap::descriptor())->New()); 1965b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reflection_tester.SetMapFieldsViaReflection(message.get()); 1966b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reflection_tester.ExpectMapFieldsSetViaReflectionIterator(message.get()); 1967b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reflection_tester.ExpectMapFieldsSetViaReflection(*message); 1968b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 1969b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1970b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#endif // !PROTOBUF_TEST_NO_DESCRIPTORS 1971b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1972b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(GeneratedMapFieldTest, NonEmptyMergeFrom) { 1973b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap message1, message2; 1974b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1975b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::SetMapFields(&message1); 1976b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1977b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // This field will test merging into an empty spot. 1978b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer (*message2.mutable_map_int32_int32())[1] = 1; 1979b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message1.mutable_map_int32_int32()->erase(1); 1980b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1981b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // This tests overwriting. 1982b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer (*message2.mutable_map_int32_double())[1] = 1; 1983b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer (*message1.mutable_map_int32_double())[1] = 2; 1984b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1985b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message1.MergeFrom(message2); 1986b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::ExpectMapFieldsSet(message1); 1987b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 1988b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1989b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(GeneratedMapFieldTest, MergeFromMessageMap) { 1990b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMessageMap message1, message2; 1991b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1992b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer (*message1.mutable_map_int32_message())[0].add_repeated_int32(100); 1993b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer (*message2.mutable_map_int32_message())[0].add_repeated_int32(101); 1994b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1995b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message1.MergeFrom(message2); 1996b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1997b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Checks repeated field is overwritten. 1998b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(1, message1.map_int32_message().at(0).repeated_int32_size()); 1999b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(101, message1.map_int32_message().at(0).repeated_int32(0)); 2000b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 2001b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2002b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Test the generated SerializeWithCachedSizesToArray() 2003b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(GeneratedMapFieldTest, SerializationToArray) { 2004b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap message1, message2; 2005b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string data; 2006b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::SetMapFields(&message1); 2007b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int size = message1.ByteSize(); 2008b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer data.resize(size); 2009b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer uint8* start = reinterpret_cast<uint8*>(string_as_array(&data)); 2010b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer uint8* end = message1.SerializeWithCachedSizesToArray(start); 2011b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(size, end - start); 2012b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(message2.ParseFromString(data)); 2013b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::ExpectMapFieldsSet(message2); 2014b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 2015b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2016b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Test the generated SerializeWithCachedSizes() 2017b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(GeneratedMapFieldTest, SerializationToStream) { 2018b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap message1, message2; 2019b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::SetMapFields(&message1); 2020b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int size = message1.ByteSize(); 2021b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string data; 2022b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer data.resize(size); 2023b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer { 2024b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Allow the output stream to buffer only one byte at a time. 2025b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer io::ArrayOutputStream array_stream(string_as_array(&data), size, 1); 2026b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer io::CodedOutputStream output_stream(&array_stream); 2027b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message1.SerializeWithCachedSizes(&output_stream); 2028b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_FALSE(output_stream.HadError()); 2029b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(size, output_stream.ByteCount()); 2030b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 2031b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(message2.ParseFromString(data)); 2032b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::ExpectMapFieldsSet(message2); 2033b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 2034b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2035b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2036b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(GeneratedMapFieldTest, SameTypeMaps) { 2037b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Descriptor* map1 = unittest::TestSameTypeMap::descriptor() 2038b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ->FindFieldByName("map1") 2039b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ->message_type(); 2040b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Descriptor* map2 = unittest::TestSameTypeMap::descriptor() 2041b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ->FindFieldByName("map2") 2042b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ->message_type(); 2043b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2044b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Message* map1_entry = 2045b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MessageFactory::generated_factory()->GetPrototype(map1); 2046b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Message* map2_entry = 2047b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MessageFactory::generated_factory()->GetPrototype(map2); 2048b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2049b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(map1, map1_entry->GetDescriptor()); 2050b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(map2, map2_entry->GetDescriptor()); 2051b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 2052b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2053b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(GeneratedMapFieldTest, Proto2UnknownEnum) { 2054b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestEnumMapPlusExtra from; 2055b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer (*from.mutable_known_map_field())[0] = unittest::E_PROTO2_MAP_ENUM_FOO; 2056b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer (*from.mutable_unknown_map_field())[0] = unittest::E_PROTO2_MAP_ENUM_EXTRA; 2057b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string data; 2058b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer from.SerializeToString(&data); 2059b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2060b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestEnumMap to; 2061b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(to.ParseFromString(data)); 2062b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(0, to.unknown_map_field().size()); 2063b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const UnknownFieldSet& unknown_field_set = 2064b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer to.GetReflection()->GetUnknownFields(to); 2065b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(1, unknown_field_set.field_count()); 2066b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(1, to.known_map_field().size()); 2067b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(unittest::PROTO2_MAP_ENUM_FOO, to.known_map_field().at(0)); 2068b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2069b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer data.clear(); 2070b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer from.Clear(); 2071b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer to.SerializeToString(&data); 2072b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(from.ParseFromString(data)); 2073b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(0, from.GetReflection()->GetUnknownFields(from).field_count()); 2074b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(1, from.known_map_field().size()); 2075b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(unittest::E_PROTO2_MAP_ENUM_FOO, from.known_map_field().at(0)); 2076b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(1, from.unknown_map_field().size()); 2077b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(unittest::E_PROTO2_MAP_ENUM_EXTRA, from.unknown_map_field().at(0)); 2078b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 2079b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2080b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(GeneratedMapFieldTest, StandardWireFormat) { 2081b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap message; 2082b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string data = "\x0A\x04\x08\x01\x10\x01"; 2083b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2084b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(message.ParseFromString(data)); 2085b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(1, message.map_int32_int32().size()); 2086b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(1, message.map_int32_int32().at(1)); 2087b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 2088b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2089b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(GeneratedMapFieldTest, UnorderedWireFormat) { 2090b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap message; 2091b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2092b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // put value before key in wire format 2093b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string data = "\x0A\x04\x10\x01\x08\x02"; 2094b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2095b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(message.ParseFromString(data)); 2096b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(1, message.map_int32_int32().size()); 2097b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(1, message.map_int32_int32().at(2)); 2098b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 2099b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2100b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(GeneratedMapFieldTest, DuplicatedKeyWireFormat) { 2101b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap message; 2102b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2103b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Two key fields in wire format 2104b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string data = "\x0A\x06\x08\x01\x08\x02\x10\x01"; 2105b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2106b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(message.ParseFromString(data)); 2107b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(1, message.map_int32_int32().size()); 2108b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(1, message.map_int32_int32().at(2)); 2109b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 2110b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2111b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(GeneratedMapFieldTest, DuplicatedValueWireFormat) { 2112b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap message; 2113b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2114b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Two value fields in wire format 2115b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string data = "\x0A\x06\x08\x01\x10\x01\x10\x02"; 2116b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2117b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(message.ParseFromString(data)); 2118b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(1, message.map_int32_int32().size()); 2119b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(2, message.map_int32_int32().at(1)); 2120b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 2121b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2122b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(GeneratedMapFieldTest, MissedKeyWireFormat) { 2123b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap message; 2124b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2125b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // No key field in wire format 2126b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string data = "\x0A\x02\x10\x01"; 2127b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2128b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(message.ParseFromString(data)); 2129b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(1, message.map_int32_int32().size()); 2130b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(1, message.map_int32_int32().at(0)); 2131b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 2132b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2133b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(GeneratedMapFieldTest, MissedValueWireFormat) { 2134b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap message; 2135b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2136b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // No value field in wire format 2137b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string data = "\x0A\x02\x08\x01"; 2138b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2139b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(message.ParseFromString(data)); 2140b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(1, message.map_int32_int32().size()); 2141b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(0, message.map_int32_int32().at(1)); 2142b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 2143b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2144b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(GeneratedMapFieldTest, MissedValueTextFormat) { 2145b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap message; 2146b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2147b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // No value field in text format 2148b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string text = 2149b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "map_int32_foreign_message {\n" 2150b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer " key: 1234567890\n" 2151b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "}"; 2152b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2153b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(google::protobuf::TextFormat::ParseFromString(text, &message)); 2154b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(1, message.map_int32_foreign_message().size()); 2155b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(11, message.ByteSize()); 2156b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 2157b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2158b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(GeneratedMapFieldTest, UnknownFieldWireFormat) { 2159b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap message; 2160b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2161b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Unknown field in wire format 2162b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string data = "\x0A\x06\x08\x02\x10\x03\x18\x01"; 2163b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2164b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(message.ParseFromString(data)); 2165b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(1, message.map_int32_int32().size()); 2166b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(3, message.map_int32_int32().at(2)); 2167b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 2168b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2169b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(GeneratedMapFieldTest, CorruptedWireFormat) { 2170b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap message; 2171b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2172b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // corrupted data in wire format 2173b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string data = "\x0A\x06\x08\x02\x11\x03"; 2174b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2175b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_FALSE(message.ParseFromString(data)); 2176b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 2177b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2178b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(GeneratedMapFieldTest, IsInitialized) { 2179b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestRequiredMessageMap map_message; 2180b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2181b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Add an uninitialized message. 2182b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer (*map_message.mutable_map_field())[0]; 2183b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_FALSE(map_message.IsInitialized()); 2184b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2185b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Initialize uninitialized message 2186b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer (*map_message.mutable_map_field())[0].set_a(0); 2187b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer (*map_message.mutable_map_field())[0].set_b(0); 2188b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer (*map_message.mutable_map_field())[0].set_c(0); 2189b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(map_message.IsInitialized()); 2190b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 2191b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2192b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Generated Message Reflection Test ================================ 2193b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2194b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(GeneratedMapFieldReflectionTest, SpaceUsed) { 2195b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap message; 2196b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapReflectionTester reflection_tester( 2197b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap::descriptor()); 2198b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reflection_tester.SetMapFieldsViaReflection(&message); 2199b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2200b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_LT(0, message.GetReflection()->SpaceUsed(message)); 2201b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 2202b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2203b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(GeneratedMapFieldReflectionTest, Accessors) { 2204b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Set every field to a unique value then go back and check all those 2205b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // values. 2206b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap message; 2207b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapReflectionTester reflection_tester( 2208b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap::descriptor()); 2209b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reflection_tester.SetMapFieldsViaReflection(&message); 2210b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::ExpectMapFieldsSet(message); 2211b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reflection_tester.ExpectMapFieldsSetViaReflection(message); 2212b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reflection_tester.ExpectMapFieldsSetViaReflectionIterator(&message); 2213b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2214b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reflection_tester.ModifyMapFieldsViaReflection(&message); 2215b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::ExpectMapFieldsModified(message); 2216b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 2217b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2218b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(GeneratedMapFieldReflectionTest, Swap) { 2219b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap message1; 2220b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap message2; 2221b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2222b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::SetMapFields(&message1); 2223b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2224b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Reflection* reflection = message1.GetReflection(); 2225b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reflection->Swap(&message1, &message2); 2226b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2227b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::ExpectClear(message1); 2228b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::ExpectMapFieldsSet(message2); 2229b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 2230b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2231b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(GeneratedMapFieldReflectionTest, SwapWithBothSet) { 2232b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap message1; 2233b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap message2; 2234b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2235b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::SetMapFields(&message1); 2236b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::SetMapFields(&message2); 2237b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::ModifyMapFields(&message2); 2238b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2239b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Reflection* reflection = message1.GetReflection(); 2240b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reflection->Swap(&message1, &message2); 2241b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2242b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::ExpectMapFieldsModified(message1); 2243b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::ExpectMapFieldsSet(message2); 2244b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 2245b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2246b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(GeneratedMapFieldReflectionTest, SwapFields) { 2247b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap message1; 2248b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap message2; 2249b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2250b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::SetMapFields(&message2); 2251b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2252b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer vector<const FieldDescriptor*> fields; 2253b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Reflection* reflection = message1.GetReflection(); 2254b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reflection->ListFields(message2, &fields); 2255b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reflection->SwapFields(&message1, &message2, fields); 2256b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2257b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::ExpectMapFieldsSet(message1); 2258b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::ExpectClear(message2); 2259b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 2260b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2261b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(GeneratedMapFieldReflectionTest, ClearField) { 2262b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap message; 2263b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::SetMapFields(&message); 2264b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::ExpectMapFieldsSet(message); 2265b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2266b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapReflectionTester reflection_tester( 2267b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap::descriptor()); 2268b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reflection_tester.ClearMapFieldsViaReflection(&message); 2269b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reflection_tester.ExpectClearViaReflection(message); 2270b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reflection_tester.ExpectClearViaReflectionIterator(&message); 2271b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 2272b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2273b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(GeneratedMapFieldReflectionTest, RemoveLast) { 2274b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap message; 2275b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapReflectionTester reflection_tester( 2276b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap::descriptor()); 2277b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2278b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::SetMapFields(&message); 2279b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::ExpectMapsSize(message, 2); 2280b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer std::vector<const Message*> expected_entries = 2281b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::GetMapEntries(message, 0); 2282b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2283b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reflection_tester.RemoveLastMapsViaReflection(&message); 2284b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2285b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::ExpectMapsSize(message, 1); 2286b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer std::vector<const Message*> remained_entries = 2287b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::GetMapEntries(message, 0); 2288b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(expected_entries == remained_entries); 2289b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 2290b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2291b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(GeneratedMapFieldReflectionTest, ReleaseLast) { 2292b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap message; 2293b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Descriptor* descriptor = message.GetDescriptor(); 2294b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapReflectionTester reflection_tester(descriptor); 2295b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2296b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::SetMapFields(&message); 2297b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2298b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::ExpectMapsSize(message, 2); 2299b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2300b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reflection_tester.ReleaseLastMapsViaReflection(&message); 2301b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2302b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::ExpectMapsSize(message, 1); 2303b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2304b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Now test that we actually release the right message. 2305b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message.Clear(); 2306b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::SetMapFields(&message); 2307b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2308b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::ExpectMapsSize(message, 2); 2309b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer std::vector<const Message*> expect_last = 2310b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::GetMapEntries(message, 1); 2311b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer std::vector<const Message*> release_last = 2312b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::GetMapEntriesFromRelease(&message); 2313b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::ExpectMapsSize(message, 1); 2314b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(expect_last == release_last); 2315b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (std::vector<const Message*>::iterator it = release_last.begin(); 2316b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer it != release_last.end(); ++it) { 2317b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer delete *it; 2318b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 2319b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 2320b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2321b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(GeneratedMapFieldReflectionTest, SwapElements) { 2322b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap message; 2323b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapReflectionTester reflection_tester( 2324b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap::descriptor()); 2325b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2326b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::SetMapFields(&message); 2327b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2328b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Get pointers of map entries at their original position 2329b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer std::vector<const Message*> entries0 = MapTestUtil::GetMapEntries(message, 0); 2330b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer std::vector<const Message*> entries1 = MapTestUtil::GetMapEntries(message, 1); 2331b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2332b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Swap the first time. 2333b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reflection_tester.SwapMapsViaReflection(&message); 2334b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2335b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Get pointer of map entry after swap once. 2336b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer std::vector<const Message*> entries0_once = 2337b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::GetMapEntries(message, 0); 2338b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer std::vector<const Message*> entries1_once = 2339b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::GetMapEntries(message, 1); 2340b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2341b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Test map entries are swapped. 2342b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::ExpectMapsSize(message, 2); 2343b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(entries0 == entries1_once); 2344b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(entries1 == entries0_once); 2345b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2346b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Swap the second time. 2347b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reflection_tester.SwapMapsViaReflection(&message); 2348b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2349b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Get pointer of map entry after swap once. 2350b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer std::vector<const Message*> entries0_twice = 2351b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::GetMapEntries(message, 0); 2352b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer std::vector<const Message*> entries1_twice = 2353b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::GetMapEntries(message, 1); 2354b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2355b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Test map entries are swapped back. 2356b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::ExpectMapsSize(message, 2); 2357b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(entries0 == entries0_twice); 2358b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(entries1 == entries1_twice); 2359b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 2360b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2361b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(GeneratedMapFieldReflectionTest, MutableUnknownFields) { 2362b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap message; 2363b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapReflectionTester reflection_tester( 2364b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap::descriptor()); 2365b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reflection_tester.MutableUnknownFieldsOfMapFieldsViaReflection(&message); 2366b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 2367b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2368b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(GeneratedMapFieldReflectionTest, EmbedProto2Message) { 2369b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMessageMap message; 2370b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2371b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const FieldDescriptor* map_field = 2372b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMessageMap::descriptor()->FindFieldByName( 2373b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "map_int32_message"); 2374b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const FieldDescriptor* value = 2375b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer map_field->message_type()->FindFieldByName("value"); 2376b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2377b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Message* entry_message = 2378b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message.GetReflection()->AddMessage(&message, map_field); 2379b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ( 2380b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer &entry_message->GetReflection()->GetMessage(*entry_message, value), 2381b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reinterpret_cast<const Message*>(&TestAllTypes::default_instance())); 2382b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2383b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Message* proto2_message = 2384b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer entry_message->GetReflection()->MutableMessage(entry_message, value); 2385b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(unittest::TestAllTypes::descriptor(), 2386b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer proto2_message->GetDescriptor()); 2387b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ASSERT_EQ(1, message.map_int32_message().size()); 2388b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 2389b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2390b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(GeneratedMapFieldReflectionTest, MergeFromClearMapEntry) { 2391b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap message; 2392b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const FieldDescriptor* map_field = 2393b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap::descriptor()->FindFieldByName("map_int32_int32"); 2394b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const FieldDescriptor* key = 2395b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer map_field->message_type()->FindFieldByName("key"); 2396b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const FieldDescriptor* value = 2397b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer map_field->message_type()->FindFieldByName("value"); 2398b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2399b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Message* entry_message1 = 2400b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message.GetReflection()->AddMessage(&message, map_field); 2401b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_FALSE(entry_message1->GetReflection()->HasField(*entry_message1, key)); 2402b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_FALSE( 2403b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer entry_message1->GetReflection()->HasField(*entry_message1, value)); 2404b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2405b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Message* entry_message2 = 2406b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message.GetReflection()->AddMessage(&message, map_field); 2407b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_FALSE(entry_message2->GetReflection()->HasField(*entry_message2, key)); 2408b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_FALSE( 2409b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer entry_message2->GetReflection()->HasField(*entry_message2, value)); 2410b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2411b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer entry_message1->MergeFrom(*entry_message2); 2412b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_FALSE(entry_message1->GetReflection()->HasField(*entry_message1, key)); 2413b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_FALSE( 2414b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer entry_message1->GetReflection()->HasField(*entry_message1, value)); 2415b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 2416b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2417b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(GeneratedMapFieldReflectionTest, MapEntryClear) { 2418b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap message; 2419b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapReflectionTester reflection_tester( 2420b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap::descriptor()); 2421b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reflection_tester.MutableUnknownFieldsOfMapFieldsViaReflection(&message); 2422b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 2423b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2424b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(GeneratedMapFieldReflectionTest, Proto2MapEntryClear) { 2425b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestEnumMap message; 2426b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Descriptor* descriptor = message.GetDescriptor(); 2427b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const FieldDescriptor* field_descriptor = 2428b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer descriptor->FindFieldByName("known_map_field"); 2429b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const FieldDescriptor* value_descriptor = 2430b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer field_descriptor->message_type()->FindFieldByName("value"); 2431b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Message* sub_message = 2432b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message.GetReflection()->AddMessage(&message, field_descriptor); 2433b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(0, sub_message->GetReflection()->GetEnumValue(*sub_message, 2434b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer value_descriptor)); 2435b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 2436b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2437b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Map Reflection API Test ========================================= 2438b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2439b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(GeneratedMapFieldReflectionTest, SetViaMapReflection) { 2440b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap message; 2441b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapReflectionTester reflection_tester( 2442b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap::descriptor()); 2443b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reflection_tester.SetMapFieldsViaMapReflection(&message); 2444b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reflection_tester.ExpectMapFieldsSetViaReflection(message); 2445b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reflection_tester.ExpectMapFieldsSetViaReflectionIterator(&message); 2446b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 2447b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2448b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Dynamic Message Test ============================================= 2449b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2450b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerclass MapFieldInDynamicMessageTest : public testing::Test { 2451b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer protected: 2452b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const DescriptorPool* pool_; 2453b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer DynamicMessageFactory factory_; 2454b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Descriptor* map_descriptor_; 2455b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Descriptor* recursive_map_descriptor_; 2456b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Message* map_prototype_; 2457b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2458b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapFieldInDynamicMessageTest() 2459b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer : pool_(DescriptorPool::generated_pool()), factory_(pool_) {} 2460b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2461b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer virtual void SetUp() { 2462b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer map_descriptor_ = 2463b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer pool_->FindMessageTypeByName("protobuf_unittest.TestMap"); 2464b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer recursive_map_descriptor_ = 2465b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer pool_->FindMessageTypeByName("protobuf_unittest.TestRecursiveMapMessage"); 2466b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ASSERT_TRUE(map_descriptor_ != NULL); 2467b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ASSERT_TRUE(recursive_map_descriptor_ != NULL); 2468b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer map_prototype_ = factory_.GetPrototype(map_descriptor_); 2469b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 2470b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}; 2471b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2472b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST_F(MapFieldInDynamicMessageTest, MapIndependentOffsets) { 2473b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Check that all fields have independent offsets by setting each 2474b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // one to a unique value then checking that they all still have those 2475b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // unique values (i.e. they don't stomp each other). 2476b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer google::protobuf::scoped_ptr<Message> message(map_prototype_->New()); 2477b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapReflectionTester reflection_tester(map_descriptor_); 2478b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2479b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reflection_tester.SetMapFieldsViaReflection(message.get()); 2480b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reflection_tester.ExpectMapFieldsSetViaReflection(*message); 2481b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 2482b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2483b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST_F(MapFieldInDynamicMessageTest, DynamicMapReflection) { 2484b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Check that map fields work properly. 2485b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer google::protobuf::scoped_ptr<Message> message(map_prototype_->New()); 2486b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2487b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Check set functions. 2488b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapReflectionTester reflection_tester(map_descriptor_); 2489b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reflection_tester.SetMapFieldsViaMapReflection(message.get()); 2490b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reflection_tester.ExpectMapFieldsSetViaReflection(*message); 2491b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 2492b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2493b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST_F(MapFieldInDynamicMessageTest, MapSpaceUsed) { 2494b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Test that SpaceUsed() works properly 2495b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2496b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Since we share the implementation with generated messages, we don't need 2497b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // to test very much here. Just make sure it appears to be working. 2498b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2499b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer google::protobuf::scoped_ptr<Message> message(map_prototype_->New()); 2500b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapReflectionTester reflection_tester(map_descriptor_); 2501b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2502b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int initial_space_used = message->SpaceUsed(); 2503b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2504b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reflection_tester.SetMapFieldsViaReflection(message.get()); 2505b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_LT(initial_space_used, message->SpaceUsed()); 2506b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 2507b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2508b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST_F(MapFieldInDynamicMessageTest, RecursiveMap) { 2509b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer TestRecursiveMapMessage from; 2510b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer (*from.mutable_a())[""]; 2511b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string data = from.SerializeAsString(); 2512b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer google::protobuf::scoped_ptr<Message> to( 2513b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer factory_.GetPrototype(recursive_map_descriptor_)->New()); 2514b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ASSERT_TRUE(to->ParseFromString(data)); 2515b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 2516b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2517b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// ReflectionOps Test =============================================== 2518b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2519b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(ReflectionOpsForMapFieldTest, MapSanityCheck) { 2520b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap message; 2521b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2522b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::SetMapFields(&message); 2523b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::ExpectMapFieldsSet(message); 2524b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 2525b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2526b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(ReflectionOpsForMapFieldTest, MapCopy) { 2527b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap message, message2; 2528b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2529b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::SetMapFields(&message); 2530b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2531b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ReflectionOps::Copy(message, &message2); 2532b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2533b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::ExpectMapFieldsSet(message2); 2534b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2535b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Copying from self should be a no-op. 2536b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ReflectionOps::Copy(message2, &message2); 2537b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::ExpectMapFieldsSet(message2); 2538b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 2539b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2540b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(ReflectionOpsForMapFieldTest, MergeMap) { 2541b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Note: Copy is implemented in terms of Merge() so technically the Copy 2542b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // test already tested most of this. 2543b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2544b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap message, message2; 2545b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2546b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::SetMapFields(&message); 2547b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2548b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ReflectionOps::Merge(message2, &message); 2549b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2550b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::ExpectMapFieldsSet(message); 2551b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 2552b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2553b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(ReflectionOpsForMapFieldTest, ClearMap) { 2554b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap message; 2555b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2556b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::SetMapFields(&message); 2557b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2558b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ReflectionOps::Clear(&message); 2559b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2560b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::ExpectClear(message); 2561b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 2562b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2563b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(ReflectionOpsForMapFieldTest, MapDiscardUnknownFields) { 2564b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap message; 2565b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::SetMapFields(&message); 2566b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2567b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Set some unknown fields in message. 2568b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message.GetReflection()->MutableUnknownFields(&message)-> 2569b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer AddVarint(123456, 654321); 2570b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2571b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Discard them. 2572b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ReflectionOps::DiscardUnknownFields(&message); 2573b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::ExpectMapFieldsSet(message); 2574b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2575b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(0, message.GetReflection()-> 2576b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer GetUnknownFields(message).field_count()); 2577b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 2578b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2579b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Wire Format Test ================================================= 2580b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2581b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(WireFormatForMapFieldTest, ParseMap) { 2582b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap source, dest; 2583b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string data; 2584b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2585b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Serialize using the generated code. 2586b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::SetMapFields(&source); 2587b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer source.SerializeToString(&data); 2588b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2589b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Parse using WireFormat. 2590b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer io::ArrayInputStream raw_input(data.data(), data.size()); 2591b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer io::CodedInputStream input(&raw_input); 2592b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer WireFormat::ParseAndMergePartial(&input, &dest); 2593b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2594b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Check. 2595b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::ExpectMapFieldsSet(dest); 2596b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 2597b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2598b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(WireFormatForMapFieldTest, MapByteSize) { 2599b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap message; 2600b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::SetMapFields(&message); 2601b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2602b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(message.ByteSize(), WireFormat::ByteSize(message)); 2603b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message.Clear(); 2604b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(0, message.ByteSize()); 2605b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(0, WireFormat::ByteSize(message)); 2606b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 2607b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2608b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(WireFormatForMapFieldTest, SerializeMap) { 2609b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap message; 2610b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string generated_data; 2611b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string dynamic_data; 2612b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2613b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::SetMapFields(&message); 2614b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2615b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Serialize using the generated code. 2616b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer { 2617b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message.ByteSize(); 2618b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer io::StringOutputStream raw_output(&generated_data); 2619b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer io::CodedOutputStream output(&raw_output); 2620b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message.SerializeWithCachedSizes(&output); 2621b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ASSERT_FALSE(output.HadError()); 2622b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 2623b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2624b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Serialize using WireFormat. 2625b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer { 2626b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer io::StringOutputStream raw_output(&dynamic_data); 2627b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer io::CodedOutputStream output(&raw_output); 2628b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int size = WireFormat::ByteSize(message); 2629b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer WireFormat::SerializeWithCachedSizes(message, size, &output); 2630b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ASSERT_FALSE(output.HadError()); 2631b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 2632b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2633b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Should be the same. 2634b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Don't use EXPECT_EQ here because we're comparing raw binary data and 2635b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // we really don't want it dumped to stdout on failure. 2636b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(dynamic_data == generated_data); 2637b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 2638b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2639b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(WireFormatForMapFieldTest, MapParseHelpers) { 2640b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string data; 2641b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2642b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer { 2643b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Set up. 2644b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer protobuf_unittest::TestMap message; 2645b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::SetMapFields(&message); 2646b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message.SerializeToString(&data); 2647b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 2648b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2649b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer { 2650b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Test ParseFromString. 2651b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer protobuf_unittest::TestMap message; 2652b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(message.ParseFromString(data)); 2653b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::ExpectMapFieldsSet(message); 2654b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 2655b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2656b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer { 2657b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Test ParseFromIstream. 2658b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer protobuf_unittest::TestMap message; 2659b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer stringstream stream(data); 2660b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(message.ParseFromIstream(&stream)); 2661b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(stream.eof()); 2662b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::ExpectMapFieldsSet(message); 2663b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 2664b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2665b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer { 2666b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Test ParseFromBoundedZeroCopyStream. 2667b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string data_with_junk(data); 2668b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer data_with_junk.append("some junk on the end"); 2669b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer io::ArrayInputStream stream(data_with_junk.data(), data_with_junk.size()); 2670b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer protobuf_unittest::TestMap message; 2671b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(message.ParseFromBoundedZeroCopyStream(&stream, data.size())); 2672b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::ExpectMapFieldsSet(message); 2673b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 2674b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2675b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer { 2676b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Test that ParseFromBoundedZeroCopyStream fails (but doesn't crash) if 2677b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // EOF is reached before the expected number of bytes. 2678b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer io::ArrayInputStream stream(data.data(), data.size()); 2679b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer protobuf_unittest::TestAllTypes message; 2680b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_FALSE( 2681b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message.ParseFromBoundedZeroCopyStream(&stream, data.size() + 1)); 2682b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 2683b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 2684b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2685b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Text Format Test ================================================= 2686b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2687b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(TextFormatMapTest, SerializeAndParse) { 2688b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap source; 2689b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap dest; 2690b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::SetMapFields(&source); 2691b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string output; 2692b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2693b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Test compact ASCII 2694b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer TextFormat::Printer printer; 2695b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer printer.PrintToString(source, &output); 2696b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer TextFormat::Parser parser; 2697b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(parser.ParseFromString(output, &dest)); 2698b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::ExpectMapFieldsSet(dest); 2699b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 2700b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2701b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(TextFormatMapTest, Sorted) { 2702b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap message; 2703b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapReflectionTester tester(message.GetDescriptor()); 2704b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer tester.SetMapFieldsViaReflection(&message); 2705b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2706b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string expected_text; 2707b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer GOOGLE_CHECK_OK(File::GetContents( 2708b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer TestSourceDir() + 2709b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "/google/protobuf/" 2710b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "testdata/map_test_data.txt", 2711b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer &expected_text, true)); 2712b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2713b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(message.DebugString(), expected_text); 2714b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2715b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Test again on the reverse order. 2716b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestMap message2; 2717b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer tester.SetMapFieldsViaReflection(&message2); 2718b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer tester.SwapMapsViaReflection(&message2); 2719b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_EQ(message2.DebugString(), expected_text); 2720b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 2721b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2722b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2723b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// arena support ================================================= 2724b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(ArenaTest, ParsingAndSerializingNoHeapAllocation) { 2725b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Allocate a large initial block to avoid mallocs during hooked test. 2726b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer std::vector<char> arena_block(128 * 1024); 2727b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ArenaOptions options; 2728b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer options.initial_block = &arena_block[0]; 2729b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer options.initial_block_size = arena_block.size(); 2730b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Arena arena(options); 2731b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string data; 2732b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer data.reserve(128 * 1024); 2733b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2734b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer { 2735b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // TODO(teboring): Enable no heap check when ArenaStringPtr is used in map. 2736b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // NoHeapChecker no_heap; 2737b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2738b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestArenaMap* from = 2739b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Arena::CreateMessage<unittest::TestArenaMap>(&arena); 2740b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::SetArenaMapFields(from); 2741b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer from->SerializeToString(&data); 2742b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2743b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestArenaMap* to = 2744b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Arena::CreateMessage<unittest::TestArenaMap>(&arena); 2745b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer to->ParseFromString(data); 2746b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::ExpectArenaMapFieldsSet(*to); 2747b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 2748b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 2749b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2750b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Use text format parsing and serializing to test reflection api. 2751b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(ArenaTest, RelfectionInTextFormat) { 2752b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Arena arena; 2753b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string data; 2754b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2755b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer TextFormat::Printer printer; 2756b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer TextFormat::Parser parser; 2757b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2758b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestArenaMap* from = 2759b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Arena::CreateMessage<unittest::TestArenaMap>(&arena); 2760b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestArenaMap* to = 2761b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Arena::CreateMessage<unittest::TestArenaMap>(&arena); 2762b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2763b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::SetArenaMapFields(from); 2764b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer printer.PrintToString(*from, &data); 2765b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2766b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer EXPECT_TRUE(parser.ParseFromString(data, to)); 2767b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MapTestUtil::ExpectArenaMapFieldsSet(*to); 2768b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 2769b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2770b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Make sure the memory allocated for string in map is deallocated. 2771b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerTEST(ArenaTest, StringMapNoLeak) { 2772b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Arena arena; 2773b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest::TestArenaMap* message = 2774b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Arena::CreateMessage<unittest::TestArenaMap>(&arena); 2775b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string data; 2776b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // String with length less than 16 will not be allocated from heap. 2777b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int original_capacity = data.capacity(); 2778b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer while (data.capacity() <= original_capacity) { 2779b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer data.append("a"); 2780b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 2781b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer (*message->mutable_map_string_string())[data] = data; 2782b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // We rely on heap checkers to detect memory leak for us. 2783b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ASSERT_FALSE(message == NULL); 2784b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 2785b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2786b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} // namespace internal 2787b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} // namespace protobuf 2788b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} // namespace google 2789