blob: 451b02e84a84e3f02ca5f96f6f3724ae36cf7cbb [file] [log] [blame]
Feng Xiaof157a562014-11-14 11:50:31 -08001// Protocol Buffers - Google's data interchange format
2// Copyright 2008 Google Inc. All rights reserved.
3// https://developers.google.com/protocol-buffers/
4//
5// Redistribution and use in source and binary forms, with or without
6// modification, are permitted provided that the following conditions are
7// met:
8//
9// * Redistributions of source code must retain the above copyright
10// notice, this list of conditions and the following disclaimer.
11// * Redistributions in binary form must reproduce the above
12// copyright notice, this list of conditions and the following disclaimer
13// in the documentation and/or other materials provided with the
14// distribution.
15// * Neither the name of Google Inc. nor the names of its
16// contributors may be used to endorse or promote products derived from
17// this software without specific prior written permission.
18//
19// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
31#include <map>
32#include <memory>
33#ifndef _SHARED_PTR_H
34#include <google/protobuf/stubs/shared_ptr.h>
35#endif
36#include <sstream>
37
38#include <google/protobuf/stubs/casts.h>
Feng Xiaoeee38b02015-08-22 18:25:48 -070039#include <google/protobuf/stubs/logging.h>
Feng Xiaof157a562014-11-14 11:50:31 -080040#include <google/protobuf/stubs/common.h>
Feng Xiaoeee38b02015-08-22 18:25:48 -070041#include <google/protobuf/stubs/scoped_ptr.h>
Feng Xiaof157a562014-11-14 11:50:31 -080042#include <google/protobuf/stubs/stringprintf.h>
43#include <google/protobuf/testing/file.h>
Jisi Liu885b6122015-02-28 14:51:22 -080044#include <google/protobuf/arena_test_util.h>
Feng Xiaof157a562014-11-14 11:50:31 -080045#include <google/protobuf/map_proto2_unittest.pb.h>
46#include <google/protobuf/map_unittest.pb.h>
47#include <google/protobuf/map_test_util.h>
48#include <google/protobuf/test_util.h>
49#include <google/protobuf/unittest.pb.h>
50#include <google/protobuf/descriptor.pb.h>
51#include <google/protobuf/descriptor.h>
52#include <google/protobuf/descriptor_database.h>
53#include <google/protobuf/dynamic_message.h>
54#include <google/protobuf/map.h>
55#include <google/protobuf/map_field_inl.h>
56#include <google/protobuf/message.h>
57#include <google/protobuf/reflection.h>
58#include <google/protobuf/reflection_ops.h>
59#include <google/protobuf/text_format.h>
60#include <google/protobuf/wire_format.h>
61#include <google/protobuf/wire_format_lite_inl.h>
62#include <google/protobuf/io/coded_stream.h>
63#include <google/protobuf/io/tokenizer.h>
64#include <google/protobuf/io/zero_copy_stream_impl.h>
65#include <google/protobuf/stubs/strutil.h>
66#include <google/protobuf/stubs/substitute.h>
67#include <google/protobuf/testing/googletest.h>
68#include <gtest/gtest.h>
69
70namespace google {
71
72using google::protobuf::unittest::ForeignMessage;
73using google::protobuf::unittest::TestAllTypes;
74using google::protobuf::unittest::TestMap;
Feng Xiaoeee38b02015-08-22 18:25:48 -070075using google::protobuf::unittest::TestRecursiveMapMessage;
Feng Xiaof157a562014-11-14 11:50:31 -080076
77namespace protobuf {
78namespace internal {
79
80// Map API Test =====================================================
81
82class MapImplTest : public ::testing::Test {
83 protected:
84 MapImplTest()
85 : map_ptr_(new Map<int32, int32>),
86 map_(*map_ptr_),
87 const_map_(*map_ptr_) {
88 EXPECT_TRUE(map_.empty());
89 EXPECT_EQ(0, map_.size());
90 }
Tres Seaver41136852014-11-18 11:58:21 -050091 ~MapImplTest() {}
Feng Xiaof157a562014-11-14 11:50:31 -080092
93 void ExpectSingleElement(int32 key, int32 value) {
94 EXPECT_FALSE(map_.empty());
95 EXPECT_EQ(1, map_.size());
96 ExpectElement(key, value);
97 }
98
99 void ExpectElements(const std::map<int32, int32>& map) {
100 EXPECT_FALSE(map_.empty());
101 EXPECT_EQ(map.size(), map_.size());
102 for (std::map<int32, int32>::const_iterator it = map.begin();
103 it != map.end(); ++it) {
104 ExpectElement(it->first, it->second);
105 }
106 }
107
108 void ExpectElement(int32 key, int32 value) {
109 // Test map size is correct.
110 EXPECT_EQ(value, map_[key]);
111 EXPECT_EQ(1, map_.count(key));
112
113 // Check mutable at and find work correctly.
114 EXPECT_EQ(value, map_.at(key));
115 Map<int32, int32>::iterator it = map_.find(key);
116
117 // interator dereferenceable
118 EXPECT_EQ(key, (*it).first);
119 EXPECT_EQ(value, (*it).second);
120 EXPECT_EQ(key, it->first);
121 EXPECT_EQ(value, it->second);
122
123 // iterator mutable
124 ((*it).second) = value + 1;
125 EXPECT_EQ(value + 1, map_[key]);
126 ((*it).second) = value;
127 EXPECT_EQ(value, map_[key]);
128
129 it->second = value + 1;
130 EXPECT_EQ(value + 1, map_[key]);
131 it->second = value;
132 EXPECT_EQ(value, map_[key]);
133
134 // copy constructor
135 Map<int32, int32>::iterator it_copy = it;
136 EXPECT_EQ(key, it_copy->first);
137 EXPECT_EQ(value, it_copy->second);
138
139 // Immutable API ================================================
140
141 // Check immutable at and find work correctly.
142 EXPECT_EQ(value, const_map_.at(key));
143 Map<int32, int32>::const_iterator const_it = const_map_.find(key);
144
145 // interator dereferenceable
146 EXPECT_EQ(key, (*const_it).first);
147 EXPECT_EQ(value, (*const_it).second);
148 EXPECT_EQ(key, const_it->first);
149 EXPECT_EQ(value, const_it->second);
150
151 // copy constructor
152 Map<int32, int32>::const_iterator const_it_copy = const_it;
153 EXPECT_EQ(key, const_it_copy->first);
154 EXPECT_EQ(value, const_it_copy->second);
155 }
156
157 google::protobuf::scoped_ptr<Map<int32, int32> > map_ptr_;
158 Map<int32, int32>& map_;
159 const Map<int32, int32>& const_map_;
160};
161
162TEST_F(MapImplTest, OperatorBracket) {
163 int32 key = 0;
164 int32 value1 = 100;
165 int32 value2 = 101;
166
167 EXPECT_EQ(0, map_[key]);
168
169 map_[key] = value1;
170 ExpectSingleElement(key, value1);
171
172 map_[key] = value2;
173 ExpectSingleElement(key, value2);
174}
175
176TEST_F(MapImplTest, OperatorBracketNonExist) {
177 int32 key = 0;
178 int32 default_value = 0;
179
180 EXPECT_EQ(default_value, map_[key]);
181 ExpectSingleElement(key, default_value);
182}
183
184TEST_F(MapImplTest, MutableAt) {
185 int32 key = 0;
186 int32 value1 = 100;
187 int32 value2 = 101;
188
189 map_[key] = value1;
190 ExpectSingleElement(key, value1);
191
192 map_.at(key) = value2;
193 ExpectSingleElement(key, value2);
194}
195
Feng Xiao58dfce92014-12-03 12:12:17 -0800196#ifdef PROTOBUF_HAS_DEATH_TEST
Jisi Liu885b6122015-02-28 14:51:22 -0800197
Feng Xiaof157a562014-11-14 11:50:31 -0800198TEST_F(MapImplTest, MutableAtNonExistDeathTest) {
199 EXPECT_DEATH(map_.at(0), "");
200}
201
202TEST_F(MapImplTest, ImmutableAtNonExistDeathTest) {
203 EXPECT_DEATH(const_map_.at(0), "");
204}
Jisi Liu885b6122015-02-28 14:51:22 -0800205
Feng Xiaoeee38b02015-08-22 18:25:48 -0700206TEST_F(MapImplTest, UsageErrors) {
207 MapKey key;
208 key.SetInt64Value(1);
209 EXPECT_DEATH(key.GetUInt64Value(),
210 "Protocol Buffer map usage error:\n"
211 "MapKey::GetUInt64Value type does not match\n"
212 " Expected : uint64\n"
213 " Actual : int64");
214
215 MapValueRef value;
216 EXPECT_DEATH(value.SetFloatValue(0.1),
217 "Protocol Buffer map usage error:\n"
218 "MapValueRef::type MapValueRef is not initialized.");
219}
220
Feng Xiao58dfce92014-12-03 12:12:17 -0800221#endif // PROTOBUF_HAS_DEATH_TEST
Feng Xiaof157a562014-11-14 11:50:31 -0800222
223TEST_F(MapImplTest, CountNonExist) {
224 EXPECT_EQ(0, map_.count(0));
225}
226
227TEST_F(MapImplTest, MutableFindNonExist) {
228 EXPECT_TRUE(map_.end() == map_.find(0));
229}
230
231TEST_F(MapImplTest, ImmutableFindNonExist) {
232 EXPECT_TRUE(const_map_.end() == const_map_.find(0));
233}
234
235TEST_F(MapImplTest, ConstEnd) {
236 EXPECT_TRUE(const_map_.end() == const_map_.cend());
237}
238
239TEST_F(MapImplTest, GetReferenceFromIterator) {
240 for (int i = 0; i < 10; i++) {
241 map_[i] = i;
242 }
243
244 for (Map<int32, int32>::const_iterator it = map_.cbegin();
245 it != map_.cend();) {
246 Map<int32, int32>::const_reference entry = *it++;
247 EXPECT_EQ(entry.first, entry.second);
248 }
249
250 for (Map<int32, int32>::const_iterator it = const_map_.begin();
251 it != const_map_.end();) {
252 Map<int32, int32>::const_reference entry = *it++;
253 EXPECT_EQ(entry.first, entry.second);
254 }
255
256 for (Map<int32, int32>::iterator it = map_.begin(); it != map_.end();) {
257 Map<int32, int32>::reference entry = *it++;
258 EXPECT_EQ(entry.first + 1, ++entry.second);
259 }
260}
261
Feng Xiao99aa0f92014-11-20 16:18:53 -0800262TEST_F(MapImplTest, IteratorBasic) {
263 map_[0] = 0;
264
265 // Default constructible (per forward iterator requirements).
266 Map<int, int>::const_iterator cit;
267 Map<int, int>::iterator it;
268
269 it = map_.begin();
270 cit = it; // Converts to const_iterator
271
272 // Can compare between them.
273 EXPECT_TRUE(it == cit);
274 EXPECT_FALSE(cit != it);
275
276 // Pre increment.
277 EXPECT_FALSE(it == ++cit);
278
279 // Post increment.
280 EXPECT_FALSE(it++ == cit);
281 EXPECT_TRUE(it == cit);
282}
283
284template <typename T>
285bool IsConstHelper(T& /*t*/) { // NOLINT. We want to catch non-const refs here.
286 return false;
287}
288template <typename T>
289bool IsConstHelper(const T& /*t*/) {
290 return true;
291}
292
293TEST_F(MapImplTest, IteratorConstness) {
294 map_[0] = 0;
295 EXPECT_TRUE(IsConstHelper(*map_.cbegin()));
296 EXPECT_TRUE(IsConstHelper(*const_map_.begin()));
297 EXPECT_FALSE(IsConstHelper(*map_.begin()));
298}
299
300bool IsForwardIteratorHelper(std::forward_iterator_tag /*tag*/) { return true; }
301template <typename T>
302bool IsForwardIteratorHelper(T /*t*/) {
303 return false;
304}
305
306TEST_F(MapImplTest, IteratorCategory) {
307 EXPECT_TRUE(IsForwardIteratorHelper(
308 std::iterator_traits<Map<int, int>::iterator>::iterator_category()));
309 EXPECT_TRUE(IsForwardIteratorHelper(std::iterator_traits<
310 Map<int, int>::const_iterator>::iterator_category()));
311}
312
Feng Xiaof157a562014-11-14 11:50:31 -0800313TEST_F(MapImplTest, InsertSingle) {
314 int32 key = 0;
315 int32 value1 = 100;
316 int32 value2 = 101;
317
318 // Insert a non-existed key.
319 std::pair<Map<int32, int32>::iterator, bool> result1 =
320 map_.insert(Map<int32, int32>::value_type(key, value1));
321 ExpectSingleElement(key, value1);
322
323 Map<int32, int32>::iterator it1 = result1.first;
324 EXPECT_EQ(key, it1->first);
325 EXPECT_EQ(value1, it1->second);
326 EXPECT_TRUE(result1.second);
327
328 // Insert an existed key.
329 std::pair<Map<int32, int32>::iterator, bool> result2 =
330 map_.insert(Map<int32, int32>::value_type(key, value2));
331 ExpectSingleElement(key, value1);
332
333 Map<int32, int32>::iterator it2 = result2.first;
334 EXPECT_TRUE(it1 == it2);
335 EXPECT_FALSE(result2.second);
336}
337
338TEST_F(MapImplTest, InsertByIterator) {
339 int32 key1 = 0;
340 int32 key2 = 1;
341 int32 value1a = 100;
342 int32 value1b = 101;
343 int32 value2a = 200;
344 int32 value2b = 201;
345
346 std::map<int32, int32> map1;
347 map1[key1] = value1a;
348 map1[key2] = value2a;
349
350 map_.insert(map1.begin(), map1.end());
351 ExpectElements(map1);
352
353 std::map<int32, int32> map2;
354 map2[key1] = value1b;
355 map2[key2] = value2b;
356
357 map_.insert(map2.begin(), map2.end());
358 ExpectElements(map1);
359}
360
361TEST_F(MapImplTest, EraseSingleByKey) {
362 int32 key = 0;
363 int32 value = 100;
364
365 map_[key] = value;
366 ExpectSingleElement(key, value);
367
368 // Erase an existing key.
369 EXPECT_EQ(1, map_.erase(key));
370 EXPECT_TRUE(map_.empty());
371 EXPECT_EQ(0, map_.size());
372 EXPECT_TRUE(map_.end() == map_.find(key));
373 EXPECT_TRUE(map_.begin() == map_.end());
374
375 // Erase a non-existing key.
376 EXPECT_EQ(0, map_.erase(key));
377}
378
379TEST_F(MapImplTest, EraseMutipleByKey) {
380 // erase in one specific order to trigger corner cases
381 for (int i = 0; i < 5; i++) {
382 map_[i] = i;
383 }
384
385 map_.erase(0);
386 EXPECT_EQ(4, map_.size());
387 EXPECT_TRUE(map_.end() == map_.find(0));
388
389 map_.erase(1);
390 EXPECT_EQ(3, map_.size());
391 EXPECT_TRUE(map_.end() == map_.find(1));
392
393 map_.erase(3);
394 EXPECT_EQ(2, map_.size());
395 EXPECT_TRUE(map_.end() == map_.find(3));
396
397 map_.erase(4);
398 EXPECT_EQ(1, map_.size());
399 EXPECT_TRUE(map_.end() == map_.find(4));
400
401 map_.erase(2);
402 EXPECT_EQ(0, map_.size());
403 EXPECT_TRUE(map_.end() == map_.find(2));
404}
405
406TEST_F(MapImplTest, EraseSingleByIterator) {
407 int32 key = 0;
408 int32 value = 100;
409
410 map_[key] = value;
411 ExpectSingleElement(key, value);
412
413 Map<int32, int32>::iterator it = map_.find(key);
414 map_.erase(it);
415 EXPECT_TRUE(map_.empty());
416 EXPECT_EQ(0, map_.size());
417 EXPECT_TRUE(map_.end() == map_.find(key));
418 EXPECT_TRUE(map_.begin() == map_.end());
419}
420
421TEST_F(MapImplTest, ValidIteratorAfterErase) {
422 for (int i = 0; i < 10; i++) {
423 map_[i] = i;
424 }
425
426 int count = 0;
427
428 for (Map<int32, int32>::iterator it = map_.begin(); it != map_.end();) {
429 count++;
430 if (it->first % 2 == 1) {
431 map_.erase(it++);
432 } else {
433 ++it;
434 }
435 }
436
437 EXPECT_EQ(10, count);
438 EXPECT_EQ(5, map_.size());
439}
440
441TEST_F(MapImplTest, EraseByIterator) {
442 int32 key1 = 0;
443 int32 key2 = 1;
444 int32 value1 = 100;
445 int32 value2 = 101;
446
447 std::map<int32, int32> map;
448 map[key1] = value1;
449 map[key2] = value2;
450
451 map_.insert(map.begin(), map.end());
452 ExpectElements(map);
453
454 map_.erase(map_.begin(), map_.end());
455 EXPECT_TRUE(map_.empty());
456 EXPECT_EQ(0, map_.size());
457 EXPECT_TRUE(map_.end() == map_.find(key1));
458 EXPECT_TRUE(map_.end() == map_.find(key2));
459 EXPECT_TRUE(map_.begin() == map_.end());
460}
461
462TEST_F(MapImplTest, Clear) {
463 int32 key = 0;
464 int32 value = 100;
465
466 map_[key] = value;
467 ExpectSingleElement(key, value);
468
469 map_.clear();
470
471 EXPECT_TRUE(map_.empty());
472 EXPECT_EQ(0, map_.size());
473 EXPECT_TRUE(map_.end() == map_.find(key));
474 EXPECT_TRUE(map_.begin() == map_.end());
475}
476
477TEST_F(MapImplTest, CopyConstructor) {
478 int32 key1 = 0;
479 int32 key2 = 1;
480 int32 value1 = 100;
481 int32 value2 = 101;
482
483 std::map<int32, int32> map;
484 map[key1] = value1;
485 map[key2] = value2;
486
487 map_.insert(map.begin(), map.end());
488
489 Map<int32, int32> other(map_);
490
491 EXPECT_EQ(2, other.size());
492 EXPECT_EQ(value1, other.at(key1));
493 EXPECT_EQ(value2, other.at(key2));
494}
495
Feng Xiaoeee38b02015-08-22 18:25:48 -0700496TEST_F(MapImplTest, IterConstructor) {
497 int32 key1 = 0;
498 int32 key2 = 1;
499 int32 value1 = 100;
500 int32 value2 = 101;
501
502 std::map<int32, int32> map;
503 map[key1] = value1;
504 map[key2] = value2;
505
506 Map<int32, int32> new_map(map.begin(), map.end());
507
508 EXPECT_EQ(2, new_map.size());
509 EXPECT_EQ(value1, new_map.at(key1));
510 EXPECT_EQ(value2, new_map.at(key2));
511}
512
Feng Xiaof157a562014-11-14 11:50:31 -0800513TEST_F(MapImplTest, Assigner) {
514 int32 key1 = 0;
515 int32 key2 = 1;
516 int32 value1 = 100;
517 int32 value2 = 101;
518
519 std::map<int32, int32> map;
520 map[key1] = value1;
521 map[key2] = value2;
522
523 map_.insert(map.begin(), map.end());
524
525 Map<int32, int32> other;
Feng Xiao99aa0f92014-11-20 16:18:53 -0800526 int32 key_other = 123;
527 int32 value_other = 321;
528 other[key_other] = value_other;
529 EXPECT_EQ(1, other.size());
530
Feng Xiaof157a562014-11-14 11:50:31 -0800531 other = map_;
532
533 EXPECT_EQ(2, other.size());
534 EXPECT_EQ(value1, other.at(key1));
535 EXPECT_EQ(value2, other.at(key2));
Feng Xiao99aa0f92014-11-20 16:18:53 -0800536 EXPECT_TRUE(other.find(key_other) == other.end());
537
538 // Self assign
539 other = other;
540 EXPECT_EQ(2, other.size());
541 EXPECT_EQ(value1, other.at(key1));
542 EXPECT_EQ(value2, other.at(key2));
Feng Xiaof157a562014-11-14 11:50:31 -0800543}
544
545TEST_F(MapImplTest, Rehash) {
546 const int test_size = 50;
547 std::map<int32, int32> reference_map;
548 for (int i = 0; i < test_size; i++) {
549 reference_map[i] = i;
550 }
551 for (int i = 0; i < test_size; i++) {
552 map_[i] = reference_map[i];
553 EXPECT_EQ(reference_map[i], map_[i]);
554 }
555 for (int i = 0; i < test_size; i++) {
556 map_.erase(i);
557 EXPECT_TRUE(map_.end() == map_.find(i));
558 }
559 EXPECT_TRUE(map_.empty());
560}
561
Feng Xiao99aa0f92014-11-20 16:18:53 -0800562TEST_F(MapImplTest, EqualRange) {
563 int key = 100, key_missing = 101;
564 map_[key] = 100;
565
566 std::pair<google::protobuf::Map<int32, int32>::iterator,
567 google::protobuf::Map<int32, int32>::iterator> range = map_.equal_range(key);
568 EXPECT_TRUE(map_.find(key) == range.first);
569 EXPECT_TRUE(++map_.find(key) == range.second);
570
571 range = map_.equal_range(key_missing);
572 EXPECT_TRUE(map_.end() == range.first);
573 EXPECT_TRUE(map_.end() == range.second);
574
575 std::pair<google::protobuf::Map<int32, int32>::const_iterator,
576 google::protobuf::Map<int32, int32>::const_iterator> const_range =
577 const_map_.equal_range(key);
578 EXPECT_TRUE(const_map_.find(key) == const_range.first);
579 EXPECT_TRUE(++const_map_.find(key) == const_range.second);
580
581 const_range = const_map_.equal_range(key_missing);
582 EXPECT_TRUE(const_map_.end() == const_range.first);
583 EXPECT_TRUE(const_map_.end() == const_range.second);
584}
585
Feng Xiao6ae3bde2014-11-25 14:01:44 -0800586TEST_F(MapImplTest, ConvertToStdMap) {
587 map_[100] = 101;
588 std::map<int32, int32> std_map(map_.begin(), map_.end());
589 EXPECT_EQ(1, std_map.size());
590 EXPECT_EQ(101, std_map[100]);
591}
592
Jisi Liu885b6122015-02-28 14:51:22 -0800593TEST_F(MapImplTest, ConvertToStdVectorOfPairs) {
594 map_[100] = 101;
595 std::vector<std::pair<int32, int32> > std_vec(map_.begin(), map_.end());
596 EXPECT_EQ(1, std_vec.size());
597 EXPECT_EQ(100, std_vec[0].first);
598 EXPECT_EQ(101, std_vec[0].second);
599}
600
Feng Xiaof157a562014-11-14 11:50:31 -0800601// Map Field Reflection Test ========================================
602
603static int Func(int i, int j) {
604 return i * j;
605}
606
607static string StrFunc(int i, int j) {
608 string str;
609 SStringPrintf(&str, "%d", Func(i, j));
610 return str;
611}
612
613static int Int(const string& value) {
614 int result = 0;
615 std::istringstream(value) >> result;
616 return result;
617}
618
619class MapFieldReflectionTest : public testing::Test {
620 protected:
621 typedef FieldDescriptor FD;
622};
623
624TEST_F(MapFieldReflectionTest, RegularFields) {
625 TestMap message;
626 const Reflection* refl = message.GetReflection();
627 const Descriptor* desc = message.GetDescriptor();
628
629 Map<int32, int32>* map_int32_int32 = message.mutable_map_int32_int32();
630 Map<int32, double>* map_int32_double = message.mutable_map_int32_double();
631 Map<string, string>* map_string_string = message.mutable_map_string_string();
632 Map<int32, ForeignMessage>* map_int32_foreign_message =
633 message.mutable_map_int32_foreign_message();
634
635 for (int i = 0; i < 10; ++i) {
636 (*map_int32_int32)[i] = Func(i, 1);
637 (*map_int32_double)[i] = Func(i, 2);
638 (*map_string_string)[StrFunc(i, 1)] = StrFunc(i, 5);
639 (*map_int32_foreign_message)[i].set_c(Func(i, 6));
640 }
641
642 // Get FieldDescriptors for all the fields of interest.
643 const FieldDescriptor* fd_map_int32_int32 =
644 desc->FindFieldByName("map_int32_int32");
645 const FieldDescriptor* fd_map_int32_double =
646 desc->FindFieldByName("map_int32_double");
647 const FieldDescriptor* fd_map_string_string =
648 desc->FindFieldByName("map_string_string");
649 const FieldDescriptor* fd_map_int32_foreign_message =
650 desc->FindFieldByName("map_int32_foreign_message");
651
652 const FieldDescriptor* fd_map_int32_in32_key =
653 fd_map_int32_int32->message_type()->FindFieldByName("key");
654 const FieldDescriptor* fd_map_int32_in32_value =
655 fd_map_int32_int32->message_type()->FindFieldByName("value");
656 const FieldDescriptor* fd_map_int32_double_key =
657 fd_map_int32_double->message_type()->FindFieldByName("key");
658 const FieldDescriptor* fd_map_int32_double_value =
659 fd_map_int32_double->message_type()->FindFieldByName("value");
660 const FieldDescriptor* fd_map_string_string_key =
661 fd_map_string_string->message_type()->FindFieldByName("key");
662 const FieldDescriptor* fd_map_string_string_value =
663 fd_map_string_string->message_type()->FindFieldByName("value");
664 const FieldDescriptor* fd_map_int32_foreign_message_key =
665 fd_map_int32_foreign_message->message_type()->FindFieldByName("key");
666 const FieldDescriptor* fd_map_int32_foreign_message_value =
667 fd_map_int32_foreign_message->message_type()->FindFieldByName("value");
668
669 // Get RepeatedPtrField objects for all fields of interest.
670 const RepeatedPtrField<Message>& mf_int32_int32 =
671 refl->GetRepeatedPtrField<Message>(message, fd_map_int32_int32);
672 const RepeatedPtrField<Message>& mf_int32_double =
673 refl->GetRepeatedPtrField<Message>(message, fd_map_int32_double);
674 const RepeatedPtrField<Message>& mf_string_string =
675 refl->GetRepeatedPtrField<Message>(message, fd_map_string_string);
676 const RepeatedPtrField<Message>&
677 mf_int32_foreign_message =
678 refl->GetRepeatedPtrField<Message>(
679 message, fd_map_int32_foreign_message);
680
681 // Get mutable RepeatedPtrField objects for all fields of interest.
682 RepeatedPtrField<Message>* mmf_int32_int32 =
683 refl->MutableRepeatedPtrField<Message>(&message, fd_map_int32_int32);
684 RepeatedPtrField<Message>* mmf_int32_double =
685 refl->MutableRepeatedPtrField<Message>(&message, fd_map_int32_double);
686 RepeatedPtrField<Message>* mmf_string_string =
687 refl->MutableRepeatedPtrField<Message>(&message, fd_map_string_string);
688 RepeatedPtrField<Message>* mmf_int32_foreign_message =
689 refl->MutableRepeatedPtrField<Message>(
690 &message, fd_map_int32_foreign_message);
691
692 // Make sure we can do gets through the RepeatedPtrField objects.
693 for (int i = 0; i < 10; ++i) {
694 {
695 // Check gets through const objects.
696 const Message& message_int32_int32 = mf_int32_int32.Get(i);
697 int32 key_int32_int32 = message_int32_int32.GetReflection()->GetInt32(
698 message_int32_int32, fd_map_int32_in32_key);
699 int32 value_int32_int32 = message_int32_int32.GetReflection()->GetInt32(
700 message_int32_int32, fd_map_int32_in32_value);
701 EXPECT_EQ(value_int32_int32, Func(key_int32_int32, 1));
702
703 const Message& message_int32_double = mf_int32_double.Get(i);
704 int32 key_int32_double = message_int32_double.GetReflection()->GetInt32(
705 message_int32_double, fd_map_int32_double_key);
706 double value_int32_double =
707 message_int32_double.GetReflection()->GetDouble(
708 message_int32_double, fd_map_int32_double_value);
709 EXPECT_EQ(value_int32_double, Func(key_int32_double, 2));
710
711 const Message& message_string_string = mf_string_string.Get(i);
712 string key_string_string =
713 message_string_string.GetReflection()->GetString(
714 message_string_string, fd_map_string_string_key);
715 string value_string_string =
716 message_string_string.GetReflection()->GetString(
717 message_string_string, fd_map_string_string_value);
718 EXPECT_EQ(value_string_string, StrFunc(Int(key_string_string), 5));
719
720 const Message& message_int32_message = mf_int32_foreign_message.Get(i);
721 int32 key_int32_message = message_int32_message.GetReflection()->GetInt32(
722 message_int32_message, fd_map_int32_foreign_message_key);
723 const ForeignMessage& value_int32_message =
724 down_cast<const ForeignMessage&>(
725 message_int32_message.GetReflection()
726 ->GetMessage(message_int32_message,
727 fd_map_int32_foreign_message_value));
728 EXPECT_EQ(value_int32_message.c(), Func(key_int32_message, 6));
729 }
730
731 {
732 // Check gets through mutable objects.
733 const Message& message_int32_int32 = mmf_int32_int32->Get(i);
734 int32 key_int32_int32 = message_int32_int32.GetReflection()->GetInt32(
735 message_int32_int32, fd_map_int32_in32_key);
736 int32 value_int32_int32 = message_int32_int32.GetReflection()->GetInt32(
737 message_int32_int32, fd_map_int32_in32_value);
738 EXPECT_EQ(value_int32_int32, Func(key_int32_int32, 1));
739
740 const Message& message_int32_double = mmf_int32_double->Get(i);
741 int32 key_int32_double = message_int32_double.GetReflection()->GetInt32(
742 message_int32_double, fd_map_int32_double_key);
743 double value_int32_double =
744 message_int32_double.GetReflection()->GetDouble(
745 message_int32_double, fd_map_int32_double_value);
746 EXPECT_EQ(value_int32_double, Func(key_int32_double, 2));
747
748 const Message& message_string_string = mmf_string_string->Get(i);
749 string key_string_string =
750 message_string_string.GetReflection()->GetString(
751 message_string_string, fd_map_string_string_key);
752 string value_string_string =
753 message_string_string.GetReflection()->GetString(
754 message_string_string, fd_map_string_string_value);
755 EXPECT_EQ(value_string_string, StrFunc(Int(key_string_string), 5));
756
757 const Message& message_int32_message = mmf_int32_foreign_message->Get(i);
758 int32 key_int32_message = message_int32_message.GetReflection()->GetInt32(
759 message_int32_message, fd_map_int32_foreign_message_key);
760 const ForeignMessage& value_int32_message =
761 down_cast<const ForeignMessage&>(
762 message_int32_message.GetReflection()
763 ->GetMessage(message_int32_message,
764 fd_map_int32_foreign_message_value));
765 EXPECT_EQ(value_int32_message.c(), Func(key_int32_message, 6));
766 }
767 }
768
769 // Do sets through the RepeatedPtrField objects.
770 for (int i = 0; i < 10; i++) {
771 {
772 Message* message_int32_int32 = mmf_int32_int32->Mutable(i);
773 int32 key_int32_int32 = message_int32_int32->GetReflection()->GetInt32(
774 *message_int32_int32, fd_map_int32_in32_key);
775 message_int32_int32->GetReflection()->SetInt32(message_int32_int32,
776 fd_map_int32_in32_value,
777 Func(key_int32_int32, -1));
778
779 Message* message_int32_double = mmf_int32_double->Mutable(i);
780 int32 key_int32_double = message_int32_double->GetReflection()->GetInt32(
781 *message_int32_double, fd_map_int32_double_key);
782 message_int32_double->GetReflection()->SetDouble(
783 message_int32_double, fd_map_int32_double_value,
784 Func(key_int32_double, -2));
785
786 Message* message_string_string = mmf_string_string->Mutable(i);
787 string key_string_string =
788 message_string_string->GetReflection()->GetString(
789 *message_string_string, fd_map_string_string_key);
790 message_string_string->GetReflection()->SetString(
791 message_string_string, fd_map_string_string_value,
792 StrFunc(Int(key_string_string), -5));
793
794 Message* message_int32_message = mmf_int32_foreign_message->Mutable(i);
795 int32 key_int32_message =
796 message_int32_message->GetReflection()->GetInt32(
797 *message_int32_message, fd_map_int32_foreign_message_key);
798 ForeignMessage* value_int32_message = down_cast<ForeignMessage*>(
799 message_int32_message->GetReflection()
800 ->MutableMessage(message_int32_message,
801 fd_map_int32_foreign_message_value));
802 value_int32_message->set_c(Func(key_int32_message, -6));
803 }
804 }
805
806 // Check gets through mutable objects.
807 for (int i = 0; i < 10; i++) {
808 EXPECT_EQ(Func(i, -1), message.map_int32_int32().at(i));
809 EXPECT_EQ(Func(i, -2), message.map_int32_double().at(i));
810 EXPECT_EQ(StrFunc(i, -5), message.map_string_string().at(StrFunc(i, 1)));
811 EXPECT_EQ(Func(i, -6), message.map_int32_foreign_message().at(i).c());
812 }
813}
814
815TEST_F(MapFieldReflectionTest, RepeatedFieldRefForRegularFields) {
816 TestMap message;
817 const Reflection* refl = message.GetReflection();
818 const Descriptor* desc = message.GetDescriptor();
819
820 Map<int32, int32>* map_int32_int32 = message.mutable_map_int32_int32();
821 Map<int32, double>* map_int32_double = message.mutable_map_int32_double();
822 Map<string, string>* map_string_string = message.mutable_map_string_string();
823 Map<int32, ForeignMessage>* map_int32_foreign_message =
824 message.mutable_map_int32_foreign_message();
825
826 for (int i = 0; i < 10; ++i) {
827 (*map_int32_int32)[i] = Func(i, 1);
828 (*map_int32_double)[i] = Func(i, 2);
829 (*map_string_string)[StrFunc(i, 1)] = StrFunc(i, 5);
830 (*map_int32_foreign_message)[i].set_c(Func(i, 6));
831 }
832
833 // Get FieldDescriptors for all the fields of interest.
834 const FieldDescriptor* fd_map_int32_int32 =
835 desc->FindFieldByName("map_int32_int32");
836 const FieldDescriptor* fd_map_int32_double =
837 desc->FindFieldByName("map_int32_double");
838 const FieldDescriptor* fd_map_string_string =
839 desc->FindFieldByName("map_string_string");
840 const FieldDescriptor* fd_map_int32_foreign_message =
841 desc->FindFieldByName("map_int32_foreign_message");
842
843 const FieldDescriptor* fd_map_int32_in32_key =
844 fd_map_int32_int32->message_type()->FindFieldByName("key");
845 const FieldDescriptor* fd_map_int32_in32_value =
846 fd_map_int32_int32->message_type()->FindFieldByName("value");
847 const FieldDescriptor* fd_map_int32_double_key =
848 fd_map_int32_double->message_type()->FindFieldByName("key");
849 const FieldDescriptor* fd_map_int32_double_value =
850 fd_map_int32_double->message_type()->FindFieldByName("value");
851 const FieldDescriptor* fd_map_string_string_key =
852 fd_map_string_string->message_type()->FindFieldByName("key");
853 const FieldDescriptor* fd_map_string_string_value =
854 fd_map_string_string->message_type()->FindFieldByName("value");
855 const FieldDescriptor* fd_map_int32_foreign_message_key =
856 fd_map_int32_foreign_message->message_type()->FindFieldByName("key");
857 const FieldDescriptor* fd_map_int32_foreign_message_value =
858 fd_map_int32_foreign_message->message_type()->FindFieldByName("value");
859
860 // Get RepeatedFieldRef objects for all fields of interest.
861 const RepeatedFieldRef<Message> mf_int32_int32 =
862 refl->GetRepeatedFieldRef<Message>(message, fd_map_int32_int32);
863 const RepeatedFieldRef<Message> mf_int32_double =
864 refl->GetRepeatedFieldRef<Message>(message, fd_map_int32_double);
865 const RepeatedFieldRef<Message> mf_string_string =
866 refl->GetRepeatedFieldRef<Message>(message, fd_map_string_string);
867 const RepeatedFieldRef<Message> mf_int32_foreign_message =
868 refl->GetRepeatedFieldRef<Message>(message, fd_map_int32_foreign_message);
869
870 // Get mutable RepeatedFieldRef objects for all fields of interest.
871 const MutableRepeatedFieldRef<Message> mmf_int32_int32 =
872 refl->GetMutableRepeatedFieldRef<Message>(&message, fd_map_int32_int32);
873 const MutableRepeatedFieldRef<Message> mmf_int32_double =
874 refl->GetMutableRepeatedFieldRef<Message>(&message, fd_map_int32_double);
875 const MutableRepeatedFieldRef<Message> mmf_string_string =
876 refl->GetMutableRepeatedFieldRef<Message>(&message, fd_map_string_string);
877 const MutableRepeatedFieldRef<Message>
878 mmf_int32_foreign_message =
879 refl->GetMutableRepeatedFieldRef<Message>(
880 &message, fd_map_int32_foreign_message);
881
882 // Get entry default instances
883 google::protobuf::scoped_ptr<Message> entry_int32_int32(
884 MessageFactory::generated_factory()
885 ->GetPrototype(fd_map_int32_int32->message_type())
886 ->New());
887 google::protobuf::scoped_ptr<Message> entry_int32_double(
888 MessageFactory::generated_factory()
889 ->GetPrototype(fd_map_int32_double->message_type())
890 ->New());
891 google::protobuf::scoped_ptr<Message> entry_string_string(
892 MessageFactory::generated_factory()
893 ->GetPrototype(fd_map_string_string->message_type())
894 ->New());
895 google::protobuf::scoped_ptr<Message> entry_int32_foreign_message(
896 MessageFactory::generated_factory()
897 ->GetPrototype(fd_map_int32_foreign_message->message_type())
898 ->New());
899
900 EXPECT_EQ(10, mf_int32_int32.size());
901 EXPECT_EQ(10, mmf_int32_int32.size());
902 EXPECT_EQ(10, mf_int32_double.size());
903 EXPECT_EQ(10, mmf_int32_double.size());
904 EXPECT_EQ(10, mf_string_string.size());
905 EXPECT_EQ(10, mmf_string_string.size());
906 EXPECT_EQ(10, mf_int32_foreign_message.size());
907 EXPECT_EQ(10, mmf_int32_foreign_message.size());
908
909 EXPECT_FALSE(mf_int32_int32.empty());
910 EXPECT_FALSE(mmf_int32_int32.empty());
911 EXPECT_FALSE(mf_int32_double.empty());
912 EXPECT_FALSE(mmf_int32_double.empty());
913 EXPECT_FALSE(mf_string_string.empty());
914 EXPECT_FALSE(mmf_string_string.empty());
915 EXPECT_FALSE(mf_int32_foreign_message.empty());
916 EXPECT_FALSE(mmf_int32_foreign_message.empty());
917
918 // Make sure we can do gets through the RepeatedFieldRef objects.
919 for (int i = 0; i < 10; ++i) {
920 {
921 // Check gets through const objects.
922 const Message& message_int32_int32 =
923 mf_int32_int32.Get(i, entry_int32_int32.get());
924 int32 key_int32_int32 = message_int32_int32.GetReflection()->GetInt32(
925 message_int32_int32, fd_map_int32_in32_key);
926 int32 value_int32_int32 = message_int32_int32.GetReflection()->GetInt32(
927 message_int32_int32, fd_map_int32_in32_value);
928 EXPECT_EQ(value_int32_int32, Func(key_int32_int32, 1));
929
930 const Message& message_int32_double =
931 mf_int32_double.Get(i, entry_int32_double.get());
932 int32 key_int32_double = message_int32_double.GetReflection()->GetInt32(
933 message_int32_double, fd_map_int32_double_key);
934 double value_int32_double =
935 message_int32_double.GetReflection()->GetDouble(
936 message_int32_double, fd_map_int32_double_value);
937 EXPECT_EQ(value_int32_double, Func(key_int32_double, 2));
938
939 const Message& message_string_string =
940 mf_string_string.Get(i, entry_string_string.get());
941 string key_string_string =
942 message_string_string.GetReflection()->GetString(
943 message_string_string, fd_map_string_string_key);
944 string value_string_string =
945 message_string_string.GetReflection()->GetString(
946 message_string_string, fd_map_string_string_value);
947 EXPECT_EQ(value_string_string, StrFunc(Int(key_string_string), 5));
948
949 const Message& message_int32_message =
950 mf_int32_foreign_message.Get(i, entry_int32_foreign_message.get());
951 int32 key_int32_message = message_int32_message.GetReflection()->GetInt32(
952 message_int32_message, fd_map_int32_foreign_message_key);
953 const ForeignMessage& value_int32_message =
954 down_cast<const ForeignMessage&>(
955 message_int32_message.GetReflection()
956 ->GetMessage(message_int32_message,
957 fd_map_int32_foreign_message_value));
958 EXPECT_EQ(value_int32_message.c(), Func(key_int32_message, 6));
959 }
960
961 {
962 // Check gets through mutable objects.
963 const Message& message_int32_int32 =
964 mmf_int32_int32.Get(i, entry_int32_int32.get());
965 int32 key_int32_int32 = message_int32_int32.GetReflection()->GetInt32(
966 message_int32_int32, fd_map_int32_in32_key);
967 int32 value_int32_int32 = message_int32_int32.GetReflection()->GetInt32(
968 message_int32_int32, fd_map_int32_in32_value);
969 EXPECT_EQ(value_int32_int32, Func(key_int32_int32, 1));
970
971 const Message& message_int32_double =
972 mmf_int32_double.Get(i, entry_int32_double.get());
973 int32 key_int32_double = message_int32_double.GetReflection()->GetInt32(
974 message_int32_double, fd_map_int32_double_key);
975 double value_int32_double =
976 message_int32_double.GetReflection()->GetDouble(
977 message_int32_double, fd_map_int32_double_value);
978 EXPECT_EQ(value_int32_double, Func(key_int32_double, 2));
979
980 const Message& message_string_string =
981 mmf_string_string.Get(i, entry_string_string.get());
982 string key_string_string =
983 message_string_string.GetReflection()->GetString(
984 message_string_string, fd_map_string_string_key);
985 string value_string_string =
986 message_string_string.GetReflection()->GetString(
987 message_string_string, fd_map_string_string_value);
988 EXPECT_EQ(value_string_string, StrFunc(Int(key_string_string), 5));
989
990 const Message& message_int32_message =
991 mmf_int32_foreign_message.Get(i, entry_int32_foreign_message.get());
992 int32 key_int32_message = message_int32_message.GetReflection()->GetInt32(
993 message_int32_message, fd_map_int32_foreign_message_key);
994 const ForeignMessage& value_int32_message =
995 down_cast<const ForeignMessage&>(
996 message_int32_message.GetReflection()
997 ->GetMessage(message_int32_message,
998 fd_map_int32_foreign_message_value));
999 EXPECT_EQ(value_int32_message.c(), Func(key_int32_message, 6));
1000 }
1001 }
1002
1003 // Make sure we can do sets through the RepeatedFieldRef objects.
1004 for (int i = 0; i < 10; i++) {
1005 const Message& message_int32_int32 =
1006 mmf_int32_int32.Get(i, entry_int32_int32.get());
1007 int key = message_int32_int32.GetReflection()->GetInt32(
1008 message_int32_int32, fd_map_int32_in32_key);
1009
1010 entry_int32_int32->GetReflection()->SetInt32(
1011 entry_int32_int32.get(), fd_map_int32_int32->message_type()->field(0),
1012 key);
1013 entry_int32_int32->GetReflection()->SetInt32(
1014 entry_int32_int32.get(), fd_map_int32_int32->message_type()->field(1),
1015 Func(key, -1));
1016 entry_int32_double->GetReflection()->SetInt32(
1017 entry_int32_double.get(), fd_map_int32_double->message_type()->field(0),
1018 key);
1019 entry_int32_double->GetReflection()->SetDouble(
1020 entry_int32_double.get(), fd_map_int32_double->message_type()->field(1),
1021 Func(key, -2));
1022 entry_string_string->GetReflection()->SetString(
Feng Xiao99aa0f92014-11-20 16:18:53 -08001023 entry_string_string.get(),
1024 fd_map_string_string->message_type()->field(0), StrFunc(key, 1));
Feng Xiaof157a562014-11-14 11:50:31 -08001025 entry_string_string->GetReflection()->SetString(
Feng Xiao99aa0f92014-11-20 16:18:53 -08001026 entry_string_string.get(),
1027 fd_map_string_string->message_type()->field(1), StrFunc(key, -5));
Feng Xiaof157a562014-11-14 11:50:31 -08001028 entry_int32_foreign_message->GetReflection()->SetInt32(
1029 entry_int32_foreign_message.get(),
Feng Xiao99aa0f92014-11-20 16:18:53 -08001030 fd_map_int32_foreign_message->message_type()->field(0), key);
Feng Xiaof157a562014-11-14 11:50:31 -08001031 Message* value_message =
1032 entry_int32_foreign_message->GetReflection()->MutableMessage(
1033 entry_int32_foreign_message.get(),
1034 fd_map_int32_foreign_message->message_type()->field(1));
1035 value_message->GetReflection()->SetInt32(
1036 value_message, value_message->GetDescriptor()->FindFieldByName("c"),
1037 Func(key, -6));
1038
Feng Xiao99aa0f92014-11-20 16:18:53 -08001039 mmf_int32_int32.Set(i, *entry_int32_int32);
1040 mmf_int32_double.Set(i, *entry_int32_double);
1041 mmf_string_string.Set(i, *entry_string_string);
1042 mmf_int32_foreign_message.Set(i, *entry_int32_foreign_message);
Feng Xiaof157a562014-11-14 11:50:31 -08001043 }
1044
1045 for (int i = 0; i < 10; i++) {
1046 EXPECT_EQ(Func(i, -1), message.map_int32_int32().at(i));
1047 EXPECT_EQ(Func(i, -2), message.map_int32_double().at(i));
1048 EXPECT_EQ(StrFunc(i, -5), message.map_string_string().at(StrFunc(i, 1)));
1049 EXPECT_EQ(Func(i, -6), message.map_int32_foreign_message().at(i).c());
1050 }
1051
1052 // Test iterators.
1053 {
1054 int index = 0;
1055 hash_map<int32, int32> result;
1056 for (RepeatedFieldRef<Message>::iterator it = mf_int32_int32.begin();
1057 it != mf_int32_int32.end(); ++it) {
1058 const Message& message = *it;
1059 int32 key =
1060 message.GetReflection()->GetInt32(message, fd_map_int32_in32_key);
1061 int32 value =
1062 message.GetReflection()->GetInt32(message, fd_map_int32_in32_value);
1063 result[key] = value;
1064 ++index;
1065 }
1066 EXPECT_EQ(10, index);
1067 for (hash_map<int32, int32>::const_iterator it = result.begin();
1068 it != result.end(); ++it) {
1069 EXPECT_EQ(message.map_int32_int32().at(it->first), it->second);
1070 }
1071 }
1072
1073 {
1074 int index = 0;
1075 hash_map<int32, double> result;
1076 for (RepeatedFieldRef<Message>::iterator it = mf_int32_double.begin();
1077 it != mf_int32_double.end(); ++it) {
1078 const Message& message = *it;
1079 int32 key =
1080 message.GetReflection()->GetInt32(message, fd_map_int32_double_key);
1081 double value = message.GetReflection()->GetDouble(
1082 message, fd_map_int32_double_value);
1083 result[key] = value;
1084 ++index;
1085 }
1086 EXPECT_EQ(10, index);
1087 for (hash_map<int32, double>::const_iterator it = result.begin();
1088 it != result.end(); ++it) {
1089 EXPECT_EQ(message.map_int32_double().at(it->first), it->second);
1090 }
1091 }
1092
1093 {
1094 int index = 0;
1095 hash_map<string, string> result;
1096 for (RepeatedFieldRef<Message>::iterator it = mf_string_string.begin();
1097 it != mf_string_string.end(); ++it) {
1098 const Message& message = *it;
1099 string key =
1100 message.GetReflection()->GetString(message, fd_map_string_string_key);
1101 string value = message.GetReflection()->GetString(
1102 message, fd_map_string_string_value);
1103 result[key] = value;
1104 ++index;
1105 }
1106 EXPECT_EQ(10, index);
1107 for (hash_map<string, string>::const_iterator it = result.begin();
1108 it != result.end(); ++it) {
1109 EXPECT_EQ(message.map_string_string().at(it->first), it->second);
1110 }
1111 }
1112
1113 {
1114 int index = 0;
1115 std::map<int32, ForeignMessage> result;
1116 for (RepeatedFieldRef<Message>::iterator it =
1117 mf_int32_foreign_message.begin();
1118 it != mf_int32_foreign_message.end(); ++it) {
1119 const Message& message = *it;
1120 int32 key = message.GetReflection()->GetInt32(
1121 message, fd_map_int32_foreign_message_key);
1122 const ForeignMessage& sub_message = down_cast<const ForeignMessage&>(
1123 message.GetReflection()
1124 ->GetMessage(message, fd_map_int32_foreign_message_value));
1125 result[key].MergeFrom(sub_message);
1126 ++index;
1127 }
1128 EXPECT_EQ(10, index);
1129 for (std::map<int32, ForeignMessage>::const_iterator it = result.begin();
1130 it != result.end(); ++it) {
1131 EXPECT_EQ(message.map_int32_foreign_message().at(it->first).c(),
1132 it->second.c());
1133 }
1134 }
1135
1136 // Test MutableRepeatedFieldRef::Add()
1137 entry_int32_int32->GetReflection()->SetInt32(
1138 entry_int32_int32.get(), fd_map_int32_int32->message_type()->field(0),
1139 4321);
1140 entry_int32_int32->GetReflection()->SetInt32(
1141 entry_int32_int32.get(), fd_map_int32_int32->message_type()->field(1),
1142 1234);
1143 mmf_int32_int32.Add(*entry_int32_int32);
1144 EXPECT_EQ(1234, message.map_int32_int32().at(4321));
1145
1146 entry_int32_double->GetReflection()->SetInt32(
1147 entry_int32_double.get(), fd_map_int32_double->message_type()->field(0),
1148 4321);
1149 entry_int32_double->GetReflection()->SetDouble(
1150 entry_int32_double.get(), fd_map_int32_double->message_type()->field(1),
1151 1234.0);
1152 mmf_int32_double.Add(*entry_int32_double);
1153 EXPECT_EQ(1234.0, message.map_int32_double().at(4321));
1154
1155 entry_string_string->GetReflection()->SetString(
1156 entry_string_string.get(),
1157 fd_map_string_string->message_type()->field(0), "4321");
1158 entry_string_string->GetReflection()->SetString(
1159 entry_string_string.get(), fd_map_string_string->message_type()->field(1),
1160 "1234");
1161 mmf_string_string.Add(*entry_string_string);
1162 EXPECT_EQ("1234", message.map_string_string().at("4321"));
1163
1164 entry_int32_foreign_message->GetReflection()->SetInt32(
1165 entry_int32_foreign_message.get(),
1166 fd_map_int32_foreign_message->message_type()->field(0), 4321);
1167 Message* value_message =
1168 entry_int32_foreign_message->GetReflection()->MutableMessage(
1169 entry_int32_foreign_message.get(),
1170 fd_map_int32_foreign_message->message_type()->field(1));
1171 ForeignMessage foreign_message;
1172 foreign_message.set_c(1234);
1173 value_message->CopyFrom(foreign_message);
1174
1175 mmf_int32_foreign_message.Add(*entry_int32_foreign_message);
1176 EXPECT_EQ(1234, message.map_int32_foreign_message().at(4321).c());
1177
Feng Xiaoeee38b02015-08-22 18:25:48 -07001178 // Test Reflection::AddAllocatedMessage
1179 Message* free_entry_string_string = MessageFactory::generated_factory()
1180 ->GetPrototype(fd_map_string_string->message_type())
1181 ->New();
1182 entry_string_string->GetReflection()->SetString(
1183 free_entry_string_string,
1184 fd_map_string_string->message_type()->field(0), "4321");
1185 entry_string_string->GetReflection()->SetString(
1186 free_entry_string_string, fd_map_string_string->message_type()->field(1),
1187 "1234");
1188 refl->AddAllocatedMessage(&message, fd_map_string_string,
1189 free_entry_string_string);
1190
Feng Xiaof157a562014-11-14 11:50:31 -08001191 // Test MutableRepeatedFieldRef::RemoveLast()
1192 mmf_int32_int32.RemoveLast();
1193 mmf_int32_double.RemoveLast();
1194 mmf_string_string.RemoveLast();
1195 mmf_int32_foreign_message.RemoveLast();
1196 EXPECT_EQ(10, message.map_int32_int32().size());
1197 EXPECT_EQ(10, message.map_int32_double().size());
Feng Xiaoeee38b02015-08-22 18:25:48 -07001198 EXPECT_EQ(11, message.map_string_string().size());
Feng Xiaof157a562014-11-14 11:50:31 -08001199 EXPECT_EQ(10, message.map_int32_foreign_message().size());
1200
1201 // Test MutableRepeatedFieldRef::SwapElements()
1202 {
1203 const Message& message0a = mmf_int32_int32.Get(0, entry_int32_int32.get());
1204 int32 int32_value0a =
1205 message0a.GetReflection()->GetInt32(message0a, fd_map_int32_in32_value);
1206 const Message& message9a = mmf_int32_int32.Get(9, entry_int32_int32.get());
1207 int32 int32_value9a =
1208 message9a.GetReflection()->GetInt32(message9a, fd_map_int32_in32_value);
1209
1210 mmf_int32_int32.SwapElements(0, 9);
1211
1212 const Message& message0b = mmf_int32_int32.Get(0, entry_int32_int32.get());
1213 int32 int32_value0b =
1214 message0b.GetReflection()->GetInt32(message0b, fd_map_int32_in32_value);
1215 const Message& message9b = mmf_int32_int32.Get(9, entry_int32_int32.get());
1216 int32 int32_value9b =
1217 message9b.GetReflection()->GetInt32(message9b, fd_map_int32_in32_value);
1218
1219 EXPECT_EQ(int32_value9a, int32_value0b);
1220 EXPECT_EQ(int32_value0a, int32_value9b);
1221 }
1222
1223 {
1224 const Message& message0a =
1225 mmf_int32_double.Get(0, entry_int32_double.get());
1226 double double_value0a = message0a.GetReflection()->GetDouble(
1227 message0a, fd_map_int32_double_value);
1228 const Message& message9a =
1229 mmf_int32_double.Get(9, entry_int32_double.get());
1230 double double_value9a = message9a.GetReflection()->GetDouble(
1231 message9a, fd_map_int32_double_value);
1232
1233 mmf_int32_double.SwapElements(0, 9);
1234
1235 const Message& message0b =
1236 mmf_int32_double.Get(0, entry_int32_double.get());
1237 double double_value0b = message0b.GetReflection()->GetDouble(
1238 message0b, fd_map_int32_double_value);
1239 const Message& message9b =
1240 mmf_int32_double.Get(9, entry_int32_double.get());
1241 double double_value9b = message9b.GetReflection()->GetDouble(
1242 message9b, fd_map_int32_double_value);
1243
1244 EXPECT_EQ(double_value9a, double_value0b);
1245 EXPECT_EQ(double_value0a, double_value9b);
1246 }
1247
1248 {
1249 const Message& message0a =
1250 mmf_string_string.Get(0, entry_string_string.get());
1251 string string_value0a = message0a.GetReflection()->GetString(
1252 message0a, fd_map_string_string_value);
1253 const Message& message9a =
1254 mmf_string_string.Get(9, entry_string_string.get());
1255 string string_value9a = message9a.GetReflection()->GetString(
1256 message9a, fd_map_string_string_value);
1257
1258 mmf_string_string.SwapElements(0, 9);
1259
1260 const Message& message0b =
1261 mmf_string_string.Get(0, entry_string_string.get());
1262 string string_value0b = message0b.GetReflection()->GetString(
1263 message0b, fd_map_string_string_value);
1264 const Message& message9b =
1265 mmf_string_string.Get(9, entry_string_string.get());
1266 string string_value9b = message9b.GetReflection()->GetString(
1267 message9b, fd_map_string_string_value);
1268
1269 EXPECT_EQ(string_value9a, string_value0b);
1270 EXPECT_EQ(string_value0a, string_value9b);
1271 }
1272
1273 {
1274 const Message& message0a =
1275 mmf_int32_foreign_message.Get(0, entry_int32_foreign_message.get());
1276 const ForeignMessage& sub_message0a = down_cast<const ForeignMessage&>(
1277 message0a.GetReflection()
1278 ->GetMessage(message0a, fd_map_int32_foreign_message_value));
1279 int32 int32_value0a = sub_message0a.c();
1280 const Message& message9a =
1281 mmf_int32_foreign_message.Get(9, entry_int32_foreign_message.get());
1282 const ForeignMessage& sub_message9a = down_cast<const ForeignMessage&>(
1283 message9a.GetReflection()
1284 ->GetMessage(message9a, fd_map_int32_foreign_message_value));
1285 int32 int32_value9a = sub_message9a.c();
1286
1287 mmf_int32_foreign_message.SwapElements(0, 9);
1288
1289 const Message& message0b =
1290 mmf_int32_foreign_message.Get(0, entry_int32_foreign_message.get());
1291 const ForeignMessage& sub_message0b = down_cast<const ForeignMessage&>(
1292 message0b.GetReflection()
1293 ->GetMessage(message0b, fd_map_int32_foreign_message_value));
1294 int32 int32_value0b = sub_message0b.c();
1295 const Message& message9b =
1296 mmf_int32_foreign_message.Get(9, entry_int32_foreign_message.get());
1297 const ForeignMessage& sub_message9b = down_cast<const ForeignMessage&>(
1298 message9b.GetReflection()
1299 ->GetMessage(message9b, fd_map_int32_foreign_message_value));
1300 int32 int32_value9b = sub_message9b.c();
1301
1302 EXPECT_EQ(int32_value9a, int32_value0b);
1303 EXPECT_EQ(int32_value0a, int32_value9b);
1304 }
1305}
1306
1307TEST_F(MapFieldReflectionTest, RepeatedFieldRefMergeFromAndSwap) {
1308 // Set-up message content.
1309 TestMap m0, m1, m2;
1310 for (int i = 0; i < 10; ++i) {
1311 (*m0.mutable_map_int32_int32())[i] = Func(i, 1);
1312 (*m0.mutable_map_int32_double())[i] = Func(i, 2);
1313 (*m0.mutable_map_string_string())[StrFunc(i, 1)] = StrFunc(i, 5);
1314 (*m0.mutable_map_int32_foreign_message())[i].set_c(Func(i, 6));
1315 (*m1.mutable_map_int32_int32())[i + 10] = Func(i, 11);
1316 (*m1.mutable_map_int32_double())[i + 10] = Func(i, 12);
1317 (*m1.mutable_map_string_string())[StrFunc(i + 10, 1)] = StrFunc(i, 15);
1318 (*m1.mutable_map_int32_foreign_message())[i + 10].set_c(Func(i, 16));
1319 (*m2.mutable_map_int32_int32())[i + 20] = Func(i, 21);
1320 (*m2.mutable_map_int32_double())[i + 20] = Func(i, 22);
1321 (*m2.mutable_map_string_string())[StrFunc(i + 20, 1)] = StrFunc(i, 25);
1322 (*m2.mutable_map_int32_foreign_message())[i + 20].set_c(Func(i, 26));
1323 }
1324
1325 const Reflection* refl = m0.GetReflection();
1326 const Descriptor* desc = m0.GetDescriptor();
1327
1328 // Get FieldDescriptors for all the fields of interest.
1329 const FieldDescriptor* fd_map_int32_int32 =
1330 desc->FindFieldByName("map_int32_int32");
1331 const FieldDescriptor* fd_map_int32_double =
1332 desc->FindFieldByName("map_int32_double");
1333 const FieldDescriptor* fd_map_string_string =
1334 desc->FindFieldByName("map_string_string");
1335 const FieldDescriptor* fd_map_int32_foreign_message =
1336 desc->FindFieldByName("map_int32_foreign_message");
1337
1338 // Get MutableRepeatedFieldRef objects for all fields of interest.
1339 const MutableRepeatedFieldRef<Message> mmf_int32_int32 =
1340 refl->GetMutableRepeatedFieldRef<Message>(
1341 &m0, fd_map_int32_int32);
1342 const MutableRepeatedFieldRef<Message> mmf_int32_double =
1343 refl->GetMutableRepeatedFieldRef<Message>(
1344 &m0, fd_map_int32_double);
1345 const MutableRepeatedFieldRef<Message> mmf_string_string =
1346 refl->GetMutableRepeatedFieldRef<Message>(
1347 &m0, fd_map_string_string);
1348 const MutableRepeatedFieldRef<Message>
1349 mmf_int32_foreign_message =
1350 refl->GetMutableRepeatedFieldRef<Message>(
1351 &m0, fd_map_int32_foreign_message);
1352
1353 // Test MutableRepeatedRef::CopyFrom
1354 mmf_int32_int32.CopyFrom(
1355 refl->GetRepeatedFieldRef<Message>(
1356 m1, fd_map_int32_int32));
1357 mmf_int32_double.CopyFrom(
1358 refl->GetRepeatedFieldRef<Message>(
1359 m1, fd_map_int32_double));
1360 mmf_string_string.CopyFrom(
1361 refl->GetRepeatedFieldRef<Message>(
1362 m1, fd_map_string_string));
1363 mmf_int32_foreign_message.CopyFrom(
1364 refl->GetRepeatedFieldRef<Message>(
1365 m1, fd_map_int32_foreign_message));
1366
1367 for (int i = 0; i < 10; ++i) {
1368 EXPECT_EQ(Func(i, 11), m0.map_int32_int32().at(i + 10));
1369 EXPECT_EQ(Func(i, 12), m0.map_int32_double().at(i + 10));
1370 EXPECT_EQ(StrFunc(i, 15), m0.map_string_string().at(StrFunc(i + 10, 1)));
1371 EXPECT_EQ(Func(i, 16), m0.map_int32_foreign_message().at(i + 10).c());
1372 }
1373
1374 // Test MutableRepeatedRef::MergeFrom
1375 mmf_int32_int32.MergeFrom(
1376 refl->GetRepeatedFieldRef<Message>(
1377 m2, fd_map_int32_int32));
1378 mmf_int32_double.MergeFrom(
1379 refl->GetRepeatedFieldRef<Message>(
1380 m2, fd_map_int32_double));
1381 mmf_string_string.MergeFrom(
1382 refl->GetRepeatedFieldRef<Message>(
1383 m2, fd_map_string_string));
1384 mmf_int32_foreign_message.MergeFrom(
1385 refl->GetRepeatedFieldRef<Message>(
1386 m2, fd_map_int32_foreign_message));
1387 for (int i = 0; i < 10; ++i) {
1388 EXPECT_EQ(Func(i, 21), m0.map_int32_int32().at(i + 20));
1389 EXPECT_EQ(Func(i, 22), m0.map_int32_double().at(i + 20));
1390 EXPECT_EQ(StrFunc(i, 25), m0.map_string_string().at(StrFunc(i + 20, 1)));
1391 EXPECT_EQ(Func(i, 26), m0.map_int32_foreign_message().at(i + 20).c());
1392 }
1393
1394 // Test MutableRepeatedRef::Swap
1395 // Swap between m0 and m2.
1396 mmf_int32_int32.Swap(
1397 refl->GetMutableRepeatedFieldRef<Message>(
1398 &m2, fd_map_int32_int32));
1399 mmf_int32_double.Swap(
1400 refl->GetMutableRepeatedFieldRef<Message>(
1401 &m2, fd_map_int32_double));
1402 mmf_string_string.Swap(
1403 refl->GetMutableRepeatedFieldRef<Message>(
1404 &m2, fd_map_string_string));
1405 mmf_int32_foreign_message.Swap(
1406 refl->GetMutableRepeatedFieldRef<Message>(
1407 &m2, fd_map_int32_foreign_message));
1408 for (int i = 0; i < 10; ++i) {
1409 // Check the content of m0.
1410 EXPECT_EQ(Func(i, 21), m0.map_int32_int32().at(i + 20));
1411 EXPECT_EQ(Func(i, 22), m0.map_int32_double().at(i + 20));
1412 EXPECT_EQ(StrFunc(i, 25), m0.map_string_string().at(StrFunc(i + 20, 1)));
1413 EXPECT_EQ(Func(i, 26), m0.map_int32_foreign_message().at(i + 20).c());
1414
1415 // Check the content of m2.
1416 EXPECT_EQ(Func(i, 11), m2.map_int32_int32().at(i + 10));
1417 EXPECT_EQ(Func(i, 12), m2.map_int32_double().at(i + 10));
1418 EXPECT_EQ(StrFunc(i, 15), m2.map_string_string().at(StrFunc(i + 10, 1)));
1419 EXPECT_EQ(Func(i, 16), m2.map_int32_foreign_message().at(i + 10).c());
1420 EXPECT_EQ(Func(i, 21), m2.map_int32_int32().at(i + 20));
1421 EXPECT_EQ(Func(i, 22), m2.map_int32_double().at(i + 20));
1422 EXPECT_EQ(StrFunc(i, 25), m2.map_string_string().at(StrFunc(i + 20, 1)));
1423 EXPECT_EQ(Func(i, 26), m2.map_int32_foreign_message().at(i + 20).c());
1424 }
1425
1426 // TODO(teboring): add test for duplicated key
1427}
1428
1429// Generated Message Test ===========================================
1430
1431TEST(GeneratedMapFieldTest, Accessors) {
1432 unittest::TestMap message;
1433
1434 MapTestUtil::SetMapFields(&message);
1435 MapTestUtil::ExpectMapFieldsSet(message);
1436
1437 MapTestUtil::ModifyMapFields(&message);
1438 MapTestUtil::ExpectMapFieldsModified(message);
1439}
1440
1441TEST(GeneratedMapFieldTest, SetMapFieldsInitialized) {
1442 unittest::TestMap message;
1443
1444 MapTestUtil::SetMapFieldsInitialized(&message);
1445 MapTestUtil::ExpectMapFieldsSetInitialized(message);
1446}
1447
1448TEST(GeneratedMapFieldTest, Proto2SetMapFieldsInitialized) {
Feng Xiaoeee38b02015-08-22 18:25:48 -07001449 unittest::TestEnumMap message;
1450 EXPECT_EQ(unittest::PROTO2_MAP_ENUM_FOO,
1451 (*message.mutable_known_map_field())[0]);
Feng Xiaof157a562014-11-14 11:50:31 -08001452}
1453
1454TEST(GeneratedMapFieldTest, Clear) {
1455 unittest::TestMap message;
1456
1457 MapTestUtil::SetMapFields(&message);
1458 message.Clear();
1459 MapTestUtil::ExpectClear(message);
1460}
1461
1462TEST(GeneratedMapFieldTest, ClearMessageMap) {
1463 unittest::TestMessageMap message;
1464
1465 // Creates a TestAllTypes with default value
1466 TestUtil::ExpectClear((*message.mutable_map_int32_message())[0]);
1467}
1468
1469TEST(GeneratedMapFieldTest, CopyFrom) {
1470 unittest::TestMap message1, message2;
1471
1472 MapTestUtil::SetMapFields(&message1);
1473 message2.CopyFrom(message1);
1474 MapTestUtil::ExpectMapFieldsSet(message2);
1475
1476 // Copying from self should be a no-op.
1477 message2.CopyFrom(message2);
1478 MapTestUtil::ExpectMapFieldsSet(message2);
1479}
1480
1481TEST(GeneratedMapFieldTest, CopyFromMessageMap) {
1482 unittest::TestMessageMap message1, message2;
1483
1484 (*message1.mutable_map_int32_message())[0].add_repeated_int32(100);
1485 (*message2.mutable_map_int32_message())[0].add_repeated_int32(101);
1486
1487 message1.CopyFrom(message2);
1488
1489 // Checks repeated field is overwritten.
1490 EXPECT_EQ(1, message1.map_int32_message().at(0).repeated_int32_size());
1491 EXPECT_EQ(101, message1.map_int32_message().at(0).repeated_int32(0));
1492}
1493
1494TEST(GeneratedMapFieldTest, SwapWithEmpty) {
1495 unittest::TestMap message1, message2;
1496
1497 MapTestUtil::SetMapFields(&message1);
1498 MapTestUtil::ExpectMapFieldsSet(message1);
1499 MapTestUtil::ExpectClear(message2);
1500
1501 message1.Swap(&message2);
1502 MapTestUtil::ExpectMapFieldsSet(message2);
1503 MapTestUtil::ExpectClear(message1);
1504}
1505
1506TEST(GeneratedMapFieldTest, SwapWithSelf) {
1507 unittest::TestMap message;
1508
1509 MapTestUtil::SetMapFields(&message);
1510 MapTestUtil::ExpectMapFieldsSet(message);
1511
1512 message.Swap(&message);
1513 MapTestUtil::ExpectMapFieldsSet(message);
1514}
1515
1516TEST(GeneratedMapFieldTest, SwapWithOther) {
1517 unittest::TestMap message1, message2;
1518
1519 MapTestUtil::SetMapFields(&message1);
1520 MapTestUtil::SetMapFields(&message2);
1521 MapTestUtil::ModifyMapFields(&message2);
1522
1523 message1.Swap(&message2);
1524 MapTestUtil::ExpectMapFieldsModified(message1);
1525 MapTestUtil::ExpectMapFieldsSet(message2);
1526}
1527
1528TEST(GeneratedMapFieldTest, CopyConstructor) {
1529 unittest::TestMap message1;
1530 MapTestUtil::SetMapFields(&message1);
1531
1532 unittest::TestMap message2(message1);
1533 MapTestUtil::ExpectMapFieldsSet(message2);
1534}
1535
1536TEST(GeneratedMapFieldTest, CopyAssignmentOperator) {
1537 unittest::TestMap message1;
1538 MapTestUtil::SetMapFields(&message1);
1539
1540 unittest::TestMap message2;
1541 message2 = message1;
1542 MapTestUtil::ExpectMapFieldsSet(message2);
1543
1544 // Make sure that self-assignment does something sane.
1545 message2.operator=(message2);
1546 MapTestUtil::ExpectMapFieldsSet(message2);
1547}
1548
1549#if !defined(PROTOBUF_TEST_NO_DESCRIPTORS) || \
1550 !defined(GOOGLE_PROTOBUF_NO_RTTI)
1551TEST(GeneratedMapFieldTest, UpcastCopyFrom) {
1552 // Test the CopyFrom method that takes in the generic const Message&
1553 // parameter.
1554 unittest::TestMap message1, message2;
1555
1556 MapTestUtil::SetMapFields(&message1);
1557
1558 const Message* source = implicit_cast<const Message*>(&message1);
1559 message2.CopyFrom(*source);
1560
1561 MapTestUtil::ExpectMapFieldsSet(message2);
1562}
1563#endif
1564
1565#ifndef PROTOBUF_TEST_NO_DESCRIPTORS
1566
1567TEST(GeneratedMapFieldTest, CopyFromDynamicMessage) {
1568 // Test copying from a DynamicMessage, which must fall back to using
1569 // reflection.
1570 unittest::TestMap message2;
1571
1572 // Construct a new version of the dynamic message via the factory.
1573 DynamicMessageFactory factory;
1574 google::protobuf::scoped_ptr<Message> message1;
1575 message1.reset(
1576 factory.GetPrototype(unittest::TestMap::descriptor())->New());
Feng Xiaoeee38b02015-08-22 18:25:48 -07001577 MapReflectionTester reflection_tester(
Feng Xiaof157a562014-11-14 11:50:31 -08001578 unittest::TestMap::descriptor());
1579 reflection_tester.SetMapFieldsViaReflection(message1.get());
1580 reflection_tester.ExpectMapFieldsSetViaReflection(*message1);
Feng Xiaoeee38b02015-08-22 18:25:48 -07001581 reflection_tester.ExpectMapFieldsSetViaReflectionIterator(message1.get());
1582 message2.CopyFrom(*message1);
1583 MapTestUtil::ExpectMapFieldsSet(message2);
1584}
Feng Xiaof157a562014-11-14 11:50:31 -08001585
Feng Xiaoeee38b02015-08-22 18:25:48 -07001586TEST(GeneratedMapFieldTest, CopyFromDynamicMessageMapReflection) {
1587 unittest::TestMap message2;
1588
1589 // Construct a new version of the dynamic message via the factory.
1590 DynamicMessageFactory factory;
1591 google::protobuf::scoped_ptr<Message> message1;
1592 message1.reset(
1593 factory.GetPrototype(unittest::TestMap::descriptor())->New());
1594 MapReflectionTester reflection_tester(
1595 unittest::TestMap::descriptor());
1596 reflection_tester.SetMapFieldsViaMapReflection(message1.get());
1597 reflection_tester.ExpectMapFieldsSetViaReflection(*message1);
1598 reflection_tester.ExpectMapFieldsSetViaReflectionIterator(message1.get());
Feng Xiaof157a562014-11-14 11:50:31 -08001599 message2.CopyFrom(*message1);
1600 MapTestUtil::ExpectMapFieldsSet(message2);
1601}
1602
1603TEST(GeneratedMapFieldTest, DynamicMessageCopyFrom) {
1604 // Test copying to a DynamicMessage, which must fall back to using reflection.
1605 unittest::TestMap message2;
1606 MapTestUtil::SetMapFields(&message2);
1607
1608 // Construct a new version of the dynamic message via the factory.
1609 DynamicMessageFactory factory;
1610 google::protobuf::scoped_ptr<Message> message1;
1611 message1.reset(
1612 factory.GetPrototype(unittest::TestMap::descriptor())->New());
1613
Feng Xiaoeee38b02015-08-22 18:25:48 -07001614 MapReflectionTester reflection_tester(
Feng Xiaof157a562014-11-14 11:50:31 -08001615 unittest::TestMap::descriptor());
1616 message1->MergeFrom(message2);
1617 reflection_tester.ExpectMapFieldsSetViaReflection(*message1);
Feng Xiaoeee38b02015-08-22 18:25:48 -07001618 reflection_tester.ExpectMapFieldsSetViaReflectionIterator(message1.get());
1619}
1620
1621TEST(GeneratedMapFieldTest, DynamicMessageCopyFromMapReflection) {
1622 MapReflectionTester reflection_tester(
1623 unittest::TestMap::descriptor());
1624 unittest::TestMap message2;
1625 reflection_tester.SetMapFieldsViaMapReflection(&message2);
1626
1627 // Construct a dynamic message via the factory.
1628 DynamicMessageFactory factory;
1629 google::protobuf::scoped_ptr<Message> message1;
1630 message1.reset(
1631 factory.GetPrototype(unittest::TestMap::descriptor())->New());
1632
1633 message1->MergeFrom(message2);
1634 reflection_tester.ExpectMapFieldsSetViaReflectionIterator(message1.get());
1635 reflection_tester.ExpectMapFieldsSetViaReflection(*message1);
1636}
1637
1638TEST(GeneratedMapFieldTest, SyncDynamicMapWithRepeatedField) {
1639 // Construct a dynamic message via the factory.
1640 MapReflectionTester reflection_tester(
1641 unittest::TestMap::descriptor());
1642 DynamicMessageFactory factory;
1643 google::protobuf::scoped_ptr<Message> message;
1644 message.reset(
1645 factory.GetPrototype(unittest::TestMap::descriptor())->New());
1646 reflection_tester.SetMapFieldsViaReflection(message.get());
1647 reflection_tester.ExpectMapFieldsSetViaReflectionIterator(message.get());
1648 reflection_tester.ExpectMapFieldsSetViaReflection(*message);
Feng Xiaof157a562014-11-14 11:50:31 -08001649}
1650
1651#endif // !PROTOBUF_TEST_NO_DESCRIPTORS
1652
1653TEST(GeneratedMapFieldTest, NonEmptyMergeFrom) {
1654 unittest::TestMap message1, message2;
1655
1656 MapTestUtil::SetMapFields(&message1);
1657
1658 // This field will test merging into an empty spot.
1659 (*message2.mutable_map_int32_int32())[1] = 1;
1660 message1.mutable_map_int32_int32()->erase(1);
1661
1662 // This tests overwriting.
1663 (*message2.mutable_map_int32_double())[1] = 1;
1664 (*message1.mutable_map_int32_double())[1] = 2;
1665
1666 message1.MergeFrom(message2);
1667 MapTestUtil::ExpectMapFieldsSet(message1);
1668}
1669
1670TEST(GeneratedMapFieldTest, MergeFromMessageMap) {
1671 unittest::TestMessageMap message1, message2;
1672
1673 (*message1.mutable_map_int32_message())[0].add_repeated_int32(100);
1674 (*message2.mutable_map_int32_message())[0].add_repeated_int32(101);
1675
1676 message1.MergeFrom(message2);
1677
1678 // Checks repeated field is overwritten.
1679 EXPECT_EQ(1, message1.map_int32_message().at(0).repeated_int32_size());
1680 EXPECT_EQ(101, message1.map_int32_message().at(0).repeated_int32(0));
1681}
1682
1683// Test the generated SerializeWithCachedSizesToArray()
1684TEST(GeneratedMapFieldTest, SerializationToArray) {
1685 unittest::TestMap message1, message2;
1686 string data;
1687 MapTestUtil::SetMapFields(&message1);
1688 int size = message1.ByteSize();
1689 data.resize(size);
1690 uint8* start = reinterpret_cast<uint8*>(string_as_array(&data));
1691 uint8* end = message1.SerializeWithCachedSizesToArray(start);
1692 EXPECT_EQ(size, end - start);
1693 EXPECT_TRUE(message2.ParseFromString(data));
1694 MapTestUtil::ExpectMapFieldsSet(message2);
1695}
1696
1697// Test the generated SerializeWithCachedSizes()
1698TEST(GeneratedMapFieldTest, SerializationToStream) {
1699 unittest::TestMap message1, message2;
1700 MapTestUtil::SetMapFields(&message1);
1701 int size = message1.ByteSize();
1702 string data;
1703 data.resize(size);
1704 {
1705 // Allow the output stream to buffer only one byte at a time.
1706 io::ArrayOutputStream array_stream(string_as_array(&data), size, 1);
1707 io::CodedOutputStream output_stream(&array_stream);
1708 message1.SerializeWithCachedSizes(&output_stream);
1709 EXPECT_FALSE(output_stream.HadError());
1710 EXPECT_EQ(size, output_stream.ByteCount());
1711 }
1712 EXPECT_TRUE(message2.ParseFromString(data));
1713 MapTestUtil::ExpectMapFieldsSet(message2);
1714}
1715
1716
1717TEST(GeneratedMapFieldTest, SameTypeMaps) {
1718 const Descriptor* map1 = unittest::TestSameTypeMap::descriptor()
1719 ->FindFieldByName("map1")
1720 ->message_type();
1721 const Descriptor* map2 = unittest::TestSameTypeMap::descriptor()
1722 ->FindFieldByName("map2")
1723 ->message_type();
1724
1725 const Message* map1_entry =
1726 MessageFactory::generated_factory()->GetPrototype(map1);
1727 const Message* map2_entry =
1728 MessageFactory::generated_factory()->GetPrototype(map2);
1729
1730 EXPECT_EQ(map1, map1_entry->GetDescriptor());
1731 EXPECT_EQ(map2, map2_entry->GetDescriptor());
1732}
1733
1734TEST(GeneratedMapFieldTest, Proto2UnknownEnum) {
1735 unittest::TestEnumMapPlusExtra from;
1736 (*from.mutable_known_map_field())[0] = unittest::E_PROTO2_MAP_ENUM_FOO;
1737 (*from.mutable_unknown_map_field())[0] = unittest::E_PROTO2_MAP_ENUM_EXTRA;
1738 string data;
1739 from.SerializeToString(&data);
1740
1741 unittest::TestEnumMap to;
1742 EXPECT_TRUE(to.ParseFromString(data));
1743 EXPECT_EQ(0, to.unknown_map_field().size());
1744 const UnknownFieldSet& unknown_field_set =
1745 to.GetReflection()->GetUnknownFields(to);
1746 EXPECT_EQ(1, unknown_field_set.field_count());
1747 EXPECT_EQ(1, to.known_map_field().size());
1748 EXPECT_EQ(unittest::PROTO2_MAP_ENUM_FOO, to.known_map_field().at(0));
1749
1750 data.clear();
1751 from.Clear();
1752 to.SerializeToString(&data);
1753 EXPECT_TRUE(from.ParseFromString(data));
1754 EXPECT_EQ(0, from.GetReflection()->GetUnknownFields(from).field_count());
1755 EXPECT_EQ(1, from.known_map_field().size());
1756 EXPECT_EQ(unittest::E_PROTO2_MAP_ENUM_FOO, from.known_map_field().at(0));
1757 EXPECT_EQ(1, from.unknown_map_field().size());
1758 EXPECT_EQ(unittest::E_PROTO2_MAP_ENUM_EXTRA, from.unknown_map_field().at(0));
1759}
1760
1761TEST(GeneratedMapFieldTest, StandardWireFormat) {
1762 unittest::TestMap message;
1763 string data = "\x0A\x04\x08\x01\x10\x01";
1764
1765 EXPECT_TRUE(message.ParseFromString(data));
1766 EXPECT_EQ(1, message.map_int32_int32().size());
1767 EXPECT_EQ(1, message.map_int32_int32().at(1));
1768}
1769
1770TEST(GeneratedMapFieldTest, UnorderedWireFormat) {
1771 unittest::TestMap message;
1772
1773 // put value before key in wire format
1774 string data = "\x0A\x04\x10\x01\x08\x02";
1775
1776 EXPECT_TRUE(message.ParseFromString(data));
1777 EXPECT_EQ(1, message.map_int32_int32().size());
1778 EXPECT_EQ(1, message.map_int32_int32().at(2));
1779}
1780
1781TEST(GeneratedMapFieldTest, DuplicatedKeyWireFormat) {
1782 unittest::TestMap message;
1783
1784 // Two key fields in wire format
1785 string data = "\x0A\x06\x08\x01\x08\x02\x10\x01";
1786
1787 EXPECT_TRUE(message.ParseFromString(data));
1788 EXPECT_EQ(1, message.map_int32_int32().size());
1789 EXPECT_EQ(1, message.map_int32_int32().at(2));
1790}
1791
1792TEST(GeneratedMapFieldTest, DuplicatedValueWireFormat) {
1793 unittest::TestMap message;
1794
1795 // Two value fields in wire format
1796 string data = "\x0A\x06\x08\x01\x10\x01\x10\x02";
1797
1798 EXPECT_TRUE(message.ParseFromString(data));
1799 EXPECT_EQ(1, message.map_int32_int32().size());
1800 EXPECT_EQ(2, message.map_int32_int32().at(1));
1801}
1802
1803TEST(GeneratedMapFieldTest, MissedKeyWireFormat) {
1804 unittest::TestMap message;
1805
1806 // No key field in wire format
1807 string data = "\x0A\x02\x10\x01";
1808
1809 EXPECT_TRUE(message.ParseFromString(data));
1810 EXPECT_EQ(1, message.map_int32_int32().size());
1811 EXPECT_EQ(1, message.map_int32_int32().at(0));
1812}
1813
1814TEST(GeneratedMapFieldTest, MissedValueWireFormat) {
1815 unittest::TestMap message;
1816
1817 // No value field in wire format
1818 string data = "\x0A\x02\x08\x01";
1819
1820 EXPECT_TRUE(message.ParseFromString(data));
1821 EXPECT_EQ(1, message.map_int32_int32().size());
1822 EXPECT_EQ(0, message.map_int32_int32().at(1));
1823}
1824
Jisi Liu885b6122015-02-28 14:51:22 -08001825TEST(GeneratedMapFieldTest, MissedValueTextFormat) {
1826 unittest::TestMap message;
1827
1828 // No value field in text format
1829 string text =
1830 "map_int32_foreign_message {\n"
1831 " key: 1234567890\n"
1832 "}";
1833
1834 EXPECT_TRUE(google::protobuf::TextFormat::ParseFromString(text, &message));
1835 EXPECT_EQ(1, message.map_int32_foreign_message().size());
1836 EXPECT_EQ(11, message.ByteSize());
1837}
1838
Feng Xiaof157a562014-11-14 11:50:31 -08001839TEST(GeneratedMapFieldTest, UnknownFieldWireFormat) {
1840 unittest::TestMap message;
1841
1842 // Unknown field in wire format
1843 string data = "\x0A\x06\x08\x02\x10\x03\x18\x01";
1844
1845 EXPECT_TRUE(message.ParseFromString(data));
1846 EXPECT_EQ(1, message.map_int32_int32().size());
1847 EXPECT_EQ(3, message.map_int32_int32().at(2));
1848}
1849
1850TEST(GeneratedMapFieldTest, CorruptedWireFormat) {
1851 unittest::TestMap message;
1852
1853 // corrupted data in wire format
1854 string data = "\x0A\x06\x08\x02\x11\x03";
1855
1856 EXPECT_FALSE(message.ParseFromString(data));
1857}
1858
Feng Xiao6ae3bde2014-11-25 14:01:44 -08001859TEST(GeneratedMapFieldTest, IsInitialized) {
1860 unittest::TestRequiredMessageMap map_message;
1861
1862 // Add an uninitialized message.
1863 (*map_message.mutable_map_field())[0];
1864 EXPECT_FALSE(map_message.IsInitialized());
1865
1866 // Initialize uninitialized message
1867 (*map_message.mutable_map_field())[0].set_a(0);
1868 (*map_message.mutable_map_field())[0].set_b(0);
1869 (*map_message.mutable_map_field())[0].set_c(0);
1870 EXPECT_TRUE(map_message.IsInitialized());
1871}
1872
Feng Xiaof157a562014-11-14 11:50:31 -08001873// Generated Message Reflection Test ================================
1874
1875TEST(GeneratedMapFieldReflectionTest, SpaceUsed) {
1876 unittest::TestMap message;
Feng Xiaoeee38b02015-08-22 18:25:48 -07001877 MapReflectionTester reflection_tester(
Feng Xiaof157a562014-11-14 11:50:31 -08001878 unittest::TestMap::descriptor());
1879 reflection_tester.SetMapFieldsViaReflection(&message);
1880
1881 EXPECT_LT(0, message.GetReflection()->SpaceUsed(message));
1882}
1883
1884TEST(GeneratedMapFieldReflectionTest, Accessors) {
1885 // Set every field to a unique value then go back and check all those
1886 // values.
1887 unittest::TestMap message;
Feng Xiaoeee38b02015-08-22 18:25:48 -07001888 MapReflectionTester reflection_tester(
Feng Xiaof157a562014-11-14 11:50:31 -08001889 unittest::TestMap::descriptor());
1890 reflection_tester.SetMapFieldsViaReflection(&message);
1891 MapTestUtil::ExpectMapFieldsSet(message);
1892 reflection_tester.ExpectMapFieldsSetViaReflection(message);
Feng Xiaoeee38b02015-08-22 18:25:48 -07001893 reflection_tester.ExpectMapFieldsSetViaReflectionIterator(&message);
Feng Xiaof157a562014-11-14 11:50:31 -08001894
1895 reflection_tester.ModifyMapFieldsViaReflection(&message);
1896 MapTestUtil::ExpectMapFieldsModified(message);
1897}
1898
1899TEST(GeneratedMapFieldReflectionTest, Swap) {
1900 unittest::TestMap message1;
1901 unittest::TestMap message2;
1902
1903 MapTestUtil::SetMapFields(&message1);
1904
1905 const Reflection* reflection = message1.GetReflection();
1906 reflection->Swap(&message1, &message2);
1907
1908 MapTestUtil::ExpectClear(message1);
1909 MapTestUtil::ExpectMapFieldsSet(message2);
1910}
1911
1912TEST(GeneratedMapFieldReflectionTest, SwapWithBothSet) {
1913 unittest::TestMap message1;
1914 unittest::TestMap message2;
1915
1916 MapTestUtil::SetMapFields(&message1);
1917 MapTestUtil::SetMapFields(&message2);
1918 MapTestUtil::ModifyMapFields(&message2);
1919
1920 const Reflection* reflection = message1.GetReflection();
1921 reflection->Swap(&message1, &message2);
1922
1923 MapTestUtil::ExpectMapFieldsModified(message1);
1924 MapTestUtil::ExpectMapFieldsSet(message2);
1925}
1926
1927TEST(GeneratedMapFieldReflectionTest, SwapFields) {
1928 unittest::TestMap message1;
1929 unittest::TestMap message2;
1930
1931 MapTestUtil::SetMapFields(&message2);
1932
1933 vector<const FieldDescriptor*> fields;
1934 const Reflection* reflection = message1.GetReflection();
1935 reflection->ListFields(message2, &fields);
1936 reflection->SwapFields(&message1, &message2, fields);
1937
1938 MapTestUtil::ExpectMapFieldsSet(message1);
1939 MapTestUtil::ExpectClear(message2);
1940}
1941
1942TEST(GeneratedMapFieldReflectionTest, ClearField) {
1943 unittest::TestMap message;
1944 MapTestUtil::SetMapFields(&message);
1945 MapTestUtil::ExpectMapFieldsSet(message);
1946
Feng Xiaoeee38b02015-08-22 18:25:48 -07001947 MapReflectionTester reflection_tester(
Feng Xiaof157a562014-11-14 11:50:31 -08001948 unittest::TestMap::descriptor());
1949 reflection_tester.ClearMapFieldsViaReflection(&message);
Feng Xiaoeee38b02015-08-22 18:25:48 -07001950 reflection_tester.ExpectClearViaReflection(message);
1951 reflection_tester.ExpectClearViaReflectionIterator(&message);
Feng Xiaof157a562014-11-14 11:50:31 -08001952}
1953
1954TEST(GeneratedMapFieldReflectionTest, RemoveLast) {
1955 unittest::TestMap message;
Feng Xiaoeee38b02015-08-22 18:25:48 -07001956 MapReflectionTester reflection_tester(
Feng Xiaof157a562014-11-14 11:50:31 -08001957 unittest::TestMap::descriptor());
1958
1959 MapTestUtil::SetMapFields(&message);
1960 MapTestUtil::ExpectMapsSize(message, 2);
1961 std::vector<const Message*> expected_entries =
1962 MapTestUtil::GetMapEntries(message, 0);
1963
1964 reflection_tester.RemoveLastMapsViaReflection(&message);
1965
1966 MapTestUtil::ExpectMapsSize(message, 1);
1967 std::vector<const Message*> remained_entries =
1968 MapTestUtil::GetMapEntries(message, 0);
1969 EXPECT_TRUE(expected_entries == remained_entries);
1970}
1971
1972TEST(GeneratedMapFieldReflectionTest, ReleaseLast) {
1973 unittest::TestMap message;
1974 const Descriptor* descriptor = message.GetDescriptor();
Feng Xiaoeee38b02015-08-22 18:25:48 -07001975 MapReflectionTester reflection_tester(descriptor);
Feng Xiaof157a562014-11-14 11:50:31 -08001976
1977 MapTestUtil::SetMapFields(&message);
1978
1979 MapTestUtil::ExpectMapsSize(message, 2);
1980
1981 reflection_tester.ReleaseLastMapsViaReflection(&message);
1982
1983 MapTestUtil::ExpectMapsSize(message, 1);
1984
1985 // Now test that we actually release the right message.
1986 message.Clear();
1987 MapTestUtil::SetMapFields(&message);
1988
1989 MapTestUtil::ExpectMapsSize(message, 2);
1990 std::vector<const Message*> expect_last =
1991 MapTestUtil::GetMapEntries(message, 1);
1992 std::vector<const Message*> release_last =
1993 MapTestUtil::GetMapEntriesFromRelease(&message);
1994 MapTestUtil::ExpectMapsSize(message, 1);
1995 EXPECT_TRUE(expect_last == release_last);
1996 for (std::vector<const Message*>::iterator it = release_last.begin();
1997 it != release_last.end(); ++it) {
1998 delete *it;
1999 }
2000}
2001
2002TEST(GeneratedMapFieldReflectionTest, SwapElements) {
2003 unittest::TestMap message;
Feng Xiaoeee38b02015-08-22 18:25:48 -07002004 MapReflectionTester reflection_tester(
Feng Xiaof157a562014-11-14 11:50:31 -08002005 unittest::TestMap::descriptor());
2006
2007 MapTestUtil::SetMapFields(&message);
2008
2009 // Get pointers of map entries at their original position
2010 std::vector<const Message*> entries0 = MapTestUtil::GetMapEntries(message, 0);
2011 std::vector<const Message*> entries1 = MapTestUtil::GetMapEntries(message, 1);
2012
2013 // Swap the first time.
2014 reflection_tester.SwapMapsViaReflection(&message);
2015
2016 // Get pointer of map entry after swap once.
2017 std::vector<const Message*> entries0_once =
2018 MapTestUtil::GetMapEntries(message, 0);
2019 std::vector<const Message*> entries1_once =
2020 MapTestUtil::GetMapEntries(message, 1);
2021
2022 // Test map entries are swapped.
2023 MapTestUtil::ExpectMapsSize(message, 2);
2024 EXPECT_TRUE(entries0 == entries1_once);
2025 EXPECT_TRUE(entries1 == entries0_once);
2026
2027 // Swap the second time.
2028 reflection_tester.SwapMapsViaReflection(&message);
2029
2030 // Get pointer of map entry after swap once.
2031 std::vector<const Message*> entries0_twice =
2032 MapTestUtil::GetMapEntries(message, 0);
2033 std::vector<const Message*> entries1_twice =
2034 MapTestUtil::GetMapEntries(message, 1);
2035
2036 // Test map entries are swapped back.
2037 MapTestUtil::ExpectMapsSize(message, 2);
2038 EXPECT_TRUE(entries0 == entries0_twice);
2039 EXPECT_TRUE(entries1 == entries1_twice);
2040}
2041
2042TEST(GeneratedMapFieldReflectionTest, MutableUnknownFields) {
2043 unittest::TestMap message;
Feng Xiaoeee38b02015-08-22 18:25:48 -07002044 MapReflectionTester reflection_tester(
Feng Xiaof157a562014-11-14 11:50:31 -08002045 unittest::TestMap::descriptor());
2046 reflection_tester.MutableUnknownFieldsOfMapFieldsViaReflection(&message);
2047}
2048
2049TEST(GeneratedMapFieldReflectionTest, EmbedProto2Message) {
2050 unittest::TestMessageMap message;
2051
2052 const FieldDescriptor* map_field =
2053 unittest::TestMessageMap::descriptor()->FindFieldByName(
2054 "map_int32_message");
2055 const FieldDescriptor* value =
2056 map_field->message_type()->FindFieldByName("value");
2057
2058 Message* entry_message =
2059 message.GetReflection()->AddMessage(&message, map_field);
2060 EXPECT_EQ(
2061 &entry_message->GetReflection()->GetMessage(*entry_message, value),
2062 reinterpret_cast<const Message*>(&TestAllTypes::default_instance()));
2063
2064 Message* proto2_message =
2065 entry_message->GetReflection()->MutableMessage(entry_message, value);
2066 EXPECT_EQ(unittest::TestAllTypes::descriptor(),
2067 proto2_message->GetDescriptor());
2068 ASSERT_EQ(1, message.map_int32_message().size());
2069}
2070
2071TEST(GeneratedMapFieldReflectionTest, MergeFromClearMapEntry) {
2072 unittest::TestMap message;
2073 const FieldDescriptor* map_field =
2074 unittest::TestMap::descriptor()->FindFieldByName("map_int32_int32");
2075 const FieldDescriptor* key =
2076 map_field->message_type()->FindFieldByName("key");
2077 const FieldDescriptor* value =
2078 map_field->message_type()->FindFieldByName("value");
2079
2080 Message* entry_message1 =
2081 message.GetReflection()->AddMessage(&message, map_field);
2082 EXPECT_FALSE(entry_message1->GetReflection()->HasField(*entry_message1, key));
2083 EXPECT_FALSE(
2084 entry_message1->GetReflection()->HasField(*entry_message1, value));
2085
2086 Message* entry_message2 =
2087 message.GetReflection()->AddMessage(&message, map_field);
2088 EXPECT_FALSE(entry_message2->GetReflection()->HasField(*entry_message2, key));
2089 EXPECT_FALSE(
2090 entry_message2->GetReflection()->HasField(*entry_message2, value));
2091
2092 entry_message1->MergeFrom(*entry_message2);
2093 EXPECT_FALSE(entry_message1->GetReflection()->HasField(*entry_message1, key));
2094 EXPECT_FALSE(
2095 entry_message1->GetReflection()->HasField(*entry_message1, value));
2096}
2097
2098TEST(GeneratedMapFieldReflectionTest, MapEntryClear) {
2099 unittest::TestMap message;
Feng Xiaoeee38b02015-08-22 18:25:48 -07002100 MapReflectionTester reflection_tester(
Feng Xiaof157a562014-11-14 11:50:31 -08002101 unittest::TestMap::descriptor());
2102 reflection_tester.MutableUnknownFieldsOfMapFieldsViaReflection(&message);
2103}
2104
2105TEST(GeneratedMapFieldReflectionTest, Proto2MapEntryClear) {
Feng Xiaoeee38b02015-08-22 18:25:48 -07002106 unittest::TestEnumMap message;
Feng Xiaof157a562014-11-14 11:50:31 -08002107 const Descriptor* descriptor = message.GetDescriptor();
2108 const FieldDescriptor* field_descriptor =
Feng Xiaoeee38b02015-08-22 18:25:48 -07002109 descriptor->FindFieldByName("known_map_field");
Feng Xiaof157a562014-11-14 11:50:31 -08002110 const FieldDescriptor* value_descriptor =
2111 field_descriptor->message_type()->FindFieldByName("value");
2112 Message* sub_message =
2113 message.GetReflection()->AddMessage(&message, field_descriptor);
Feng Xiaoeee38b02015-08-22 18:25:48 -07002114 EXPECT_EQ(0, sub_message->GetReflection()->GetEnumValue(*sub_message,
Feng Xiaof157a562014-11-14 11:50:31 -08002115 value_descriptor));
2116}
2117
Feng Xiaoeee38b02015-08-22 18:25:48 -07002118// Map Reflection API Test =========================================
2119
2120TEST(GeneratedMapFieldReflectionTest, SetViaMapReflection) {
2121 unittest::TestMap message;
2122 MapReflectionTester reflection_tester(
2123 unittest::TestMap::descriptor());
2124 reflection_tester.SetMapFieldsViaMapReflection(&message);
2125 reflection_tester.ExpectMapFieldsSetViaReflection(message);
2126 reflection_tester.ExpectMapFieldsSetViaReflectionIterator(&message);
2127}
2128
Feng Xiaof157a562014-11-14 11:50:31 -08002129// Dynamic Message Test =============================================
2130
2131class MapFieldInDynamicMessageTest : public testing::Test {
2132 protected:
2133 const DescriptorPool* pool_;
2134 DynamicMessageFactory factory_;
2135 const Descriptor* map_descriptor_;
Feng Xiaoeee38b02015-08-22 18:25:48 -07002136 const Descriptor* recursive_map_descriptor_;
Feng Xiaof157a562014-11-14 11:50:31 -08002137 const Message* map_prototype_;
2138
2139 MapFieldInDynamicMessageTest()
2140 : pool_(DescriptorPool::generated_pool()), factory_(pool_) {}
2141
2142 virtual void SetUp() {
2143 map_descriptor_ =
2144 pool_->FindMessageTypeByName("protobuf_unittest.TestMap");
Feng Xiaoeee38b02015-08-22 18:25:48 -07002145 recursive_map_descriptor_ =
2146 pool_->FindMessageTypeByName("protobuf_unittest.TestRecursiveMapMessage");
Feng Xiaof157a562014-11-14 11:50:31 -08002147 ASSERT_TRUE(map_descriptor_ != NULL);
Feng Xiaoeee38b02015-08-22 18:25:48 -07002148 ASSERT_TRUE(recursive_map_descriptor_ != NULL);
Feng Xiaof157a562014-11-14 11:50:31 -08002149 map_prototype_ = factory_.GetPrototype(map_descriptor_);
2150 }
2151};
2152
2153TEST_F(MapFieldInDynamicMessageTest, MapIndependentOffsets) {
2154 // Check that all fields have independent offsets by setting each
2155 // one to a unique value then checking that they all still have those
2156 // unique values (i.e. they don't stomp each other).
Jisi Liu46e8ff62015-10-05 11:59:43 -07002157 google::protobuf::scoped_ptr<Message> message(map_prototype_->New());
Feng Xiaoeee38b02015-08-22 18:25:48 -07002158 MapReflectionTester reflection_tester(map_descriptor_);
Feng Xiaof157a562014-11-14 11:50:31 -08002159
2160 reflection_tester.SetMapFieldsViaReflection(message.get());
2161 reflection_tester.ExpectMapFieldsSetViaReflection(*message);
2162}
2163
Feng Xiaoeee38b02015-08-22 18:25:48 -07002164TEST_F(MapFieldInDynamicMessageTest, DynamicMapReflection) {
Feng Xiaof157a562014-11-14 11:50:31 -08002165 // Check that map fields work properly.
Jisi Liu46e8ff62015-10-05 11:59:43 -07002166 google::protobuf::scoped_ptr<Message> message(map_prototype_->New());
Feng Xiaof157a562014-11-14 11:50:31 -08002167
2168 // Check set functions.
Feng Xiaoeee38b02015-08-22 18:25:48 -07002169 MapReflectionTester reflection_tester(map_descriptor_);
2170 reflection_tester.SetMapFieldsViaMapReflection(message.get());
Feng Xiaof157a562014-11-14 11:50:31 -08002171 reflection_tester.ExpectMapFieldsSetViaReflection(*message);
2172}
2173
2174TEST_F(MapFieldInDynamicMessageTest, MapSpaceUsed) {
2175 // Test that SpaceUsed() works properly
2176
2177 // Since we share the implementation with generated messages, we don't need
2178 // to test very much here. Just make sure it appears to be working.
2179
Jisi Liu46e8ff62015-10-05 11:59:43 -07002180 google::protobuf::scoped_ptr<Message> message(map_prototype_->New());
Feng Xiaoeee38b02015-08-22 18:25:48 -07002181 MapReflectionTester reflection_tester(map_descriptor_);
Feng Xiaof157a562014-11-14 11:50:31 -08002182
2183 int initial_space_used = message->SpaceUsed();
2184
2185 reflection_tester.SetMapFieldsViaReflection(message.get());
2186 EXPECT_LT(initial_space_used, message->SpaceUsed());
2187}
2188
Feng Xiaoeee38b02015-08-22 18:25:48 -07002189TEST_F(MapFieldInDynamicMessageTest, RecursiveMap) {
2190 TestRecursiveMapMessage from;
Feng Xiaod9ab86c2015-08-25 22:20:47 -07002191 (*from.mutable_a())[""];
Feng Xiaoeee38b02015-08-22 18:25:48 -07002192 string data = from.SerializeAsString();
2193 google::protobuf::scoped_ptr<Message> to(
2194 factory_.GetPrototype(recursive_map_descriptor_)->New());
2195 ASSERT_TRUE(to->ParseFromString(data));
2196}
2197
Feng Xiaof157a562014-11-14 11:50:31 -08002198// ReflectionOps Test ===============================================
2199
2200TEST(ReflectionOpsForMapFieldTest, MapSanityCheck) {
2201 unittest::TestMap message;
2202
2203 MapTestUtil::SetMapFields(&message);
2204 MapTestUtil::ExpectMapFieldsSet(message);
2205}
2206
2207TEST(ReflectionOpsForMapFieldTest, MapCopy) {
2208 unittest::TestMap message, message2;
2209
2210 MapTestUtil::SetMapFields(&message);
2211
2212 ReflectionOps::Copy(message, &message2);
2213
2214 MapTestUtil::ExpectMapFieldsSet(message2);
2215
2216 // Copying from self should be a no-op.
2217 ReflectionOps::Copy(message2, &message2);
2218 MapTestUtil::ExpectMapFieldsSet(message2);
2219}
2220
2221TEST(ReflectionOpsForMapFieldTest, MergeMap) {
2222 // Note: Copy is implemented in terms of Merge() so technically the Copy
2223 // test already tested most of this.
2224
2225 unittest::TestMap message, message2;
2226
2227 MapTestUtil::SetMapFields(&message);
2228
2229 ReflectionOps::Merge(message2, &message);
2230
2231 MapTestUtil::ExpectMapFieldsSet(message);
2232}
2233
2234TEST(ReflectionOpsForMapFieldTest, ClearMap) {
2235 unittest::TestMap message;
2236
2237 MapTestUtil::SetMapFields(&message);
2238
2239 ReflectionOps::Clear(&message);
2240
2241 MapTestUtil::ExpectClear(message);
2242}
2243
2244TEST(ReflectionOpsForMapFieldTest, MapDiscardUnknownFields) {
2245 unittest::TestMap message;
2246 MapTestUtil::SetMapFields(&message);
2247
2248 // Set some unknown fields in message.
2249 message.GetReflection()->MutableUnknownFields(&message)->
2250 AddVarint(123456, 654321);
2251
2252 // Discard them.
2253 ReflectionOps::DiscardUnknownFields(&message);
2254 MapTestUtil::ExpectMapFieldsSet(message);
2255
2256 EXPECT_EQ(0, message.GetReflection()->
2257 GetUnknownFields(message).field_count());
2258}
2259
2260// Wire Format Test =================================================
2261
2262TEST(WireFormatForMapFieldTest, ParseMap) {
2263 unittest::TestMap source, dest;
2264 string data;
2265
2266 // Serialize using the generated code.
2267 MapTestUtil::SetMapFields(&source);
2268 source.SerializeToString(&data);
2269
2270 // Parse using WireFormat.
2271 io::ArrayInputStream raw_input(data.data(), data.size());
2272 io::CodedInputStream input(&raw_input);
2273 WireFormat::ParseAndMergePartial(&input, &dest);
2274
2275 // Check.
2276 MapTestUtil::ExpectMapFieldsSet(dest);
2277}
2278
2279TEST(WireFormatForMapFieldTest, MapByteSize) {
2280 unittest::TestMap message;
2281 MapTestUtil::SetMapFields(&message);
2282
2283 EXPECT_EQ(message.ByteSize(), WireFormat::ByteSize(message));
2284 message.Clear();
2285 EXPECT_EQ(0, message.ByteSize());
2286 EXPECT_EQ(0, WireFormat::ByteSize(message));
2287}
2288
2289TEST(WireFormatForMapFieldTest, SerializeMap) {
2290 unittest::TestMap message;
2291 string generated_data;
2292 string dynamic_data;
2293
2294 MapTestUtil::SetMapFields(&message);
2295
2296 // Serialize using the generated code.
2297 {
2298 message.ByteSize();
2299 io::StringOutputStream raw_output(&generated_data);
2300 io::CodedOutputStream output(&raw_output);
2301 message.SerializeWithCachedSizes(&output);
2302 ASSERT_FALSE(output.HadError());
2303 }
2304
2305 // Serialize using WireFormat.
2306 {
2307 io::StringOutputStream raw_output(&dynamic_data);
2308 io::CodedOutputStream output(&raw_output);
2309 int size = WireFormat::ByteSize(message);
2310 WireFormat::SerializeWithCachedSizes(message, size, &output);
2311 ASSERT_FALSE(output.HadError());
2312 }
2313
2314 // Should be the same.
2315 // Don't use EXPECT_EQ here because we're comparing raw binary data and
2316 // we really don't want it dumped to stdout on failure.
2317 EXPECT_TRUE(dynamic_data == generated_data);
2318}
2319
2320TEST(WireFormatForMapFieldTest, MapParseHelpers) {
2321 string data;
2322
2323 {
2324 // Set up.
2325 protobuf_unittest::TestMap message;
2326 MapTestUtil::SetMapFields(&message);
2327 message.SerializeToString(&data);
2328 }
2329
2330 {
2331 // Test ParseFromString.
2332 protobuf_unittest::TestMap message;
2333 EXPECT_TRUE(message.ParseFromString(data));
2334 MapTestUtil::ExpectMapFieldsSet(message);
2335 }
2336
2337 {
2338 // Test ParseFromIstream.
2339 protobuf_unittest::TestMap message;
2340 stringstream stream(data);
2341 EXPECT_TRUE(message.ParseFromIstream(&stream));
2342 EXPECT_TRUE(stream.eof());
2343 MapTestUtil::ExpectMapFieldsSet(message);
2344 }
2345
2346 {
2347 // Test ParseFromBoundedZeroCopyStream.
2348 string data_with_junk(data);
2349 data_with_junk.append("some junk on the end");
2350 io::ArrayInputStream stream(data_with_junk.data(), data_with_junk.size());
2351 protobuf_unittest::TestMap message;
2352 EXPECT_TRUE(message.ParseFromBoundedZeroCopyStream(&stream, data.size()));
2353 MapTestUtil::ExpectMapFieldsSet(message);
2354 }
2355
2356 {
2357 // Test that ParseFromBoundedZeroCopyStream fails (but doesn't crash) if
2358 // EOF is reached before the expected number of bytes.
2359 io::ArrayInputStream stream(data.data(), data.size());
2360 protobuf_unittest::TestAllTypes message;
2361 EXPECT_FALSE(
2362 message.ParseFromBoundedZeroCopyStream(&stream, data.size() + 1));
2363 }
2364}
2365
2366// Text Format Test =================================================
2367
2368TEST(TextFormatMapTest, SerializeAndParse) {
2369 unittest::TestMap source;
2370 unittest::TestMap dest;
2371 MapTestUtil::SetMapFields(&source);
2372 string output;
2373
2374 // Test compact ASCII
2375 TextFormat::Printer printer;
2376 printer.PrintToString(source, &output);
2377 TextFormat::Parser parser;
2378 EXPECT_TRUE(parser.ParseFromString(output, &dest));
2379 MapTestUtil::ExpectMapFieldsSet(dest);
2380}
2381
Bo Yang5db21732015-05-21 14:28:59 -07002382TEST(TextFormatMapTest, Sorted) {
2383 unittest::TestMap message;
Feng Xiaoeee38b02015-08-22 18:25:48 -07002384 MapReflectionTester tester(message.GetDescriptor());
Bo Yang5db21732015-05-21 14:28:59 -07002385 tester.SetMapFieldsViaReflection(&message);
2386
2387 string expected_text;
2388 GOOGLE_CHECK_OK(File::GetContents(
2389 TestSourceDir() +
2390 "/google/protobuf/"
2391 "testdata/map_test_data.txt",
2392 &expected_text, true));
2393
2394 EXPECT_EQ(message.DebugString(), expected_text);
2395
2396 // Test again on the reverse order.
2397 unittest::TestMap message2;
2398 tester.SetMapFieldsViaReflection(&message2);
2399 tester.SwapMapsViaReflection(&message2);
2400 EXPECT_EQ(message2.DebugString(), expected_text);
2401}
2402
Feng Xiaof157a562014-11-14 11:50:31 -08002403
Jisi Liu885b6122015-02-28 14:51:22 -08002404// arena support =================================================
2405TEST(ArenaTest, ParsingAndSerializingNoHeapAllocation) {
2406 // Allocate a large initial block to avoid mallocs during hooked test.
2407 std::vector<char> arena_block(128 * 1024);
2408 ArenaOptions options;
unknownca1c2522015-05-27 11:45:32 -07002409 options.initial_block = &arena_block[0];
Jisi Liu885b6122015-02-28 14:51:22 -08002410 options.initial_block_size = arena_block.size();
2411 Arena arena(options);
2412 string data;
2413 data.reserve(128 * 1024);
2414
2415 {
Feng Xiaoeee38b02015-08-22 18:25:48 -07002416 // TODO(teboring): Enable no heap check when ArenaStringPtr is used in map.
2417 // NoHeapChecker no_heap;
Jisi Liu885b6122015-02-28 14:51:22 -08002418
2419 unittest::TestArenaMap* from =
2420 Arena::CreateMessage<unittest::TestArenaMap>(&arena);
2421 MapTestUtil::SetArenaMapFields(from);
2422 from->SerializeToString(&data);
2423
2424 unittest::TestArenaMap* to =
2425 Arena::CreateMessage<unittest::TestArenaMap>(&arena);
2426 to->ParseFromString(data);
2427 MapTestUtil::ExpectArenaMapFieldsSet(*to);
2428 }
2429}
2430
2431// Use text format parsing and serializing to test reflection api.
2432TEST(ArenaTest, RelfectionInTextFormat) {
2433 Arena arena;
2434 string data;
2435
2436 TextFormat::Printer printer;
2437 TextFormat::Parser parser;
2438
2439 unittest::TestArenaMap* from =
2440 Arena::CreateMessage<unittest::TestArenaMap>(&arena);
2441 unittest::TestArenaMap* to =
2442 Arena::CreateMessage<unittest::TestArenaMap>(&arena);
2443
2444 MapTestUtil::SetArenaMapFields(from);
2445 printer.PrintToString(*from, &data);
2446
2447 EXPECT_TRUE(parser.ParseFromString(data, to));
2448 MapTestUtil::ExpectArenaMapFieldsSet(*to);
2449}
2450
Feng Xiaoeee38b02015-08-22 18:25:48 -07002451// Make sure the memory allocated for string in map is deallocated.
2452TEST(ArenaTest, StringMapNoLeak) {
2453 Arena arena;
2454 unittest::TestArenaMap* message =
2455 Arena::CreateMessage<unittest::TestArenaMap>(&arena);
2456 string data;
2457 // String with length less than 16 will not be allocated from heap.
2458 int original_capacity = data.capacity();
2459 while (data.capacity() <= original_capacity) {
2460 data.append("a");
2461 }
2462 (*message->mutable_map_string_string())[data] = data;
2463 // We rely on heap checkers to detect memory leak for us.
2464 ASSERT_FALSE(message == NULL);
2465}
2466
Feng Xiaof157a562014-11-14 11:50:31 -08002467} // namespace internal
2468} // namespace protobuf
2469} // namespace google