34 #define _WINSOCKAPI_ // to avoid re-definition in WinSock2.h
35 #define NOMINMAX // to avoid defining min/max macros
44 #include <unordered_map>
52 #include <google/protobuf/map_proto2_unittest.pb.h>
54 #include <google/protobuf/map_unittest.pb.h>
57 #include <google/protobuf/unittest.pb.h>
81 #include <google/protobuf/port_def.inc>
86 using unittest::ForeignMessage;
87 using unittest::TestAllTypes;
88 using unittest::TestMap;
89 using unittest::TestRecursiveMapMessage;
118 for (std::map<int32, int32>::const_iterator
it =
map.begin();
141 ((*it).second) =
value + 1;
143 ((*it).second) =
value;
187 ExpectSingleElement(
key, value1);
190 ExpectSingleElement(
key, value2);
207 ExpectSingleElement(
key, value1);
209 map_.at(
key) = value2;
210 ExpectSingleElement(
key, value2);
213 #ifdef PROTOBUF_HAS_DEATH_TEST
215 TEST_F(MapImplTest, MutableAtNonExistDeathTest) {
216 EXPECT_DEATH(map_.at(0),
"");
219 TEST_F(MapImplTest, ImmutableAtNonExistDeathTest) {
220 EXPECT_DEATH(const_map_.at(0),
"");
223 TEST_F(MapImplTest, UsageErrors) {
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"
233 EXPECT_DEATH(
value.SetFloatValue(0.1),
234 "Protocol Buffer map usage error:\n"
235 "MapValueRef::type MapValueRef is not initialized.");
238 #endif // PROTOBUF_HAS_DEATH_TEST
260 EXPECT_TRUE(const_map_.end() == const_map_.find(0));
264 EXPECT_TRUE(const_map_.end() == const_map_.cend());
268 for (
int i = 0;
i < 10;
i++) {
273 it != map_.cend();) {
279 it != const_map_.end();) {
286 EXPECT_EQ(entry.first + 1, ++entry.second);
312 template <
typename Iterator>
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];
325 static int k0 = 812398771;
326 static int k1 = 1312938717;
327 static int k2 = 1321555333;
335 const int kTestSize = 250000;
340 while (
map.size() < kTestSize) {
345 static_cast<int>(frog) >= 0 ?
static_cast<int>(frog) : last_key ^ 1;
347 map[last_key] = last_key ^ 1;
349 std::vector<int64> times;
353 const int kChunkSize = 1000;
357 for (
int i = 0;
i < kChunkSize;
i++) {
364 }
while (!
map.empty());
365 if (times.size() < .99 * kTestSize / kChunkSize) {
369 int64 x0 =
median(times.begin(), times.begin() + 9);
370 int64 x1 =
median(times.begin() + times.size() - 9, times.end());
383 const int kTestSize = 1024;
385 for (
int i = 0;
s.size() < kTestSize;
i++) {
386 if ((map_.hash_function()(
i) & (kTestSize - 1)) < 3) {
394 std::vector<int64> times;
395 std::set<int>::iterator
it =
s.begin();
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());
416 std::vector<Map<int32, int32>::iterator>
v;
417 const int kIters = 1e5;
419 int32 key = (3 +
i * (5 +
i * (-8 +
i * (62 +
i)))) & 0x77777777;
421 v.push_back(map_.find(
key));
424 it !=
v.end();
it++) {
431 template <
typename T,
typename U>
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;
448 template <
typename Iter>
450 const int kMaxAdvance = 10;
451 for (
int i = 0;
i < kMaxAdvance;
i++) {
453 if (i0 ==
end)
return;
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++) {
466 if (
it ==
m->end())
return;
467 const IteratorType old =
it;
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++) {
475 const IteratorType after_growth =
m->find(old->first);
476 TestEqualIterators<IteratorType>(old, after_growth,
m->end());
481 for (
int i = 0;
i < 2 * (target_size - initial_size);
i++) {
482 if (
i != old->first) {
485 if (((
i ^
m->begin()->first) & 15) == 0) {
490 TestEqualIterators<IteratorType>(old,
m->find(old->first),
m->end());
491 TestEqualIterators<IteratorType>(old, after_growth,
m->end());
503 while (
m.size() <
n) {
508 static_cast<int>(frog) >= 0 ?
static_cast<int>(frog) : last_key ^ 1;
510 m[last_key] = last_key ^ 1;
517 std::unordered_map<int, Map<int, int>::iterator> mi(
n);
519 mp[
it->first] = &*
it;
532 TestOldVersusNewIterator<Map<int, int>::const_iterator>(
n % 3, &
m);
533 TestOldVersusNewIterator<Map<int, int>::iterator>(
n % (1 + (
n / 40)), &
m);
536 m[last_key] =
m[last_key ^ 999] = 0;
537 std::vector<Map<int, int>::iterator>
v;
539 int position_of_last_key = 0;
541 if (
it->first == last_key) {
542 position_of_last_key =
v.size();
550 if (
index == position_of_last_key) {
560 const int kMaxSizeToTest = 100 * 1000;
562 const int kMaxSizeToTest = 1000 * 1000;
565 int n = kMaxSizeToTest;
566 unsigned int frog =
k1 +
n;
567 while (
n > 1 &&
s.size() < 25) {
569 n =
static_cast<int>(
n * 100 / (101.0 + (frog & 63)));
578 for (std::set<int>::iterator
i =
s.begin();
i !=
s.end(); ++
i) {
585 map_[3] = map_[13] = map_[20] = 0;
586 const int initial_size = map_.size();
588 std::vector<Map<int, int>::iterator>
v;
593 for (
int i = 0; map_.size() <= initial_size * 20;
i++) {
596 const int larger_size = map_.size();
601 for (
int i = 0;
i <
v.size();
i++) {
604 EXPECT_EQ(larger_size -
v.size(), map_.size());
607 template <
typename T>
611 template <
typename T>
629 std::iterator_traits<
639 std::pair<Map<int32, int32>::iterator,
bool> result1 =
641 ExpectSingleElement(
key, value1);
649 std::pair<Map<int32, int32>::iterator,
bool> result2 =
651 ExpectSingleElement(
key, value1);
666 std::map<int32, int32> map1;
667 map1[key1] = value1a;
668 map1[key2] = value2a;
670 map_.insert(map1.begin(), map1.end());
671 ExpectElements(map1);
673 std::map<int32, int32> map2;
674 map2[key1] = value1b;
675 map2[key2] = value2b;
677 map_.insert(map2.begin(), map2.end());
678 ExpectElements(map1);
682 map_.insert({{1, 100}, {2, 200}});
683 ExpectElements({{1, 100}, {2, 200}});
685 map_.insert({{2, 201}, {3, 301}});
686 ExpectElements({{1, 100}, {2, 200}, {3, 301}});
709 for (
int i = 0;
i < 5;
i++) {
750 for (
int i = 0;
i < 10;
i++) {
758 if (
it->first % 2 == 1) {
775 std::map<int32, int32>
map;
779 map_.insert(
map.begin(),
map.end());
782 map_.erase(map_.begin(), map_.end());
811 std::map<int32, int32>
map;
815 m->insert(
map.begin(),
map.end());
839 std::map<int32, int32>
map;
856 std::map<int32, int32>
map;
860 map_.insert(
map.begin(),
map.end());
863 int32 key_other = 123;
864 int32 value_other = 321;
865 other[key_other] = value_other;
884 std::map<int32, int32> reference_map;
886 reference_map[
i] =
i;
889 map_[
i] = reference_map[
i];
900 int key = 100, key_missing = 101;
908 range = map_.equal_range(key_missing);
912 std::pair<Map<int32, int32>::const_iterator,
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);
925 std::map<int32, int32> std_map(map_.begin(), map_.end());
932 std::vector<std::pair<int32, int32> > std_vec(map_.begin(), map_.end());
941 another[9398] = 41999;
942 another[8070] = 42056;
945 testing::UnorderedElementsAre(testing::Pair(9398, 41999)));
946 EXPECT_THAT(map_, testing::UnorderedElementsAre(testing::Pair(8070, 42056),
947 testing::Pair(9398, 41999)));
951 Arena arena1, arena2;
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)));
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)));
981 static int Func(
int i,
int j) {
return i * j; }
991 std::istringstream(
value) >> result;
1013 message.mutable_map_string_string();
1015 message.mutable_map_int32_foreign_message();
1017 for (
int i = 0;
i < 10; ++
i) {
1018 (*map_int32_int32)[
i] =
Func(
i, 1);
1019 (*map_int32_double)[
i] =
Func(
i, 2);
1021 (*map_int32_foreign_message)[
i].set_c(
Func(
i, 6));
1026 desc->FindFieldByName(
"map_int32_int32");
1028 desc->FindFieldByName(
"map_int32_double");
1030 desc->FindFieldByName(
"map_string_string");
1032 desc->FindFieldByName(
"map_int32_foreign_message");
1070 fd_map_int32_foreign_message);
1073 for (
int i = 0;
i < 10; ++
i) {
1076 const Message& message_int32_int32 = mf_int32_int32.
Get(
i);
1078 message_int32_int32, fd_map_int32_in32_key);
1080 message_int32_int32, fd_map_int32_in32_value);
1083 const Message& message_int32_double = mf_int32_double.Get(
i);
1085 message_int32_double, fd_map_int32_double_key);
1086 double value_int32_double =
1088 message_int32_double, fd_map_int32_double_value);
1091 const Message& message_string_string = mf_string_string.Get(
i);
1094 message_string_string, fd_map_string_string_key);
1097 message_string_string, fd_map_string_string_value);
1100 const Message& message_int32_message = mf_int32_foreign_message.Get(
i);
1102 message_int32_message, fd_map_int32_foreign_message_key);
1103 const ForeignMessage& value_int32_message =
1104 down_cast<const ForeignMessage&>(
1106 message_int32_message, fd_map_int32_foreign_message_value));
1107 EXPECT_EQ(value_int32_message.c(),
Func(key_int32_message, 6));
1112 const Message& message_int32_int32 = mmf_int32_int32->Get(
i);
1114 message_int32_int32, fd_map_int32_in32_key);
1116 message_int32_int32, fd_map_int32_in32_value);
1119 const Message& message_int32_double = mmf_int32_double->Get(
i);
1121 message_int32_double, fd_map_int32_double_key);
1122 double value_int32_double =
1124 message_int32_double, fd_map_int32_double_value);
1127 const Message& message_string_string = mmf_string_string->Get(
i);
1130 message_string_string, fd_map_string_string_key);
1133 message_string_string, fd_map_string_string_value);
1136 const Message& message_int32_message = mmf_int32_foreign_message->Get(
i);
1138 message_int32_message, fd_map_int32_foreign_message_key);
1139 const ForeignMessage& value_int32_message =
1140 down_cast<const ForeignMessage&>(
1142 message_int32_message, fd_map_int32_foreign_message_value));
1143 EXPECT_EQ(value_int32_message.c(),
Func(key_int32_message, 6));
1148 for (
int i = 0;
i < 10;
i++) {
1150 Message* message_int32_int32 = mmf_int32_int32->Mutable(
i);
1152 *message_int32_int32, fd_map_int32_in32_key);
1154 fd_map_int32_in32_value,
1155 Func(key_int32_int32, -1));
1157 Message* message_int32_double = mmf_int32_double->Mutable(
i);
1159 *message_int32_double, fd_map_int32_double_key);
1161 message_int32_double, fd_map_int32_double_value,
1162 Func(key_int32_double, -2));
1164 Message* message_string_string = mmf_string_string->Mutable(
i);
1167 *message_string_string, fd_map_string_string_key);
1169 message_string_string, fd_map_string_string_value,
1172 Message* message_int32_message = mmf_int32_foreign_message->Mutable(
i);
1173 int32 key_int32_message =
1175 *message_int32_message, fd_map_int32_foreign_message_key);
1176 ForeignMessage* value_int32_message = down_cast<ForeignMessage*>(
1178 message_int32_message, fd_map_int32_foreign_message_value));
1179 value_int32_message->set_c(
Func(key_int32_message, -6));
1184 for (
int i = 0;
i < 10;
i++) {
1200 message.mutable_map_string_string();
1202 message.mutable_map_int32_foreign_message();
1204 for (
int i = 0;
i < 10; ++
i) {
1205 (*map_int32_int32)[
i] =
Func(
i, 1);
1206 (*map_int32_double)[
i] =
Func(
i, 2);
1208 (*map_int32_foreign_message)[
i].set_c(
Func(
i, 6));
1213 desc->FindFieldByName(
"map_int32_int32");
1215 desc->FindFieldByName(
"map_int32_double");
1217 desc->FindFieldByName(
"map_string_string");
1219 desc->FindFieldByName(
"map_int32_foreign_message");
1257 fd_map_int32_foreign_message);
1260 std::unique_ptr<Message> entry_int32_int32(
1264 std::unique_ptr<Message> entry_int32_double(
1268 std::unique_ptr<Message> entry_string_string(
1272 std::unique_ptr<Message> entry_int32_foreign_message(
1274 ->GetPrototype(fd_map_int32_foreign_message->
message_type())
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());
1296 for (
int i = 0;
i < 10; ++
i) {
1299 const Message& message_int32_int32 =
1300 mf_int32_int32.Get(
i, entry_int32_int32.get());
1302 message_int32_int32, fd_map_int32_in32_key);
1304 message_int32_int32, fd_map_int32_in32_value);
1307 const Message& message_int32_double =
1308 mf_int32_double.Get(
i, entry_int32_double.get());
1310 message_int32_double, fd_map_int32_double_key);
1311 double value_int32_double =
1313 message_int32_double, fd_map_int32_double_value);
1316 const Message& message_string_string =
1317 mf_string_string.Get(
i, entry_string_string.get());
1320 message_string_string, fd_map_string_string_key);
1323 message_string_string, fd_map_string_string_value);
1326 const Message& message_int32_message =
1327 mf_int32_foreign_message.Get(
i, entry_int32_foreign_message.get());
1329 message_int32_message, fd_map_int32_foreign_message_key);
1330 const ForeignMessage& value_int32_message =
1331 down_cast<const ForeignMessage&>(
1333 message_int32_message, fd_map_int32_foreign_message_value));
1334 EXPECT_EQ(value_int32_message.c(),
Func(key_int32_message, 6));
1339 const Message& message_int32_int32 =
1340 mmf_int32_int32.Get(
i, entry_int32_int32.get());
1342 message_int32_int32, fd_map_int32_in32_key);
1344 message_int32_int32, fd_map_int32_in32_value);
1347 const Message& message_int32_double =
1348 mmf_int32_double.Get(
i, entry_int32_double.get());
1350 message_int32_double, fd_map_int32_double_key);
1351 double value_int32_double =
1353 message_int32_double, fd_map_int32_double_value);
1356 const Message& message_string_string =
1357 mmf_string_string.Get(
i, entry_string_string.get());
1360 message_string_string, fd_map_string_string_key);
1363 message_string_string, fd_map_string_string_value);
1366 const Message& message_int32_message =
1367 mmf_int32_foreign_message.Get(
i, entry_int32_foreign_message.get());
1369 message_int32_message, fd_map_int32_foreign_message_key);
1370 const ForeignMessage& value_int32_message =
1371 down_cast<const ForeignMessage&>(
1373 message_int32_message, fd_map_int32_foreign_message_value));
1374 EXPECT_EQ(value_int32_message.c(),
Func(key_int32_message, 6));
1379 for (
int i = 0;
i < 10;
i++) {
1380 const Message& message_int32_int32 =
1381 mmf_int32_int32.Get(
i, entry_int32_int32.get());
1383 message_int32_int32, fd_map_int32_in32_key);
1385 entry_int32_int32->GetReflection()->SetInt32(
1388 entry_int32_int32->GetReflection()->SetInt32(
1391 entry_int32_double->GetReflection()->SetInt32(
1394 entry_int32_double->GetReflection()->SetDouble(
1397 entry_string_string->GetReflection()->SetString(
1398 entry_string_string.get(),
1400 entry_string_string->GetReflection()->SetString(
1401 entry_string_string.get(),
1403 entry_int32_foreign_message->GetReflection()->SetInt32(
1404 entry_int32_foreign_message.get(),
1408 entry_int32_foreign_message.get(),
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);
1420 for (
int i = 0;
i < 10;
i++) {
1430 std::unordered_map<int32, int32> result;
1432 it != mf_int32_int32.end(); ++
it) {
1435 message.GetReflection()->GetInt32(
message, fd_map_int32_in32_key);
1437 message.GetReflection()->GetInt32(
message, fd_map_int32_in32_value);
1442 for (std::unordered_map<int32, int32>::const_iterator
it = result.begin();
1443 it != result.end(); ++
it) {
1450 std::unordered_map<int32, double> result;
1452 it != mf_int32_double.end(); ++
it) {
1455 message.GetReflection()->GetInt32(
message, fd_map_int32_double_key);
1457 message, fd_map_int32_double_value);
1462 for (std::unordered_map<int32, double>::const_iterator
it = result.begin();
1463 it != result.end(); ++
it) {
1470 std::unordered_map<std::string, std::string> result;
1472 it != mf_string_string.end(); ++
it) {
1475 message.GetReflection()->GetString(
message, fd_map_string_string_key);
1477 message, fd_map_string_string_value);
1482 for (std::unordered_map<std::string, std::string>::const_iterator
it =
1484 it != result.end(); ++
it) {
1491 std::map<int32, ForeignMessage> result;
1493 mf_int32_foreign_message.begin();
1494 it != mf_int32_foreign_message.end(); ++
it) {
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);
1505 for (std::map<int32, ForeignMessage>::const_iterator
it = result.begin();
1506 it != result.end(); ++
it) {
1513 entry_int32_int32->GetReflection()->SetInt32(
1516 entry_int32_int32->GetReflection()->SetInt32(
1519 mmf_int32_int32.Add(*entry_int32_int32);
1522 entry_int32_double->GetReflection()->SetInt32(
1525 entry_int32_double->GetReflection()->SetDouble(
1528 mmf_int32_double.Add(*entry_int32_double);
1531 entry_string_string->GetReflection()->SetString(
1534 entry_string_string->GetReflection()->SetString(
1537 mmf_string_string.Add(*entry_string_string);
1540 entry_int32_foreign_message->GetReflection()->SetInt32(
1541 entry_int32_foreign_message.get(),
1545 entry_int32_foreign_message.get(),
1547 ForeignMessage foreign_message;
1548 foreign_message.set_c(1234);
1549 value_message->
CopyFrom(foreign_message);
1551 mmf_int32_foreign_message.Add(*entry_int32_foreign_message);
1555 Message* free_entry_string_string =
1562 entry_string_string->GetReflection()->SetString(
1566 free_entry_string_string);
1569 mmf_int32_int32.RemoveLast();
1570 mmf_int32_double.RemoveLast();
1571 mmf_string_string.RemoveLast();
1572 mmf_int32_foreign_message.RemoveLast();
1580 const Message& message0a = mmf_int32_int32.Get(0, entry_int32_int32.get());
1581 int32 int32_value0a =
1583 const Message& message9a = mmf_int32_int32.Get(9, entry_int32_int32.get());
1584 int32 int32_value9a =
1587 mmf_int32_int32.SwapElements(0, 9);
1589 const Message& message0b = mmf_int32_int32.Get(0, entry_int32_int32.get());
1590 int32 int32_value0b =
1592 const Message& message9b = mmf_int32_int32.Get(9, entry_int32_int32.get());
1593 int32 int32_value9b =
1596 EXPECT_EQ(int32_value9a, int32_value0b);
1597 EXPECT_EQ(int32_value0a, int32_value9b);
1602 mmf_int32_double.Get(0, entry_int32_double.get());
1604 message0a, fd_map_int32_double_value);
1606 mmf_int32_double.Get(9, entry_int32_double.get());
1608 message9a, fd_map_int32_double_value);
1610 mmf_int32_double.SwapElements(0, 9);
1613 mmf_int32_double.Get(0, entry_int32_double.get());
1615 message0b, fd_map_int32_double_value);
1617 mmf_int32_double.Get(9, entry_int32_double.get());
1619 message9b, fd_map_int32_double_value);
1621 EXPECT_EQ(double_value9a, double_value0b);
1622 EXPECT_EQ(double_value0a, double_value9b);
1627 mmf_string_string.Get(0, entry_string_string.get());
1629 message0a, fd_map_string_string_value);
1631 mmf_string_string.Get(9, entry_string_string.get());
1633 message9a, fd_map_string_string_value);
1635 mmf_string_string.SwapElements(0, 9);
1638 mmf_string_string.Get(0, entry_string_string.get());
1640 message0b, fd_map_string_string_value);
1642 mmf_string_string.Get(9, entry_string_string.get());
1644 message9b, fd_map_string_string_value);
1646 EXPECT_EQ(string_value9a, string_value0b);
1647 EXPECT_EQ(string_value0a, string_value9b);
1652 mmf_int32_foreign_message.Get(0, entry_int32_foreign_message.get());
1653 const ForeignMessage& sub_message0a =
1655 message0a, fd_map_int32_foreign_message_value));
1656 int32 int32_value0a = sub_message0a.c();
1658 mmf_int32_foreign_message.Get(9, entry_int32_foreign_message.get());
1659 const ForeignMessage& sub_message9a =
1661 message9a, fd_map_int32_foreign_message_value));
1662 int32 int32_value9a = sub_message9a.c();
1664 mmf_int32_foreign_message.SwapElements(0, 9);
1667 mmf_int32_foreign_message.Get(0, entry_int32_foreign_message.get());
1668 const ForeignMessage& sub_message0b =
1670 message0b, fd_map_int32_foreign_message_value));
1671 int32 int32_value0b = sub_message0b.c();
1673 mmf_int32_foreign_message.Get(9, entry_int32_foreign_message.get());
1674 const ForeignMessage& sub_message9b =
1676 message9b, fd_map_int32_foreign_message_value));
1677 int32 int32_value9b = sub_message9b.c();
1679 EXPECT_EQ(int32_value9a, int32_value0b);
1680 EXPECT_EQ(int32_value0a, int32_value9b);
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);
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);
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);
1699 (*m2.mutable_map_int32_foreign_message())[
i + 20].set_c(
Func(
i, 26));
1707 desc->FindFieldByName(
"map_int32_int32");
1709 desc->FindFieldByName(
"map_int32_double");
1711 desc->FindFieldByName(
"map_string_string");
1713 desc->FindFieldByName(
"map_int32_foreign_message");
1724 fd_map_int32_foreign_message);
1727 mmf_int32_int32.CopyFrom(
1729 mmf_int32_double.CopyFrom(
1731 mmf_string_string.CopyFrom(
1733 mmf_int32_foreign_message.CopyFrom(
1736 for (
int i = 0;
i < 10; ++
i) {
1740 EXPECT_EQ(
Func(
i, 16), m0.map_int32_foreign_message().at(
i + 10).c());
1744 mmf_int32_int32.MergeFrom(
1746 mmf_int32_double.MergeFrom(
1748 mmf_string_string.MergeFrom(
1750 mmf_int32_foreign_message.MergeFrom(
1752 for (
int i = 0;
i < 10; ++
i) {
1756 EXPECT_EQ(
Func(
i, 26), m0.map_int32_foreign_message().at(
i + 20).c());
1761 mmf_int32_int32.Swap(
1763 mmf_int32_double.Swap(
1765 mmf_string_string.Swap(
1768 &m2, fd_map_int32_foreign_message));
1769 for (
int i = 0;
i < 10; ++
i) {
1774 EXPECT_EQ(
Func(
i, 26), m0.map_int32_foreign_message().at(
i + 20).c());
1780 EXPECT_EQ(
Func(
i, 16), m2.map_int32_foreign_message().at(
i + 10).c());
1784 EXPECT_EQ(
Func(
i, 26), m2.map_int32_foreign_message().at(
i + 20).c());
1794 std::unique_ptr<Message>
message(
1806 entry_reflection->
SetInt32(entry1, key_field, 1);
1807 entry_reflection->
SetInt32(entry2, key_field, 1);
1819 message.GetDescriptor()->FindFieldByName(
"map_int32_int32");
1827 entry_reflection->
SetInt32(entry1, key_field, 1);
1828 entry_reflection->
SetInt32(entry2, key_field, 1);
1837 TEST(GeneratedMapFieldTest, Accessors) {
1847 TEST(GeneratedMapFieldTest, SetMapFieldsInitialized) {
1854 TEST(GeneratedMapFieldTest, Proto2SetMapFieldsInitialized) {
1855 unittest::TestEnumMap
message;
1856 EXPECT_EQ(unittest::PROTO2_MAP_ENUM_FOO,
1857 (*
message.mutable_known_map_field())[0]);
1868 TEST(GeneratedMapFieldTest, ClearMessageMap) {
1869 unittest::TestMessageMap
message;
1872 TestUtil::ExpectClear((*
message.mutable_map_int32_message())[0]);
1876 unittest::TestMap message1, message2;
1879 message2.CopyFrom(message1);
1883 message2.CopyFrom(message2);
1887 TEST(GeneratedMapFieldTest, CopyFromMessageMap) {
1888 unittest::TestMessageMap message1, message2;
1890 (*message1.mutable_map_int32_message())[0].add_repeated_int32(100);
1891 (*message2.mutable_map_int32_message())[0].add_repeated_int32(101);
1893 message1.CopyFrom(message2);
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));
1900 TEST(GeneratedMapFieldTest, SwapWithEmpty) {
1901 unittest::TestMap message1, message2;
1907 message1.Swap(&message2);
1912 TEST(GeneratedMapFieldTest, SwapWithSelf) {
1922 TEST(GeneratedMapFieldTest, SwapWithOther) {
1923 unittest::TestMap message1, message2;
1929 message1.Swap(&message2);
1934 TEST(GeneratedMapFieldTest, CopyConstructor) {
1935 unittest::TestMap message1;
1938 unittest::TestMap message2(message1);
1942 TEST(GeneratedMapFieldTest, CopyAssignmentOperator) {
1943 unittest::TestMap message1;
1946 unittest::TestMap message2;
1947 message2 = message1;
1951 message2.operator=(message2);
1955 #if !defined(PROTOBUF_TEST_NO_DESCRIPTORS) || PROTOBUF_RTTI
1956 TEST(GeneratedMapFieldTest, UpcastCopyFrom) {
1959 unittest::TestMap message1, message2;
1963 const Message*
source = implicit_cast<const Message*>(&message1);
1964 message2.CopyFrom(*
source);
1970 #ifndef PROTOBUF_TEST_NO_DESCRIPTORS
1972 TEST(GeneratedMapFieldTest, CopyFromDynamicMessage) {
1975 unittest::TestMap message2;
1979 std::unique_ptr<Message> message1;
1985 message2.CopyFrom(*message1);
1989 TEST(GeneratedMapFieldTest, CopyFromDynamicMessageMapReflection) {
1990 unittest::TestMap message2;
1994 std::unique_ptr<Message> message1;
2000 message2.CopyFrom(*message1);
2004 TEST(GeneratedMapFieldTest, DynamicMessageMergeFromDynamicMessage) {
2007 std::unique_ptr<Message> message1;
2013 std::unique_ptr<Message> message2;
2019 std::unique_ptr<Message> message3;
2023 message2->MergeFrom(*message1);
2024 message3->MergeFrom(*message1);
2036 TEST(GeneratedMapFieldTest, DynamicMessageCopyFrom) {
2038 unittest::TestMap message2;
2043 std::unique_ptr<Message> message1;
2047 message1->MergeFrom(message2);
2052 TEST(GeneratedMapFieldTest, DynamicMessageCopyFromMapReflection) {
2054 unittest::TestMap message2;
2059 std::unique_ptr<Message> message1;
2062 message1->MergeFrom(message2);
2067 TEST(GeneratedMapFieldTest, SyncDynamicMapWithRepeatedField) {
2071 std::unique_ptr<Message>
message;
2078 #endif // !PROTOBUF_TEST_NO_DESCRIPTORS
2080 TEST(GeneratedMapFieldTest, NonEmptyMergeFrom) {
2081 unittest::TestMap message1, message2;
2086 (*message2.mutable_map_int32_int32())[1] = 1;
2087 message1.mutable_map_int32_int32()->erase(1);
2090 (*message2.mutable_map_int32_double())[1] = 1;
2091 (*message1.mutable_map_int32_double())[1] = 2;
2093 message1.MergeFrom(message2);
2101 message2.MergeFrom(message1);
2109 TEST(GeneratedMapFieldTest, MergeFromMessageMap) {
2110 unittest::TestMessageMap message1, message2;
2112 (*message1.mutable_map_int32_message())[0].add_repeated_int32(100);
2113 (*message2.mutable_map_int32_message())[0].add_repeated_int32(101);
2115 message1.MergeFrom(message2);
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));
2123 TEST(GeneratedMapFieldTest, SerializationToArray) {
2124 unittest::TestMap message1, message2;
2127 int size = message1.ByteSize();
2130 uint8*
end = message1.SerializeWithCachedSizesToArray(
start);
2137 TEST(GeneratedMapFieldTest, SerializationToStream) {
2138 unittest::TestMap message1, message2;
2140 int size = message1.ByteSize();
2147 message1.SerializeWithCachedSizes(&output_stream);
2156 TEST(GeneratedMapFieldTest, SameTypeMaps) {
2158 ->FindFieldByName(
"map1")
2161 ->FindFieldByName(
"map2")
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;
2178 from.SerializeToString(&
data);
2180 unittest::TestEnumMap to;
2182 EXPECT_EQ(0, to.unknown_map_field().size());
2184 to.GetReflection()->GetUnknownFields(to);
2186 EXPECT_EQ(1, to.known_map_field().size());
2187 EXPECT_EQ(unittest::PROTO2_MAP_ENUM_FOO, to.known_map_field().at(0));
2191 to.SerializeToString(&
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));
2200 TEST(GeneratedMapFieldTest, StandardWireFormat) {
2209 TEST(GeneratedMapFieldTest, UnorderedWireFormat) {
2221 TEST(GeneratedMapFieldTest, DuplicatedKeyWireFormat) {
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;
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();
2252 ASSERT_EQ(1, map_message.map_field().size());
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());
2258 ASSERT_TRUE(map_message.map_field().find(
key)->second.has_dummy5());
2259 EXPECT_EQ(12, map_message.map_field().find(
key)->second.dummy5());
2266 TEST(GeneratedMapFieldTest, KeysValuesUnknownsWireFormat) {
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++) {
2275 data.push_back(items * 2);
2276 static const int kBitsOfIPerItem = 4;
2277 static const int mask = (1 << kBitsOfIPerItem) - 1;
2280 for (
int i = 0;
i < (1 << (items * kBitsOfIPerItem));
i++) {
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;
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
2298 if (j != items - 1) expect_success =
false;
2300 if (expect_success) {
2313 TEST(GeneratedMapFieldTest, DuplicatedValueWireFormat) {
2324 TEST(GeneratedMapFieldTest, MissedKeyWireFormat) {
2336 TEST(GeneratedMapFieldTest, MissedValueWireFormat) {
2348 TEST(GeneratedMapFieldTest, MissedValueTextFormat) {
2353 "map_int32_foreign_message {\n"
2354 " key: 1234567890\n"
2362 TEST(GeneratedMapFieldTest, UnknownFieldWireFormat) {
2373 TEST(GeneratedMapFieldTest, CorruptedWireFormat) {
2383 unittest::TestRequiredMessageMap map_message;
2386 (*map_message.mutable_map_field())[0];
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);
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);
2405 (*map_message.mutable_map_field())[0] = with_dummy4;
2416 s[
s.size() - 3] -= 8;
2418 encoded_val[encoded_val.size() - 1] += 33;
2419 for (
int i = 0;
i < encoded_val.size();
i++) {
2420 if (encoded_val[
i] == 97) {
2425 encoded_val[
i - 1] += 16;
2426 encoded_val[
i] = 91;
2427 }
else if (encoded_val[
i] == 98) {
2429 encoded_val[
i - 1] += 8;
2436 s[1] += encoded_val.size();
2441 ASSERT_EQ(1, map_message.map_field().size());
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());
2455 ASSERT_EQ(1, map_message.map_field().size());
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());
2466 TEST(GeneratedMapFieldReflectionTest, SpaceUsed) {
2474 TEST(GeneratedMapFieldReflectionTest, Accessors) {
2488 TEST(GeneratedMapFieldReflectionTest, Swap) {
2489 unittest::TestMap message1;
2490 unittest::TestMap message2;
2494 const Reflection* reflection = message1.GetReflection();
2495 reflection->
Swap(&message1, &message2);
2501 TEST(GeneratedMapFieldReflectionTest, SwapWithBothSet) {
2502 unittest::TestMap message1;
2503 unittest::TestMap message2;
2509 const Reflection* reflection = message1.GetReflection();
2510 reflection->
Swap(&message1, &message2);
2516 TEST(GeneratedMapFieldReflectionTest, SwapFields) {
2517 unittest::TestMap message1;
2518 unittest::TestMap message2;
2522 std::vector<const FieldDescriptor*>
fields;
2523 const Reflection* reflection = message1.GetReflection();
2542 TEST(GeneratedMapFieldReflectionTest, RemoveLast) {
2548 std::vector<const Message*> expected_entries =
2554 std::vector<const Message*> remained_entries =
2556 EXPECT_TRUE(expected_entries == remained_entries);
2559 TEST(GeneratedMapFieldReflectionTest, ReleaseLast) {
2577 std::vector<const Message*> expect_last =
2579 std::vector<const Message*> release_last =
2583 for (std::vector<const Message*>::iterator
it = release_last.begin();
2584 it != release_last.end(); ++
it) {
2589 TEST(GeneratedMapFieldReflectionTest, SwapElements) {
2603 std::vector<const Message*> entries0_once =
2605 std::vector<const Message*> entries1_once =
2617 std::vector<const Message*> entries0_twice =
2619 std::vector<const Message*> entries1_twice =
2628 TEST(GeneratedMapFieldReflectionTest, MutableUnknownFields) {
2634 TEST(GeneratedMapFieldReflectionTest, EmbedProto2Message) {
2635 unittest::TestMessageMap
message;
2639 "map_int32_message");
2647 reinterpret_cast<const Message*
>(&TestAllTypes::default_instance()));
2656 TEST(GeneratedMapFieldReflectionTest, MergeFromClearMapEntry) {
2677 entry_message1->
MergeFrom(*entry_message2);
2683 TEST(GeneratedMapFieldReflectionTest, MapEntryClear) {
2689 TEST(GeneratedMapFieldReflectionTest, Proto2MapEntryClear) {
2690 unittest::TestEnumMap
message;
2693 descriptor->FindFieldByName(
"known_map_field");
2704 TEST(GeneratedMapFieldReflectionTest, SetViaMapReflection) {
2739 std::unique_ptr<Message>
message(map_prototype_->New());
2748 std::unique_ptr<Message>
message(map_prototype_->New());
2762 std::unique_ptr<Message>
message(map_prototype_->New());
2765 int initial_space_used =
message->SpaceUsed();
2772 TestRecursiveMapMessage from;
2773 (*from.mutable_a())[
""];
2775 std::unique_ptr<Message> to(
2776 factory_.GetPrototype(recursive_map_descriptor_)->New());
2781 std::unique_ptr<Message>
message(map_prototype_->New());
2791 message.get(),
"map_int32_foreign_message", map_key, &map_val);
2803 submsg_reflection->
SetInt32(submsg, submsg_field, 128);
2807 to.ParseFromString(
data);
2808 EXPECT_EQ(128, to.map_int32_foreign_message().at(0).c());
2812 std::unique_ptr<Message>
message(map_prototype_->New());
2819 message.get(),
"map_int32_foreign_message", 0);
2835 submsg_reflection->
SetInt32(submsg, submsg_field, 128);
2839 to.ParseFromString(
data);
2840 EXPECT_EQ(128, to.map_int32_foreign_message().at(0).c());
2845 TEST(ReflectionOpsForMapFieldTest, MapSanityCheck) {
2852 TEST(ReflectionOpsForMapFieldTest, MapCopy) {
2853 unittest::TestMap
message, message2;
2866 TEST(ReflectionOpsForMapFieldTest, MergeMap) {
2870 unittest::TestMap
message, message2;
2879 TEST(ReflectionOpsForMapFieldTest, ClearMap) {
2889 TEST(ReflectionOpsForMapFieldTest, MapDiscardUnknownFields) {
2894 message.GetReflection()->MutableUnknownFields(&
message)->AddVarint(123456,
2902 message.GetReflection()->GetUnknownFields(
message).field_count());
2906 unittest::TestRequiredMessageMap map_message;
2909 (*map_message.mutable_map_field())[0];
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);
2938 TEST(WireFormatForMapFieldTest, MapByteSize) {
2948 TEST(WireFormatForMapFieldTest, SerializeMap) {
2979 TEST(WireFormatForMapFieldTest, SerializeMapDynamicMessage) {
2981 std::unique_ptr<Message> dynamic_message;
2982 dynamic_message.reset(
2988 unittest::TestMap generated_message;
2996 generated_message.SerializeToString(&generated_data);
2997 dynamic_message->SerializeToString(&dynamic_data);
3002 EXPECT_TRUE(dynamic_data.size() == generated_data.size());
3005 TEST(WireFormatForMapFieldTest, MapParseHelpers) {
3010 protobuf_unittest::TestMap
message;
3017 protobuf_unittest::TestMap
message;
3024 protobuf_unittest::TestMap
message;
3034 data_with_junk.append(
"some junk on the end");
3036 protobuf_unittest::TestMap
message;
3045 protobuf_unittest::TestAllTypes
message;
3053 template <
typename T>
3056 const int size = t.ByteSize();
3061 t.SerializePartialToCodedStream(&output_stream);
3067 template <
typename T>
3070 const int size = t.ByteSize();
3075 t.SerializeToCodedStream(&output_stream);
3081 template <
typename T>
3083 const int size = t.ByteSize();
3089 t.SerializeWithCachedSizes(&output_stream);
3108 protobuf_unittest::TestMaps u;
3120 s[
n %
s.size()] = (
n >> 10) & 0x7f;
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;
3134 const uint64 multiplier = 0xa29cd16f;
3135 for (
int i = 0;
i < kIters;
i++) {
3140 const bool b =
i32 > 0;
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;
3153 inner.mutable_m()->erase(
i);
3154 frog = frog * multiplier +
i;
3155 frog ^= (frog >> 41);
3160 TEST(MapSerializationTest, DeterministicSubmessage) {
3161 protobuf_unittest::TestSubmessageMaps
p;
3162 protobuf_unittest::TestMaps t;
3163 const std::string filename =
"golden_message_maps";
3168 t.ParseFromString(golden);
3169 *(
p.mutable_m()) = t;
3170 std::vector<std::string>
v;
3174 const int kAttempts = 10;
3175 for (
int i = 0;
i < kAttempts;
i++) {
3176 protobuf_unittest::TestSubmessageMaps q(
p);
3183 TEST(TextFormatMapTest, SerializeAndParse) {
3184 unittest::TestMap
source;
3185 unittest::TestMap
dest;
3200 std::unique_ptr<Message>
message(
3208 "testdata/map_test_data.txt"),
3209 &expected_text,
true));
3222 "testdata/map_test_data.txt"),
3223 &expected_text,
true));
3229 unittest::TestMap message2;
3232 EXPECT_EQ(message2.DebugString(), expected_text);
3235 TEST(TextFormatMapTest, ParseCorruptedString) {
3239 "net/proto2/internal/testdata/golden_message_maps"),
3240 &serialized_message,
true));
3241 protobuf_unittest::TestMaps
message;
3243 TestParseCorruptedString<protobuf_unittest::TestMaps, true>(
message);
3244 TestParseCorruptedString<protobuf_unittest::TestMaps, false>(
message);
3250 TEST(TextFormatMapTest, NoDisableIterator) {
3251 unittest::TestMap
source;
3252 (*
source.mutable_map_int32_int32())[1] = 1;
3271 "map_int32_int32 {\n"
3280 TEST(TextFormatMapTest, NoDisableReflectionIterator) {
3281 unittest::TestMap
source;
3282 (*
source.mutable_map_int32_int32())[1] = 1;
3288 source.GetDescriptor()->FindFieldByName(
"map_int32_int32");
3300 const Reflection* map_entry_reflection = iter->GetReflection();
3302 iter->GetDescriptor()->FindFieldByName(
"value");
3303 map_entry_reflection->
SetInt32(&(*iter), value_field_desc, 2);
3311 "map_int32_int32 {\n"
3320 TEST(ArenaTest, ParsingAndSerializingNoHeapAllocation) {
3322 std::vector<char> arena_block(128 * 1024);
3324 options.initial_block = &arena_block[0];
3325 options.initial_block_size = arena_block.size();
3328 data.reserve(128 * 1024);
3334 unittest::TestArenaMap* from =
3335 Arena::CreateMessage<unittest::TestArenaMap>(&arena);
3337 from->SerializeToString(&
data);
3339 unittest::TestArenaMap* to =
3340 Arena::CreateMessage<unittest::TestArenaMap>(&arena);
3341 to->ParseFromString(
data);
3347 TEST(ArenaTest, ReflectionInTextFormat) {
3354 unittest::TestArenaMap* from =
3355 Arena::CreateMessage<unittest::TestArenaMap>(&arena);
3356 unittest::TestArenaMap* to =
3357 Arena::CreateMessage<unittest::TestArenaMap>(&arena);
3369 unittest::TestArenaMap*
message =
3370 Arena::CreateMessage<unittest::TestArenaMap>(&arena);
3373 int original_capacity =
data.capacity();
3374 while (
data.capacity() <= original_capacity) {
3384 std::vector<char> arena_block(128 * 1024);
3385 std::fill(arena_block.begin(), arena_block.end(),
'\xff');
3388 options.initial_block = &arena_block[0];
3389 options.initial_block_size = arena_block.size();
3392 unittest::TestArenaMap*
message =
3393 Arena::CreateMessage<unittest::TestArenaMap>(&arena);
3397 TEST(MoveTest, MoveConstructorWorks) {
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();
3407 EXPECT_EQ(42, moved_to_map[42].optional_nested_message().bb());
3408 EXPECT_EQ(43, moved_to_map[43].optional_nested_message().bb());
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());
3415 TEST(MoveTest, MoveAssignmentWorks) {
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();
3425 EXPECT_EQ(42, moved_to_map[42].optional_nested_message().bb());
3426 EXPECT_EQ(43, moved_to_map[43].optional_nested_message().bb());
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());