src/google/protobuf/map_test.cc
Go to the documentation of this file.
1 // 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 // A hack to include windows.h first, which ensures the GetMessage macro can
32 // be undefined when we include <google/protobuf/stubs/common.h>
33 #if defined(_WIN32)
34 #define _WINSOCKAPI_ // to avoid re-definition in WinSock2.h
35 #define NOMINMAX // to avoid defining min/max macros
36 #include <windows.h>
37 #endif // _WIN32
38 
39 #include <algorithm>
40 #include <map>
41 #include <memory>
42 #include <set>
43 #include <sstream>
44 #include <unordered_map>
45 #include <vector>
46 
52 #include <google/protobuf/map_proto2_unittest.pb.h>
54 #include <google/protobuf/map_unittest.pb.h>
57 #include <google/protobuf/unittest.pb.h>
65 #include <google/protobuf/map.h>
75 #include <gmock/gmock.h>
77 #include <gtest/gtest.h>
79 
80 
81 #include <google/protobuf/port_def.inc>
82 
83 namespace google {
84 namespace protobuf {
85 
86 using unittest::ForeignMessage;
87 using unittest::TestAllTypes;
88 using unittest::TestMap;
89 using unittest::TestRecursiveMapMessage;
90 
91 namespace internal {
92 
95 }
96 
97 // Map API Test =====================================================
98 
99 class MapImplTest : public ::testing::Test {
100  protected:
102  : map_ptr_(new Map<int32, int32>()),
103  map_(*map_ptr_),
104  const_map_(*map_ptr_) {
106  EXPECT_EQ(0, map_.size());
107  }
108 
111  EXPECT_EQ(1, map_.size());
113  }
114 
115  void ExpectElements(const std::map<int32, int32>& map) {
117  EXPECT_EQ(map.size(), map_.size());
118  for (std::map<int32, int32>::const_iterator it = map.begin();
119  it != map.end(); ++it) {
120  ExpectElement(it->first, it->second);
121  }
122  }
123 
125  // Test map size is correct.
126  EXPECT_EQ(value, map_[key]);
127  EXPECT_EQ(1, map_.count(key));
129 
130  // Check mutable at and find work correctly.
133 
134  // iterator dereferenceable
135  EXPECT_EQ(key, (*it).first);
136  EXPECT_EQ(value, (*it).second);
137  EXPECT_EQ(key, it->first);
138  EXPECT_EQ(value, it->second);
139 
140  // iterator mutable
141  ((*it).second) = value + 1;
142  EXPECT_EQ(value + 1, map_[key]);
143  ((*it).second) = value;
144  EXPECT_EQ(value, map_[key]);
145 
146  it->second = value + 1;
147  EXPECT_EQ(value + 1, map_[key]);
148  it->second = value;
149  EXPECT_EQ(value, map_[key]);
150 
151  // copy constructor
153  EXPECT_EQ(key, it_copy->first);
154  EXPECT_EQ(value, it_copy->second);
155 
156  // Immutable API ================================================
157 
158  // Check immutable at and find work correctly.
161 
162  // iterator dereferenceable
163  EXPECT_EQ(key, (*const_it).first);
164  EXPECT_EQ(value, (*const_it).second);
165  EXPECT_EQ(key, const_it->first);
166  EXPECT_EQ(value, const_it->second);
167 
168  // copy constructor
169  Map<int32, int32>::const_iterator const_it_copy = const_it;
170  EXPECT_EQ(key, const_it_copy->first);
171  EXPECT_EQ(value, const_it_copy->second);
172  }
173 
174  std::unique_ptr<Map<int32, int32> > map_ptr_;
177 };
178 
179 TEST_F(MapImplTest, OperatorBracket) {
180  int32 key = 0;
181  int32 value1 = 100;
182  int32 value2 = 101;
183 
184  EXPECT_EQ(0, map_[key]);
185 
186  map_[key] = value1;
187  ExpectSingleElement(key, value1);
188 
189  map_[key] = value2;
190  ExpectSingleElement(key, value2);
191 }
192 
193 TEST_F(MapImplTest, OperatorBracketNonExist) {
194  int32 key = 0;
195  int32 default_value = 0;
196 
197  EXPECT_EQ(default_value, map_[key]);
198  ExpectSingleElement(key, default_value);
199 }
200 
201 TEST_F(MapImplTest, MutableAt) {
202  int32 key = 0;
203  int32 value1 = 100;
204  int32 value2 = 101;
205 
206  map_[key] = value1;
207  ExpectSingleElement(key, value1);
208 
209  map_.at(key) = value2;
210  ExpectSingleElement(key, value2);
211 }
212 
213 #ifdef PROTOBUF_HAS_DEATH_TEST
214 
215 TEST_F(MapImplTest, MutableAtNonExistDeathTest) {
216  EXPECT_DEATH(map_.at(0), "");
217 }
218 
219 TEST_F(MapImplTest, ImmutableAtNonExistDeathTest) {
220  EXPECT_DEATH(const_map_.at(0), "");
221 }
222 
223 TEST_F(MapImplTest, UsageErrors) {
224  MapKey key;
225  key.SetInt64Value(1);
226  EXPECT_DEATH(key.GetUInt64Value(),
227  "Protocol Buffer map usage error:\n"
228  "MapKey::GetUInt64Value type does not match\n"
229  " Expected : uint64\n"
230  " Actual : int64");
231 
232  MapValueRef value;
233  EXPECT_DEATH(value.SetFloatValue(0.1),
234  "Protocol Buffer map usage error:\n"
235  "MapValueRef::type MapValueRef is not initialized.");
236 }
237 
238 #endif // PROTOBUF_HAS_DEATH_TEST
239 
240 TEST_F(MapImplTest, MapKeyAssignment) {
241  MapKey from, to;
242  from.SetStringValue("abc");
243  to = from;
244  EXPECT_EQ("abc", to.GetStringValue());
245 }
246 
247 TEST_F(MapImplTest, CountNonExist) { EXPECT_EQ(0, map_.count(0)); }
248 
249 TEST_F(MapImplTest, ContainNotExist) { EXPECT_FALSE(map_.contains(0)); }
250 
251 TEST_F(MapImplTest, ImmutableContainNotExist) {
252  EXPECT_FALSE(const_map_.contains(0));
253 }
254 
255 TEST_F(MapImplTest, MutableFindNonExist) {
256  EXPECT_TRUE(map_.end() == map_.find(0));
257 }
258 
259 TEST_F(MapImplTest, ImmutableFindNonExist) {
260  EXPECT_TRUE(const_map_.end() == const_map_.find(0));
261 }
262 
263 TEST_F(MapImplTest, ConstEnd) {
264  EXPECT_TRUE(const_map_.end() == const_map_.cend());
265 }
266 
267 TEST_F(MapImplTest, GetReferenceFromIterator) {
268  for (int i = 0; i < 10; i++) {
269  map_[i] = i;
270  }
271 
272  for (Map<int32, int32>::const_iterator it = map_.cbegin();
273  it != map_.cend();) {
275  EXPECT_EQ(entry.first, entry.second);
276  }
277 
278  for (Map<int32, int32>::const_iterator it = const_map_.begin();
279  it != const_map_.end();) {
281  EXPECT_EQ(entry.first, entry.second);
282  }
283 
284  for (Map<int32, int32>::iterator it = map_.begin(); it != map_.end();) {
285  Map<int32, int32>::reference entry = *it++;
286  EXPECT_EQ(entry.first + 1, ++entry.second);
287  }
288 }
289 
290 TEST_F(MapImplTest, IteratorBasic) {
291  map_[0] = 0;
292 
293  // Default constructible (per forward iterator requirements).
296 
297  it = map_.begin();
298  cit = it; // Converts to const_iterator
299 
300  // Can compare between them.
301  EXPECT_TRUE(it == cit);
302  EXPECT_FALSE(cit != it);
303 
304  // Pre increment.
305  EXPECT_FALSE(it == ++cit);
306 
307  // Post increment.
308  EXPECT_FALSE(it++ == cit);
309  EXPECT_TRUE(it == cit);
310 }
311 
312 template <typename Iterator>
313 static int64 median(Iterator i0, Iterator i1) {
314  std::vector<int64> v(i0, i1);
315  std::nth_element(v.begin(), v.begin() + v.size() / 2, v.end());
316  return v[v.size() / 2];
317 }
318 
319 static int64 Now() {
322 }
323 
324 // Arbitrary odd integers for creating test data.
325 static int k0 = 812398771;
326 static int k1 = 1312938717;
327 static int k2 = 1321555333;
328 
329 // A naive begin() implementation will cause begin() to get slower and slower
330 // if one erases elements at the "front" of the hash map, and we'd like to
331 // avoid that, as std::unordered_map does.
332 TEST_F(MapImplTest, BeginIsFast) {
333  if (true) return; // TODO(gpike): make this less flaky and re-enable it.
335  const int kTestSize = 250000;
336  // Create a random-looking map of size n. Use non-negative integer keys.
337  uint32 frog = 123983;
338  int last_key = 0;
339  int counter = 0;
340  while (map.size() < kTestSize) {
341  frog *= static_cast<uint32>(k0);
342  frog ^= frog >> 17;
343  frog += counter++;
344  last_key =
345  static_cast<int>(frog) >= 0 ? static_cast<int>(frog) : last_key ^ 1;
346  GOOGLE_DCHECK_GE(last_key, 0);
347  map[last_key] = last_key ^ 1;
348  }
349  std::vector<int64> times;
350  // We're going to do map.erase(map.begin()) over and over again. But,
351  // just in case one iteration is fast compared to the granularity of
352  // our time keeping, we measure kChunkSize iterations per outer-loop iter.
353  const int kChunkSize = 1000;
354  GOOGLE_CHECK_EQ(kTestSize % kChunkSize, 0);
355  do {
356  const int64 start = Now();
357  for (int i = 0; i < kChunkSize; i++) {
358  map.erase(map.begin());
359  }
360  const int64 end = Now();
361  if (end > start) {
362  times.push_back(end - start);
363  }
364  } while (!map.empty());
365  if (times.size() < .99 * kTestSize / kChunkSize) {
366  GOOGLE_LOG(WARNING) << "Now() isn't helping us measure time";
367  return;
368  }
369  int64 x0 = median(times.begin(), times.begin() + 9);
370  int64 x1 = median(times.begin() + times.size() - 9, times.end());
371  GOOGLE_LOG(INFO) << "x0=" << x0 << ", x1=" << x1;
372  // x1 will greatly exceed x0 if the code we just executed took O(n^2) time.
373  // And we'll probably time out and never get here. So, this test is
374  // intentionally loose: we check that x0 and x1 are within a factor of 8.
375  EXPECT_GE(x1, x0 / 8);
376  EXPECT_GE(x0, x1 / 8);
377 }
378 
379 // Try to create kTestSize keys that will land in just a few buckets, and
380 // time the insertions, to get a rough estimate of whether an O(n^2) worst case
381 // was triggered. This test is a hacky, but probably better than nothing.
382 TEST_F(MapImplTest, HashFlood) {
383  const int kTestSize = 1024; // must be a power of 2
384  std::set<int> s;
385  for (int i = 0; s.size() < kTestSize; i++) {
386  if ((map_.hash_function()(i) & (kTestSize - 1)) < 3) {
387  s.insert(i);
388  }
389  }
390  // Create hash table with kTestSize entries that hash flood a table with
391  // 1024 (or 512 or 2048 or ...) entries. This assumes that map_ uses powers
392  // of 2 for table sizes, and that it's sufficient to "flood" with respect to
393  // the low bits of the output of map_.hash_function().
394  std::vector<int64> times;
395  std::set<int>::iterator it = s.begin();
396  int count = 0;
397  do {
398  const int64 start = Now();
399  map_[*it] = 0;
400  const int64 end = Now();
401  if (end > start) {
402  times.push_back(end - start);
403  }
404  ++count;
405  ++it;
406  } while (it != s.end());
407  if (times.size() < .99 * count) return;
408  int64 x0 = median(times.begin(), times.begin() + 9);
409  int64 x1 = median(times.begin() + times.size() - 9, times.end());
410  // x1 will greatly exceed x0 if the code we just executed took O(n^2) time.
411  // But we want to allow O(n log n). A factor of 20 should be generous enough.
412  EXPECT_LE(x1, x0 * 20);
413 }
414 
415 TEST_F(MapImplTest, CopyIteratorStressTest) {
416  std::vector<Map<int32, int32>::iterator> v;
417  const int kIters = 1e5;
418  for (uint32 i = 0; i < kIters; i++) {
419  int32 key = (3 + i * (5 + i * (-8 + i * (62 + i)))) & 0x77777777;
420  map_[key] = i;
421  v.push_back(map_.find(key));
422  }
423  for (std::vector<Map<int32, int32>::iterator>::const_iterator it = v.begin();
424  it != v.end(); it++) {
426  ASSERT_EQ(i->first, (*it)->first);
427  ASSERT_EQ(i->second, (*it)->second);
428  }
429 }
430 
431 template <typename T, typename U>
432 static void TestValidityForAllKeysExcept(int key_to_avoid, const T& check_map,
433  const U& map) {
434  typedef typename U::value_type value_type; // a key-value pair
435  for (typename U::const_iterator it = map.begin(); it != map.end(); ++it) {
436  const int key = it->first;
437  if (key == key_to_avoid) continue;
438  // All iterators relevant to this key, whether old (from check_map) or new,
439  // must point to the same memory. So, test pointer equality here.
440  const value_type* check_val = &*check_map.find(key)->second;
441  EXPECT_EQ(check_val, &*it);
442  EXPECT_EQ(check_val, &*map.find(key));
443  }
444 }
445 
446 // EXPECT i0 and i1 to be the same. Advancing them should have the same effect,
447 // too.
448 template <typename Iter>
449 static void TestEqualIterators(Iter i0, Iter i1, Iter end) {
450  const int kMaxAdvance = 10;
451  for (int i = 0; i < kMaxAdvance; i++) {
452  EXPECT_EQ(i0 == end, i1 == end);
453  if (i0 == end) return;
454  EXPECT_EQ(&*i0, &*i1) << "iter " << i;
455  ++i0;
456  ++i1;
457  }
458 }
459 
460 template <typename IteratorType>
462  const int initial_size = m->size();
463  IteratorType it = m->begin();
464  for (int i = 0; i < skip && it != m->end(); it++, i++) {
465  }
466  if (it == m->end()) return;
467  const IteratorType old = it;
468  GOOGLE_LOG(INFO) << "skip=" << skip << ", old->first=" << old->first;
469  const int target_size =
470  initial_size < 100 ? initial_size * 5 : initial_size * 5 / 4;
471  for (int i = 0; m->size() <= target_size; i++) {
472  (*m)[i] = 0;
473  }
474  // Iterator 'old' should still work just fine despite the growth of *m.
475  const IteratorType after_growth = m->find(old->first);
476  TestEqualIterators<IteratorType>(old, after_growth, m->end());
477 
478  // Now shrink the number of elements. Do this with a mix of erases and
479  // inserts to increase the chance that the hashtable will resize to a lower
480  // number of buckets. (But, in any case, the test is still useful.)
481  for (int i = 0; i < 2 * (target_size - initial_size); i++) {
482  if (i != old->first) {
483  m->erase(i);
484  }
485  if (((i ^ m->begin()->first) & 15) == 0) {
486  (*m)[i * 342] = i;
487  }
488  }
489  // Now, the table has grown and shrunk; test again.
490  TestEqualIterators<IteratorType>(old, m->find(old->first), m->end());
491  TestEqualIterators<IteratorType>(old, after_growth, m->end());
492 }
493 
494 // Create and test an n-element Map, with emphasis on iterator correctness.
495 static void StressTestIterators(int n) {
496  GOOGLE_LOG(INFO) << "StressTestIterators " << n;
497  GOOGLE_CHECK_GT(n, 0);
498  // Create a random-looking map of size n. Use non-negative integer keys.
500  uint32 frog = 123987 + n;
501  int last_key = 0;
502  int counter = 0;
503  while (m.size() < n) {
504  frog *= static_cast<uint32>(k0);
505  frog ^= frog >> 17;
506  frog += counter++;
507  last_key =
508  static_cast<int>(frog) >= 0 ? static_cast<int>(frog) : last_key ^ 1;
509  GOOGLE_DCHECK_GE(last_key, 0);
510  m[last_key] = last_key ^ 1;
511  }
512  // Test it.
513  ASSERT_EQ(n, m.size());
514  // Create maps of pointers and iterators.
515  // These should remain valid even if we modify m.
517  std::unordered_map<int, Map<int, int>::iterator> mi(n);
518  for (Map<int, int>::iterator it = m.begin(); it != m.end(); ++it) {
519  mp[it->first] = &*it;
520  mi[it->first] = it;
521  }
522  ASSERT_EQ(m.size(), mi.size());
523  ASSERT_EQ(m.size(), mp.size());
524  m.erase(last_key);
525  ASSERT_EQ(n - 1, m.size());
526  TestValidityForAllKeysExcept(last_key, mp, m);
527  TestValidityForAllKeysExcept(last_key, mi, m);
528 
529  m[last_key] = 0;
530  ASSERT_EQ(n, m.size());
531  // Test old iterator vs new iterator, with table modification in between.
532  TestOldVersusNewIterator<Map<int, int>::const_iterator>(n % 3, &m);
533  TestOldVersusNewIterator<Map<int, int>::iterator>(n % (1 + (n / 40)), &m);
534  // Finally, ensure erase(iterator) doesn't reorder anything, because that is
535  // what its documentation says.
536  m[last_key] = m[last_key ^ 999] = 0;
537  std::vector<Map<int, int>::iterator> v;
538  v.reserve(m.size());
539  int position_of_last_key = 0;
540  for (Map<int, int>::iterator it = m.begin(); it != m.end(); ++it) {
541  if (it->first == last_key) {
542  position_of_last_key = v.size();
543  }
544  v.push_back(it);
545  }
546  ASSERT_EQ(m.size(), v.size());
547  const Map<int, int>::iterator erase_result = m.erase(m.find(last_key));
548  int index = 0;
549  for (Map<int, int>::iterator it = m.begin(); it != m.end(); ++it, ++index) {
550  if (index == position_of_last_key) {
551  EXPECT_EQ(&*erase_result, &*v[++index]);
552  }
553  ASSERT_EQ(&*it, &*v[index]);
554  }
555 }
556 
557 TEST_F(MapImplTest, IteratorInvalidation) {
558  // Create a set of pseudo-random sizes to test.
559 #ifndef NDEBUG
560  const int kMaxSizeToTest = 100 * 1000;
561 #else
562  const int kMaxSizeToTest = 1000 * 1000;
563 #endif
564  std::set<int> s;
565  int n = kMaxSizeToTest;
566  unsigned int frog = k1 + n;
567  while (n > 1 && s.size() < 25) {
568  s.insert(n);
569  n = static_cast<int>(n * 100 / (101.0 + (frog & 63)));
570  frog *= k2;
571  frog ^= frog >> 17;
572  }
573  // Ensure we test a few small sizes.
574  s.insert(1);
575  s.insert(2);
576  s.insert(3);
577  // Now, the real work.
578  for (std::set<int>::iterator i = s.begin(); i != s.end(); ++i) {
580  }
581 }
582 
583 // Test that erase() revalidates iterators.
584 TEST_F(MapImplTest, EraseRevalidates) {
585  map_[3] = map_[13] = map_[20] = 0;
586  const int initial_size = map_.size();
587  EXPECT_EQ(3, initial_size);
588  std::vector<Map<int, int>::iterator> v;
589  for (Map<int, int>::iterator it = map_.begin(); it != map_.end(); ++it) {
590  v.push_back(it);
591  }
592  EXPECT_EQ(initial_size, v.size());
593  for (int i = 0; map_.size() <= initial_size * 20; i++) {
594  map_[i] = 0;
595  }
596  const int larger_size = map_.size();
597  // We've greatly increased the size of the map, so it is highly likely that
598  // the following will corrupt m if erase() doesn't properly revalidate
599  // iterators passed to it. Finishing this routine without crashing indicates
600  // success.
601  for (int i = 0; i < v.size(); i++) {
602  map_.erase(v[i]);
603  }
604  EXPECT_EQ(larger_size - v.size(), map_.size());
605 }
606 
607 template <typename T>
608 bool IsConstHelper(T& /*t*/) { // NOLINT. We want to catch non-const refs here.
609  return false;
610 }
611 template <typename T>
612 bool IsConstHelper(const T& /*t*/) {
613  return true;
614 }
615 
616 TEST_F(MapImplTest, IteratorConstness) {
617  map_[0] = 0;
618  EXPECT_TRUE(IsConstHelper(*map_.cbegin()));
619  EXPECT_TRUE(IsConstHelper(*const_map_.begin()));
620  EXPECT_FALSE(IsConstHelper(*map_.begin()));
621 }
622 
623 bool IsForwardIteratorHelper(std::forward_iterator_tag /*tag*/) { return true; }
624 
625 TEST_F(MapImplTest, IteratorCategory) {
627  std::iterator_traits<Map<int, int>::iterator>::iterator_category()));
629  std::iterator_traits<
630  Map<int, int>::const_iterator>::iterator_category()));
631 }
632 
633 TEST_F(MapImplTest, InsertSingle) {
634  int32 key = 0;
635  int32 value1 = 100;
636  int32 value2 = 101;
637 
638  // Insert a non-existed key.
639  std::pair<Map<int32, int32>::iterator, bool> result1 =
640  map_.insert(Map<int32, int32>::value_type(key, value1));
641  ExpectSingleElement(key, value1);
642 
643  Map<int32, int32>::iterator it1 = result1.first;
644  EXPECT_EQ(key, it1->first);
645  EXPECT_EQ(value1, it1->second);
646  EXPECT_TRUE(result1.second);
647 
648  // Insert an existed key.
649  std::pair<Map<int32, int32>::iterator, bool> result2 =
650  map_.insert(Map<int32, int32>::value_type(key, value2));
651  ExpectSingleElement(key, value1);
652 
653  Map<int32, int32>::iterator it2 = result2.first;
654  EXPECT_TRUE(it1 == it2);
655  EXPECT_FALSE(result2.second);
656 }
657 
658 TEST_F(MapImplTest, InsertByIterator) {
659  int32 key1 = 0;
660  int32 key2 = 1;
661  int32 value1a = 100;
662  int32 value1b = 101;
663  int32 value2a = 200;
664  int32 value2b = 201;
665 
666  std::map<int32, int32> map1;
667  map1[key1] = value1a;
668  map1[key2] = value2a;
669 
670  map_.insert(map1.begin(), map1.end());
671  ExpectElements(map1);
672 
673  std::map<int32, int32> map2;
674  map2[key1] = value1b;
675  map2[key2] = value2b;
676 
677  map_.insert(map2.begin(), map2.end());
678  ExpectElements(map1);
679 }
680 
681 TEST_F(MapImplTest, InsertByInitializerList) {
682  map_.insert({{1, 100}, {2, 200}});
683  ExpectElements({{1, 100}, {2, 200}});
684 
685  map_.insert({{2, 201}, {3, 301}});
686  ExpectElements({{1, 100}, {2, 200}, {3, 301}});
687 }
688 
689 TEST_F(MapImplTest, EraseSingleByKey) {
690  int32 key = 0;
691  int32 value = 100;
692 
693  map_[key] = value;
694  ExpectSingleElement(key, value);
695 
696  // Erase an existing key.
697  EXPECT_EQ(1, map_.erase(key));
698  EXPECT_TRUE(map_.empty());
699  EXPECT_EQ(0, map_.size());
700  EXPECT_TRUE(map_.end() == map_.find(key));
701  EXPECT_TRUE(map_.begin() == map_.end());
702 
703  // Erase a non-existing key.
704  EXPECT_EQ(0, map_.erase(key));
705 }
706 
707 TEST_F(MapImplTest, EraseMutipleByKey) {
708  // erase in one specific order to trigger corner cases
709  for (int i = 0; i < 5; i++) {
710  map_[i] = i;
711  }
712 
713  map_.erase(0);
714  EXPECT_EQ(4, map_.size());
715  EXPECT_TRUE(map_.end() == map_.find(0));
716 
717  map_.erase(1);
718  EXPECT_EQ(3, map_.size());
719  EXPECT_TRUE(map_.end() == map_.find(1));
720 
721  map_.erase(3);
722  EXPECT_EQ(2, map_.size());
723  EXPECT_TRUE(map_.end() == map_.find(3));
724 
725  map_.erase(4);
726  EXPECT_EQ(1, map_.size());
727  EXPECT_TRUE(map_.end() == map_.find(4));
728 
729  map_.erase(2);
730  EXPECT_EQ(0, map_.size());
731  EXPECT_TRUE(map_.end() == map_.find(2));
732 }
733 
734 TEST_F(MapImplTest, EraseSingleByIterator) {
735  int32 key = 0;
736  int32 value = 100;
737 
738  map_[key] = value;
739  ExpectSingleElement(key, value);
740 
741  Map<int32, int32>::iterator it = map_.find(key);
742  map_.erase(it);
743  EXPECT_TRUE(map_.empty());
744  EXPECT_EQ(0, map_.size());
745  EXPECT_TRUE(map_.end() == map_.find(key));
746  EXPECT_TRUE(map_.begin() == map_.end());
747 }
748 
749 TEST_F(MapImplTest, ValidIteratorAfterErase) {
750  for (int i = 0; i < 10; i++) {
751  map_[i] = i;
752  }
753 
754  int count = 0;
755 
756  for (Map<int32, int32>::iterator it = map_.begin(); it != map_.end();) {
757  count++;
758  if (it->first % 2 == 1) {
759  map_.erase(it++);
760  } else {
761  ++it;
762  }
763  }
764 
765  EXPECT_EQ(10, count);
766  EXPECT_EQ(5, map_.size());
767 }
768 
769 TEST_F(MapImplTest, EraseByIterator) {
770  int32 key1 = 0;
771  int32 key2 = 1;
772  int32 value1 = 100;
773  int32 value2 = 101;
774 
775  std::map<int32, int32> map;
776  map[key1] = value1;
777  map[key2] = value2;
778 
779  map_.insert(map.begin(), map.end());
780  ExpectElements(map);
781 
782  map_.erase(map_.begin(), map_.end());
783  EXPECT_TRUE(map_.empty());
784  EXPECT_EQ(0, map_.size());
785  EXPECT_TRUE(map_.end() == map_.find(key1));
786  EXPECT_TRUE(map_.end() == map_.find(key2));
787  EXPECT_TRUE(map_.begin() == map_.end());
788 }
789 
791  int32 key = 0;
792  int32 value = 100;
793 
794  map_[key] = value;
795  ExpectSingleElement(key, value);
796 
797  map_.clear();
798 
799  EXPECT_TRUE(map_.empty());
800  EXPECT_EQ(0, map_.size());
801  EXPECT_TRUE(map_.end() == map_.find(key));
802  EXPECT_TRUE(map_.begin() == map_.end());
803 }
804 
805 static void CopyConstructorHelper(Arena* arena, Map<int32, int32>* m) {
806  int32 key1 = 0;
807  int32 key2 = 1;
808  int32 value1 = 100;
809  int32 value2 = 101;
810 
811  std::map<int32, int32> map;
812  map[key1] = value1;
813  map[key2] = value2;
814 
815  m->insert(map.begin(), map.end());
816 
817  Map<int32, int32> other(*m);
818 
819  EXPECT_EQ(2, other.size());
820  EXPECT_EQ(value1, other.at(key1));
821  EXPECT_EQ(value2, other.at(key2));
822 }
823 
824 TEST_F(MapImplTest, CopyConstructorWithArena) {
825  Arena a;
826  CopyConstructorHelper(&a, &map_);
827 }
828 
829 TEST_F(MapImplTest, CopyConstructorWithoutArena) {
830  CopyConstructorHelper(NULL, &map_);
831 }
832 
833 TEST_F(MapImplTest, IterConstructor) {
834  int32 key1 = 0;
835  int32 key2 = 1;
836  int32 value1 = 100;
837  int32 value2 = 101;
838 
839  std::map<int32, int32> map;
840  map[key1] = value1;
841  map[key2] = value2;
842 
843  Map<int32, int32> new_map(map.begin(), map.end());
844 
845  EXPECT_EQ(2, new_map.size());
846  EXPECT_EQ(value1, new_map.at(key1));
847  EXPECT_EQ(value2, new_map.at(key2));
848 }
849 
850 TEST_F(MapImplTest, Assigner) {
851  int32 key1 = 0;
852  int32 key2 = 1;
853  int32 value1 = 100;
854  int32 value2 = 101;
855 
856  std::map<int32, int32> map;
857  map[key1] = value1;
858  map[key2] = value2;
859 
860  map_.insert(map.begin(), map.end());
861 
862  Map<int32, int32> other;
863  int32 key_other = 123;
864  int32 value_other = 321;
865  other[key_other] = value_other;
866  EXPECT_EQ(1, other.size());
867 
868  other = map_;
869 
870  EXPECT_EQ(2, other.size());
871  EXPECT_EQ(value1, other.at(key1));
872  EXPECT_EQ(value2, other.at(key2));
873  EXPECT_TRUE(other.find(key_other) == other.end());
874 
875  // Self assign
876  other = *&other; // Avoid -Wself-assign.
877  EXPECT_EQ(2, other.size());
878  EXPECT_EQ(value1, other.at(key1));
879  EXPECT_EQ(value2, other.at(key2));
880 }
881 
882 TEST_F(MapImplTest, Rehash) {
883  const int test_size = 50;
884  std::map<int32, int32> reference_map;
885  for (int i = 0; i < test_size; i++) {
886  reference_map[i] = i;
887  }
888  for (int i = 0; i < test_size; i++) {
889  map_[i] = reference_map[i];
890  EXPECT_EQ(reference_map[i], map_[i]);
891  }
892  for (int i = 0; i < test_size; i++) {
893  map_.erase(i);
894  EXPECT_TRUE(map_.end() == map_.find(i));
895  }
896  EXPECT_TRUE(map_.empty());
897 }
898 
899 TEST_F(MapImplTest, EqualRange) {
900  int key = 100, key_missing = 101;
901  map_[key] = 100;
902 
903  std::pair<Map<int32, int32>::iterator, Map<int32, int32>::iterator> range =
904  map_.equal_range(key);
905  EXPECT_TRUE(map_.find(key) == range.first);
906  EXPECT_TRUE(++map_.find(key) == range.second);
907 
908  range = map_.equal_range(key_missing);
909  EXPECT_TRUE(map_.end() == range.first);
910  EXPECT_TRUE(map_.end() == range.second);
911 
912  std::pair<Map<int32, int32>::const_iterator,
914  const_range = const_map_.equal_range(key);
915  EXPECT_TRUE(const_map_.find(key) == const_range.first);
916  EXPECT_TRUE(++const_map_.find(key) == const_range.second);
917 
918  const_range = const_map_.equal_range(key_missing);
919  EXPECT_TRUE(const_map_.end() == const_range.first);
920  EXPECT_TRUE(const_map_.end() == const_range.second);
921 }
922 
923 TEST_F(MapImplTest, ConvertToStdMap) {
924  map_[100] = 101;
925  std::map<int32, int32> std_map(map_.begin(), map_.end());
926  EXPECT_EQ(1, std_map.size());
927  EXPECT_EQ(101, std_map[100]);
928 }
929 
930 TEST_F(MapImplTest, ConvertToStdVectorOfPairs) {
931  map_[100] = 101;
932  std::vector<std::pair<int32, int32> > std_vec(map_.begin(), map_.end());
933  EXPECT_EQ(1, std_vec.size());
934  EXPECT_EQ(100, std_vec[0].first);
935  EXPECT_EQ(101, std_vec[0].second);
936 }
937 
938 TEST_F(MapImplTest, SwapBasic) {
939  Map<int32, int32> another;
940  map_[9398] = 41999;
941  another[9398] = 41999;
942  another[8070] = 42056;
943  another.swap(map_);
944  EXPECT_THAT(another,
945  testing::UnorderedElementsAre(testing::Pair(9398, 41999)));
946  EXPECT_THAT(map_, testing::UnorderedElementsAre(testing::Pair(8070, 42056),
947  testing::Pair(9398, 41999)));
948 }
949 
950 TEST_F(MapImplTest, SwapArena) {
951  Arena arena1, arena2;
952  Map<int32, int32> m1(&arena1);
953  Map<int32, int32> m2(&arena2);
954  map_[9398] = 41999;
955  m1[9398] = 41999;
956  m1[8070] = 42056;
957  m2[10244] = 10247;
958  m2[8070] = 42056;
959  m1.swap(map_);
960  EXPECT_THAT(m1, testing::UnorderedElementsAre(testing::Pair(9398, 41999)));
961  EXPECT_THAT(map_, testing::UnorderedElementsAre(testing::Pair(8070, 42056),
962  testing::Pair(9398, 41999)));
963  m2.swap(m1);
964  EXPECT_THAT(m1, testing::UnorderedElementsAre(testing::Pair(8070, 42056),
965  testing::Pair(10244, 10247)));
966  EXPECT_THAT(m2, testing::UnorderedElementsAre(testing::Pair(9398, 41999)));
967 }
968 
969 TEST_F(MapImplTest, CopyAssignMapIterator) {
970  TestMap message;
972  reflection_tester.SetMapFieldsViaMapReflection(&message);
973  MapIterator it1 = reflection_tester.MapBegin(&message, "map_int32_int32");
974  MapIterator it2 = reflection_tester.MapEnd(&message, "map_int32_int32");
975  it2 = it1;
977 }
978 
979 // Map Field Reflection Test ========================================
980 
981 static int Func(int i, int j) { return i * j; }
982 
983 static std::string StrFunc(int i, int j) {
985  SStringPrintf(&str, "%d", Func(i, j));
986  return str;
987 }
988 
989 static int Int(const std::string& value) {
990  int result = 0;
991  std::istringstream(value) >> result;
992  return result;
993 }
994 
996  protected:
998 
999  int MapSize(const Reflection* reflection, const FieldDescriptor* field,
1000  const Message& message) {
1001  return reflection->MapSize(message, field);
1002  }
1003 };
1004 
1006  TestMap message;
1007  const Reflection* refl = message.GetReflection();
1008  const Descriptor* desc = message.GetDescriptor();
1009 
1010  Map<int32, int32>* map_int32_int32 = message.mutable_map_int32_int32();
1011  Map<int32, double>* map_int32_double = message.mutable_map_int32_double();
1012  Map<std::string, std::string>* map_string_string =
1013  message.mutable_map_string_string();
1014  Map<int32, ForeignMessage>* map_int32_foreign_message =
1015  message.mutable_map_int32_foreign_message();
1016 
1017  for (int i = 0; i < 10; ++i) {
1018  (*map_int32_int32)[i] = Func(i, 1);
1019  (*map_int32_double)[i] = Func(i, 2);
1020  (*map_string_string)[StrFunc(i, 1)] = StrFunc(i, 5);
1021  (*map_int32_foreign_message)[i].set_c(Func(i, 6));
1022  }
1023 
1024  // Get FieldDescriptors for all the fields of interest.
1025  const FieldDescriptor* fd_map_int32_int32 =
1026  desc->FindFieldByName("map_int32_int32");
1027  const FieldDescriptor* fd_map_int32_double =
1028  desc->FindFieldByName("map_int32_double");
1029  const FieldDescriptor* fd_map_string_string =
1030  desc->FindFieldByName("map_string_string");
1031  const FieldDescriptor* fd_map_int32_foreign_message =
1032  desc->FindFieldByName("map_int32_foreign_message");
1033 
1034  const FieldDescriptor* fd_map_int32_in32_key =
1035  fd_map_int32_int32->message_type()->FindFieldByName("key");
1036  const FieldDescriptor* fd_map_int32_in32_value =
1037  fd_map_int32_int32->message_type()->FindFieldByName("value");
1038  const FieldDescriptor* fd_map_int32_double_key =
1039  fd_map_int32_double->message_type()->FindFieldByName("key");
1040  const FieldDescriptor* fd_map_int32_double_value =
1041  fd_map_int32_double->message_type()->FindFieldByName("value");
1042  const FieldDescriptor* fd_map_string_string_key =
1043  fd_map_string_string->message_type()->FindFieldByName("key");
1044  const FieldDescriptor* fd_map_string_string_value =
1045  fd_map_string_string->message_type()->FindFieldByName("value");
1046  const FieldDescriptor* fd_map_int32_foreign_message_key =
1047  fd_map_int32_foreign_message->message_type()->FindFieldByName("key");
1048  const FieldDescriptor* fd_map_int32_foreign_message_value =
1049  fd_map_int32_foreign_message->message_type()->FindFieldByName("value");
1050 
1051  // Get RepeatedPtrField objects for all fields of interest.
1052  const RepeatedPtrField<Message>& mf_int32_int32 =
1053  refl->GetRepeatedPtrField<Message>(message, fd_map_int32_int32);
1054  const RepeatedPtrField<Message>& mf_int32_double =
1055  refl->GetRepeatedPtrField<Message>(message, fd_map_int32_double);
1056  const RepeatedPtrField<Message>& mf_string_string =
1057  refl->GetRepeatedPtrField<Message>(message, fd_map_string_string);
1058  const RepeatedPtrField<Message>& mf_int32_foreign_message =
1059  refl->GetRepeatedPtrField<Message>(message, fd_map_int32_foreign_message);
1060 
1061  // Get mutable RepeatedPtrField objects for all fields of interest.
1062  RepeatedPtrField<Message>* mmf_int32_int32 =
1063  refl->MutableRepeatedPtrField<Message>(&message, fd_map_int32_int32);
1064  RepeatedPtrField<Message>* mmf_int32_double =
1065  refl->MutableRepeatedPtrField<Message>(&message, fd_map_int32_double);
1066  RepeatedPtrField<Message>* mmf_string_string =
1067  refl->MutableRepeatedPtrField<Message>(&message, fd_map_string_string);
1068  RepeatedPtrField<Message>* mmf_int32_foreign_message =
1070  fd_map_int32_foreign_message);
1071 
1072  // Make sure we can do gets through the RepeatedPtrField objects.
1073  for (int i = 0; i < 10; ++i) {
1074  {
1075  // Check gets through const objects.
1076  const Message& message_int32_int32 = mf_int32_int32.Get(i);
1077  int32 key_int32_int32 = message_int32_int32.GetReflection()->GetInt32(
1078  message_int32_int32, fd_map_int32_in32_key);
1079  int32 value_int32_int32 = message_int32_int32.GetReflection()->GetInt32(
1080  message_int32_int32, fd_map_int32_in32_value);
1081  EXPECT_EQ(value_int32_int32, Func(key_int32_int32, 1));
1082 
1083  const Message& message_int32_double = mf_int32_double.Get(i);
1084  int32 key_int32_double = message_int32_double.GetReflection()->GetInt32(
1085  message_int32_double, fd_map_int32_double_key);
1086  double value_int32_double =
1087  message_int32_double.GetReflection()->GetDouble(
1088  message_int32_double, fd_map_int32_double_value);
1089  EXPECT_EQ(value_int32_double, Func(key_int32_double, 2));
1090 
1091  const Message& message_string_string = mf_string_string.Get(i);
1092  std::string key_string_string =
1093  message_string_string.GetReflection()->GetString(
1094  message_string_string, fd_map_string_string_key);
1095  std::string value_string_string =
1096  message_string_string.GetReflection()->GetString(
1097  message_string_string, fd_map_string_string_value);
1098  EXPECT_EQ(value_string_string, StrFunc(Int(key_string_string), 5));
1099 
1100  const Message& message_int32_message = mf_int32_foreign_message.Get(i);
1101  int32 key_int32_message = message_int32_message.GetReflection()->GetInt32(
1102  message_int32_message, fd_map_int32_foreign_message_key);
1103  const ForeignMessage& value_int32_message =
1104  down_cast<const ForeignMessage&>(
1105  message_int32_message.GetReflection()->GetMessage(
1106  message_int32_message, fd_map_int32_foreign_message_value));
1107  EXPECT_EQ(value_int32_message.c(), Func(key_int32_message, 6));
1108  }
1109 
1110  {
1111  // Check gets through mutable objects.
1112  const Message& message_int32_int32 = mmf_int32_int32->Get(i);
1113  int32 key_int32_int32 = message_int32_int32.GetReflection()->GetInt32(
1114  message_int32_int32, fd_map_int32_in32_key);
1115  int32 value_int32_int32 = message_int32_int32.GetReflection()->GetInt32(
1116  message_int32_int32, fd_map_int32_in32_value);
1117  EXPECT_EQ(value_int32_int32, Func(key_int32_int32, 1));
1118 
1119  const Message& message_int32_double = mmf_int32_double->Get(i);
1120  int32 key_int32_double = message_int32_double.GetReflection()->GetInt32(
1121  message_int32_double, fd_map_int32_double_key);
1122  double value_int32_double =
1123  message_int32_double.GetReflection()->GetDouble(
1124  message_int32_double, fd_map_int32_double_value);
1125  EXPECT_EQ(value_int32_double, Func(key_int32_double, 2));
1126 
1127  const Message& message_string_string = mmf_string_string->Get(i);
1128  std::string key_string_string =
1129  message_string_string.GetReflection()->GetString(
1130  message_string_string, fd_map_string_string_key);
1131  std::string value_string_string =
1132  message_string_string.GetReflection()->GetString(
1133  message_string_string, fd_map_string_string_value);
1134  EXPECT_EQ(value_string_string, StrFunc(Int(key_string_string), 5));
1135 
1136  const Message& message_int32_message = mmf_int32_foreign_message->Get(i);
1137  int32 key_int32_message = message_int32_message.GetReflection()->GetInt32(
1138  message_int32_message, fd_map_int32_foreign_message_key);
1139  const ForeignMessage& value_int32_message =
1140  down_cast<const ForeignMessage&>(
1141  message_int32_message.GetReflection()->GetMessage(
1142  message_int32_message, fd_map_int32_foreign_message_value));
1143  EXPECT_EQ(value_int32_message.c(), Func(key_int32_message, 6));
1144  }
1145  }
1146 
1147  // Do sets through the RepeatedPtrField objects.
1148  for (int i = 0; i < 10; i++) {
1149  {
1150  Message* message_int32_int32 = mmf_int32_int32->Mutable(i);
1151  int32 key_int32_int32 = message_int32_int32->GetReflection()->GetInt32(
1152  *message_int32_int32, fd_map_int32_in32_key);
1153  message_int32_int32->GetReflection()->SetInt32(message_int32_int32,
1154  fd_map_int32_in32_value,
1155  Func(key_int32_int32, -1));
1156 
1157  Message* message_int32_double = mmf_int32_double->Mutable(i);
1158  int32 key_int32_double = message_int32_double->GetReflection()->GetInt32(
1159  *message_int32_double, fd_map_int32_double_key);
1160  message_int32_double->GetReflection()->SetDouble(
1161  message_int32_double, fd_map_int32_double_value,
1162  Func(key_int32_double, -2));
1163 
1164  Message* message_string_string = mmf_string_string->Mutable(i);
1165  std::string key_string_string =
1166  message_string_string->GetReflection()->GetString(
1167  *message_string_string, fd_map_string_string_key);
1168  message_string_string->GetReflection()->SetString(
1169  message_string_string, fd_map_string_string_value,
1170  StrFunc(Int(key_string_string), -5));
1171 
1172  Message* message_int32_message = mmf_int32_foreign_message->Mutable(i);
1173  int32 key_int32_message =
1174  message_int32_message->GetReflection()->GetInt32(
1175  *message_int32_message, fd_map_int32_foreign_message_key);
1176  ForeignMessage* value_int32_message = down_cast<ForeignMessage*>(
1177  message_int32_message->GetReflection()->MutableMessage(
1178  message_int32_message, fd_map_int32_foreign_message_value));
1179  value_int32_message->set_c(Func(key_int32_message, -6));
1180  }
1181  }
1182 
1183  // Check gets through mutable objects.
1184  for (int i = 0; i < 10; i++) {
1185  EXPECT_EQ(Func(i, -1), message.map_int32_int32().at(i));
1186  EXPECT_EQ(Func(i, -2), message.map_int32_double().at(i));
1187  EXPECT_EQ(StrFunc(i, -5), message.map_string_string().at(StrFunc(i, 1)));
1188  EXPECT_EQ(Func(i, -6), message.map_int32_foreign_message().at(i).c());
1189  }
1190 }
1191 
1192 TEST_F(MapFieldReflectionTest, RepeatedFieldRefForRegularFields) {
1193  TestMap message;
1194  const Reflection* refl = message.GetReflection();
1195  const Descriptor* desc = message.GetDescriptor();
1196 
1197  Map<int32, int32>* map_int32_int32 = message.mutable_map_int32_int32();
1198  Map<int32, double>* map_int32_double = message.mutable_map_int32_double();
1199  Map<std::string, std::string>* map_string_string =
1200  message.mutable_map_string_string();
1201  Map<int32, ForeignMessage>* map_int32_foreign_message =
1202  message.mutable_map_int32_foreign_message();
1203 
1204  for (int i = 0; i < 10; ++i) {
1205  (*map_int32_int32)[i] = Func(i, 1);
1206  (*map_int32_double)[i] = Func(i, 2);
1207  (*map_string_string)[StrFunc(i, 1)] = StrFunc(i, 5);
1208  (*map_int32_foreign_message)[i].set_c(Func(i, 6));
1209  }
1210 
1211  // Get FieldDescriptors for all the fields of interest.
1212  const FieldDescriptor* fd_map_int32_int32 =
1213  desc->FindFieldByName("map_int32_int32");
1214  const FieldDescriptor* fd_map_int32_double =
1215  desc->FindFieldByName("map_int32_double");
1216  const FieldDescriptor* fd_map_string_string =
1217  desc->FindFieldByName("map_string_string");
1218  const FieldDescriptor* fd_map_int32_foreign_message =
1219  desc->FindFieldByName("map_int32_foreign_message");
1220 
1221  const FieldDescriptor* fd_map_int32_in32_key =
1222  fd_map_int32_int32->message_type()->FindFieldByName("key");
1223  const FieldDescriptor* fd_map_int32_in32_value =
1224  fd_map_int32_int32->message_type()->FindFieldByName("value");
1225  const FieldDescriptor* fd_map_int32_double_key =
1226  fd_map_int32_double->message_type()->FindFieldByName("key");
1227  const FieldDescriptor* fd_map_int32_double_value =
1228  fd_map_int32_double->message_type()->FindFieldByName("value");
1229  const FieldDescriptor* fd_map_string_string_key =
1230  fd_map_string_string->message_type()->FindFieldByName("key");
1231  const FieldDescriptor* fd_map_string_string_value =
1232  fd_map_string_string->message_type()->FindFieldByName("value");
1233  const FieldDescriptor* fd_map_int32_foreign_message_key =
1234  fd_map_int32_foreign_message->message_type()->FindFieldByName("key");
1235  const FieldDescriptor* fd_map_int32_foreign_message_value =
1236  fd_map_int32_foreign_message->message_type()->FindFieldByName("value");
1237 
1238  // Get RepeatedFieldRef objects for all fields of interest.
1239  const RepeatedFieldRef<Message> mf_int32_int32 =
1240  refl->GetRepeatedFieldRef<Message>(message, fd_map_int32_int32);
1241  const RepeatedFieldRef<Message> mf_int32_double =
1242  refl->GetRepeatedFieldRef<Message>(message, fd_map_int32_double);
1243  const RepeatedFieldRef<Message> mf_string_string =
1244  refl->GetRepeatedFieldRef<Message>(message, fd_map_string_string);
1245  const RepeatedFieldRef<Message> mf_int32_foreign_message =
1246  refl->GetRepeatedFieldRef<Message>(message, fd_map_int32_foreign_message);
1247 
1248  // Get mutable RepeatedFieldRef objects for all fields of interest.
1249  const MutableRepeatedFieldRef<Message> mmf_int32_int32 =
1250  refl->GetMutableRepeatedFieldRef<Message>(&message, fd_map_int32_int32);
1251  const MutableRepeatedFieldRef<Message> mmf_int32_double =
1252  refl->GetMutableRepeatedFieldRef<Message>(&message, fd_map_int32_double);
1253  const MutableRepeatedFieldRef<Message> mmf_string_string =
1254  refl->GetMutableRepeatedFieldRef<Message>(&message, fd_map_string_string);
1255  const MutableRepeatedFieldRef<Message> mmf_int32_foreign_message =
1257  fd_map_int32_foreign_message);
1258 
1259  // Get entry default instances
1260  std::unique_ptr<Message> entry_int32_int32(
1262  ->GetPrototype(fd_map_int32_int32->message_type())
1263  ->New());
1264  std::unique_ptr<Message> entry_int32_double(
1266  ->GetPrototype(fd_map_int32_double->message_type())
1267  ->New());
1268  std::unique_ptr<Message> entry_string_string(
1270  ->GetPrototype(fd_map_string_string->message_type())
1271  ->New());
1272  std::unique_ptr<Message> entry_int32_foreign_message(
1274  ->GetPrototype(fd_map_int32_foreign_message->message_type())
1275  ->New());
1276 
1277  EXPECT_EQ(10, mf_int32_int32.size());
1278  EXPECT_EQ(10, mmf_int32_int32.size());
1279  EXPECT_EQ(10, mf_int32_double.size());
1280  EXPECT_EQ(10, mmf_int32_double.size());
1281  EXPECT_EQ(10, mf_string_string.size());
1282  EXPECT_EQ(10, mmf_string_string.size());
1283  EXPECT_EQ(10, mf_int32_foreign_message.size());
1284  EXPECT_EQ(10, mmf_int32_foreign_message.size());
1285 
1286  EXPECT_FALSE(mf_int32_int32.empty());
1287  EXPECT_FALSE(mmf_int32_int32.empty());
1288  EXPECT_FALSE(mf_int32_double.empty());
1289  EXPECT_FALSE(mmf_int32_double.empty());
1290  EXPECT_FALSE(mf_string_string.empty());
1291  EXPECT_FALSE(mmf_string_string.empty());
1292  EXPECT_FALSE(mf_int32_foreign_message.empty());
1293  EXPECT_FALSE(mmf_int32_foreign_message.empty());
1294 
1295  // Make sure we can do gets through the RepeatedFieldRef objects.
1296  for (int i = 0; i < 10; ++i) {
1297  {
1298  // Check gets through const objects.
1299  const Message& message_int32_int32 =
1300  mf_int32_int32.Get(i, entry_int32_int32.get());
1301  int32 key_int32_int32 = message_int32_int32.GetReflection()->GetInt32(
1302  message_int32_int32, fd_map_int32_in32_key);
1303  int32 value_int32_int32 = message_int32_int32.GetReflection()->GetInt32(
1304  message_int32_int32, fd_map_int32_in32_value);
1305  EXPECT_EQ(value_int32_int32, Func(key_int32_int32, 1));
1306 
1307  const Message& message_int32_double =
1308  mf_int32_double.Get(i, entry_int32_double.get());
1309  int32 key_int32_double = message_int32_double.GetReflection()->GetInt32(
1310  message_int32_double, fd_map_int32_double_key);
1311  double value_int32_double =
1312  message_int32_double.GetReflection()->GetDouble(
1313  message_int32_double, fd_map_int32_double_value);
1314  EXPECT_EQ(value_int32_double, Func(key_int32_double, 2));
1315 
1316  const Message& message_string_string =
1317  mf_string_string.Get(i, entry_string_string.get());
1318  std::string key_string_string =
1319  message_string_string.GetReflection()->GetString(
1320  message_string_string, fd_map_string_string_key);
1321  std::string value_string_string =
1322  message_string_string.GetReflection()->GetString(
1323  message_string_string, fd_map_string_string_value);
1324  EXPECT_EQ(value_string_string, StrFunc(Int(key_string_string), 5));
1325 
1326  const Message& message_int32_message =
1327  mf_int32_foreign_message.Get(i, entry_int32_foreign_message.get());
1328  int32 key_int32_message = message_int32_message.GetReflection()->GetInt32(
1329  message_int32_message, fd_map_int32_foreign_message_key);
1330  const ForeignMessage& value_int32_message =
1331  down_cast<const ForeignMessage&>(
1332  message_int32_message.GetReflection()->GetMessage(
1333  message_int32_message, fd_map_int32_foreign_message_value));
1334  EXPECT_EQ(value_int32_message.c(), Func(key_int32_message, 6));
1335  }
1336 
1337  {
1338  // Check gets through mutable objects.
1339  const Message& message_int32_int32 =
1340  mmf_int32_int32.Get(i, entry_int32_int32.get());
1341  int32 key_int32_int32 = message_int32_int32.GetReflection()->GetInt32(
1342  message_int32_int32, fd_map_int32_in32_key);
1343  int32 value_int32_int32 = message_int32_int32.GetReflection()->GetInt32(
1344  message_int32_int32, fd_map_int32_in32_value);
1345  EXPECT_EQ(value_int32_int32, Func(key_int32_int32, 1));
1346 
1347  const Message& message_int32_double =
1348  mmf_int32_double.Get(i, entry_int32_double.get());
1349  int32 key_int32_double = message_int32_double.GetReflection()->GetInt32(
1350  message_int32_double, fd_map_int32_double_key);
1351  double value_int32_double =
1352  message_int32_double.GetReflection()->GetDouble(
1353  message_int32_double, fd_map_int32_double_value);
1354  EXPECT_EQ(value_int32_double, Func(key_int32_double, 2));
1355 
1356  const Message& message_string_string =
1357  mmf_string_string.Get(i, entry_string_string.get());
1358  std::string key_string_string =
1359  message_string_string.GetReflection()->GetString(
1360  message_string_string, fd_map_string_string_key);
1361  std::string value_string_string =
1362  message_string_string.GetReflection()->GetString(
1363  message_string_string, fd_map_string_string_value);
1364  EXPECT_EQ(value_string_string, StrFunc(Int(key_string_string), 5));
1365 
1366  const Message& message_int32_message =
1367  mmf_int32_foreign_message.Get(i, entry_int32_foreign_message.get());
1368  int32 key_int32_message = message_int32_message.GetReflection()->GetInt32(
1369  message_int32_message, fd_map_int32_foreign_message_key);
1370  const ForeignMessage& value_int32_message =
1371  down_cast<const ForeignMessage&>(
1372  message_int32_message.GetReflection()->GetMessage(
1373  message_int32_message, fd_map_int32_foreign_message_value));
1374  EXPECT_EQ(value_int32_message.c(), Func(key_int32_message, 6));
1375  }
1376  }
1377 
1378  // Make sure we can do sets through the RepeatedFieldRef objects.
1379  for (int i = 0; i < 10; i++) {
1380  const Message& message_int32_int32 =
1381  mmf_int32_int32.Get(i, entry_int32_int32.get());
1382  int key = message_int32_int32.GetReflection()->GetInt32(
1383  message_int32_int32, fd_map_int32_in32_key);
1384 
1385  entry_int32_int32->GetReflection()->SetInt32(
1386  entry_int32_int32.get(), fd_map_int32_int32->message_type()->field(0),
1387  key);
1388  entry_int32_int32->GetReflection()->SetInt32(
1389  entry_int32_int32.get(), fd_map_int32_int32->message_type()->field(1),
1390  Func(key, -1));
1391  entry_int32_double->GetReflection()->SetInt32(
1392  entry_int32_double.get(), fd_map_int32_double->message_type()->field(0),
1393  key);
1394  entry_int32_double->GetReflection()->SetDouble(
1395  entry_int32_double.get(), fd_map_int32_double->message_type()->field(1),
1396  Func(key, -2));
1397  entry_string_string->GetReflection()->SetString(
1398  entry_string_string.get(),
1399  fd_map_string_string->message_type()->field(0), StrFunc(key, 1));
1400  entry_string_string->GetReflection()->SetString(
1401  entry_string_string.get(),
1402  fd_map_string_string->message_type()->field(1), StrFunc(key, -5));
1403  entry_int32_foreign_message->GetReflection()->SetInt32(
1404  entry_int32_foreign_message.get(),
1405  fd_map_int32_foreign_message->message_type()->field(0), key);
1406  Message* value_message =
1407  entry_int32_foreign_message->GetReflection()->MutableMessage(
1408  entry_int32_foreign_message.get(),
1409  fd_map_int32_foreign_message->message_type()->field(1));
1410  value_message->GetReflection()->SetInt32(
1411  value_message, value_message->GetDescriptor()->FindFieldByName("c"),
1412  Func(key, -6));
1413 
1414  mmf_int32_int32.Set(i, *entry_int32_int32);
1415  mmf_int32_double.Set(i, *entry_int32_double);
1416  mmf_string_string.Set(i, *entry_string_string);
1417  mmf_int32_foreign_message.Set(i, *entry_int32_foreign_message);
1418  }
1419 
1420  for (int i = 0; i < 10; i++) {
1421  EXPECT_EQ(Func(i, -1), message.map_int32_int32().at(i));
1422  EXPECT_EQ(Func(i, -2), message.map_int32_double().at(i));
1423  EXPECT_EQ(StrFunc(i, -5), message.map_string_string().at(StrFunc(i, 1)));
1424  EXPECT_EQ(Func(i, -6), message.map_int32_foreign_message().at(i).c());
1425  }
1426 
1427  // Test iterators.
1428  {
1429  int index = 0;
1430  std::unordered_map<int32, int32> result;
1431  for (RepeatedFieldRef<Message>::iterator it = mf_int32_int32.begin();
1432  it != mf_int32_int32.end(); ++it) {
1433  const Message& message = *it;
1434  int32 key =
1435  message.GetReflection()->GetInt32(message, fd_map_int32_in32_key);
1436  int32 value =
1437  message.GetReflection()->GetInt32(message, fd_map_int32_in32_value);
1438  result[key] = value;
1439  ++index;
1440  }
1441  EXPECT_EQ(10, index);
1442  for (std::unordered_map<int32, int32>::const_iterator it = result.begin();
1443  it != result.end(); ++it) {
1444  EXPECT_EQ(message.map_int32_int32().at(it->first), it->second);
1445  }
1446  }
1447 
1448  {
1449  int index = 0;
1450  std::unordered_map<int32, double> result;
1451  for (RepeatedFieldRef<Message>::iterator it = mf_int32_double.begin();
1452  it != mf_int32_double.end(); ++it) {
1453  const Message& message = *it;
1454  int32 key =
1455  message.GetReflection()->GetInt32(message, fd_map_int32_double_key);
1456  double value = message.GetReflection()->GetDouble(
1457  message, fd_map_int32_double_value);
1458  result[key] = value;
1459  ++index;
1460  }
1461  EXPECT_EQ(10, index);
1462  for (std::unordered_map<int32, double>::const_iterator it = result.begin();
1463  it != result.end(); ++it) {
1464  EXPECT_EQ(message.map_int32_double().at(it->first), it->second);
1465  }
1466  }
1467 
1468  {
1469  int index = 0;
1470  std::unordered_map<std::string, std::string> result;
1471  for (RepeatedFieldRef<Message>::iterator it = mf_string_string.begin();
1472  it != mf_string_string.end(); ++it) {
1473  const Message& message = *it;
1474  std::string key =
1475  message.GetReflection()->GetString(message, fd_map_string_string_key);
1476  std::string value = message.GetReflection()->GetString(
1477  message, fd_map_string_string_value);
1478  result[key] = value;
1479  ++index;
1480  }
1481  EXPECT_EQ(10, index);
1482  for (std::unordered_map<std::string, std::string>::const_iterator it =
1483  result.begin();
1484  it != result.end(); ++it) {
1485  EXPECT_EQ(message.map_string_string().at(it->first), it->second);
1486  }
1487  }
1488 
1489  {
1490  int index = 0;
1491  std::map<int32, ForeignMessage> result;
1493  mf_int32_foreign_message.begin();
1494  it != mf_int32_foreign_message.end(); ++it) {
1495  const Message& message = *it;
1496  int32 key = message.GetReflection()->GetInt32(
1497  message, fd_map_int32_foreign_message_key);
1498  const ForeignMessage& sub_message =
1499  down_cast<const ForeignMessage&>(message.GetReflection()->GetMessage(
1500  message, fd_map_int32_foreign_message_value));
1501  result[key].MergeFrom(sub_message);
1502  ++index;
1503  }
1504  EXPECT_EQ(10, index);
1505  for (std::map<int32, ForeignMessage>::const_iterator it = result.begin();
1506  it != result.end(); ++it) {
1507  EXPECT_EQ(message.map_int32_foreign_message().at(it->first).c(),
1508  it->second.c());
1509  }
1510  }
1511 
1512  // Test MutableRepeatedFieldRef::Add()
1513  entry_int32_int32->GetReflection()->SetInt32(
1514  entry_int32_int32.get(), fd_map_int32_int32->message_type()->field(0),
1515  4321);
1516  entry_int32_int32->GetReflection()->SetInt32(
1517  entry_int32_int32.get(), fd_map_int32_int32->message_type()->field(1),
1518  1234);
1519  mmf_int32_int32.Add(*entry_int32_int32);
1520  EXPECT_EQ(1234, message.map_int32_int32().at(4321));
1521 
1522  entry_int32_double->GetReflection()->SetInt32(
1523  entry_int32_double.get(), fd_map_int32_double->message_type()->field(0),
1524  4321);
1525  entry_int32_double->GetReflection()->SetDouble(
1526  entry_int32_double.get(), fd_map_int32_double->message_type()->field(1),
1527  1234.0);
1528  mmf_int32_double.Add(*entry_int32_double);
1529  EXPECT_EQ(1234.0, message.map_int32_double().at(4321));
1530 
1531  entry_string_string->GetReflection()->SetString(
1532  entry_string_string.get(), fd_map_string_string->message_type()->field(0),
1533  "4321");
1534  entry_string_string->GetReflection()->SetString(
1535  entry_string_string.get(), fd_map_string_string->message_type()->field(1),
1536  "1234");
1537  mmf_string_string.Add(*entry_string_string);
1538  EXPECT_EQ("1234", message.map_string_string().at("4321"));
1539 
1540  entry_int32_foreign_message->GetReflection()->SetInt32(
1541  entry_int32_foreign_message.get(),
1542  fd_map_int32_foreign_message->message_type()->field(0), 4321);
1543  Message* value_message =
1544  entry_int32_foreign_message->GetReflection()->MutableMessage(
1545  entry_int32_foreign_message.get(),
1546  fd_map_int32_foreign_message->message_type()->field(1));
1547  ForeignMessage foreign_message;
1548  foreign_message.set_c(1234);
1549  value_message->CopyFrom(foreign_message);
1550 
1551  mmf_int32_foreign_message.Add(*entry_int32_foreign_message);
1552  EXPECT_EQ(1234, message.map_int32_foreign_message().at(4321).c());
1553 
1554  // Test Reflection::AddAllocatedMessage
1555  Message* free_entry_string_string =
1557  ->GetPrototype(fd_map_string_string->message_type())
1558  ->New();
1559  entry_string_string->GetReflection()->SetString(
1560  free_entry_string_string, fd_map_string_string->message_type()->field(0),
1561  "4321");
1562  entry_string_string->GetReflection()->SetString(
1563  free_entry_string_string, fd_map_string_string->message_type()->field(1),
1564  "1234");
1565  refl->AddAllocatedMessage(&message, fd_map_string_string,
1566  free_entry_string_string);
1567 
1568  // Test MutableRepeatedFieldRef::RemoveLast()
1569  mmf_int32_int32.RemoveLast();
1570  mmf_int32_double.RemoveLast();
1571  mmf_string_string.RemoveLast();
1572  mmf_int32_foreign_message.RemoveLast();
1573  EXPECT_EQ(10, message.map_int32_int32().size());
1574  EXPECT_EQ(10, message.map_int32_double().size());
1575  EXPECT_EQ(11, message.map_string_string().size());
1576  EXPECT_EQ(10, message.map_int32_foreign_message().size());
1577 
1578  // Test MutableRepeatedFieldRef::SwapElements()
1579  {
1580  const Message& message0a = mmf_int32_int32.Get(0, entry_int32_int32.get());
1581  int32 int32_value0a =
1582  message0a.GetReflection()->GetInt32(message0a, fd_map_int32_in32_value);
1583  const Message& message9a = mmf_int32_int32.Get(9, entry_int32_int32.get());
1584  int32 int32_value9a =
1585  message9a.GetReflection()->GetInt32(message9a, fd_map_int32_in32_value);
1586 
1587  mmf_int32_int32.SwapElements(0, 9);
1588 
1589  const Message& message0b = mmf_int32_int32.Get(0, entry_int32_int32.get());
1590  int32 int32_value0b =
1591  message0b.GetReflection()->GetInt32(message0b, fd_map_int32_in32_value);
1592  const Message& message9b = mmf_int32_int32.Get(9, entry_int32_int32.get());
1593  int32 int32_value9b =
1594  message9b.GetReflection()->GetInt32(message9b, fd_map_int32_in32_value);
1595 
1596  EXPECT_EQ(int32_value9a, int32_value0b);
1597  EXPECT_EQ(int32_value0a, int32_value9b);
1598  }
1599 
1600  {
1601  const Message& message0a =
1602  mmf_int32_double.Get(0, entry_int32_double.get());
1603  double double_value0a = message0a.GetReflection()->GetDouble(
1604  message0a, fd_map_int32_double_value);
1605  const Message& message9a =
1606  mmf_int32_double.Get(9, entry_int32_double.get());
1607  double double_value9a = message9a.GetReflection()->GetDouble(
1608  message9a, fd_map_int32_double_value);
1609 
1610  mmf_int32_double.SwapElements(0, 9);
1611 
1612  const Message& message0b =
1613  mmf_int32_double.Get(0, entry_int32_double.get());
1614  double double_value0b = message0b.GetReflection()->GetDouble(
1615  message0b, fd_map_int32_double_value);
1616  const Message& message9b =
1617  mmf_int32_double.Get(9, entry_int32_double.get());
1618  double double_value9b = message9b.GetReflection()->GetDouble(
1619  message9b, fd_map_int32_double_value);
1620 
1621  EXPECT_EQ(double_value9a, double_value0b);
1622  EXPECT_EQ(double_value0a, double_value9b);
1623  }
1624 
1625  {
1626  const Message& message0a =
1627  mmf_string_string.Get(0, entry_string_string.get());
1628  std::string string_value0a = message0a.GetReflection()->GetString(
1629  message0a, fd_map_string_string_value);
1630  const Message& message9a =
1631  mmf_string_string.Get(9, entry_string_string.get());
1632  std::string string_value9a = message9a.GetReflection()->GetString(
1633  message9a, fd_map_string_string_value);
1634 
1635  mmf_string_string.SwapElements(0, 9);
1636 
1637  const Message& message0b =
1638  mmf_string_string.Get(0, entry_string_string.get());
1639  std::string string_value0b = message0b.GetReflection()->GetString(
1640  message0b, fd_map_string_string_value);
1641  const Message& message9b =
1642  mmf_string_string.Get(9, entry_string_string.get());
1643  std::string string_value9b = message9b.GetReflection()->GetString(
1644  message9b, fd_map_string_string_value);
1645 
1646  EXPECT_EQ(string_value9a, string_value0b);
1647  EXPECT_EQ(string_value0a, string_value9b);
1648  }
1649 
1650  {
1651  const Message& message0a =
1652  mmf_int32_foreign_message.Get(0, entry_int32_foreign_message.get());
1653  const ForeignMessage& sub_message0a =
1654  down_cast<const ForeignMessage&>(message0a.GetReflection()->GetMessage(
1655  message0a, fd_map_int32_foreign_message_value));
1656  int32 int32_value0a = sub_message0a.c();
1657  const Message& message9a =
1658  mmf_int32_foreign_message.Get(9, entry_int32_foreign_message.get());
1659  const ForeignMessage& sub_message9a =
1660  down_cast<const ForeignMessage&>(message9a.GetReflection()->GetMessage(
1661  message9a, fd_map_int32_foreign_message_value));
1662  int32 int32_value9a = sub_message9a.c();
1663 
1664  mmf_int32_foreign_message.SwapElements(0, 9);
1665 
1666  const Message& message0b =
1667  mmf_int32_foreign_message.Get(0, entry_int32_foreign_message.get());
1668  const ForeignMessage& sub_message0b =
1669  down_cast<const ForeignMessage&>(message0b.GetReflection()->GetMessage(
1670  message0b, fd_map_int32_foreign_message_value));
1671  int32 int32_value0b = sub_message0b.c();
1672  const Message& message9b =
1673  mmf_int32_foreign_message.Get(9, entry_int32_foreign_message.get());
1674  const ForeignMessage& sub_message9b =
1675  down_cast<const ForeignMessage&>(message9b.GetReflection()->GetMessage(
1676  message9b, fd_map_int32_foreign_message_value));
1677  int32 int32_value9b = sub_message9b.c();
1678 
1679  EXPECT_EQ(int32_value9a, int32_value0b);
1680  EXPECT_EQ(int32_value0a, int32_value9b);
1681  }
1682 }
1683 
1684 TEST_F(MapFieldReflectionTest, RepeatedFieldRefMergeFromAndSwap) {
1685  // Set-up message content.
1686  TestMap m0, m1, m2;
1687  for (int i = 0; i < 10; ++i) {
1688  (*m0.mutable_map_int32_int32())[i] = Func(i, 1);
1689  (*m0.mutable_map_int32_double())[i] = Func(i, 2);
1690  (*m0.mutable_map_string_string())[StrFunc(i, 1)] = StrFunc(i, 5);
1691  (*m0.mutable_map_int32_foreign_message())[i].set_c(Func(i, 6));
1692  (*m1.mutable_map_int32_int32())[i + 10] = Func(i, 11);
1693  (*m1.mutable_map_int32_double())[i + 10] = Func(i, 12);
1694  (*m1.mutable_map_string_string())[StrFunc(i + 10, 1)] = StrFunc(i, 15);
1695  (*m1.mutable_map_int32_foreign_message())[i + 10].set_c(Func(i, 16));
1696  (*m2.mutable_map_int32_int32())[i + 20] = Func(i, 21);
1697  (*m2.mutable_map_int32_double())[i + 20] = Func(i, 22);
1698  (*m2.mutable_map_string_string())[StrFunc(i + 20, 1)] = StrFunc(i, 25);
1699  (*m2.mutable_map_int32_foreign_message())[i + 20].set_c(Func(i, 26));
1700  }
1701 
1702  const Reflection* refl = m0.GetReflection();
1703  const Descriptor* desc = m0.GetDescriptor();
1704 
1705  // Get FieldDescriptors for all the fields of interest.
1706  const FieldDescriptor* fd_map_int32_int32 =
1707  desc->FindFieldByName("map_int32_int32");
1708  const FieldDescriptor* fd_map_int32_double =
1709  desc->FindFieldByName("map_int32_double");
1710  const FieldDescriptor* fd_map_string_string =
1711  desc->FindFieldByName("map_string_string");
1712  const FieldDescriptor* fd_map_int32_foreign_message =
1713  desc->FindFieldByName("map_int32_foreign_message");
1714 
1715  // Get MutableRepeatedFieldRef objects for all fields of interest.
1716  const MutableRepeatedFieldRef<Message> mmf_int32_int32 =
1717  refl->GetMutableRepeatedFieldRef<Message>(&m0, fd_map_int32_int32);
1718  const MutableRepeatedFieldRef<Message> mmf_int32_double =
1719  refl->GetMutableRepeatedFieldRef<Message>(&m0, fd_map_int32_double);
1720  const MutableRepeatedFieldRef<Message> mmf_string_string =
1721  refl->GetMutableRepeatedFieldRef<Message>(&m0, fd_map_string_string);
1722  const MutableRepeatedFieldRef<Message> mmf_int32_foreign_message =
1724  fd_map_int32_foreign_message);
1725 
1726  // Test MutableRepeatedRef::CopyFrom
1727  mmf_int32_int32.CopyFrom(
1728  refl->GetRepeatedFieldRef<Message>(m1, fd_map_int32_int32));
1729  mmf_int32_double.CopyFrom(
1730  refl->GetRepeatedFieldRef<Message>(m1, fd_map_int32_double));
1731  mmf_string_string.CopyFrom(
1732  refl->GetRepeatedFieldRef<Message>(m1, fd_map_string_string));
1733  mmf_int32_foreign_message.CopyFrom(
1734  refl->GetRepeatedFieldRef<Message>(m1, fd_map_int32_foreign_message));
1735 
1736  for (int i = 0; i < 10; ++i) {
1737  EXPECT_EQ(Func(i, 11), m0.map_int32_int32().at(i + 10));
1738  EXPECT_EQ(Func(i, 12), m0.map_int32_double().at(i + 10));
1739  EXPECT_EQ(StrFunc(i, 15), m0.map_string_string().at(StrFunc(i + 10, 1)));
1740  EXPECT_EQ(Func(i, 16), m0.map_int32_foreign_message().at(i + 10).c());
1741  }
1742 
1743  // Test MutableRepeatedRef::MergeFrom
1744  mmf_int32_int32.MergeFrom(
1745  refl->GetRepeatedFieldRef<Message>(m2, fd_map_int32_int32));
1746  mmf_int32_double.MergeFrom(
1747  refl->GetRepeatedFieldRef<Message>(m2, fd_map_int32_double));
1748  mmf_string_string.MergeFrom(
1749  refl->GetRepeatedFieldRef<Message>(m2, fd_map_string_string));
1750  mmf_int32_foreign_message.MergeFrom(
1751  refl->GetRepeatedFieldRef<Message>(m2, fd_map_int32_foreign_message));
1752  for (int i = 0; i < 10; ++i) {
1753  EXPECT_EQ(Func(i, 21), m0.map_int32_int32().at(i + 20));
1754  EXPECT_EQ(Func(i, 22), m0.map_int32_double().at(i + 20));
1755  EXPECT_EQ(StrFunc(i, 25), m0.map_string_string().at(StrFunc(i + 20, 1)));
1756  EXPECT_EQ(Func(i, 26), m0.map_int32_foreign_message().at(i + 20).c());
1757  }
1758 
1759  // Test MutableRepeatedRef::Swap
1760  // Swap between m0 and m2.
1761  mmf_int32_int32.Swap(
1762  refl->GetMutableRepeatedFieldRef<Message>(&m2, fd_map_int32_int32));
1763  mmf_int32_double.Swap(
1764  refl->GetMutableRepeatedFieldRef<Message>(&m2, fd_map_int32_double));
1765  mmf_string_string.Swap(
1766  refl->GetMutableRepeatedFieldRef<Message>(&m2, fd_map_string_string));
1767  mmf_int32_foreign_message.Swap(refl->GetMutableRepeatedFieldRef<Message>(
1768  &m2, fd_map_int32_foreign_message));
1769  for (int i = 0; i < 10; ++i) {
1770  // Check the content of m0.
1771  EXPECT_EQ(Func(i, 21), m0.map_int32_int32().at(i + 20));
1772  EXPECT_EQ(Func(i, 22), m0.map_int32_double().at(i + 20));
1773  EXPECT_EQ(StrFunc(i, 25), m0.map_string_string().at(StrFunc(i + 20, 1)));
1774  EXPECT_EQ(Func(i, 26), m0.map_int32_foreign_message().at(i + 20).c());
1775 
1776  // Check the content of m2.
1777  EXPECT_EQ(Func(i, 11), m2.map_int32_int32().at(i + 10));
1778  EXPECT_EQ(Func(i, 12), m2.map_int32_double().at(i + 10));
1779  EXPECT_EQ(StrFunc(i, 15), m2.map_string_string().at(StrFunc(i + 10, 1)));
1780  EXPECT_EQ(Func(i, 16), m2.map_int32_foreign_message().at(i + 10).c());
1781  EXPECT_EQ(Func(i, 21), m2.map_int32_int32().at(i + 20));
1782  EXPECT_EQ(Func(i, 22), m2.map_int32_double().at(i + 20));
1783  EXPECT_EQ(StrFunc(i, 25), m2.map_string_string().at(StrFunc(i + 20, 1)));
1784  EXPECT_EQ(Func(i, 26), m2.map_int32_foreign_message().at(i + 20).c());
1785  }
1786 
1787  // TODO(teboring): add test for duplicated key
1788 }
1789 
1790 TEST_F(MapFieldReflectionTest, MapSizeWithDuplicatedKey) {
1791  // Dynamic Message
1792  {
1793  DynamicMessageFactory factory;
1794  std::unique_ptr<Message> message(
1796  const Reflection* reflection = message->GetReflection();
1797  const FieldDescriptor* field =
1798  unittest::TestMap::descriptor()->FindFieldByName("map_int32_int32");
1799 
1800  Message* entry1 = reflection->AddMessage(message.get(), field);
1801  Message* entry2 = reflection->AddMessage(message.get(), field);
1802 
1803  const Reflection* entry_reflection = entry1->GetReflection();
1804  const FieldDescriptor* key_field =
1805  entry1->GetDescriptor()->FindFieldByName("key");
1806  entry_reflection->SetInt32(entry1, key_field, 1);
1807  entry_reflection->SetInt32(entry2, key_field, 1);
1808 
1809  EXPECT_EQ(2, reflection->FieldSize(*message, field));
1810  EXPECT_EQ(1, MapSize(reflection, field, *message));
1811  EXPECT_EQ(2, reflection->FieldSize(*message, field));
1812  }
1813 
1814  // Generated Message
1815  {
1816  unittest::TestMap message;
1817  const Reflection* reflection = message.GetReflection();
1818  const FieldDescriptor* field =
1819  message.GetDescriptor()->FindFieldByName("map_int32_int32");
1820 
1821  Message* entry1 = reflection->AddMessage(&message, field);
1822  Message* entry2 = reflection->AddMessage(&message, field);
1823 
1824  const Reflection* entry_reflection = entry1->GetReflection();
1825  const FieldDescriptor* key_field =
1826  entry1->GetDescriptor()->FindFieldByName("key");
1827  entry_reflection->SetInt32(entry1, key_field, 1);
1828  entry_reflection->SetInt32(entry2, key_field, 1);
1829 
1830  EXPECT_EQ(2, reflection->FieldSize(message, field));
1831  EXPECT_EQ(1, MapSize(reflection, field, message));
1832  }
1833 }
1834 
1835 // Generated Message Test ===========================================
1836 
1837 TEST(GeneratedMapFieldTest, Accessors) {
1838  unittest::TestMap message;
1839 
1842 
1845 }
1846 
1847 TEST(GeneratedMapFieldTest, SetMapFieldsInitialized) {
1848  unittest::TestMap message;
1849 
1852 }
1853 
1854 TEST(GeneratedMapFieldTest, Proto2SetMapFieldsInitialized) {
1855  unittest::TestEnumMap message;
1856  EXPECT_EQ(unittest::PROTO2_MAP_ENUM_FOO,
1857  (*message.mutable_known_map_field())[0]);
1858 }
1859 
1860 TEST(GeneratedMapFieldTest, Clear) {
1861  unittest::TestMap message;
1862 
1864  message.Clear();
1866 }
1867 
1868 TEST(GeneratedMapFieldTest, ClearMessageMap) {
1869  unittest::TestMessageMap message;
1870 
1871  // Creates a TestAllTypes with default value
1872  TestUtil::ExpectClear((*message.mutable_map_int32_message())[0]);
1873 }
1874 
1875 TEST(GeneratedMapFieldTest, CopyFrom) {
1876  unittest::TestMap message1, message2;
1877 
1878  MapTestUtil::SetMapFields(&message1);
1879  message2.CopyFrom(message1);
1881 
1882  // Copying from self should be a no-op.
1883  message2.CopyFrom(message2);
1885 }
1886 
1887 TEST(GeneratedMapFieldTest, CopyFromMessageMap) {
1888  unittest::TestMessageMap message1, message2;
1889 
1890  (*message1.mutable_map_int32_message())[0].add_repeated_int32(100);
1891  (*message2.mutable_map_int32_message())[0].add_repeated_int32(101);
1892 
1893  message1.CopyFrom(message2);
1894 
1895  // Checks repeated field is overwritten.
1896  EXPECT_EQ(1, message1.map_int32_message().at(0).repeated_int32_size());
1897  EXPECT_EQ(101, message1.map_int32_message().at(0).repeated_int32(0));
1898 }
1899 
1900 TEST(GeneratedMapFieldTest, SwapWithEmpty) {
1901  unittest::TestMap message1, message2;
1902 
1903  MapTestUtil::SetMapFields(&message1);
1905  MapTestUtil::ExpectClear(message2);
1906 
1907  message1.Swap(&message2);
1909  MapTestUtil::ExpectClear(message1);
1910 }
1911 
1912 TEST(GeneratedMapFieldTest, SwapWithSelf) {
1913  unittest::TestMap message;
1914 
1917 
1918  message.Swap(&message);
1920 }
1921 
1922 TEST(GeneratedMapFieldTest, SwapWithOther) {
1923  unittest::TestMap message1, message2;
1924 
1925  MapTestUtil::SetMapFields(&message1);
1926  MapTestUtil::SetMapFields(&message2);
1927  MapTestUtil::ModifyMapFields(&message2);
1928 
1929  message1.Swap(&message2);
1932 }
1933 
1934 TEST(GeneratedMapFieldTest, CopyConstructor) {
1935  unittest::TestMap message1;
1936  MapTestUtil::SetMapFields(&message1);
1937 
1938  unittest::TestMap message2(message1);
1940 }
1941 
1942 TEST(GeneratedMapFieldTest, CopyAssignmentOperator) {
1943  unittest::TestMap message1;
1944  MapTestUtil::SetMapFields(&message1);
1945 
1946  unittest::TestMap message2;
1947  message2 = message1;
1949 
1950  // Make sure that self-assignment does something sane.
1951  message2.operator=(message2);
1953 }
1954 
1955 #if !defined(PROTOBUF_TEST_NO_DESCRIPTORS) || PROTOBUF_RTTI
1956 TEST(GeneratedMapFieldTest, UpcastCopyFrom) {
1957  // Test the CopyFrom method that takes in the generic const Message&
1958  // parameter.
1959  unittest::TestMap message1, message2;
1960 
1961  MapTestUtil::SetMapFields(&message1);
1962 
1963  const Message* source = implicit_cast<const Message*>(&message1);
1964  message2.CopyFrom(*source);
1965 
1967 }
1968 #endif
1969 
1970 #ifndef PROTOBUF_TEST_NO_DESCRIPTORS
1971 
1972 TEST(GeneratedMapFieldTest, CopyFromDynamicMessage) {
1973  // Test copying from a DynamicMessage, which must fall back to using
1974  // reflection.
1975  unittest::TestMap message2;
1976 
1977  // Construct a new version of the dynamic message via the factory.
1978  DynamicMessageFactory factory;
1979  std::unique_ptr<Message> message1;
1980  message1.reset(factory.GetPrototype(unittest::TestMap::descriptor())->New());
1982  reflection_tester.SetMapFieldsViaReflection(message1.get());
1983  reflection_tester.ExpectMapFieldsSetViaReflection(*message1);
1984  reflection_tester.ExpectMapFieldsSetViaReflectionIterator(message1.get());
1985  message2.CopyFrom(*message1);
1987 }
1988 
1989 TEST(GeneratedMapFieldTest, CopyFromDynamicMessageMapReflection) {
1990  unittest::TestMap message2;
1991 
1992  // Construct a new version of the dynamic message via the factory.
1993  DynamicMessageFactory factory;
1994  std::unique_ptr<Message> message1;
1995  message1.reset(factory.GetPrototype(unittest::TestMap::descriptor())->New());
1997  reflection_tester.SetMapFieldsViaMapReflection(message1.get());
1998  reflection_tester.ExpectMapFieldsSetViaReflection(*message1);
1999  reflection_tester.ExpectMapFieldsSetViaReflectionIterator(message1.get());
2000  message2.CopyFrom(*message1);
2002 }
2003 
2004 TEST(GeneratedMapFieldTest, DynamicMessageMergeFromDynamicMessage) {
2005  // Construct two dynamic message and sets via map reflection.
2006  DynamicMessageFactory factory;
2007  std::unique_ptr<Message> message1;
2008  message1.reset(factory.GetPrototype(unittest::TestMap::descriptor())->New());
2010  reflection_tester.SetMapFieldsViaMapReflection(message1.get());
2011 
2012  // message2 is created by same factory.
2013  std::unique_ptr<Message> message2;
2014  message2.reset(factory.GetPrototype(unittest::TestMap::descriptor())->New());
2015  reflection_tester.SetMapFieldsViaMapReflection(message2.get());
2016 
2017  // message3 is created by different factory.
2018  DynamicMessageFactory factory3;
2019  std::unique_ptr<Message> message3;
2020  message3.reset(factory3.GetPrototype(unittest::TestMap::descriptor())->New());
2021  reflection_tester.SetMapFieldsViaMapReflection(message3.get());
2022 
2023  message2->MergeFrom(*message1);
2024  message3->MergeFrom(*message1);
2025 
2026  // Test MergeFrom does not sync to repeated fields and
2027  // there is no duplicate keys in text format.
2028  std::string output1, output2, output3;
2029  TextFormat::PrintToString(*message1, &output1);
2030  TextFormat::PrintToString(*message2, &output2);
2031  TextFormat::PrintToString(*message3, &output3);
2032  EXPECT_EQ(output1, output2);
2033  EXPECT_EQ(output1, output3);
2034 }
2035 
2036 TEST(GeneratedMapFieldTest, DynamicMessageCopyFrom) {
2037  // Test copying to a DynamicMessage, which must fall back to using reflection.
2038  unittest::TestMap message2;
2039  MapTestUtil::SetMapFields(&message2);
2040 
2041  // Construct a new version of the dynamic message via the factory.
2042  DynamicMessageFactory factory;
2043  std::unique_ptr<Message> message1;
2044  message1.reset(factory.GetPrototype(unittest::TestMap::descriptor())->New());
2045 
2047  message1->MergeFrom(message2);
2048  reflection_tester.ExpectMapFieldsSetViaReflection(*message1);
2049  reflection_tester.ExpectMapFieldsSetViaReflectionIterator(message1.get());
2050 }
2051 
2052 TEST(GeneratedMapFieldTest, DynamicMessageCopyFromMapReflection) {
2054  unittest::TestMap message2;
2055  reflection_tester.SetMapFieldsViaMapReflection(&message2);
2056 
2057  // Construct a dynamic message via the factory.
2058  DynamicMessageFactory factory;
2059  std::unique_ptr<Message> message1;
2060  message1.reset(factory.GetPrototype(unittest::TestMap::descriptor())->New());
2061 
2062  message1->MergeFrom(message2);
2063  reflection_tester.ExpectMapFieldsSetViaReflectionIterator(message1.get());
2064  reflection_tester.ExpectMapFieldsSetViaReflection(*message1);
2065 }
2066 
2067 TEST(GeneratedMapFieldTest, SyncDynamicMapWithRepeatedField) {
2068  // Construct a dynamic message via the factory.
2070  DynamicMessageFactory factory;
2071  std::unique_ptr<Message> message;
2073  reflection_tester.SetMapFieldsViaReflection(message.get());
2074  reflection_tester.ExpectMapFieldsSetViaReflectionIterator(message.get());
2075  reflection_tester.ExpectMapFieldsSetViaReflection(*message);
2076 }
2077 
2078 #endif // !PROTOBUF_TEST_NO_DESCRIPTORS
2079 
2080 TEST(GeneratedMapFieldTest, NonEmptyMergeFrom) {
2081  unittest::TestMap message1, message2;
2082 
2083  MapTestUtil::SetMapFields(&message1);
2084 
2085  // This field will test merging into an empty spot.
2086  (*message2.mutable_map_int32_int32())[1] = 1;
2087  message1.mutable_map_int32_int32()->erase(1);
2088 
2089  // This tests overwriting.
2090  (*message2.mutable_map_int32_double())[1] = 1;
2091  (*message1.mutable_map_int32_double())[1] = 2;
2092 
2093  message1.MergeFrom(message2);
2095 
2096  // Test reflection MergeFrom does not sync to repeated field
2097  // and there is no duplicated keys.
2098  MapTestUtil::SetMapFields(&message1);
2099  MapTestUtil::SetMapFields(&message2);
2100 
2101  message2.MergeFrom(message1);
2102 
2103  std::string output1, output2;
2104  TextFormat::PrintToString(message1, &output1);
2105  TextFormat::PrintToString(message2, &output2);
2106  EXPECT_EQ(output1, output2);
2107 }
2108 
2109 TEST(GeneratedMapFieldTest, MergeFromMessageMap) {
2110  unittest::TestMessageMap message1, message2;
2111 
2112  (*message1.mutable_map_int32_message())[0].add_repeated_int32(100);
2113  (*message2.mutable_map_int32_message())[0].add_repeated_int32(101);
2114 
2115  message1.MergeFrom(message2);
2116 
2117  // Checks repeated field is overwritten.
2118  EXPECT_EQ(1, message1.map_int32_message().at(0).repeated_int32_size());
2119  EXPECT_EQ(101, message1.map_int32_message().at(0).repeated_int32(0));
2120 }
2121 
2122 // Test the generated SerializeWithCachedSizesToArray()
2123 TEST(GeneratedMapFieldTest, SerializationToArray) {
2124  unittest::TestMap message1, message2;
2125  std::string data;
2126  MapTestUtil::SetMapFields(&message1);
2127  int size = message1.ByteSize();
2128  data.resize(size);
2129  uint8* start = reinterpret_cast<uint8*>(::google::protobuf::string_as_array(&data));
2130  uint8* end = message1.SerializeWithCachedSizesToArray(start);
2131  EXPECT_EQ(size, end - start);
2132  EXPECT_TRUE(message2.ParseFromString(data));
2134 }
2135 
2136 // Test the generated SerializeWithCachedSizes()
2137 TEST(GeneratedMapFieldTest, SerializationToStream) {
2138  unittest::TestMap message1, message2;
2139  MapTestUtil::SetMapFields(&message1);
2140  int size = message1.ByteSize();
2141  std::string data;
2142  data.resize(size);
2143  {
2144  // Allow the output stream to buffer only one byte at a time.
2146  io::CodedOutputStream output_stream(&array_stream);
2147  message1.SerializeWithCachedSizes(&output_stream);
2148  EXPECT_FALSE(output_stream.HadError());
2149  EXPECT_EQ(size, output_stream.ByteCount());
2150  }
2151  EXPECT_TRUE(message2.ParseFromString(data));
2153 }
2154 
2155 
2156 TEST(GeneratedMapFieldTest, SameTypeMaps) {
2158  ->FindFieldByName("map1")
2159  ->message_type();
2161  ->FindFieldByName("map2")
2162  ->message_type();
2163 
2164  const Message* map1_entry =
2166  const Message* map2_entry =
2168 
2169  EXPECT_EQ(map1, map1_entry->GetDescriptor());
2170  EXPECT_EQ(map2, map2_entry->GetDescriptor());
2171 }
2172 
2173 TEST(GeneratedMapFieldTest, Proto2UnknownEnum) {
2174  unittest::TestEnumMapPlusExtra from;
2175  (*from.mutable_known_map_field())[0] = unittest::E_PROTO2_MAP_ENUM_FOO;
2176  (*from.mutable_unknown_map_field())[0] = unittest::E_PROTO2_MAP_ENUM_EXTRA;
2177  std::string data;
2178  from.SerializeToString(&data);
2179 
2180  unittest::TestEnumMap to;
2181  EXPECT_TRUE(to.ParseFromString(data));
2182  EXPECT_EQ(0, to.unknown_map_field().size());
2183  const UnknownFieldSet& unknown_field_set =
2184  to.GetReflection()->GetUnknownFields(to);
2185  EXPECT_EQ(1, unknown_field_set.field_count());
2186  EXPECT_EQ(1, to.known_map_field().size());
2187  EXPECT_EQ(unittest::PROTO2_MAP_ENUM_FOO, to.known_map_field().at(0));
2188 
2189  data.clear();
2190  from.Clear();
2191  to.SerializeToString(&data);
2192  EXPECT_TRUE(from.ParseFromString(data));
2193  EXPECT_EQ(0, from.GetReflection()->GetUnknownFields(from).field_count());
2194  EXPECT_EQ(1, from.known_map_field().size());
2195  EXPECT_EQ(unittest::E_PROTO2_MAP_ENUM_FOO, from.known_map_field().at(0));
2196  EXPECT_EQ(1, from.unknown_map_field().size());
2197  EXPECT_EQ(unittest::E_PROTO2_MAP_ENUM_EXTRA, from.unknown_map_field().at(0));
2198 }
2199 
2200 TEST(GeneratedMapFieldTest, StandardWireFormat) {
2201  unittest::TestMap message;
2202  std::string data = "\x0A\x04\x08\x01\x10\x01";
2203 
2204  EXPECT_TRUE(message.ParseFromString(data));
2205  EXPECT_EQ(1, message.map_int32_int32().size());
2206  EXPECT_EQ(1, message.map_int32_int32().at(1));
2207 }
2208 
2209 TEST(GeneratedMapFieldTest, UnorderedWireFormat) {
2210  unittest::TestMap message;
2211 
2212  // put value before key in wire format
2213  std::string data = "\x0A\x04\x10\x01\x08\x02";
2214 
2215  EXPECT_TRUE(message.ParseFromString(data));
2216  EXPECT_EQ(1, message.map_int32_int32().size());
2217  ASSERT_NE(message.map_int32_int32().find(2), message.map_int32_int32().end());
2218  EXPECT_EQ(1, message.map_int32_int32().at(2));
2219 }
2220 
2221 TEST(GeneratedMapFieldTest, DuplicatedKeyWireFormat) {
2222  unittest::TestMap message;
2223 
2224  // Two key fields in wire format
2225  std::string data = "\x0A\x06\x08\x01\x08\x02\x10\x01";
2226 
2227  EXPECT_TRUE(message.ParseFromString(data));
2228  EXPECT_EQ(1, message.map_int32_int32().size());
2229  EXPECT_EQ(1, message.map_int32_int32().at(2));
2230 
2231  // A similar test, but with a map from int to a message type.
2232  // Again, we want to be sure that the "second one wins" when
2233  // there are two separate entries with the same key.
2234  const int key = 99;
2235  unittest::TestRequiredMessageMap map_message;
2236  unittest::TestRequired with_dummy4;
2237  with_dummy4.set_a(0);
2238  with_dummy4.set_b(0);
2239  with_dummy4.set_c(0);
2240  with_dummy4.set_dummy4(11);
2241  (*map_message.mutable_map_field())[key] = with_dummy4;
2242  std::string s = map_message.SerializeAsString();
2243  unittest::TestRequired with_dummy5;
2244  with_dummy5.set_a(0);
2245  with_dummy5.set_b(0);
2246  with_dummy5.set_c(0);
2247  with_dummy5.set_dummy5(12);
2248  (*map_message.mutable_map_field())[key] = with_dummy5;
2249  std::string both = s + map_message.SerializeAsString();
2250  // We don't expect a merge now. The "second one wins."
2251  ASSERT_TRUE(map_message.ParseFromString(both));
2252  ASSERT_EQ(1, map_message.map_field().size());
2253  ASSERT_EQ(1, map_message.map_field().count(key));
2254  EXPECT_EQ(0, map_message.map_field().find(key)->second.a());
2255  EXPECT_EQ(0, map_message.map_field().find(key)->second.b());
2256  EXPECT_EQ(0, map_message.map_field().find(key)->second.c());
2257  EXPECT_FALSE(map_message.map_field().find(key)->second.has_dummy4());
2258  ASSERT_TRUE(map_message.map_field().find(key)->second.has_dummy5());
2259  EXPECT_EQ(12, map_message.map_field().find(key)->second.dummy5());
2260 }
2261 
2262 // Exhaustive combinations of keys, values, and junk in any order.
2263 // This re-tests some of the things tested above, but if it fails
2264 // it's more work to determine what went wrong, so it isn't necessarily
2265 // bad that we have the simpler tests too.
2266 TEST(GeneratedMapFieldTest, KeysValuesUnknownsWireFormat) {
2267  unittest::TestMap message;
2268  const int kMaxNumKeysAndValuesAndJunk = 4;
2269  const char kKeyTag = 0x08;
2270  const char kValueTag = 0x10;
2271  const char kJunkTag = 0x20;
2272  for (int items = 0; items <= kMaxNumKeysAndValuesAndJunk; items++) {
2273  std::string data = "\x0A";
2274  // Encode length of what will follow.
2275  data.push_back(items * 2);
2276  static const int kBitsOfIPerItem = 4;
2277  static const int mask = (1 << kBitsOfIPerItem) - 1;
2278  // Each iteration of the following is a test. It uses i as bit vector
2279  // encoding the keys and values to put in the wire format.
2280  for (int i = 0; i < (1 << (items * kBitsOfIPerItem)); i++) {
2281  std::string wire_format = data;
2282  int expected_key = 0;
2283  int expected_value = 0;
2284  for (int k = i, j = 0; j < items; j++, k >>= kBitsOfIPerItem) {
2285  bool is_key = k & 0x1;
2286  bool is_value = !is_key && (k & 0x2);
2287  wire_format.push_back(is_key ? kKeyTag
2288  : is_value ? kValueTag : kJunkTag);
2289  char c = static_cast<char>(k & mask) >> 2; // One char after the tag.
2290  wire_format.push_back(c);
2291  if (is_key) expected_key = static_cast<int>(c);
2292  if (is_value) expected_value = static_cast<int>(c);
2293  bool res = message.ParseFromString(wire_format);
2294  bool expect_success = true;
2295 #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
2296  // Unfortunately the old map parser accepts malformed input, the new
2297  // parser accepts only correct input.
2298  if (j != items - 1) expect_success = false;
2299 #endif
2300  if (expect_success) {
2301  ASSERT_TRUE(res);
2302  ASSERT_EQ(1, message.map_int32_int32().size());
2303  ASSERT_EQ(expected_key, message.map_int32_int32().begin()->first);
2304  ASSERT_EQ(expected_value, message.map_int32_int32().begin()->second);
2305  } else {
2306  ASSERT_FALSE(res);
2307  }
2308  }
2309  }
2310  }
2311 }
2312 
2313 TEST(GeneratedMapFieldTest, DuplicatedValueWireFormat) {
2314  unittest::TestMap message;
2315 
2316  // Two value fields in wire format
2317  std::string data = "\x0A\x06\x08\x01\x10\x01\x10\x02";
2318 
2319  EXPECT_TRUE(message.ParseFromString(data));
2320  EXPECT_EQ(1, message.map_int32_int32().size());
2321  EXPECT_EQ(2, message.map_int32_int32().at(1));
2322 }
2323 
2324 TEST(GeneratedMapFieldTest, MissedKeyWireFormat) {
2325  unittest::TestMap message;
2326 
2327  // No key field in wire format
2328  std::string data = "\x0A\x02\x10\x01";
2329 
2330  EXPECT_TRUE(message.ParseFromString(data));
2331  EXPECT_EQ(1, message.map_int32_int32().size());
2332  ASSERT_NE(message.map_int32_int32().find(0), message.map_int32_int32().end());
2333  EXPECT_EQ(1, message.map_int32_int32().at(0));
2334 }
2335 
2336 TEST(GeneratedMapFieldTest, MissedValueWireFormat) {
2337  unittest::TestMap message;
2338 
2339  // No value field in wire format
2340  std::string data = "\x0A\x02\x08\x01";
2341 
2342  EXPECT_TRUE(message.ParseFromString(data));
2343  EXPECT_EQ(1, message.map_int32_int32().size());
2344  ASSERT_NE(message.map_int32_int32().find(1), message.map_int32_int32().end());
2345  EXPECT_EQ(0, message.map_int32_int32().at(1));
2346 }
2347 
2348 TEST(GeneratedMapFieldTest, MissedValueTextFormat) {
2349  unittest::TestMap message;
2350 
2351  // No value field in text format
2352  std::string text =
2353  "map_int32_foreign_message {\n"
2354  " key: 1234567890\n"
2355  "}";
2356 
2358  EXPECT_EQ(1, message.map_int32_foreign_message().size());
2359  EXPECT_EQ(11, message.ByteSize());
2360 }
2361 
2362 TEST(GeneratedMapFieldTest, UnknownFieldWireFormat) {
2363  unittest::TestMap message;
2364 
2365  // Unknown field in wire format
2366  std::string data = "\x0A\x06\x08\x02\x10\x03\x18\x01";
2367 
2368  EXPECT_TRUE(message.ParseFromString(data));
2369  EXPECT_EQ(1, message.map_int32_int32().size());
2370  EXPECT_EQ(3, message.map_int32_int32().at(2));
2371 }
2372 
2373 TEST(GeneratedMapFieldTest, CorruptedWireFormat) {
2374  unittest::TestMap message;
2375 
2376  // corrupted data in wire format
2377  std::string data = "\x0A\x06\x08\x02\x11\x03";
2378 
2379  EXPECT_FALSE(message.ParseFromString(data));
2380 }
2381 
2382 TEST(GeneratedMapFieldTest, IsInitialized) {
2383  unittest::TestRequiredMessageMap map_message;
2384 
2385  // Add an uninitialized message.
2386  (*map_message.mutable_map_field())[0];
2387  EXPECT_FALSE(map_message.IsInitialized());
2388 
2389  // Initialize uninitialized message
2390  (*map_message.mutable_map_field())[0].set_a(0);
2391  (*map_message.mutable_map_field())[0].set_b(0);
2392  (*map_message.mutable_map_field())[0].set_c(0);
2393  EXPECT_TRUE(map_message.IsInitialized());
2394 }
2395 
2396 TEST(GeneratedMapFieldTest, MessagesMustMerge) {
2397  unittest::TestRequiredMessageMap map_message;
2398  unittest::TestRequired with_dummy4;
2399  with_dummy4.set_a(97);
2400  with_dummy4.set_b(0);
2401  with_dummy4.set_c(0);
2402  with_dummy4.set_dummy4(98);
2403 
2404  EXPECT_TRUE(with_dummy4.IsInitialized());
2405  (*map_message.mutable_map_field())[0] = with_dummy4;
2406  EXPECT_TRUE(map_message.IsInitialized());
2407  std::string s = map_message.SerializeAsString();
2408 
2409  // Modify s so that there are two values in the entry for key 0.
2410  // The first will have no value for c. The second will have no value for a.
2411  // Those are required fields. Also, make some other little changes, to
2412  // ensure we are merging the two values (because they're messages).
2413  ASSERT_EQ(s.size() - 2, s[1]); // encoding of the length of what follows
2414  std::string encoded_val(s.data() + 4, s.data() + s.size());
2415  // In s, change the encoding of c to an encoding of dummy32.
2416  s[s.size() - 3] -= 8;
2417  // Make encoded_val slightly different from what's in s.
2418  encoded_val[encoded_val.size() - 1] += 33; // Encode c = 33.
2419  for (int i = 0; i < encoded_val.size(); i++) {
2420  if (encoded_val[i] == 97) {
2421  // Encode b = 91 instead of a = 97. But this won't matter, because
2422  // we also encode b = 0 right after this. The point is to leave out
2423  // a required field, and make sure the parser doesn't complain, because
2424  // every required field is set after the merge of the two values.
2425  encoded_val[i - 1] += 16;
2426  encoded_val[i] = 91;
2427  } else if (encoded_val[i] == 98) {
2428  // Encode dummy5 = 99 instead of dummy4 = 98.
2429  encoded_val[i - 1] += 8; // The tag for dummy5 is 8 more.
2430  encoded_val[i]++;
2431  break;
2432  }
2433  }
2434 
2435  s += encoded_val; // Add the second message.
2436  s[1] += encoded_val.size(); // Adjust encoded size.
2437 
2438  // Test key then value then value.
2439  int key = 0;
2440  ASSERT_TRUE(map_message.ParseFromString(s));
2441  ASSERT_EQ(1, map_message.map_field().size());
2442  ASSERT_EQ(1, map_message.map_field().count(key));
2443  EXPECT_EQ(97, map_message.map_field().find(key)->second.a());
2444  EXPECT_EQ(0, map_message.map_field().find(key)->second.b());
2445  EXPECT_EQ(33, map_message.map_field().find(key)->second.c());
2446  EXPECT_EQ(98, map_message.map_field().find(key)->second.dummy4());
2447  EXPECT_EQ(99, map_message.map_field().find(key)->second.dummy5());
2448 
2449  // Test key then value then value then key.
2450  s.push_back(s[2]); // Copy the key's tag.
2451  key = 19;
2452  s.push_back(key); // Second key is 19 instead of 0.
2453  s[1] += 2; // Adjust encoded size.
2454  ASSERT_TRUE(map_message.ParseFromString(s));
2455  ASSERT_EQ(1, map_message.map_field().size());
2456  ASSERT_EQ(1, map_message.map_field().count(key));
2457  EXPECT_EQ(97, map_message.map_field().find(key)->second.a());
2458  EXPECT_EQ(0, map_message.map_field().find(key)->second.b());
2459  EXPECT_EQ(33, map_message.map_field().find(key)->second.c());
2460  EXPECT_EQ(98, map_message.map_field().find(key)->second.dummy4());
2461  EXPECT_EQ(99, map_message.map_field().find(key)->second.dummy5());
2462 }
2463 
2464 // Generated Message Reflection Test ================================
2465 
2466 TEST(GeneratedMapFieldReflectionTest, SpaceUsed) {
2467  unittest::TestMap message;
2469  reflection_tester.SetMapFieldsViaReflection(&message);
2470 
2471  EXPECT_LT(0, message.GetReflection()->SpaceUsed(message));
2472 }
2473 
2474 TEST(GeneratedMapFieldReflectionTest, Accessors) {
2475  // Set every field to a unique value then go back and check all those
2476  // values.
2477  unittest::TestMap message;
2479  reflection_tester.SetMapFieldsViaReflection(&message);
2481  reflection_tester.ExpectMapFieldsSetViaReflection(message);
2483 
2484  reflection_tester.ModifyMapFieldsViaReflection(&message);
2486 }
2487 
2488 TEST(GeneratedMapFieldReflectionTest, Swap) {
2489  unittest::TestMap message1;
2490  unittest::TestMap message2;
2491 
2492  MapTestUtil::SetMapFields(&message1);
2493 
2494  const Reflection* reflection = message1.GetReflection();
2495  reflection->Swap(&message1, &message2);
2496 
2497  MapTestUtil::ExpectClear(message1);
2499 }
2500 
2501 TEST(GeneratedMapFieldReflectionTest, SwapWithBothSet) {
2502  unittest::TestMap message1;
2503  unittest::TestMap message2;
2504 
2505  MapTestUtil::SetMapFields(&message1);
2506  MapTestUtil::SetMapFields(&message2);
2507  MapTestUtil::ModifyMapFields(&message2);
2508 
2509  const Reflection* reflection = message1.GetReflection();
2510  reflection->Swap(&message1, &message2);
2511 
2514 }
2515 
2516 TEST(GeneratedMapFieldReflectionTest, SwapFields) {
2517  unittest::TestMap message1;
2518  unittest::TestMap message2;
2519 
2520  MapTestUtil::SetMapFields(&message2);
2521 
2522  std::vector<const FieldDescriptor*> fields;
2523  const Reflection* reflection = message1.GetReflection();
2524  reflection->ListFields(message2, &fields);
2525  reflection->SwapFields(&message1, &message2, fields);
2526 
2528  MapTestUtil::ExpectClear(message2);
2529 }
2530 
2531 TEST(GeneratedMapFieldReflectionTest, ClearField) {
2532  unittest::TestMap message;
2535 
2537  reflection_tester.ClearMapFieldsViaReflection(&message);
2538  reflection_tester.ExpectClearViaReflection(message);
2539  reflection_tester.ExpectClearViaReflectionIterator(&message);
2540 }
2541 
2542 TEST(GeneratedMapFieldReflectionTest, RemoveLast) {
2543  unittest::TestMap message;
2545 
2548  std::vector<const Message*> expected_entries =
2550 
2551  reflection_tester.RemoveLastMapsViaReflection(&message);
2552 
2554  std::vector<const Message*> remained_entries =
2556  EXPECT_TRUE(expected_entries == remained_entries);
2557 }
2558 
2559 TEST(GeneratedMapFieldReflectionTest, ReleaseLast) {
2560  unittest::TestMap message;
2561  const Descriptor* descriptor = message.GetDescriptor();
2562  MapReflectionTester reflection_tester(descriptor);
2563 
2565 
2567 
2568  reflection_tester.ReleaseLastMapsViaReflection(&message);
2569 
2571 
2572  // Now test that we actually release the right message.
2573  message.Clear();
2575 
2577  std::vector<const Message*> expect_last =
2579  std::vector<const Message*> release_last =
2582  EXPECT_TRUE(expect_last == release_last);
2583  for (std::vector<const Message*>::iterator it = release_last.begin();
2584  it != release_last.end(); ++it) {
2585  delete *it;
2586  }
2587 }
2588 
2589 TEST(GeneratedMapFieldReflectionTest, SwapElements) {
2590  unittest::TestMap message;
2592 
2594 
2595  // Get pointers of map entries at their original position
2596  std::vector<const Message*> entries0 = MapTestUtil::GetMapEntries(message, 0);
2597  std::vector<const Message*> entries1 = MapTestUtil::GetMapEntries(message, 1);
2598 
2599  // Swap the first time.
2600  reflection_tester.SwapMapsViaReflection(&message);
2601 
2602  // Get pointer of map entry after swap once.
2603  std::vector<const Message*> entries0_once =
2605  std::vector<const Message*> entries1_once =
2607 
2608  // Test map entries are swapped.
2610  EXPECT_TRUE(entries0 == entries1_once);
2611  EXPECT_TRUE(entries1 == entries0_once);
2612 
2613  // Swap the second time.
2614  reflection_tester.SwapMapsViaReflection(&message);
2615 
2616  // Get pointer of map entry after swap once.
2617  std::vector<const Message*> entries0_twice =
2619  std::vector<const Message*> entries1_twice =
2621 
2622  // Test map entries are swapped back.
2624  EXPECT_TRUE(entries0 == entries0_twice);
2625  EXPECT_TRUE(entries1 == entries1_twice);
2626 }
2627 
2628 TEST(GeneratedMapFieldReflectionTest, MutableUnknownFields) {
2629  unittest::TestMap message;
2632 }
2633 
2634 TEST(GeneratedMapFieldReflectionTest, EmbedProto2Message) {
2635  unittest::TestMessageMap message;
2636 
2637  const FieldDescriptor* map_field =
2638  unittest::TestMessageMap::descriptor()->FindFieldByName(
2639  "map_int32_message");
2640  const FieldDescriptor* value =
2641  map_field->message_type()->FindFieldByName("value");
2642 
2643  Message* entry_message =
2644  message.GetReflection()->AddMessage(&message, map_field);
2645  EXPECT_EQ(
2646  &entry_message->GetReflection()->GetMessage(*entry_message, value),
2647  reinterpret_cast<const Message*>(&TestAllTypes::default_instance()));
2648 
2649  Message* proto2_message =
2650  entry_message->GetReflection()->MutableMessage(entry_message, value);
2652  proto2_message->GetDescriptor());
2653  ASSERT_EQ(1, message.map_int32_message().size());
2654 }
2655 
2656 TEST(GeneratedMapFieldReflectionTest, MergeFromClearMapEntry) {
2657  unittest::TestMap message;
2658  const FieldDescriptor* map_field =
2659  unittest::TestMap::descriptor()->FindFieldByName("map_int32_int32");
2660  const FieldDescriptor* key =
2661  map_field->message_type()->FindFieldByName("key");
2662  const FieldDescriptor* value =
2663  map_field->message_type()->FindFieldByName("value");
2664 
2665  Message* entry_message1 =
2666  message.GetReflection()->AddMessage(&message, map_field);
2667  EXPECT_FALSE(entry_message1->GetReflection()->HasField(*entry_message1, key));
2668  EXPECT_FALSE(
2669  entry_message1->GetReflection()->HasField(*entry_message1, value));
2670 
2671  Message* entry_message2 =
2672  message.GetReflection()->AddMessage(&message, map_field);
2673  EXPECT_FALSE(entry_message2->GetReflection()->HasField(*entry_message2, key));
2674  EXPECT_FALSE(
2675  entry_message2->GetReflection()->HasField(*entry_message2, value));
2676 
2677  entry_message1->MergeFrom(*entry_message2);
2678  EXPECT_FALSE(entry_message1->GetReflection()->HasField(*entry_message1, key));
2679  EXPECT_FALSE(
2680  entry_message1->GetReflection()->HasField(*entry_message1, value));
2681 }
2682 
2683 TEST(GeneratedMapFieldReflectionTest, MapEntryClear) {
2684  unittest::TestMap message;
2687 }
2688 
2689 TEST(GeneratedMapFieldReflectionTest, Proto2MapEntryClear) {
2690  unittest::TestEnumMap message;
2691  const Descriptor* descriptor = message.GetDescriptor();
2692  const FieldDescriptor* field_descriptor =
2693  descriptor->FindFieldByName("known_map_field");
2694  const FieldDescriptor* value_descriptor =
2695  field_descriptor->message_type()->FindFieldByName("value");
2696  Message* sub_message =
2697  message.GetReflection()->AddMessage(&message, field_descriptor);
2698  EXPECT_EQ(0, sub_message->GetReflection()->GetEnumValue(*sub_message,
2699  value_descriptor));
2700 }
2701 
2702 // Map Reflection API Test =========================================
2703 
2704 TEST(GeneratedMapFieldReflectionTest, SetViaMapReflection) {
2705  unittest::TestMap message;
2707  reflection_tester.SetMapFieldsViaMapReflection(&message);
2708  reflection_tester.ExpectMapFieldsSetViaReflection(message);
2710 }
2711 
2712 // Dynamic Message Test =============================================
2713 
2715  protected:
2721 
2724 
2725  virtual void SetUp() {
2726  map_descriptor_ = pool_->FindMessageTypeByName("protobuf_unittest.TestMap");
2728  pool_->FindMessageTypeByName("protobuf_unittest.TestRecursiveMapMessage");
2732  }
2733 };
2734 
2735 TEST_F(MapFieldInDynamicMessageTest, MapIndependentOffsets) {
2736  // Check that all fields have independent offsets by setting each
2737  // one to a unique value then checking that they all still have those
2738  // unique values (i.e. they don't stomp each other).
2739  std::unique_ptr<Message> message(map_prototype_->New());
2740  MapReflectionTester reflection_tester(map_descriptor_);
2741 
2742  reflection_tester.SetMapFieldsViaReflection(message.get());
2743  reflection_tester.ExpectMapFieldsSetViaReflection(*message);
2744 }
2745 
2746 TEST_F(MapFieldInDynamicMessageTest, DynamicMapReflection) {
2747  // Check that map fields work properly.
2748  std::unique_ptr<Message> message(map_prototype_->New());
2749 
2750  // Check set functions.
2751  MapReflectionTester reflection_tester(map_descriptor_);
2752  reflection_tester.SetMapFieldsViaMapReflection(message.get());
2753  reflection_tester.ExpectMapFieldsSetViaReflection(*message);
2754 }
2755 
2757  // Test that SpaceUsed() works properly
2758 
2759  // Since we share the implementation with generated messages, we don't need
2760  // to test very much here. Just make sure it appears to be working.
2761 
2762  std::unique_ptr<Message> message(map_prototype_->New());
2763  MapReflectionTester reflection_tester(map_descriptor_);
2764 
2765  int initial_space_used = message->SpaceUsed();
2766 
2767  reflection_tester.SetMapFieldsViaReflection(message.get());
2768  EXPECT_LT(initial_space_used, message->SpaceUsed());
2769 }
2770 
2772  TestRecursiveMapMessage from;
2773  (*from.mutable_a())[""];
2774  std::string data = from.SerializeAsString();
2775  std::unique_ptr<Message> to(
2776  factory_.GetPrototype(recursive_map_descriptor_)->New());
2777  ASSERT_TRUE(to->ParseFromString(data));
2778 }
2779 
2780 TEST_F(MapFieldInDynamicMessageTest, MapValueReferernceValidAfterSerialize) {
2781  std::unique_ptr<Message> message(map_prototype_->New());
2782  MapReflectionTester reflection_tester(map_descriptor_);
2783  reflection_tester.SetMapFieldsViaMapReflection(message.get());
2784 
2785  // Get value reference before serialization, so that we know the value is from
2786  // map.
2787  MapKey map_key;
2788  MapValueRef map_val;
2789  map_key.SetInt32Value(0);
2790  reflection_tester.GetMapValueViaMapReflection(
2791  message.get(), "map_int32_foreign_message", map_key, &map_val);
2792  Message* submsg = map_val.MutableMessageValue();
2793 
2794  // In previous implementation, calling SerializeToString will cause syncing
2795  // from map to repeated field, which will invalidate the submsg we previously
2796  // got.
2797  std::string data;
2798  message->SerializeToString(&data);
2799 
2800  const Reflection* submsg_reflection = submsg->GetReflection();
2801  const Descriptor* submsg_desc = submsg->GetDescriptor();
2802  const FieldDescriptor* submsg_field = submsg_desc->FindFieldByName("c");
2803  submsg_reflection->SetInt32(submsg, submsg_field, 128);
2804 
2805  message->SerializeToString(&data);
2806  TestMap to;
2807  to.ParseFromString(data);
2808  EXPECT_EQ(128, to.map_int32_foreign_message().at(0).c());
2809 }
2810 
2811 TEST_F(MapFieldInDynamicMessageTest, MapEntryReferernceValidAfterSerialize) {
2812  std::unique_ptr<Message> message(map_prototype_->New());
2813  MapReflectionTester reflection_tester(map_descriptor_);
2814  reflection_tester.SetMapFieldsViaReflection(message.get());
2815 
2816  // Get map entry before serialization, so that we know the it is from
2817  // repeated field.
2818  Message* map_entry = reflection_tester.GetMapEntryViaReflection(
2819  message.get(), "map_int32_foreign_message", 0);
2820  const Reflection* map_entry_reflection = map_entry->GetReflection();
2821  const Descriptor* map_entry_desc = map_entry->GetDescriptor();
2822  const FieldDescriptor* value_field = map_entry_desc->FindFieldByName("value");
2823  Message* submsg =
2824  map_entry_reflection->MutableMessage(map_entry, value_field);
2825 
2826  // In previous implementation, calling SerializeToString will cause syncing
2827  // from repeated field to map, which will invalidate the map_entry we
2828  // previously got.
2829  std::string data;
2830  message->SerializeToString(&data);
2831 
2832  const Reflection* submsg_reflection = submsg->GetReflection();
2833  const Descriptor* submsg_desc = submsg->GetDescriptor();
2834  const FieldDescriptor* submsg_field = submsg_desc->FindFieldByName("c");
2835  submsg_reflection->SetInt32(submsg, submsg_field, 128);
2836 
2837  message->SerializeToString(&data);
2838  TestMap to;
2839  to.ParseFromString(data);
2840  EXPECT_EQ(128, to.map_int32_foreign_message().at(0).c());
2841 }
2842 
2843 // ReflectionOps Test ===============================================
2844 
2845 TEST(ReflectionOpsForMapFieldTest, MapSanityCheck) {
2846  unittest::TestMap message;
2847 
2850 }
2851 
2852 TEST(ReflectionOpsForMapFieldTest, MapCopy) {
2853  unittest::TestMap message, message2;
2854 
2856 
2857  ReflectionOps::Copy(message, &message2);
2858 
2860 
2861  // Copying from self should be a no-op.
2862  ReflectionOps::Copy(message2, &message2);
2864 }
2865 
2866 TEST(ReflectionOpsForMapFieldTest, MergeMap) {
2867  // Note: Copy is implemented in terms of Merge() so technically the Copy
2868  // test already tested most of this.
2869 
2870  unittest::TestMap message, message2;
2871 
2873 
2874  ReflectionOps::Merge(message2, &message);
2875 
2877 }
2878 
2879 TEST(ReflectionOpsForMapFieldTest, ClearMap) {
2880  unittest::TestMap message;
2881 
2883 
2885 
2887 }
2888 
2889 TEST(ReflectionOpsForMapFieldTest, MapDiscardUnknownFields) {
2890  unittest::TestMap message;
2892 
2893  // Set some unknown fields in message.
2894  message.GetReflection()->MutableUnknownFields(&message)->AddVarint(123456,
2895  654321);
2896 
2897  // Discard them.
2900 
2901  EXPECT_EQ(0,
2902  message.GetReflection()->GetUnknownFields(message).field_count());
2903 }
2904 
2905 TEST(ReflectionOpsForMapFieldTest, IsInitialized) {
2906  unittest::TestRequiredMessageMap map_message;
2907 
2908  // Add an uninitialized message.
2909  (*map_message.mutable_map_field())[0];
2911 
2912  // Initialize uninitialized message
2913  (*map_message.mutable_map_field())[0].set_a(0);
2914  (*map_message.mutable_map_field())[0].set_b(0);
2915  (*map_message.mutable_map_field())[0].set_c(0);
2917 }
2918 
2919 // Wire Format Test =================================================
2920 
2921 TEST(WireFormatForMapFieldTest, ParseMap) {
2922  unittest::TestMap source, dest;
2923  std::string data;
2924 
2925  // Serialize using the generated code.
2927  source.SerializeToString(&data);
2928 
2929  // Parse using WireFormat.
2930  io::ArrayInputStream raw_input(data.data(), data.size());
2933 
2934  // Check.
2936 }
2937 
2938 TEST(WireFormatForMapFieldTest, MapByteSize) {
2939  unittest::TestMap message;
2941 
2943  message.Clear();
2944  EXPECT_EQ(0, message.ByteSize());
2946 }
2947 
2948 TEST(WireFormatForMapFieldTest, SerializeMap) {
2949  unittest::TestMap message;
2950  std::string generated_data;
2951  std::string dynamic_data;
2952 
2954 
2955  // Serialize using the generated code.
2956  {
2957  message.ByteSize();
2958  io::StringOutputStream raw_output(&generated_data);
2959  io::CodedOutputStream output(&raw_output);
2960  message.SerializeWithCachedSizes(&output);
2961  ASSERT_FALSE(output.HadError());
2962  }
2963 
2964  // Serialize using WireFormat.
2965  {
2966  io::StringOutputStream raw_output(&dynamic_data);
2967  io::CodedOutputStream output(&raw_output);
2970  ASSERT_FALSE(output.HadError());
2971  }
2972 
2973  // Should be the same.
2974  // Don't use EXPECT_EQ here because we're comparing raw binary data and
2975  // we really don't want it dumped to stdout on failure.
2976  EXPECT_TRUE(dynamic_data == generated_data);
2977 }
2978 
2979 TEST(WireFormatForMapFieldTest, SerializeMapDynamicMessage) {
2980  DynamicMessageFactory factory;
2981  std::unique_ptr<Message> dynamic_message;
2982  dynamic_message.reset(
2985  reflection_tester.SetMapFieldsViaReflection(dynamic_message.get());
2986  reflection_tester.ExpectMapFieldsSetViaReflection(*dynamic_message);
2987 
2988  unittest::TestMap generated_message;
2989  MapTestUtil::SetMapFields(&generated_message);
2990  MapTestUtil::ExpectMapFieldsSet(generated_message);
2991 
2992  std::string generated_data;
2993  std::string dynamic_data;
2994 
2995  // Serialize.
2996  generated_message.SerializeToString(&generated_data);
2997  dynamic_message->SerializeToString(&dynamic_data);
2998 
2999  // Because map serialization doesn't guarantee order, we just compare
3000  // serialized size here. This is enough to tell dynamic message doesn't miss
3001  // anything in serialization.
3002  EXPECT_TRUE(dynamic_data.size() == generated_data.size());
3003 }
3004 
3005 TEST(WireFormatForMapFieldTest, MapParseHelpers) {
3006  std::string data;
3007 
3008  {
3009  // Set up.
3010  protobuf_unittest::TestMap message;
3012  message.SerializeToString(&data);
3013  }
3014 
3015  {
3016  // Test ParseFromString.
3017  protobuf_unittest::TestMap message;
3018  EXPECT_TRUE(message.ParseFromString(data));
3020  }
3021 
3022  {
3023  // Test ParseFromIstream.
3024  protobuf_unittest::TestMap message;
3025  std::stringstream stream(data);
3026  EXPECT_TRUE(message.ParseFromIstream(&stream));
3027  EXPECT_TRUE(stream.eof());
3029  }
3030 
3031  {
3032  // Test ParseFromBoundedZeroCopyStream.
3033  std::string data_with_junk(data);
3034  data_with_junk.append("some junk on the end");
3035  io::ArrayInputStream stream(data_with_junk.data(), data_with_junk.size());
3036  protobuf_unittest::TestMap message;
3037  EXPECT_TRUE(message.ParseFromBoundedZeroCopyStream(&stream, data.size()));
3039  }
3040 
3041  {
3042  // Test that ParseFromBoundedZeroCopyStream fails (but doesn't crash) if
3043  // EOF is reached before the expected number of bytes.
3044  io::ArrayInputStream stream(data.data(), data.size());
3045  protobuf_unittest::TestAllTypes message;
3046  EXPECT_FALSE(
3047  message.ParseFromBoundedZeroCopyStream(&stream, data.size() + 1));
3048  }
3049 }
3050 
3051 // Deterministic Serialization Test ==========================================
3052 
3053 template <typename T>
3055  const T& t) {
3056  const int size = t.ByteSize();
3057  std::string result(size, '\0');
3059  io::CodedOutputStream output_stream(&array_stream);
3060  output_stream.SetSerializationDeterministic(true);
3061  t.SerializePartialToCodedStream(&output_stream);
3062  EXPECT_FALSE(output_stream.HadError());
3063  EXPECT_EQ(size, output_stream.ByteCount());
3064  return result;
3065 }
3066 
3067 template <typename T>
3069  const T& t) {
3070  const int size = t.ByteSize();
3071  std::string result(size, '\0');
3073  io::CodedOutputStream output_stream(&array_stream);
3074  output_stream.SetSerializationDeterministic(true);
3075  t.SerializeToCodedStream(&output_stream);
3076  EXPECT_FALSE(output_stream.HadError());
3077  EXPECT_EQ(size, output_stream.ByteCount());
3078  return result;
3079 }
3080 
3081 template <typename T>
3083  const int size = t.ByteSize();
3084  std::string result(size, '\0');
3086  {
3087  io::CodedOutputStream output_stream(&array_stream);
3088  output_stream.SetSerializationDeterministic(true);
3089  t.SerializeWithCachedSizes(&output_stream);
3090  EXPECT_FALSE(output_stream.HadError());
3091  EXPECT_EQ(size, output_stream.ByteCount());
3092  }
3094  EXPECT_EQ(result,
3096  return result;
3097 }
3098 
3099 // Helper to test the serialization of the first arg against a golden file.
3100 static void TestDeterministicSerialization(const protobuf_unittest::TestMaps& t,
3101  const std::string& filename) {
3102  std::string expected;
3104  TestUtil::GetTestDataPath("net/proto2/internal/testdata/" + filename),
3105  &expected, true));
3106  const std::string actual = DeterministicSerialization(t);
3107  EXPECT_EQ(expected, actual);
3108  protobuf_unittest::TestMaps u;
3109  EXPECT_TRUE(u.ParseFromString(actual));
3111 }
3112 
3113 // Helper for MapSerializationTest. Return a 7-bit ASCII string.
3115  std::string s(n % static_cast<uint64>(9), '\0');
3116  if (s.empty()) {
3117  return StrCat(n);
3118  } else {
3119  while (n != 0) {
3120  s[n % s.size()] = (n >> 10) & 0x7f;
3121  n /= 888;
3122  }
3123  return s;
3124  }
3125 }
3126 
3127 TEST(MapSerializationTest, Deterministic) {
3128  const int kIters = 25;
3129  protobuf_unittest::TestMaps t;
3130  protobuf_unittest::TestIntIntMap inner;
3131  (*inner.mutable_m())[0] = (*inner.mutable_m())[10] =
3132  (*inner.mutable_m())[-200] = 0;
3133  uint64 frog = 9;
3134  const uint64 multiplier = 0xa29cd16f;
3135  for (int i = 0; i < kIters; i++) {
3136  const int32 i32 = static_cast<int32>(frog & 0xffffffff);
3137  const uint32 u32 = static_cast<uint32>(i32) * 91919;
3138  const int64 i64 = static_cast<int64>(frog);
3139  const uint64 u64 = frog * static_cast<uint64>(187321);
3140  const bool b = i32 > 0;
3141  const std::string s = ConstructKey(frog);
3142  (*inner.mutable_m())[i] = i32;
3143  (*t.mutable_m_int32())[i32] = (*t.mutable_m_sint32())[i32] =
3144  (*t.mutable_m_sfixed32())[i32] = inner;
3145  (*t.mutable_m_uint32())[u32] = (*t.mutable_m_fixed32())[u32] = inner;
3146  (*t.mutable_m_int64())[i64] = (*t.mutable_m_sint64())[i64] =
3147  (*t.mutable_m_sfixed64())[i64] = inner;
3148  (*t.mutable_m_uint64())[u64] = (*t.mutable_m_fixed64())[u64] = inner;
3149  (*t.mutable_m_bool())[b] = inner;
3150  (*t.mutable_m_string())[s] = inner;
3151  (*t.mutable_m_string())[s + std::string(1 << (u32 % static_cast<uint32>(9)),
3152  b)] = inner;
3153  inner.mutable_m()->erase(i);
3154  frog = frog * multiplier + i;
3155  frog ^= (frog >> 41);
3156  }
3157  TestDeterministicSerialization(t, "golden_message_maps");
3158 }
3159 
3160 TEST(MapSerializationTest, DeterministicSubmessage) {
3161  protobuf_unittest::TestSubmessageMaps p;
3162  protobuf_unittest::TestMaps t;
3163  const std::string filename = "golden_message_maps";
3164  std::string golden;
3166  TestUtil::GetTestDataPath("net/proto2/internal/testdata/" + filename),
3167  &golden, true));
3168  t.ParseFromString(golden);
3169  *(p.mutable_m()) = t;
3170  std::vector<std::string> v;
3171  // Use multiple attempts to increase the chance of a failure if something is
3172  // buggy. For example, each separate copy of a map might use a different
3173  // randomly-chosen hash function.
3174  const int kAttempts = 10;
3175  for (int i = 0; i < kAttempts; i++) {
3176  protobuf_unittest::TestSubmessageMaps q(p);
3178  }
3179 }
3180 
3181 // Text Format Test =================================================
3182 
3183 TEST(TextFormatMapTest, SerializeAndParse) {
3184  unittest::TestMap source;
3185  unittest::TestMap dest;
3188 
3189  // Test compact ASCII
3190  TextFormat::Printer printer;
3191  printer.PrintToString(source, &output);
3193  EXPECT_TRUE(parser.ParseFromString(output, &dest));
3195 }
3196 
3197 TEST(TextFormatMapTest, DynamicMessage) {
3198  TestMap prototype;
3199  DynamicMessageFactory factory;
3200  std::unique_ptr<Message> message(
3201  factory.GetPrototype(prototype.GetDescriptor())->New());
3202  MapReflectionTester tester(message->GetDescriptor());
3203  tester.SetMapFieldsViaReflection(message.get());
3204 
3205  std::string expected_text;
3207  File::GetContents(TestUtil::GetTestDataPath("net/proto2/internal/"
3208  "testdata/map_test_data.txt"),
3209  &expected_text, true));
3210 
3211  EXPECT_EQ(message->DebugString(), expected_text);
3212 }
3213 
3214 TEST(TextFormatMapTest, Sorted) {
3215  unittest::TestMap message;
3216  MapReflectionTester tester(message.GetDescriptor());
3218 
3219  std::string expected_text;
3221  File::GetContents(TestUtil::GetTestDataPath("net/proto2/internal/"
3222  "testdata/map_test_data.txt"),
3223  &expected_text, true));
3224 
3225  CleanStringLineEndings(&expected_text, false);
3226  EXPECT_EQ(message.DebugString(), expected_text);
3227 
3228  // Test again on the reverse order.
3229  unittest::TestMap message2;
3230  tester.SetMapFieldsViaReflection(&message2);
3231  tester.SwapMapsViaReflection(&message2);
3232  EXPECT_EQ(message2.DebugString(), expected_text);
3233 }
3234 
3235 TEST(TextFormatMapTest, ParseCorruptedString) {
3236  std::string serialized_message;
3239  "net/proto2/internal/testdata/golden_message_maps"),
3240  &serialized_message, true));
3241  protobuf_unittest::TestMaps message;
3242  GOOGLE_CHECK(message.ParseFromString(serialized_message));
3243  TestParseCorruptedString<protobuf_unittest::TestMaps, true>(message);
3244  TestParseCorruptedString<protobuf_unittest::TestMaps, false>(message);
3245 }
3246 
3247 // Previously, serializing to text format will disable iterator from generated
3248 // API. Now, the iterator can be still used even after serializing to text
3249 // format.
3250 TEST(TextFormatMapTest, NoDisableIterator) {
3251  unittest::TestMap source;
3252  (*source.mutable_map_int32_int32())[1] = 1;
3253 
3254  // Get iterator.
3255  Map<int32, int32>::iterator iter = source.mutable_map_int32_int32()->find(1);
3256 
3257  // Serialize message to text format, which will invalidate the previous
3258  // iterator previously.
3260  TextFormat::Printer printer;
3261  printer.PrintToString(source, &output);
3262 
3263  // Modify map via the iterator (invalidated in prvious implementation.).
3264  iter->second = 2;
3265 
3266  // In previous implementation, the new change won't be reflected in text
3267  // format, because the previous iterator has been invalidated.
3268  output.clear();
3269  printer.PrintToString(source, &output);
3270  std::string expected =
3271  "map_int32_int32 {\n"
3272  " key: 1\n"
3273  " value: 2\n"
3274  "}\n";
3275  EXPECT_EQ(output, expected);
3276 }
3277 
3278 // Previously, serializing to text format will disable iterator from reflection
3279 // API.
3280 TEST(TextFormatMapTest, NoDisableReflectionIterator) {
3281  unittest::TestMap source;
3282  (*source.mutable_map_int32_int32())[1] = 1;
3283 
3284  // Get iterator. This will also sync internal repeated field with map inside
3285  // of MapField.
3286  const Reflection* reflection = source.GetReflection();
3287  const FieldDescriptor* field_desc =
3288  source.GetDescriptor()->FindFieldByName("map_int32_int32");
3289  RepeatedPtrField<Message>* map_field =
3290  reflection->MutableRepeatedPtrField<Message>(&source, field_desc);
3291  RepeatedPtrField<Message>::iterator iter = map_field->begin();
3292 
3293  // Serialize message to text format, which will invalidate the prvious
3294  // iterator previously.
3296  TextFormat::Printer printer;
3297  printer.PrintToString(source, &output);
3298 
3299  // Modify map via the iterator (invalidated in prvious implementation.).
3300  const Reflection* map_entry_reflection = iter->GetReflection();
3301  const FieldDescriptor* value_field_desc =
3302  iter->GetDescriptor()->FindFieldByName("value");
3303  map_entry_reflection->SetInt32(&(*iter), value_field_desc, 2);
3304  GOOGLE_LOG(INFO) << iter->DebugString();
3305 
3306  // In previous implementation, the new change won't be reflected in text
3307  // format, because the previous iterator has been invalidated.
3308  output.clear();
3309  printer.PrintToString(source, &output);
3310  std::string expected =
3311  "map_int32_int32 {\n"
3312  " key: 1\n"
3313  " value: 2\n"
3314  "}\n";
3315  EXPECT_EQ(output, expected);
3316 }
3317 
3318 
3319 // arena support =================================================
3320 TEST(ArenaTest, ParsingAndSerializingNoHeapAllocation) {
3321  // Allocate a large initial block to avoid mallocs during hooked test.
3322  std::vector<char> arena_block(128 * 1024);
3324  options.initial_block = &arena_block[0];
3325  options.initial_block_size = arena_block.size();
3326  Arena arena(options);
3327  std::string data;
3328  data.reserve(128 * 1024);
3329 
3330  {
3331  // TODO(teboring): Enable no heap check when ArenaStringPtr is used in map.
3332  // NoHeapChecker no_heap;
3333 
3334  unittest::TestArenaMap* from =
3335  Arena::CreateMessage<unittest::TestArenaMap>(&arena);
3337  from->SerializeToString(&data);
3338 
3339  unittest::TestArenaMap* to =
3340  Arena::CreateMessage<unittest::TestArenaMap>(&arena);
3341  to->ParseFromString(data);
3343  }
3344 }
3345 
3346 // Use text format parsing and serializing to test reflection api.
3347 TEST(ArenaTest, ReflectionInTextFormat) {
3348  Arena arena;
3349  std::string data;
3350 
3351  TextFormat::Printer printer;
3353 
3354  unittest::TestArenaMap* from =
3355  Arena::CreateMessage<unittest::TestArenaMap>(&arena);
3356  unittest::TestArenaMap* to =
3357  Arena::CreateMessage<unittest::TestArenaMap>(&arena);
3358 
3360  printer.PrintToString(*from, &data);
3361 
3362  EXPECT_TRUE(parser.ParseFromString(data, to));
3364 }
3365 
3366 // Make sure the memory allocated for string in map is deallocated.
3367 TEST(ArenaTest, StringMapNoLeak) {
3368  Arena arena;
3369  unittest::TestArenaMap* message =
3370  Arena::CreateMessage<unittest::TestArenaMap>(&arena);
3371  std::string data;
3372  // String with length less than 16 will not be allocated from heap.
3373  int original_capacity = data.capacity();
3374  while (data.capacity() <= original_capacity) {
3375  data.append("a");
3376  }
3377  (*message->mutable_map_string_string())[data] = data;
3378  // We rely on heap checkers to detect memory leak for us.
3380 }
3381 
3382 TEST(ArenaTest, IsInitialized) {
3383  // Allocate a large initial polluted block.
3384  std::vector<char> arena_block(128 * 1024);
3385  std::fill(arena_block.begin(), arena_block.end(), '\xff');
3386 
3388  options.initial_block = &arena_block[0];
3389  options.initial_block_size = arena_block.size();
3390  Arena arena(options);
3391 
3392  unittest::TestArenaMap* message =
3393  Arena::CreateMessage<unittest::TestArenaMap>(&arena);
3394  EXPECT_EQ(0, (*message->mutable_map_int32_int32())[0]);
3395 }
3396 
3397 TEST(MoveTest, MoveConstructorWorks) {
3398  Map<int32, TestAllTypes> original_map;
3399  original_map[42].mutable_optional_nested_message()->set_bb(42);
3400  original_map[43].mutable_optional_nested_message()->set_bb(43);
3401  const auto* nested_msg42_ptr = &original_map[42].optional_nested_message();
3402  const auto* nested_msg43_ptr = &original_map[43].optional_nested_message();
3403 
3404  Map<int32, TestAllTypes> moved_to_map(std::move(original_map));
3405  EXPECT_TRUE(original_map.empty());
3406  EXPECT_EQ(2, moved_to_map.size());
3407  EXPECT_EQ(42, moved_to_map[42].optional_nested_message().bb());
3408  EXPECT_EQ(43, moved_to_map[43].optional_nested_message().bb());
3409  // This test takes advantage of the fact that pointers are swapped, so there
3410  // should be pointer stability.
3411  EXPECT_EQ(nested_msg42_ptr, &moved_to_map[42].optional_nested_message());
3412  EXPECT_EQ(nested_msg43_ptr, &moved_to_map[43].optional_nested_message());
3413 }
3414 
3415 TEST(MoveTest, MoveAssignmentWorks) {
3416  Map<int32, TestAllTypes> original_map;
3417  original_map[42].mutable_optional_nested_message()->set_bb(42);
3418  original_map[43].mutable_optional_nested_message()->set_bb(43);
3419  const auto* nested_msg42_ptr = &original_map[42].optional_nested_message();
3420  const auto* nested_msg43_ptr = &original_map[43].optional_nested_message();
3421 
3422  Map<int32, TestAllTypes> moved_to_map = std::move(original_map);
3423  EXPECT_TRUE(original_map.empty());
3424  EXPECT_EQ(2, moved_to_map.size());
3425  EXPECT_EQ(42, moved_to_map[42].optional_nested_message().bb());
3426  EXPECT_EQ(43, moved_to_map[43].optional_nested_message().bb());
3427  // This test takes advantage of the fact that pointers are swapped, so there
3428  // should be pointer stability.
3429  EXPECT_EQ(nested_msg42_ptr, &moved_to_map[42].optional_nested_message());
3430  EXPECT_EQ(nested_msg43_ptr, &moved_to_map[43].optional_nested_message());
3431 }
3432 
3433 } // namespace internal
3434 } // namespace protobuf
3435 } // namespace google
reflection_ops.h
google::protobuf::MapTestUtil::ExpectMapFieldsSet
static void ExpectMapFieldsSet(const unittest::TestMap &message)
Definition: map_test_util.cc:62
google::protobuf::Reflection::GetString
std::string GetString(const Message &message, const FieldDescriptor *field) const
Definition: generated_message_reflection.cc:1151
GOOGLE_CHECK_EQ
#define GOOGLE_CHECK_EQ(A, B)
Definition: logging.h:156
google::protobuf.internal::ParseMap
bool ParseMap(io::CodedInputStream *input, void *map_field)
Definition: generated_message_table_driven.h:224
ASSERT_FALSE
#define ASSERT_FALSE(condition)
Definition: gtest.h:1998
google::protobuf::MapTestUtil::ModifyMapFields
static void ModifyMapFields(unittest::TestMap *message)
Definition: map_test_util.cc:53
EXPECT_GE
#define EXPECT_GE(val1, val2)
Definition: gtest.h:2058
INFO
const int INFO
Definition: log_severity.h:59
google::protobuf::RepeatedPtrField
Definition: command_line_interface.h:62
google::protobuf::MutableRepeatedFieldRef
Definition: src/google/protobuf/message.h:360
google::protobuf::value
const Descriptor::ReservedRange value
Definition: src/google/protobuf/descriptor.h:1954
google::protobuf::FieldDescriptor
Definition: src/google/protobuf/descriptor.h:515
google::protobuf::Map::at
const T & at(const key_type &key) const
Definition: map.h:1058
google::protobuf::io::CodedOutputStream::SetDefaultSerializationDeterministic
static void SetDefaultSerializationDeterministic()
Definition: coded_stream.h:907
google::protobuf::MapTestUtil::SetArenaMapFields
static void SetArenaMapFields(unittest::TestArenaMap *message)
Definition: map_test_util.cc:44
EXPECT_THAT
#define EXPECT_THAT(value, matcher)
zero_copy_stream_impl.h
google::protobuf::MapTestUtil::ExpectClear
static void ExpectClear(const unittest::TestMap &message)
Definition: map_test_util.cc:58
EXPECT_LE
#define EXPECT_LE(val1, val2)
Definition: gtest.h:2054
google::protobuf.internal::k2
static int k2
Definition: src/google/protobuf/map_test.cc:327
arena_test_util.h
ASSERT_NE
#define ASSERT_NE(val1, val2)
Definition: gtest.h:2086
end
GLuint GLuint end
Definition: glcorearb.h:2858
stream
GLuint GLuint stream
Definition: glcorearb.h:3946
NULL
NULL
Definition: test_security_zap.cpp:405
google::protobuf::int64
int64_t int64
Definition: protobuf/src/google/protobuf/stubs/port.h:151
map_field_inl.h
google::protobuf.internal::k0
static int k0
Definition: src/google/protobuf/map_test.cc:325
google::protobuf::StrCat
string StrCat(const AlphaNum &a, const AlphaNum &b)
Definition: strutil.cc:1480
GOOGLE_DCHECK_GE
#define GOOGLE_DCHECK_GE
Definition: logging.h:201
google::protobuf::Map::find
const_iterator find(const key_type &key) const
Definition: map.h:1075
options
Message * options
Definition: src/google/protobuf/descriptor.cc:3119
input
std::string input
Definition: tokenizer_unittest.cc:197
google::protobuf::uint8
uint8_t uint8
Definition: protobuf/src/google/protobuf/stubs/port.h:153
google::protobuf::io::CodedOutputStream::HadError
bool HadError() const
Definition: coded_stream.h:829
gtest.h
google::protobuf::MapKey::SetStringValue
void SetStringValue(const std::string &val)
Definition: map_field.h:415
s
XmlRpcServer s
google::protobuf::TextFormat::Parser
Definition: text_format.h:509
tokenizer.h
google::protobuf::Message::GetReflection
const Reflection * GetReflection() const
Definition: src/google/protobuf/message.h:335
google::protobuf::python::cmessage::CopyFrom
static PyObject * CopyFrom(CMessage *self, PyObject *arg)
Definition: python/google/protobuf/pyext/message.cc:1861
google::protobuf::TextFormat::Printer::PrintToString
bool PrintToString(const Message &message, std::string *output) const
Definition: text_format.cc:1859
message_differencer.h
google::protobuf::python::descriptor::Iter
static PyObject * Iter(PyContainer *self)
Definition: descriptor_containers.cc:534
google::protobuf.internal::IsForwardIteratorHelper
bool IsForwardIteratorHelper(std::forward_iterator_tag)
Definition: src/google/protobuf/map_test.cc:623
google::protobuf::MapKey::GetInt32Value
int32 GetInt32Value() const
Definition: map_field.h:428
google::protobuf.internal::WireFormat::ByteSize
static size_t ByteSize(const Message &message)
Definition: wire_format.cc:1078
EXPECT_EQ
#define EXPECT_EQ(val1, val2)
Definition: glog/src/googletest.h:155
google::protobuf.internal::MapFieldInDynamicMessageTest::factory_
DynamicMessageFactory factory_
Definition: src/google/protobuf/map_test.cc:2717
google::protobuf.internal::TestValidityForAllKeysExcept
static void TestValidityForAllKeysExcept(int key_to_avoid, const T &check_map, const U &map)
Definition: src/google/protobuf/map_test.cc:432
google::protobuf::uint32
uint32_t uint32
Definition: protobuf/src/google/protobuf/stubs/port.h:155
google::protobuf::Reflection::GetRepeatedFieldRef
RepeatedFieldRef< T > GetRepeatedFieldRef(const Message &message, const FieldDescriptor *field) const
Definition: reflection.h:55
google::protobuf::Message::CopyFrom
virtual void CopyFrom(const Message &from)
Definition: src/google/protobuf/message.cc:98
google::protobuf::MessageFactory::generated_factory
static MessageFactory * generated_factory()
Definition: src/google/protobuf/message.cc:655
google::protobuf::RepeatedPtrField::Get
const Element & Get(int index) const
Definition: repeated_field.h:2014
google::protobuf::util::TimeUtil::GetCurrentTime
static Timestamp GetCurrentTime()
Definition: time_util.cc:170
desc
#define desc
Definition: extension_set.h:342
google::protobuf::MessageFactory::GetPrototype
virtual const Message * GetPrototype(const Descriptor *type)=0
google::protobuf::Reflection::SetDouble
void SetDouble(Message *message, const FieldDescriptor *field, double value) const
dynamic_message.h
string
GLsizei const GLchar *const * string
Definition: glcorearb.h:3083
google::protobuf::io::CodedOutputStream::SetSerializationDeterministic
void SetSerializationDeterministic(bool value)
Definition: coded_stream.h:855
google::protobuf::MapTestUtil::SetMapFieldsInitialized
static void SetMapFieldsInitialized(unittest::TestMap *message)
Definition: map_test_util.cc:49
google::protobuf::Reflection::SetString
void SetString(Message *message, const FieldDescriptor *field, const std::string &value) const
Definition: generated_message_reflection.cc:1193
google::protobuf::MapReflectionTester::GetMapEntryViaReflection
Message * GetMapEntryViaReflection(Message *message, const std::string &field_name, int index)
Definition: map_test_util.cc:740
descriptor_database.h
google::protobuf.internal::MapImplTest::map_ptr_
std::unique_ptr< Map< int32, int32 > > map_ptr_
Definition: src/google/protobuf/map_test.cc:174
google::protobuf::Reflection::Swap
void Swap(Message *message1, Message *message2) const
Definition: generated_message_reflection.cc:600
gmock.h
google::protobuf::Map::swap
void swap(Map &other)
Definition: map.h:1154
google::protobuf.internal::MapTestForceDeterministic
void MapTestForceDeterministic()
Definition: src/google/protobuf/map_test.cc:93
google::protobuf::Reflection
Definition: src/google/protobuf/message.h:400
descriptor
Descriptor * descriptor
Definition: php/ext/google/protobuf/protobuf.h:936
google::protobuf::MapTestUtil::SetMapFields
static void SetMapFields(unittest::TestMap *message)
Definition: map_test_util.cc:39
google::protobuf::MapReflectionTester::SetMapFieldsViaReflection
void SetMapFieldsViaReflection(Message *message)
Definition: map_test_util.cc:348
map
zval * map
Definition: php/ext/google/protobuf/encode_decode.c:473
google::protobuf::Reflection::HasField
bool HasField(const Message &message, const FieldDescriptor *field) const
Definition: generated_message_reflection.cc:728
google::protobuf.internal::Func
static int Func(int i, int j)
Definition: src/google/protobuf/map_test.cc:981
T
#define T(upbtypeconst, upbtype, ctype, default_value)
google::protobuf::Reflection::MapSize
int MapSize(const Message &message, const FieldDescriptor *field) const
Definition: generated_message_reflection.cc:1803
google::protobuf::MapTestUtil::GetMapEntries
static std::vector< const Message * > GetMapEntries(const unittest::TestMap &message, int index)
Definition: map_test_util.cc:136
google::protobuf::Map::equal_range
std::pair< const_iterator, const_iterator > equal_range(const key_type &key) const
Definition: map.h:1080
testing::Test
Definition: gtest.h:415
google::protobuf::MapReflectionTester::SwapMapsViaReflection
void SwapMapsViaReflection(Message *message)
Definition: map_test_util.cc:904
google::protobuf.internal::TestDeterministicSerialization
static void TestDeterministicSerialization(const protobuf_unittest::TestMaps &t, const std::string &filename)
Definition: src/google/protobuf/map_test.cc:3100
google::protobuf::MapReflectionTester::ExpectMapFieldsSetViaReflection
void ExpectMapFieldsSetViaReflection(const Message &message)
Definition: map_test_util.cc:973
google::protobuf.internal::Now
static int64 Now()
Definition: src/google/protobuf/map_test.cc:319
google::protobuf.internal::MapImplTest::const_map_
const Map< int32, int32 > & const_map_
Definition: src/google/protobuf/map_test.cc:176
google::protobuf::UnknownFieldSet::field_count
int field_count() const
Definition: unknown_field_set.h:311
test_util2.h
GOOGLE_CHECK_GT
#define GOOGLE_CHECK_GT(A, B)
Definition: logging.h:160
ASSERT_EQ
#define ASSERT_EQ(val1, val2)
Definition: gtest.h:2082
google::protobuf::Map::count
size_type count(const key_type &key) const
Definition: map.h:1070
b
GLboolean GLboolean GLboolean b
Definition: glcorearb.h:3228
google::protobuf.internal::ReflectionOps::Merge
static void Merge(const Message &from, Message *to)
Definition: reflection_ops.cc:72
google::protobuf::Descriptor::field
const FieldDescriptor * field(int index) const
google::protobuf::MapReflectionTester::RemoveLastMapsViaReflection
void RemoveLastMapsViaReflection(Message *message)
Definition: map_test_util.cc:875
google::protobuf::io::CodedOutputStream::ByteCount
int ByteCount() const
Definition: coded_stream.h:1291
range
GLenum GLint * range
Definition: glcorearb.h:3963
google::protobuf::MapReflectionTester::MutableUnknownFieldsOfMapFieldsViaReflection
void MutableUnknownFieldsOfMapFieldsViaReflection(Message *message)
Definition: map_test_util.cc:915
google::protobuf::int32
int32_t int32
Definition: protobuf/src/google/protobuf/stubs/port.h:150
i32
UNITY_INT32 i32
Definition: unity.c:1225
google::protobuf::MapReflectionTester::ExpectMapFieldsSetViaReflectionIterator
void ExpectMapFieldsSetViaReflectionIterator(Message *message)
Definition: map_test_util.cc:1313
google::protobuf::MapTestUtil::ExpectMapFieldsModified
static void ExpectMapFieldsModified(const unittest::TestMap &message)
Definition: map_test_util.cc:81
google::protobuf::MapReflectionTester::ModifyMapFieldsViaReflection
void ModifyMapFieldsViaReflection(Message *message)
Definition: map_test_util.cc:780
google::protobuf::Reflection::SwapFields
void SwapFields(Message *message1, Message *message2, const std::vector< const FieldDescriptor * > &fields) const
Definition: generated_message_reflection.cc:673
google::protobuf.internal::TestOldVersusNewIterator
static void TestOldVersusNewIterator(int skip, Map< int, int > *m)
Definition: src/google/protobuf/map_test.cc:461
google::protobuf.internal::StressTestIterators
static void StressTestIterators(int n)
Definition: src/google/protobuf/map_test.cc:495
google::protobuf::MapReflectionTester::MapBegin
MapIterator MapBegin(Message *message, const std::string &field_name)
Definition: map_test_util.cc:746
google::protobuf::File::GetContents
static bool GetContents(const string &name, string *output, bool)
Definition: file.h:83
mask
GLint GLuint mask
Definition: glcorearb.h:2789
google::protobuf.internal::MapFieldInDynamicMessageTest::SetUp
virtual void SetUp()
Definition: src/google/protobuf/map_test.cc:2725
coded_stream.h
google::protobuf::TestUtil::GetTestDataPath
std::string GetTestDataPath(const std::string &google3_path)
Definition: test_util2.h:66
generated_pool
InternalDescriptorPool * generated_pool
Definition: def.c:582
google::protobuf::Map::contains
bool contains(const Key &key) const
Definition: map.h:1079
google::protobuf::Reflection::GetMutableRepeatedFieldRef
MutableRepeatedFieldRef< T > GetMutableRepeatedFieldRef(Message *message, const FieldDescriptor *field) const
Definition: reflection.h:61
google::protobuf.internal::MapFieldInDynamicMessageTest::recursive_map_descriptor_
const Descriptor * recursive_map_descriptor_
Definition: src/google/protobuf/map_test.cc:2719
google::protobuf.internal::MapFieldInDynamicMessageTest::map_prototype_
const Message * map_prototype_
Definition: src/google/protobuf/map_test.cc:2720
start
GLuint start
Definition: glcorearb.h:2858
google::protobuf.internal::ConstructKey
static std::string ConstructKey(uint64 n)
Definition: src/google/protobuf/map_test.cc:3114
google::protobuf.internal::ReflectionOps::DiscardUnknownFields
static void DiscardUnknownFields(Message *message)
Definition: reflection_ops.cc:238
google::protobuf::TextFormat::ParseFromString
static bool ParseFromString(const std::string &input, Message *output)
Definition: text_format.cc:1496
google::protobuf::MapReflectionTester::SetMapFieldsViaMapReflection
void SetMapFieldsViaMapReflection(Message *message)
Definition: map_test_util.cc:544
update_failure_list.str
str
Definition: update_failure_list.py:41
google::protobuf::TextFormat::Printer
Definition: text_format.h:234
google::protobuf::util::MessageDifferencer::Equals
static bool Equals(const Message &message1, const Message &message2)
Definition: message_differencer.cc:231
google::protobuf::DescriptorPool
Definition: src/google/protobuf/descriptor.h:1539
message.h
p
const char * p
Definition: gmock-matchers_test.cc:3863
google::protobuf::Reflection::SetInt32
void SetInt32(Message *message, const FieldDescriptor *field, int32 value) const
google::protobuf::io::ArrayOutputStream
Definition: zero_copy_stream_impl_lite.h:99
google::protobuf.internal::median
static int64 median(Iterator i0, Iterator i1)
Definition: src/google/protobuf/map_test.cc:313
google::protobuf::MapReflectionTester::ReleaseLastMapsViaReflection
void ReleaseLastMapsViaReflection(Message *message)
Definition: map_test_util.cc:887
GOOGLE_LOG
#define GOOGLE_LOG(LEVEL)
Definition: logging.h:146
google::protobuf::Map::empty
bool empty() const
Definition: map.h:1046
google::protobuf.internal::Int
static int Int(const std::string &value)
Definition: src/google/protobuf/map_test.cc:989
google::protobuf::io::ArrayInputStream
Definition: zero_copy_stream_impl_lite.h:65
google::protobuf::uint64
uint64_t uint64
Definition: protobuf/src/google/protobuf/stubs/port.h:156
google::protobuf.internal::RepeatedPtrIterator
Definition: repeated_field.h:369
google::protobuf::WARNING
static const LogLevel WARNING
Definition: protobuf/src/google/protobuf/testing/googletest.h:71
google::protobuf.internal::CopyConstructorHelper
static void CopyConstructorHelper(Arena *arena, Map< int32, int32 > *m)
Definition: src/google/protobuf/map_test.cc:805
google::protobuf.internal::TestEqualIterators
static void TestEqualIterators(Iter i0, Iter i1, Iter end)
Definition: src/google/protobuf/map_test.cc:449
text_format.h
add_person.raw_input
raw_input
Definition: add_person.py:11
google::protobuf::Reflection::GetRepeatedPtrField
const RepeatedPtrField< T > & GetRepeatedPtrField(const Message &, const FieldDescriptor *) const
EXPECT_TRUE
#define EXPECT_TRUE(cond)
Definition: glog/src/googletest.h:137
google::protobuf::string_as_array
char * string_as_array(string *str)
Definition: stl_util.h:83
google::protobuf.internal::MapFieldInDynamicMessageTest::map_descriptor_
const Descriptor * map_descriptor_
Definition: src/google/protobuf/map_test.cc:2718
google::protobuf.internal::MapImplTest::ExpectElement
void ExpectElement(int32 key, int32 value)
Definition: src/google/protobuf/map_test.cc:124
ASSERT_TRUE
#define ASSERT_TRUE(condition)
Definition: gtest.h:1995
source
GLsizei GLsizei GLchar * source
Definition: glcorearb.h:3072
google::protobuf::MapTestUtil::ExpectArenaMapFieldsSet
static void ExpectArenaMapFieldsSet(const unittest::TestArenaMap &message)
Definition: map_test_util.cc:67
google::protobuf::DynamicMessage
Definition: dynamic_message.cc:232
map_test_util.h
casts.h
field
const FieldDescriptor * field
Definition: parser_unittest.cc:2694
google::protobuf::Reflection::FieldSize
int FieldSize(const Message &message, const FieldDescriptor *field) const
Definition: generated_message_reflection.cc:744
map.h
key
const SETUP_TEARDOWN_TESTCONTEXT char * key
Definition: test_wss_transport.cpp:10
google::protobuf::Reflection::GetInt32
int32 GetInt32(const Message &message, const FieldDescriptor *field) const
google::protobuf::Reflection::MutableMessage
Message * MutableMessage(Message *message, const FieldDescriptor *field, MessageFactory *factory=nullptr) const
Definition: generated_message_reflection.cc:1462
GOOGLE_CHECK
#define GOOGLE_CHECK(EXPRESSION)
Definition: logging.h:153
google::protobuf.internal.python_message.ClearField
ClearField
Definition: python_message.py:902
google::protobuf.internal::WireFormat::SerializeWithCachedSizes
static void SerializeWithCachedSizes(const Message &message, int size, io::CodedOutputStream *output)
Definition: wire_format.cc:711
n
GLdouble n
Definition: glcorearb.h:4153
google::protobuf.internal::MapImplTest::map_
Map< int32, int32 > & map_
Definition: src/google/protobuf/map_test.cc:175
google::protobuf::io::CodedOutputStream
Definition: coded_stream.h:693
google::protobuf::MapTestUtil::ExpectMapsSize
static void ExpectMapsSize(const unittest::TestMap &message, int size)
Definition: map_test_util.cc:87
i
int i
Definition: gmock-matchers_test.cc:764
google::protobuf::DynamicMessageFactory
Definition: dynamic_message.h:80
google::protobuf.internal::MapFieldReflectionTest::FD
FieldDescriptor FD
Definition: src/google/protobuf/map_test.cc:997
google::protobuf::MapKey::SetInt32Value
void SetInt32Value(int32 value)
Definition: map_field.h:403
fields
static const upb_fielddef fields[107]
Definition: ruby/ext/google/protobuf_c/upb.c:7671
google::protobuf::ArenaOptions
Definition: arena.h:115
google::protobuf::MapReflectionTester::GetMapValueViaMapReflection
void GetMapValueViaMapReflection(Message *message, const std::string &field_name, const MapKey &map_key, MapValueRef *map_val)
Definition: map_test_util.cc:732
google::protobuf::Message
Definition: src/google/protobuf/message.h:205
google::protobuf::Message::GetDescriptor
const Descriptor * GetDescriptor() const
Definition: src/google/protobuf/message.h:326
google::protobuf.internal::DeterministicSerializationWithSerializeToCodedStream
static std::string DeterministicSerializationWithSerializeToCodedStream(const T &t)
Definition: src/google/protobuf/map_test.cc:3068
google::protobuf::io::StringOutputStream
Definition: zero_copy_stream_impl_lite.h:131
google::protobuf.internal::k1
static int k1
Definition: src/google/protobuf/map_test.cc:326
google::protobuf.internal::MapFieldInDynamicMessageTest
Definition: src/google/protobuf/map_test.cc:2714
v
const GLdouble * v
Definition: glcorearb.h:3106
google::protobuf::MapReflectionTester::ExpectClearViaReflection
void ExpectClearViaReflection(const Message &message)
Definition: map_test_util.cc:1540
google::protobuf.internal.python_message.Clear
Clear
Definition: python_message.py:1431
common.h
google::protobuf::MapIterator::GetKey
const MapKey & GetKey()
Definition: map_field.h:749
google::protobuf::Descriptor::FindFieldByName
const FieldDescriptor * FindFieldByName(const std::string &name) const
Definition: src/google/protobuf/descriptor.cc:1615
google::protobuf.internal::StrFunc
static std::string StrFunc(int i, int j)
Definition: src/google/protobuf/map_test.cc:983
EXPECT_LT
#define EXPECT_LT(val1, val2)
Definition: glog/src/googletest.h:158
value_type
zend_class_entry * value_type
Definition: php/ext/google/protobuf/message.c:2546
google::protobuf.internal::MapFieldInDynamicMessageTest::MapFieldInDynamicMessageTest
MapFieldInDynamicMessageTest()
Definition: src/google/protobuf/map_test.cc:2722
time_util.h
google::protobuf.internal::DeterministicSerializationWithSerializePartialToCodedStream
static std::string DeterministicSerializationWithSerializePartialToCodedStream(const T &t)
Definition: src/google/protobuf/map_test.cc:3054
benchmarks.python.py_benchmark.dest
dest
Definition: py_benchmark.py:13
google::protobuf::TextFormat::PrintToString
static bool PrintToString(const Message &message, std::string *output)
Definition: text_format.cc:2398
size
GLsizeiptr size
Definition: glcorearb.h:2943
google::protobuf::MapKey
Definition: map_field.h:371
GOOGLE_CHECK_OK
#define GOOGLE_CHECK_OK(A)
Definition: logging.h:155
google::protobuf.internal::MapFieldInDynamicMessageTest::pool_
const DescriptorPool * pool_
Definition: src/google/protobuf/map_test.cc:2716
google::protobuf.internal::TEST_F
TEST_F(MapFieldBasePrimitiveTest, SpaceUsedExcludingSelf)
Definition: map_field_test.cc:132
googletest.h
EXPECT_FALSE
#define EXPECT_FALSE(cond)
Definition: glog/src/googletest.h:145
google::protobuf.internal::MapImplTest::MapImplTest
MapImplTest()
Definition: src/google/protobuf/map_test.cc:101
google::protobuf::UnknownFieldSet
Definition: unknown_field_set.h:86
google::protobuf::MapKey::GetStringValue
const std::string & GetStringValue() const
Definition: map_field.h:440
google::protobuf::io::CodedInputStream
Definition: coded_stream.h:173
stringprintf.h
wire_format.h
m
const upb_json_parsermethod * m
Definition: ruby/ext/google/protobuf_c/upb.h:10501
logging.h
google::protobuf::Message::MergeFrom
virtual void MergeFrom(const Message &from)
Definition: src/google/protobuf/message.cc:82
google::protobuf.internal::MapImplTest::ExpectElements
void ExpectElements(const std::map< int32, int32 > &map)
Definition: src/google/protobuf/map_test.cc:115
google::protobuf::MapReflectionTester
Definition: map_test_util.h:88
google::protobuf::CleanStringLineEndings
void CleanStringLineEndings(const string &src, string *dst, bool auto_end_last_line)
Definition: strutil.cc:2341
google::protobuf.internal::WireFormat::ParseAndMergePartial
static bool ParseAndMergePartial(io::CodedInputStream *input, Message *message)
Definition: wire_format.cc:384
google::protobuf::Descriptor
Definition: src/google/protobuf/descriptor.h:231
descriptor.h
google::protobuf::MapTestUtil::ExpectMapFieldsSetInitialized
static void ExpectMapFieldsSetInitialized(const unittest::TestMap &message)
Definition: map_test_util.cc:74
default_value
def default_value(type_)
google::protobuf::Map::size
size_type size() const
Definition: map.h:1045
google::protobuf.internal::TEST
TEST(GeneratedMapFieldTest, Accessors)
Definition: src/google/protobuf/map_test.cc:1837
google::protobuf::SStringPrintf
const string & SStringPrintf(string *dst, const char *format,...)
Definition: stringprintf.cc:118
google::protobuf::Message::New
Message * New() const override=0
first
GLint first
Definition: glcorearb.h:2830
google::protobuf::Map::end
iterator end()
Definition: map.h:1034
google::protobuf.internal.python_message.IsInitialized
IsInitialized
Definition: python_message.py:1246
google::protobuf::Reflection::GetEnumValue
int GetEnumValue(const Message &message, const FieldDescriptor *field) const
Definition: generated_message_reflection.cc:1301
google::protobuf.internal::ReflectionOps::Copy
static void Copy(const Message &from, Message *to)
Definition: reflection_ops.cc:66
google::protobuf::FieldDescriptor::message_type
const Descriptor * message_type() const
Definition: src/google/protobuf/descriptor.cc:7228
substitute.h
test_size
void test_size()
Definition: unittest_radix_tree.cpp:180
data
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: glcorearb.h:2879
reflection.h
google::protobuf::Map
Definition: map.h:62
file.h
internal
Definition: any.pb.h:40
google::protobuf::MapReflectionTester::MapEnd
MapIterator MapEnd(Message *message, const std::string &field_name)
Definition: map_test_util.cc:752
google::protobuf::Reflection::AddAllocatedMessage
void AddAllocatedMessage(Message *message, const FieldDescriptor *field, Message *new_entry) const
Definition: generated_message_reflection.cc:1679
value
GLsizei const GLfloat * value
Definition: glcorearb.h:3093
google::protobuf.internal::ReflectionOps::IsInitialized
static bool IsInitialized(const Message &message)
Definition: reflection_ops.cc:177
descriptor.pb.h
google::protobuf::Reflection::AddMessage
Message * AddMessage(Message *message, const FieldDescriptor *field, MessageFactory *factory=nullptr) const
Definition: generated_message_reflection.cc:1638
output
const upb_json_parsermethod const upb_symtab upb_sink * output
Definition: ruby/ext/google/protobuf_c/upb.h:10503
google::protobuf.internal::IsConstHelper
bool IsConstHelper(T &)
Definition: src/google/protobuf/map_test.cc:608
benchmarks.python.py_benchmark.parser
parser
Definition: py_benchmark.py:10
google::protobuf::MapIterator
Definition: map_field.h:712
google::protobuf.internal::MapFieldReflectionTest
Definition: src/google/protobuf/map_test.cc:995
count
GLint GLsizei count
Definition: glcorearb.h:2830
google::protobuf.internal::MapImplTest
Definition: src/google/protobuf/map_test.cc:99
google::protobuf::MapTestUtil::GetMapEntriesFromRelease
static std::vector< const Message * > GetMapEntriesFromRelease(unittest::TestMap *message)
Definition: map_test_util.cc:180
test_util.h
index
GLuint index
Definition: glcorearb.h:3055
a
GLboolean GLboolean GLboolean GLboolean a
Definition: glcorearb.h:3228
google::protobuf::Reflection::ListFields
void ListFields(const Message &message, std::vector< const FieldDescriptor * > *output) const
Definition: generated_message_reflection.cc:1029
skip
static int32_t skip(upb_pbdecoder *d, size_t bytes)
Definition: php/ext/google/protobuf/upb.c:6915
google::protobuf::RepeatedPtrField::begin
iterator begin()
Definition: repeated_field.h:2444
google::protobuf.internal::MapImplTest::ExpectSingleElement
void ExpectSingleElement(int32 key, int32 value)
Definition: src/google/protobuf/map_test.cc:109
it
MapIter it
Definition: php/ext/google/protobuf/map.c:205
google
Definition: data_proto2_to_proto3_util.h:11
message
GLenum GLuint GLenum GLsizei const GLchar * message
Definition: glcorearb.h:2695
google::protobuf::MapReflectionTester::ExpectClearViaReflectionIterator
void ExpectClearViaReflectionIterator(Message *message)
Definition: map_test_util.cc:1564
google::protobuf::RepeatedFieldRef
Definition: src/google/protobuf/message.h:357
google::protobuf::DynamicMessageFactory::GetPrototype
const Message * GetPrototype(const Descriptor *type) override
Definition: dynamic_message.cc:653
google::protobuf.internal::ReflectionOps::Clear
static void Clear(Message *message)
Definition: reflection_ops.cc:165
google::protobuf::MapValueRef::MutableMessageValue
Message * MutableMessageValue()
Definition: map_field.h:650
google::protobuf::MapReflectionTester::ClearMapFieldsViaReflection
void ClearMapFieldsViaReflection(Message *message)
Definition: map_test_util.cc:758
google::protobuf.internal::MapFieldReflectionTest::MapSize
int MapSize(const Reflection *reflection, const FieldDescriptor *field, const Message &message)
Definition: src/google/protobuf/map_test.cc:999
google::protobuf::Reflection::GetMessage
const Message & GetMessage(const Message &message, const FieldDescriptor *field, MessageFactory *factory=nullptr) const
Definition: generated_message_reflection.cc:1443
google::protobuf::MapValueRef
Definition: map_field.h:565
google::protobuf::util::TimeUtil::TimestampToNanoseconds
static int64 TimestampToNanoseconds(const Timestamp &timestamp)
Definition: time_util.cc:317
google::protobuf::Reflection::MutableRepeatedPtrField
RepeatedPtrField< T > * MutableRepeatedPtrField(Message *, const FieldDescriptor *) const
google::protobuf.internal::DeterministicSerialization
static std::string DeterministicSerialization(const T &t)
Definition: src/google/protobuf/map_test.cc:3082
google::protobuf::DescriptorPool::FindMessageTypeByName
const Descriptor * FindMessageTypeByName(const std::string &name) const
Definition: src/google/protobuf/descriptor.cc:1430
google::protobuf::Reflection::GetDouble
double GetDouble(const Message &message, const FieldDescriptor *field) const


libaditof
Author(s):
autogenerated on Wed May 21 2025 02:06:56