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