Index: third_party/protobuf/src/google/protobuf/extension_set_unittest.cc |
diff --git a/third_party/protobuf/src/google/protobuf/extension_set_unittest.cc b/third_party/protobuf/src/google/protobuf/extension_set_unittest.cc |
index 559de6e138f759f9c01c7ddf8d602c18588254a6..f40fcbc26d9b77c222280b99b6fb129fc181f7ab 100644 |
--- a/third_party/protobuf/src/google/protobuf/extension_set_unittest.cc |
+++ b/third_party/protobuf/src/google/protobuf/extension_set_unittest.cc |
@@ -1,6 +1,6 @@ |
// Protocol Buffers - Google's data interchange format |
// Copyright 2008 Google Inc. All rights reserved. |
-// http://code.google.com/p/protobuf/ |
+// https://developers.google.com/protocol-buffers/ |
// |
// Redistribution and use in source and binary forms, with or without |
// modification, are permitted provided that the following conditions are |
@@ -37,12 +37,14 @@ |
#include <google/protobuf/unittest_mset.pb.h> |
#include <google/protobuf/test_util.h> |
#include <google/protobuf/descriptor.pb.h> |
+#include <google/protobuf/arena.h> |
#include <google/protobuf/descriptor.h> |
#include <google/protobuf/dynamic_message.h> |
#include <google/protobuf/wire_format.h> |
#include <google/protobuf/io/coded_stream.h> |
#include <google/protobuf/io/zero_copy_stream_impl.h> |
+#include <google/protobuf/stubs/logging.h> |
#include <google/protobuf/stubs/common.h> |
#include <google/protobuf/stubs/strutil.h> |
#include <google/protobuf/testing/googletest.h> |
@@ -142,7 +144,7 @@ TEST(ExtensionSetTest, ClearOneField) { |
TestUtil::ExpectAllExtensionsSet(message); |
} |
-TEST(ExtensionSetTest, SetAllocatedExtensin) { |
+TEST(ExtensionSetTest, SetAllocatedExtension) { |
unittest::TestAllExtensions message; |
EXPECT_FALSE(message.HasExtension( |
unittest::optional_foreign_message_extension)); |
@@ -162,17 +164,17 @@ TEST(ExtensionSetTest, SetAllocatedExtensin) { |
// SetAllocatedExtension should delete the previously existing extension. |
// (We reply on unittest to check memory leaks for this case) |
message.SetAllocatedExtension(unittest::optional_foreign_message_extension, |
- new unittest::ForeignMessage()); |
+ new unittest::ForeignMessage()); |
// SetAllocatedExtension with a NULL parameter is equivalent to ClearExtenion. |
message.SetAllocatedExtension(unittest::optional_foreign_message_extension, |
- NULL); |
+ NULL); |
EXPECT_FALSE(message.HasExtension( |
unittest::optional_foreign_message_extension)); |
} |
TEST(ExtensionSetTest, ReleaseExtension) { |
- unittest::TestMessageSet message; |
+ proto2_wireformat_unittest::TestMessageSet message; |
EXPECT_FALSE(message.HasExtension( |
unittest::TestMessageSetExtension1::message_set_extension)); |
// Add a extension using SetAllocatedExtension |
@@ -186,7 +188,7 @@ TEST(ExtensionSetTest, ReleaseExtension) { |
// Release the extension using ReleaseExtension |
unittest::TestMessageSetExtension1* released_extension = |
message.ReleaseExtension( |
- unittest::TestMessageSetExtension1::message_set_extension); |
+ unittest::TestMessageSetExtension1::message_set_extension); |
EXPECT_EQ(extension, released_extension); |
EXPECT_FALSE(message.HasExtension( |
unittest::TestMessageSetExtension1::message_set_extension)); |
@@ -198,7 +200,7 @@ TEST(ExtensionSetTest, ReleaseExtension) { |
message.ClearExtension( |
unittest::TestMessageSetExtension1::message_set_extension); |
released_extension = message.ReleaseExtension( |
- unittest::TestMessageSetExtension1::message_set_extension); |
+ unittest::TestMessageSetExtension1::message_set_extension); |
EXPECT_TRUE(released_extension != NULL); |
delete released_extension; |
} |
@@ -256,6 +258,192 @@ TEST(ExtensionSetTest, SwapWithSelf) { |
TestUtil::ExpectAllExtensionsSet(message); |
} |
+TEST(ExtensionSetTest, SwapExtension) { |
+ unittest::TestAllExtensions message1; |
+ unittest::TestAllExtensions message2; |
+ |
+ TestUtil::SetAllExtensions(&message1); |
+ vector<const FieldDescriptor*> fields; |
+ |
+ // Swap empty fields. |
+ const Reflection* reflection = message1.GetReflection(); |
+ reflection->SwapFields(&message1, &message2, fields); |
+ TestUtil::ExpectAllExtensionsSet(message1); |
+ TestUtil::ExpectExtensionsClear(message2); |
+ |
+ // Swap two extensions. |
+ fields.push_back( |
+ reflection->FindKnownExtensionByNumber(12)); |
+ fields.push_back( |
+ reflection->FindKnownExtensionByNumber(25)); |
+ reflection->SwapFields(&message1, &message2, fields); |
+ |
+ EXPECT_TRUE(message1.HasExtension(unittest::optional_int32_extension)); |
+ EXPECT_FALSE(message1.HasExtension(unittest::optional_double_extension)); |
+ EXPECT_FALSE(message1.HasExtension(unittest::optional_cord_extension)); |
+ |
+ EXPECT_FALSE(message2.HasExtension(unittest::optional_int32_extension)); |
+ EXPECT_TRUE(message2.HasExtension(unittest::optional_double_extension)); |
+ EXPECT_TRUE(message2.HasExtension(unittest::optional_cord_extension)); |
+} |
+ |
+TEST(ExtensionSetTest, SwapExtensionWithEmpty) { |
+ unittest::TestAllExtensions message1; |
+ unittest::TestAllExtensions message2; |
+ unittest::TestAllExtensions message3; |
+ |
+ TestUtil::SetAllExtensions(&message3); |
+ |
+ const Reflection* reflection = message3.GetReflection(); |
+ vector<const FieldDescriptor*> fields; |
+ reflection->ListFields(message3, &fields); |
+ |
+ reflection->SwapFields(&message1, &message2, fields); |
+ |
+ TestUtil::ExpectExtensionsClear(message1); |
+ TestUtil::ExpectExtensionsClear(message2); |
+} |
+ |
+TEST(ExtensionSetTest, SwapExtensionBothFull) { |
+ unittest::TestAllExtensions message1; |
+ unittest::TestAllExtensions message2; |
+ |
+ TestUtil::SetAllExtensions(&message1); |
+ TestUtil::SetAllExtensions(&message2); |
+ |
+ const Reflection* reflection = message1.GetReflection(); |
+ vector<const FieldDescriptor*> fields; |
+ reflection->ListFields(message1, &fields); |
+ |
+ reflection->SwapFields(&message1, &message2, fields); |
+ |
+ TestUtil::ExpectAllExtensionsSet(message1); |
+ TestUtil::ExpectAllExtensionsSet(message2); |
+} |
+ |
+TEST(ExtensionSetTest, ArenaSetAllExtension) { |
+ ::google::protobuf::Arena arena1; |
+ unittest::TestAllExtensions* message1 = |
+ ::google::protobuf::Arena::CreateMessage<unittest::TestAllExtensions>(&arena1); |
+ TestUtil::SetAllExtensions(message1); |
+ TestUtil::ExpectAllExtensionsSet(*message1); |
+} |
+ |
+TEST(ExtensionSetTest, ArenaCopyConstructor) { |
+ ::google::protobuf::Arena arena1; |
+ unittest::TestAllExtensions* message1 = |
+ ::google::protobuf::Arena::CreateMessage<unittest::TestAllExtensions>(&arena1); |
+ TestUtil::SetAllExtensions(message1); |
+ unittest::TestAllExtensions message2(*message1); |
+ arena1.Reset(); |
+ TestUtil::ExpectAllExtensionsSet(message2); |
+} |
+ |
+TEST(ExtensionSetTest, ArenaMergeFrom) { |
+ ::google::protobuf::Arena arena1; |
+ unittest::TestAllExtensions* message1 = |
+ ::google::protobuf::Arena::CreateMessage<unittest::TestAllExtensions>(&arena1); |
+ TestUtil::SetAllExtensions(message1); |
+ unittest::TestAllExtensions message2; |
+ message2.MergeFrom(*message1); |
+ arena1.Reset(); |
+ TestUtil::ExpectAllExtensionsSet(message2); |
+} |
+ |
+TEST(ExtensionSetTest, ArenaSetAllocatedMessageAndRelease) { |
+ ::google::protobuf::Arena arena; |
+ unittest::TestAllExtensions* message = |
+ ::google::protobuf::Arena::CreateMessage<unittest::TestAllExtensions>(&arena); |
+ EXPECT_FALSE(message->HasExtension( |
+ unittest::optional_foreign_message_extension)); |
+ // Add a extension using SetAllocatedExtension |
+ unittest::ForeignMessage* foreign_message = new unittest::ForeignMessage(); |
+ message->SetAllocatedExtension(unittest::optional_foreign_message_extension, |
+ foreign_message); |
+ // foreign_message is now owned by the arena. |
+ EXPECT_EQ(foreign_message, |
+ message->MutableExtension( |
+ unittest::optional_foreign_message_extension)); |
+ |
+ // Underlying message is copied, and returned. |
+ unittest::ForeignMessage* released_message = message->ReleaseExtension( |
+ unittest::optional_foreign_message_extension); |
+ delete released_message; |
+ EXPECT_FALSE(message->HasExtension( |
+ unittest::optional_foreign_message_extension)); |
+} |
+ |
+TEST(ExtensionSetTest, SwapExtensionBothFullWithArena) { |
+ ::google::protobuf::Arena arena1; |
+ google::protobuf::scoped_ptr<google::protobuf::Arena> arena2(new ::google::protobuf::Arena()); |
+ |
+ unittest::TestAllExtensions* message1 = |
+ Arena::CreateMessage<unittest::TestAllExtensions>(&arena1); |
+ unittest::TestAllExtensions* message2 = |
+ Arena::CreateMessage<unittest::TestAllExtensions>(arena2.get()); |
+ |
+ TestUtil::SetAllExtensions(message1); |
+ TestUtil::SetAllExtensions(message2); |
+ message1->SetExtension(unittest::optional_int32_extension, 1); |
+ message2->SetExtension(unittest::optional_int32_extension, 2); |
+ message1->Swap(message2); |
+ EXPECT_EQ(2, message1->GetExtension(unittest::optional_int32_extension)); |
+ EXPECT_EQ(1, message2->GetExtension(unittest::optional_int32_extension)); |
+ // Re-set the original values so ExpectAllExtensionsSet is happy. |
+ message1->SetExtension(unittest::optional_int32_extension, 101); |
+ message2->SetExtension(unittest::optional_int32_extension, 101); |
+ TestUtil::ExpectAllExtensionsSet(*message1); |
+ TestUtil::ExpectAllExtensionsSet(*message2); |
+ arena2.reset(NULL); |
+ TestUtil::ExpectAllExtensionsSet(*message1); |
+ // Test corner cases, when one is empty and other is not. |
+ ::google::protobuf::Arena arena3, arena4; |
+ |
+ unittest::TestAllExtensions* message3 = |
+ Arena::CreateMessage<unittest::TestAllExtensions>(&arena3); |
+ unittest::TestAllExtensions* message4 = |
+ Arena::CreateMessage<unittest::TestAllExtensions>(&arena4); |
+ TestUtil::SetAllExtensions(message3); |
+ message3->Swap(message4); |
+ arena3.Reset(); |
+ TestUtil::ExpectAllExtensionsSet(*message4); |
+} |
+ |
+TEST(ExtensionSetTest, SwapFieldsOfExtensionBothFullWithArena) { |
+ google::protobuf::Arena arena1; |
+ google::protobuf::Arena* arena2 = new ::google::protobuf::Arena(); |
+ |
+ unittest::TestAllExtensions* message1 = |
+ Arena::CreateMessage<unittest::TestAllExtensions>(&arena1); |
+ unittest::TestAllExtensions* message2 = |
+ Arena::CreateMessage<unittest::TestAllExtensions>(arena2); |
+ |
+ TestUtil::SetAllExtensions(message1); |
+ TestUtil::SetAllExtensions(message2); |
+ |
+ const Reflection* reflection = message1->GetReflection(); |
+ vector<const FieldDescriptor*> fields; |
+ reflection->ListFields(*message1, &fields); |
+ reflection->SwapFields(message1, message2, fields); |
+ TestUtil::ExpectAllExtensionsSet(*message1); |
+ TestUtil::ExpectAllExtensionsSet(*message2); |
+ delete arena2; |
+ TestUtil::ExpectAllExtensionsSet(*message1); |
+} |
+ |
+TEST(ExtensionSetTest, SwapExtensionWithSelf) { |
+ unittest::TestAllExtensions message1; |
+ |
+ TestUtil::SetAllExtensions(&message1); |
+ |
+ vector<const FieldDescriptor*> fields; |
+ const Reflection* reflection = message1.GetReflection(); |
+ reflection->ListFields(message1, &fields); |
+ reflection->SwapFields(&message1, &message1, fields); |
+ |
+ TestUtil::ExpectAllExtensionsSet(message1); |
+} |
+ |
TEST(ExtensionSetTest, SerializationToArray) { |
// Serialize as TestAllExtensions and parse as TestAllTypes to insure wire |
// compatibility of extensions. |
@@ -353,6 +541,7 @@ TEST(ExtensionSetTest, Parsing) { |
TestUtil::SetAllFields(&source); |
source.SerializeToString(&data); |
EXPECT_TRUE(destination.ParseFromString(data)); |
+ TestUtil::SetOneofFields(&destination); |
TestUtil::ExpectAllExtensionsSet(destination); |
} |
@@ -368,6 +557,48 @@ TEST(ExtensionSetTest, PackedParsing) { |
TestUtil::ExpectPackedExtensionsSet(destination); |
} |
+TEST(ExtensionSetTest, PackedToUnpackedParsing) { |
+ unittest::TestPackedTypes source; |
+ unittest::TestUnpackedExtensions destination; |
+ string data; |
+ |
+ TestUtil::SetPackedFields(&source); |
+ source.SerializeToString(&data); |
+ EXPECT_TRUE(destination.ParseFromString(data)); |
+ TestUtil::ExpectUnpackedExtensionsSet(destination); |
+ |
+ // Reserialize |
+ unittest::TestUnpackedTypes unpacked; |
+ TestUtil::SetUnpackedFields(&unpacked); |
+ EXPECT_TRUE(unpacked.SerializeAsString() == destination.SerializeAsString()); |
+ |
+ // Make sure we can add extensions. |
+ destination.AddExtension(unittest::unpacked_int32_extension, 1); |
+ destination.AddExtension(unittest::unpacked_enum_extension, |
+ protobuf_unittest::FOREIGN_BAR); |
+} |
+ |
+TEST(ExtensionSetTest, UnpackedToPackedParsing) { |
+ unittest::TestUnpackedTypes source; |
+ unittest::TestPackedExtensions destination; |
+ string data; |
+ |
+ TestUtil::SetUnpackedFields(&source); |
+ source.SerializeToString(&data); |
+ EXPECT_TRUE(destination.ParseFromString(data)); |
+ TestUtil::ExpectPackedExtensionsSet(destination); |
+ |
+ // Reserialize |
+ unittest::TestPackedTypes packed; |
+ TestUtil::SetPackedFields(&packed); |
+ EXPECT_TRUE(packed.SerializeAsString() == destination.SerializeAsString()); |
+ |
+ // Make sure we can add extensions. |
+ destination.AddExtension(unittest::packed_int32_extension, 1); |
+ destination.AddExtension(unittest::packed_enum_extension, |
+ protobuf_unittest::FOREIGN_BAR); |
+} |
+ |
TEST(ExtensionSetTest, IsInitialized) { |
// Test that IsInitialized() returns false if required fields in nested |
// extensions are missing. |
@@ -550,6 +781,256 @@ TEST(ExtensionSetTest, SpaceUsedExcludingSelf) { |
} |
} |
+// N.B.: We do not test range-based for here because we remain C++03 compatible. |
+template<typename T, typename M, typename ID> |
+inline T SumAllExtensions(const M& message, ID extension, T zero) { |
+ T sum = zero; |
+ typename RepeatedField<T>::const_iterator iter = |
+ message.GetRepeatedExtension(extension).begin(); |
+ typename RepeatedField<T>::const_iterator end = |
+ message.GetRepeatedExtension(extension).end(); |
+ for (; iter != end; ++iter) { |
+ sum += *iter; |
+ } |
+ return sum; |
+} |
+ |
+template<typename T, typename M, typename ID> |
+inline void IncAllExtensions(M* message, ID extension, |
+ T val) { |
+ typename RepeatedField<T>::iterator iter = |
+ message->MutableRepeatedExtension(extension)->begin(); |
+ typename RepeatedField<T>::iterator end = |
+ message->MutableRepeatedExtension(extension)->end(); |
+ for (; iter != end; ++iter) { |
+ *iter += val; |
+ } |
+} |
+ |
+TEST(ExtensionSetTest, RepeatedFields) { |
+ unittest::TestAllExtensions message; |
+ |
+ // Test empty repeated-field case (b/12926163) |
+ ASSERT_EQ(0, message.GetRepeatedExtension( |
+ unittest::repeated_int32_extension).size()); |
+ ASSERT_EQ(0, message.GetRepeatedExtension( |
+ unittest::repeated_nested_enum_extension).size()); |
+ ASSERT_EQ(0, message.GetRepeatedExtension( |
+ unittest::repeated_string_extension).size()); |
+ ASSERT_EQ(0, message.GetRepeatedExtension( |
+ unittest::repeated_nested_message_extension).size()); |
+ |
+ unittest::TestAllTypes::NestedMessage nested_message; |
+ nested_message.set_bb(42); |
+ unittest::TestAllTypes::NestedEnum nested_enum = |
+ unittest::TestAllTypes::NestedEnum_MIN; |
+ |
+ for (int i = 0; i < 10; ++i) { |
+ message.AddExtension(unittest::repeated_int32_extension, 1); |
+ message.AddExtension(unittest::repeated_int64_extension, 2); |
+ message.AddExtension(unittest::repeated_uint32_extension, 3); |
+ message.AddExtension(unittest::repeated_uint64_extension, 4); |
+ message.AddExtension(unittest::repeated_sint32_extension, 5); |
+ message.AddExtension(unittest::repeated_sint64_extension, 6); |
+ message.AddExtension(unittest::repeated_fixed32_extension, 7); |
+ message.AddExtension(unittest::repeated_fixed64_extension, 8); |
+ message.AddExtension(unittest::repeated_sfixed32_extension, 7); |
+ message.AddExtension(unittest::repeated_sfixed64_extension, 8); |
+ message.AddExtension(unittest::repeated_float_extension, 9.0); |
+ message.AddExtension(unittest::repeated_double_extension, 10.0); |
+ message.AddExtension(unittest::repeated_bool_extension, true); |
+ message.AddExtension(unittest::repeated_nested_enum_extension, nested_enum); |
+ message.AddExtension(unittest::repeated_string_extension, |
+ ::std::string("test")); |
+ message.AddExtension(unittest::repeated_bytes_extension, |
+ ::std::string("test\xFF")); |
+ message.AddExtension( |
+ unittest::repeated_nested_message_extension)->CopyFrom(nested_message); |
+ message.AddExtension(unittest::repeated_nested_enum_extension, |
+ nested_enum); |
+ } |
+ |
+ ASSERT_EQ(10, SumAllExtensions<int32>( |
+ message, unittest::repeated_int32_extension, 0)); |
+ IncAllExtensions<int32>( |
+ &message, unittest::repeated_int32_extension, 1); |
+ ASSERT_EQ(20, SumAllExtensions<int32>( |
+ message, unittest::repeated_int32_extension, 0)); |
+ |
+ ASSERT_EQ(20, SumAllExtensions<int64>( |
+ message, unittest::repeated_int64_extension, 0)); |
+ IncAllExtensions<int64>( |
+ &message, unittest::repeated_int64_extension, 1); |
+ ASSERT_EQ(30, SumAllExtensions<int64>( |
+ message, unittest::repeated_int64_extension, 0)); |
+ |
+ ASSERT_EQ(30, SumAllExtensions<uint32>( |
+ message, unittest::repeated_uint32_extension, 0)); |
+ IncAllExtensions<uint32>( |
+ &message, unittest::repeated_uint32_extension, 1); |
+ ASSERT_EQ(40, SumAllExtensions<uint32>( |
+ message, unittest::repeated_uint32_extension, 0)); |
+ |
+ ASSERT_EQ(40, SumAllExtensions<uint64>( |
+ message, unittest::repeated_uint64_extension, 0)); |
+ IncAllExtensions<uint64>( |
+ &message, unittest::repeated_uint64_extension, 1); |
+ ASSERT_EQ(50, SumAllExtensions<uint64>( |
+ message, unittest::repeated_uint64_extension, 0)); |
+ |
+ ASSERT_EQ(50, SumAllExtensions<int32>( |
+ message, unittest::repeated_sint32_extension, 0)); |
+ IncAllExtensions<int32>( |
+ &message, unittest::repeated_sint32_extension, 1); |
+ ASSERT_EQ(60, SumAllExtensions<int32>( |
+ message, unittest::repeated_sint32_extension, 0)); |
+ |
+ ASSERT_EQ(60, SumAllExtensions<int64>( |
+ message, unittest::repeated_sint64_extension, 0)); |
+ IncAllExtensions<int64>( |
+ &message, unittest::repeated_sint64_extension, 1); |
+ ASSERT_EQ(70, SumAllExtensions<int64>( |
+ message, unittest::repeated_sint64_extension, 0)); |
+ |
+ ASSERT_EQ(70, SumAllExtensions<uint32>( |
+ message, unittest::repeated_fixed32_extension, 0)); |
+ IncAllExtensions<uint32>( |
+ &message, unittest::repeated_fixed32_extension, 1); |
+ ASSERT_EQ(80, SumAllExtensions<uint32>( |
+ message, unittest::repeated_fixed32_extension, 0)); |
+ |
+ ASSERT_EQ(80, SumAllExtensions<uint64>( |
+ message, unittest::repeated_fixed64_extension, 0)); |
+ IncAllExtensions<uint64>( |
+ &message, unittest::repeated_fixed64_extension, 1); |
+ ASSERT_EQ(90, SumAllExtensions<uint64>( |
+ message, unittest::repeated_fixed64_extension, 0)); |
+ |
+ // Usually, floating-point arithmetic cannot be trusted to be exact, so it is |
+ // a Bad Idea to assert equality in a test like this. However, we're dealing |
+ // with integers with a small number of significant mantissa bits, so we |
+ // should actually have exact precision here. |
+ ASSERT_EQ(90, SumAllExtensions<float>( |
+ message, unittest::repeated_float_extension, 0)); |
+ IncAllExtensions<float>( |
+ &message, unittest::repeated_float_extension, 1); |
+ ASSERT_EQ(100, SumAllExtensions<float>( |
+ message, unittest::repeated_float_extension, 0)); |
+ |
+ ASSERT_EQ(100, SumAllExtensions<double>( |
+ message, unittest::repeated_double_extension, 0)); |
+ IncAllExtensions<double>( |
+ &message, unittest::repeated_double_extension, 1); |
+ ASSERT_EQ(110, SumAllExtensions<double>( |
+ message, unittest::repeated_double_extension, 0)); |
+ |
+ RepeatedPtrField< ::std::string>::iterator string_iter; |
+ RepeatedPtrField< ::std::string>::iterator string_end; |
+ for (string_iter = message.MutableRepeatedExtension( |
+ unittest::repeated_string_extension)->begin(), |
+ string_end = message.MutableRepeatedExtension( |
+ unittest::repeated_string_extension)->end(); |
+ string_iter != string_end; ++string_iter) { |
+ *string_iter += "test"; |
+ } |
+ RepeatedPtrField< ::std::string>::const_iterator string_const_iter; |
+ RepeatedPtrField< ::std::string>::const_iterator string_const_end; |
+ for (string_const_iter = message.GetRepeatedExtension( |
+ unittest::repeated_string_extension).begin(), |
+ string_const_end = message.GetRepeatedExtension( |
+ unittest::repeated_string_extension).end(); |
+ string_iter != string_end; ++string_iter) { |
+ ASSERT_TRUE(*string_iter == "testtest"); |
+ } |
+ |
+ RepeatedField<unittest::TestAllTypes_NestedEnum>::iterator enum_iter; |
+ RepeatedField<unittest::TestAllTypes_NestedEnum>::iterator enum_end; |
+ for (enum_iter = message.MutableRepeatedExtension( |
+ unittest::repeated_nested_enum_extension)->begin(), |
+ enum_end = message.MutableRepeatedExtension( |
+ unittest::repeated_nested_enum_extension)->end(); |
+ enum_iter != enum_end; ++enum_iter) { |
+ *enum_iter = unittest::TestAllTypes::NestedEnum_MAX; |
+ } |
+ RepeatedField<unittest::TestAllTypes_NestedEnum>::const_iterator |
+ enum_const_iter; |
+ RepeatedField<unittest::TestAllTypes_NestedEnum>::const_iterator |
+ enum_const_end; |
+ for (enum_const_iter = message.GetRepeatedExtension( |
+ unittest::repeated_nested_enum_extension).begin(), |
+ enum_const_end = message.GetRepeatedExtension( |
+ unittest::repeated_nested_enum_extension).end(); |
+ enum_iter != enum_end; ++enum_iter) { |
+ ASSERT_EQ(*enum_const_iter, unittest::TestAllTypes::NestedEnum_MAX); |
+ } |
+ |
+ RepeatedPtrField<unittest::TestAllTypes_NestedMessage>::iterator |
+ msg_iter; |
+ RepeatedPtrField<unittest::TestAllTypes_NestedMessage>::iterator |
+ msg_end; |
+ for (msg_iter = message.MutableRepeatedExtension( |
+ unittest::repeated_nested_message_extension)->begin(), |
+ msg_end = message.MutableRepeatedExtension( |
+ unittest::repeated_nested_message_extension)->end(); |
+ msg_iter != msg_end; ++msg_iter) { |
+ msg_iter->set_bb(1234); |
+ } |
+ RepeatedPtrField<unittest::TestAllTypes_NestedMessage>:: |
+ const_iterator msg_const_iter; |
+ RepeatedPtrField<unittest::TestAllTypes_NestedMessage>:: |
+ const_iterator msg_const_end; |
+ for (msg_const_iter = message.GetRepeatedExtension( |
+ unittest::repeated_nested_message_extension).begin(), |
+ msg_const_end = message.GetRepeatedExtension( |
+ unittest::repeated_nested_message_extension).end(); |
+ msg_const_iter != msg_const_end; ++msg_const_iter) { |
+ ASSERT_EQ(msg_const_iter->bb(), 1234); |
+ } |
+ |
+ // Test range-based for as well, but only if compiled as C++11. |
+#if __cplusplus >= 201103L |
+ // Test one primitive field. |
+ for (auto& x : *message.MutableRepeatedExtension( |
+ unittest::repeated_int32_extension)) { |
+ x = 4321; |
+ } |
+ for (const auto& x : message.GetRepeatedExtension( |
+ unittest::repeated_int32_extension)) { |
+ ASSERT_EQ(x, 4321); |
+ } |
+ // Test one string field. |
+ for (auto& x : *message.MutableRepeatedExtension( |
+ unittest::repeated_string_extension)) { |
+ x = "test_range_based_for"; |
+ } |
+ for (const auto& x : message.GetRepeatedExtension( |
+ unittest::repeated_string_extension)) { |
+ ASSERT_TRUE(x == "test_range_based_for"); |
+ } |
+ // Test one message field. |
+ for (auto& x : *message.MutableRepeatedExtension( |
+ unittest::repeated_nested_message_extension)) { |
+ x.set_bb(4321); |
+ } |
+ for (const auto& x : *message.MutableRepeatedExtension( |
+ unittest::repeated_nested_message_extension)) { |
+ ASSERT_EQ(x.bb(), 4321); |
+ } |
+#endif |
+} |
+ |
+// From b/12926163 |
+TEST(ExtensionSetTest, AbsentExtension) { |
+ unittest::TestAllExtensions message; |
+ message.MutableRepeatedExtension(unittest::repeated_nested_message_extension) |
+ ->Add()->set_bb(123); |
+ ASSERT_EQ(1, message.ExtensionSize( |
+ unittest::repeated_nested_message_extension)); |
+ EXPECT_EQ( |
+ 123, message.GetExtension( |
+ unittest::repeated_nested_message_extension, 0).bb()); |
+} |
+ |
#ifdef PROTOBUF_HAS_DEATH_TEST |
TEST(ExtensionSetTest, InvalidEnumDeath) { |