hpb: refactor repeated tests to repeated_test.cc
PiperOrigin-RevId: 698015352
diff --git a/csharp/src/Google.Protobuf/Reflection/FeatureSetDescriptor.g.cs b/csharp/src/Google.Protobuf/Reflection/FeatureSetDescriptor.g.cs
deleted file mode 100644
index 208ce1f..0000000
--- a/csharp/src/Google.Protobuf/Reflection/FeatureSetDescriptor.g.cs
+++ /dev/null
@@ -1,17 +0,0 @@
-#region Copyright notice and license
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-//
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file or at
-// https://developers.google.com/open-source/licenses/bsd
-#endregion
-
-namespace Google.Protobuf.Reflection;
-
-internal sealed partial class FeatureSetDescriptor
-{
- // Canonical serialized form of the edition defaults, generated by embed_edition_defaults.
- private const string DefaultsBase64 =
- "ChMYhAciACoMCAEQAhgCIAMoATACChMY5wciACoMCAIQARgBIAIoATABChMY6AciDAgBEAEYASACKAEwASoAIOYHKOgH";
-}
diff --git a/hpb_generator/tests/repeated_test.cc b/hpb_generator/tests/repeated_test.cc
new file mode 100644
index 0000000..df9d119
--- /dev/null
+++ b/hpb_generator/tests/repeated_test.cc
@@ -0,0 +1,318 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2024 Google LLC. All rights reserved.
+//
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file or at
+// https://developers.google.com/open-source/licenses/bsd
+
+#include <gmock/gmock.h>
+#include <gtest/gtest.h>
+#include "google/protobuf/compiler/hpb/tests/child_model.upb.proto.h"
+#include "google/protobuf/compiler/hpb/tests/test_extension.upb.proto.h"
+#include "google/protobuf/compiler/hpb/tests/test_model.upb.proto.h"
+#include "google/protobuf/hpb/requires.h"
+
+namespace {
+
+using ::hpb::internal::Requires;
+using ::hpb_unittest::protos::ChildModel1;
+using ::hpb_unittest::protos::TestModel;
+using ::testing::ElementsAre;
+
+const char kTestStr1[] = "abcdefg";
+const char kTestStr2[] = "just another test string";
+
+TEST(CppGeneratedCode, RepeatedMessages) {
+ ::hpb::Arena arena;
+ auto test_model = ::hpb::CreateMessage<TestModel>(arena);
+ EXPECT_EQ(0, test_model.child_models_size());
+ // Should be able to clear repeated field when empty.
+ test_model.mutable_child_models()->clear();
+ EXPECT_EQ(0, test_model.child_models_size());
+ // Add 2 children.
+ auto new_child = test_model.add_child_models();
+ EXPECT_EQ(true, new_child.ok());
+ new_child.value()->set_child_str1(kTestStr1);
+ new_child = test_model.add_child_models();
+ EXPECT_EQ(true, new_child.ok());
+ new_child.value()->set_child_str1(kTestStr2);
+ EXPECT_EQ(2, test_model.child_models_size());
+ // Mutable access.
+ auto mutable_first = test_model.mutable_child_models(0);
+ EXPECT_EQ(mutable_first->child_str1(), kTestStr1);
+ mutable_first->set_child_str1("change1");
+ auto mutable_second = test_model.mutable_child_models(1);
+ EXPECT_EQ(mutable_second->child_str1(), kTestStr2);
+ mutable_second->set_child_str1("change2");
+ // Check mutations using views.
+ auto view_first = test_model.child_models(0);
+ EXPECT_EQ(view_first->child_str1(), "change1");
+ auto view_second = test_model.child_models(1);
+ EXPECT_EQ(view_second->child_str1(), "change2");
+}
+
+TEST(CppGeneratedCode, RepeatedScalar) {
+ ::hpb::Arena arena;
+ auto test_model = ::hpb::CreateMessage<TestModel>(arena);
+ EXPECT_EQ(0, test_model.value_array_size());
+ // Should be able to clear repeated field when empty.
+ test_model.mutable_value_array()->clear();
+ EXPECT_EQ(0, test_model.value_array_size());
+ // Add 2 children.
+ EXPECT_EQ(true, test_model.add_value_array(5));
+ EXPECT_EQ(true, test_model.add_value_array(6));
+ EXPECT_EQ(2, test_model.value_array_size());
+ EXPECT_EQ(5, test_model.value_array(0));
+ EXPECT_EQ(6, test_model.value_array(1));
+ EXPECT_EQ(true, test_model.resize_value_array(3));
+ EXPECT_EQ(3, test_model.value_array_size());
+ test_model.set_value_array(2, 7);
+ EXPECT_EQ(5, test_model.value_array(0));
+ EXPECT_EQ(6, test_model.value_array(1));
+ EXPECT_EQ(7, test_model.value_array(2));
+}
+
+TEST(CppGeneratedCode, RepeatedFieldClear) {
+ ::hpb::Arena arena;
+ auto test_model = ::hpb::CreateMessage<TestModel>(arena);
+ test_model.mutable_value_array()->push_back(5);
+ test_model.mutable_value_array()->push_back(16);
+ test_model.mutable_value_array()->push_back(27);
+ ASSERT_EQ(test_model.mutable_value_array()->size(), 3);
+ test_model.mutable_value_array()->clear();
+ EXPECT_EQ(test_model.mutable_value_array()->size(), 0);
+}
+
+TEST(CppGeneratedCode, RepeatedFieldProxyForScalars) {
+ ::hpb::Arena arena;
+ auto test_model = ::hpb::CreateMessage<TestModel>(arena);
+ EXPECT_EQ(0, test_model.value_array().size());
+ EXPECT_EQ(0, test_model.mutable_value_array()->size());
+
+ test_model.mutable_value_array()->push_back(5);
+ test_model.mutable_value_array()->push_back(16);
+ test_model.mutable_value_array()->push_back(27);
+
+ ASSERT_EQ(test_model.mutable_value_array()->size(), 3);
+ EXPECT_EQ((*test_model.mutable_value_array())[0], 5);
+ EXPECT_EQ((*test_model.mutable_value_array())[1], 16);
+ EXPECT_EQ((*test_model.mutable_value_array())[2], 27);
+
+ const auto value_array = test_model.value_array();
+ ASSERT_EQ(value_array.size(), 3);
+ EXPECT_EQ(value_array[0], 5);
+ EXPECT_EQ(value_array[1], 16);
+ EXPECT_EQ(value_array[2], 27);
+
+ EXPECT_THAT(value_array, ElementsAre(5, 16, 27));
+
+ EXPECT_THAT(std::vector(value_array.begin(), value_array.end()),
+ ElementsAre(5, 16, 27));
+ EXPECT_THAT(std::vector(value_array.cbegin(), value_array.cend()),
+ ElementsAre(5, 16, 27));
+ EXPECT_THAT(std::vector(value_array.rbegin(), value_array.rend()),
+ ElementsAre(27, 16, 5));
+ EXPECT_THAT(std::vector(value_array.crbegin(), value_array.crend()),
+ ElementsAre(27, 16, 5));
+}
+
+TEST(CppGeneratedCode, RepeatedScalarIterator) {
+ ::hpb::Arena arena;
+ auto test_model = ::hpb::CreateMessage<TestModel>(arena);
+ test_model.mutable_value_array()->push_back(5);
+ test_model.mutable_value_array()->push_back(16);
+ test_model.mutable_value_array()->push_back(27);
+ int sum = 0;
+ // Access by value.
+ const ::hpb::RepeatedField<int32_t>::CProxy rep1 = test_model.value_array();
+ for (auto i : rep1) {
+ sum += i;
+ }
+ EXPECT_EQ(sum, 5 + 16 + 27);
+ // Access by const reference.
+ sum = 0;
+ for (const auto& i : *test_model.mutable_value_array()) {
+ sum += i;
+ }
+ EXPECT_EQ(sum, 5 + 16 + 27);
+ // Access by forwarding reference.
+ sum = 0;
+ for (auto&& i : *test_model.mutable_value_array()) {
+ sum += i;
+ }
+ EXPECT_EQ(sum, 5 + 16 + 27);
+ // Test iterator operators.
+ auto begin = test_model.value_array().begin();
+ auto end = test_model.value_array().end();
+ sum = 0;
+ for (auto it = begin; it != end; ++it) {
+ sum += *it;
+ }
+ EXPECT_EQ(sum, 5 + 16 + 27);
+ auto it = begin;
+ ++it;
+ EXPECT_TRUE(begin < it);
+ EXPECT_TRUE(begin <= it);
+ it = end;
+ EXPECT_TRUE(it == end);
+ EXPECT_TRUE(it > begin);
+ EXPECT_TRUE(it >= begin);
+ EXPECT_TRUE(it != begin);
+ // difference type
+ it = end;
+ --it;
+ --it;
+ EXPECT_EQ(end - it, 2);
+ it = begin;
+ EXPECT_EQ(it[0], 5);
+ EXPECT_EQ(it[1], 16);
+ EXPECT_EQ(it[2], 27);
+ // ValueProxy.
+ sum = 0;
+ for (::hpb::RepeatedField<int32_t>::ValueCProxy c :
+ test_model.value_array()) {
+ sum += c;
+ }
+ EXPECT_EQ(sum, 5 + 16 + 27);
+ sum = 0;
+ for (::hpb::RepeatedField<int32_t>::ValueProxy c :
+ *test_model.mutable_value_array()) {
+ sum += c;
+ }
+ EXPECT_EQ(sum, 5 + 16 + 27);
+}
+
+TEST(CppGeneratedCode, RepeatedFieldProxyForStrings) {
+ ::hpb::Arena arena;
+ auto test_model = ::hpb::CreateMessage<TestModel>(arena);
+ EXPECT_EQ(0, test_model.repeated_string().size());
+ EXPECT_EQ(0, test_model.mutable_repeated_string()->size());
+
+ test_model.mutable_repeated_string()->push_back("a");
+ test_model.mutable_repeated_string()->push_back("b");
+ test_model.mutable_repeated_string()->push_back("c");
+
+ ASSERT_EQ(test_model.repeated_string().size(), 3);
+ EXPECT_EQ(test_model.repeated_string()[0], "a");
+ EXPECT_EQ(test_model.repeated_string()[1], "b");
+ EXPECT_EQ(test_model.repeated_string()[2], "c");
+
+ EXPECT_THAT(test_model.repeated_string(), ElementsAre("a", "b", "c"));
+ EXPECT_THAT(*test_model.mutable_repeated_string(),
+ ElementsAre("a", "b", "c"));
+
+ ASSERT_EQ(test_model.mutable_repeated_string()->size(), 3);
+ EXPECT_EQ((*test_model.mutable_repeated_string())[0], "a");
+ EXPECT_EQ((*test_model.mutable_repeated_string())[1], "b");
+ EXPECT_EQ((*test_model.mutable_repeated_string())[2], "c");
+
+ // The const accessor can't be used to modify the element
+ EXPECT_FALSE((std::is_assignable<decltype(test_model.repeated_string()[1]),
+ absl::string_view>::value));
+ // But the mutable one is fine.
+ (*test_model.mutable_repeated_string())[1] = "other";
+ EXPECT_THAT(test_model.repeated_string(), ElementsAre("a", "other", "c"));
+
+ test_model.mutable_repeated_string()->clear();
+ EXPECT_EQ(test_model.mutable_repeated_string()->size(), 0);
+}
+
+TEST(CppGeneratedCode, RepeatedFieldProxyForMessages) {
+ ::hpb::Arena arena;
+ auto test_model = ::hpb::CreateMessage<TestModel>(arena);
+ EXPECT_EQ(0, test_model.child_models().size());
+ ChildModel1 child1;
+ child1.set_child_str1(kTestStr1);
+ test_model.mutable_child_models()->push_back(child1);
+ ChildModel1 child2;
+ child2.set_child_str1(kTestStr2);
+ test_model.mutable_child_models()->push_back(std::move(child2));
+
+ int i = 0;
+ for (auto child : test_model.child_models()) {
+ EXPECT_FALSE(Requires<decltype(child)>(
+ [](auto&& x) -> decltype(x.set_child_str1("")) {}));
+ if (i++ == 0) {
+ EXPECT_EQ(child.child_str1(), kTestStr1);
+ } else {
+ EXPECT_EQ(child.child_str1(), kTestStr2);
+ }
+ }
+
+ i = 0;
+ for (const auto& child : *test_model.mutable_child_models()) {
+ if (i++ == 0) {
+ EXPECT_EQ(child.child_str1(), kTestStr1);
+ } else {
+ EXPECT_EQ(child.child_str1(), kTestStr2);
+ }
+ }
+
+ using testing::_;
+ EXPECT_THAT(test_model.child_models(), ElementsAre(_, _));
+
+ EXPECT_EQ(test_model.child_models().size(), 2);
+ EXPECT_EQ(test_model.child_models()[0].child_str1(), kTestStr1);
+ EXPECT_EQ(test_model.child_models()[1].child_str1(), kTestStr2);
+ EXPECT_EQ((*test_model.mutable_child_models())[0].child_str1(), kTestStr1);
+ EXPECT_EQ((*test_model.mutable_child_models())[1].child_str1(), kTestStr2);
+ (*test_model.mutable_child_models())[0].set_child_str1("change1");
+ EXPECT_EQ((*test_model.mutable_child_models())[0].child_str1(), "change1");
+ test_model.mutable_child_models()->clear();
+ EXPECT_EQ(test_model.mutable_child_models()->size(), 0);
+}
+
+TEST(CppGeneratedCode, EmptyRepeatedFieldProxyForMessages) {
+ ::hpb::Arena arena;
+ auto test_model = ::hpb::CreateMessage<TestModel>(arena);
+ EXPECT_EQ(0, test_model.child_models().size());
+ ChildModel1 child1;
+ child1.set_child_str1(kTestStr1);
+
+ EXPECT_EQ(test_model.child_models().size(), 0);
+ EXPECT_EQ(std::distance(test_model.child_models().begin(),
+ test_model.child_models().end()),
+ 0);
+}
+
+TEST(CppGeneratedCode, RepeatedFieldProxyForMessagesIndexOperator) {
+ ::hpb::Arena arena;
+ auto test_model = ::hpb::CreateMessage<TestModel>(arena);
+ EXPECT_EQ(0, test_model.child_models().size());
+ ChildModel1 child1;
+ child1.set_child_str1(kTestStr1);
+ test_model.mutable_child_models()->push_back(child1);
+ ChildModel1 child2;
+
+ child2.set_child_str1(kTestStr2);
+ test_model.mutable_child_models()->push_back(std::move(child2));
+ ASSERT_EQ(test_model.child_models().size(), 2);
+
+ // test_model.child_models()[0].set_child_str1("change1");
+ (*test_model.mutable_child_models())[0].set_child_str1("change1");
+ EXPECT_EQ((*test_model.mutable_child_models())[0].child_str1(), "change1");
+}
+
+TEST(CppGeneratedCode, RepeatedStrings) {
+ ::hpb::Arena arena;
+ auto test_model = ::hpb::CreateMessage<TestModel>(arena);
+ EXPECT_EQ(0, test_model.repeated_string_size());
+ // Should be able to clear repeated field when empty.
+ test_model.mutable_repeated_string()->clear();
+ EXPECT_EQ(0, test_model.repeated_string_size());
+ // Add 2 children.
+ EXPECT_EQ(true, test_model.add_repeated_string("Hello"));
+ EXPECT_EQ(true, test_model.add_repeated_string("World"));
+ EXPECT_EQ(2, test_model.repeated_string_size());
+ EXPECT_EQ("Hello", test_model.repeated_string(0));
+ EXPECT_EQ("World", test_model.repeated_string(1));
+ EXPECT_EQ(true, test_model.resize_repeated_string(3));
+ EXPECT_EQ(3, test_model.repeated_string_size());
+ test_model.set_repeated_string(2, "Test");
+ EXPECT_EQ("Hello", test_model.repeated_string(0));
+ EXPECT_EQ("World", test_model.repeated_string(1));
+ EXPECT_EQ("Test", test_model.repeated_string(2));
+}
+
+
+} // namespace
diff --git a/hpb_generator/tests/test_generated.cc b/hpb_generator/tests/test_generated.cc
index ac37063..86e4de0 100644
--- a/hpb_generator/tests/test_generated.cc
+++ b/hpb_generator/tests/test_generated.cc
@@ -10,7 +10,6 @@
#include <limits>
#include <memory>
#include <utility>
-#include <vector>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
@@ -25,7 +24,6 @@
#include "google/protobuf/hpb/backend/upb/interop.h"
#include "google/protobuf/hpb/hpb.h"
#include "google/protobuf/hpb/ptr.h"
-#include "google/protobuf/hpb/repeated_field.h"
#include "google/protobuf/hpb/requires.h"
#include "upb/mem/arena.hpp"
@@ -44,7 +42,6 @@
using ::hpb_unittest::protos::TestModel_Category_IMAGES;
using ::hpb_unittest::protos::TestModel_Category_NEWS;
using ::hpb_unittest::protos::TestModel_Category_VIDEO;
-using ::testing::ElementsAre;
TEST(CppGeneratedCode, Constructor) { TestModel test_model; }
@@ -331,298 +328,6 @@
EXPECT_EQ(true, mutable_nested_child->has_nested_child_name());
}
-TEST(CppGeneratedCode, RepeatedMessages) {
- ::hpb::Arena arena;
- auto test_model = ::hpb::CreateMessage<TestModel>(arena);
- EXPECT_EQ(0, test_model.child_models_size());
- // Should be able to clear repeated field when empty.
- test_model.mutable_child_models()->clear();
- EXPECT_EQ(0, test_model.child_models_size());
- // Add 2 children.
- auto new_child = test_model.add_child_models();
- EXPECT_EQ(true, new_child.ok());
- new_child.value()->set_child_str1(kTestStr1);
- new_child = test_model.add_child_models();
- EXPECT_EQ(true, new_child.ok());
- new_child.value()->set_child_str1(kTestStr2);
- EXPECT_EQ(2, test_model.child_models_size());
- // Mutable access.
- auto mutable_first = test_model.mutable_child_models(0);
- EXPECT_EQ(mutable_first->child_str1(), kTestStr1);
- mutable_first->set_child_str1("change1");
- auto mutable_second = test_model.mutable_child_models(1);
- EXPECT_EQ(mutable_second->child_str1(), kTestStr2);
- mutable_second->set_child_str1("change2");
- // Check mutations using views.
- auto view_first = test_model.child_models(0);
- EXPECT_EQ(view_first->child_str1(), "change1");
- auto view_second = test_model.child_models(1);
- EXPECT_EQ(view_second->child_str1(), "change2");
-}
-
-TEST(CppGeneratedCode, RepeatedScalar) {
- ::hpb::Arena arena;
- auto test_model = ::hpb::CreateMessage<TestModel>(arena);
- EXPECT_EQ(0, test_model.value_array_size());
- // Should be able to clear repeated field when empty.
- test_model.mutable_value_array()->clear();
- EXPECT_EQ(0, test_model.value_array_size());
- // Add 2 children.
- EXPECT_EQ(true, test_model.add_value_array(5));
- EXPECT_EQ(true, test_model.add_value_array(6));
- EXPECT_EQ(2, test_model.value_array_size());
- EXPECT_EQ(5, test_model.value_array(0));
- EXPECT_EQ(6, test_model.value_array(1));
- EXPECT_EQ(true, test_model.resize_value_array(3));
- EXPECT_EQ(3, test_model.value_array_size());
- test_model.set_value_array(2, 7);
- EXPECT_EQ(5, test_model.value_array(0));
- EXPECT_EQ(6, test_model.value_array(1));
- EXPECT_EQ(7, test_model.value_array(2));
-}
-
-TEST(CppGeneratedCode, RepeatedFieldClear) {
- ::hpb::Arena arena;
- auto test_model = ::hpb::CreateMessage<TestModel>(arena);
- test_model.mutable_value_array()->push_back(5);
- test_model.mutable_value_array()->push_back(16);
- test_model.mutable_value_array()->push_back(27);
- ASSERT_EQ(test_model.mutable_value_array()->size(), 3);
- test_model.mutable_value_array()->clear();
- EXPECT_EQ(test_model.mutable_value_array()->size(), 0);
-}
-
-TEST(CppGeneratedCode, RepeatedFieldProxyForScalars) {
- ::hpb::Arena arena;
- auto test_model = ::hpb::CreateMessage<TestModel>(arena);
- EXPECT_EQ(0, test_model.value_array().size());
- EXPECT_EQ(0, test_model.mutable_value_array()->size());
-
- test_model.mutable_value_array()->push_back(5);
- test_model.mutable_value_array()->push_back(16);
- test_model.mutable_value_array()->push_back(27);
-
- ASSERT_EQ(test_model.mutable_value_array()->size(), 3);
- EXPECT_EQ((*test_model.mutable_value_array())[0], 5);
- EXPECT_EQ((*test_model.mutable_value_array())[1], 16);
- EXPECT_EQ((*test_model.mutable_value_array())[2], 27);
-
- const auto value_array = test_model.value_array();
- ASSERT_EQ(value_array.size(), 3);
- EXPECT_EQ(value_array[0], 5);
- EXPECT_EQ(value_array[1], 16);
- EXPECT_EQ(value_array[2], 27);
-
- EXPECT_THAT(value_array, ElementsAre(5, 16, 27));
-
- EXPECT_THAT(std::vector(value_array.begin(), value_array.end()),
- ElementsAre(5, 16, 27));
- EXPECT_THAT(std::vector(value_array.cbegin(), value_array.cend()),
- ElementsAre(5, 16, 27));
- EXPECT_THAT(std::vector(value_array.rbegin(), value_array.rend()),
- ElementsAre(27, 16, 5));
- EXPECT_THAT(std::vector(value_array.crbegin(), value_array.crend()),
- ElementsAre(27, 16, 5));
-}
-
-TEST(CppGeneratedCode, RepeatedScalarIterator) {
- ::hpb::Arena arena;
- auto test_model = ::hpb::CreateMessage<TestModel>(arena);
- test_model.mutable_value_array()->push_back(5);
- test_model.mutable_value_array()->push_back(16);
- test_model.mutable_value_array()->push_back(27);
- int sum = 0;
- // Access by value.
- const ::hpb::RepeatedField<int32_t>::CProxy rep1 = test_model.value_array();
- for (auto i : rep1) {
- sum += i;
- }
- EXPECT_EQ(sum, 5 + 16 + 27);
- // Access by const reference.
- sum = 0;
- for (const auto& i : *test_model.mutable_value_array()) {
- sum += i;
- }
- EXPECT_EQ(sum, 5 + 16 + 27);
- // Access by forwarding reference.
- sum = 0;
- for (auto&& i : *test_model.mutable_value_array()) {
- sum += i;
- }
- EXPECT_EQ(sum, 5 + 16 + 27);
- // Test iterator operators.
- auto begin = test_model.value_array().begin();
- auto end = test_model.value_array().end();
- sum = 0;
- for (auto it = begin; it != end; ++it) {
- sum += *it;
- }
- EXPECT_EQ(sum, 5 + 16 + 27);
- auto it = begin;
- ++it;
- EXPECT_TRUE(begin < it);
- EXPECT_TRUE(begin <= it);
- it = end;
- EXPECT_TRUE(it == end);
- EXPECT_TRUE(it > begin);
- EXPECT_TRUE(it >= begin);
- EXPECT_TRUE(it != begin);
- // difference type
- it = end;
- --it;
- --it;
- EXPECT_EQ(end - it, 2);
- it = begin;
- EXPECT_EQ(it[0], 5);
- EXPECT_EQ(it[1], 16);
- EXPECT_EQ(it[2], 27);
- // ValueProxy.
- sum = 0;
- for (::hpb::RepeatedField<int32_t>::ValueCProxy c :
- test_model.value_array()) {
- sum += c;
- }
- EXPECT_EQ(sum, 5 + 16 + 27);
- sum = 0;
- for (::hpb::RepeatedField<int32_t>::ValueProxy c :
- *test_model.mutable_value_array()) {
- sum += c;
- }
- EXPECT_EQ(sum, 5 + 16 + 27);
-}
-
-TEST(CppGeneratedCode, RepeatedFieldProxyForStrings) {
- ::hpb::Arena arena;
- auto test_model = ::hpb::CreateMessage<TestModel>(arena);
- EXPECT_EQ(0, test_model.repeated_string().size());
- EXPECT_EQ(0, test_model.mutable_repeated_string()->size());
-
- test_model.mutable_repeated_string()->push_back("a");
- test_model.mutable_repeated_string()->push_back("b");
- test_model.mutable_repeated_string()->push_back("c");
-
- ASSERT_EQ(test_model.repeated_string().size(), 3);
- EXPECT_EQ(test_model.repeated_string()[0], "a");
- EXPECT_EQ(test_model.repeated_string()[1], "b");
- EXPECT_EQ(test_model.repeated_string()[2], "c");
-
- EXPECT_THAT(test_model.repeated_string(), ElementsAre("a", "b", "c"));
- EXPECT_THAT(*test_model.mutable_repeated_string(),
- ElementsAre("a", "b", "c"));
-
- ASSERT_EQ(test_model.mutable_repeated_string()->size(), 3);
- EXPECT_EQ((*test_model.mutable_repeated_string())[0], "a");
- EXPECT_EQ((*test_model.mutable_repeated_string())[1], "b");
- EXPECT_EQ((*test_model.mutable_repeated_string())[2], "c");
-
- // The const accessor can't be used to modify the element
- EXPECT_FALSE((std::is_assignable<decltype(test_model.repeated_string()[1]),
- absl::string_view>::value));
- // But the mutable one is fine.
- (*test_model.mutable_repeated_string())[1] = "other";
- EXPECT_THAT(test_model.repeated_string(), ElementsAre("a", "other", "c"));
-
- test_model.mutable_repeated_string()->clear();
- EXPECT_EQ(test_model.mutable_repeated_string()->size(), 0);
-}
-
-TEST(CppGeneratedCode, RepeatedFieldProxyForMessages) {
- ::hpb::Arena arena;
- auto test_model = ::hpb::CreateMessage<TestModel>(arena);
- EXPECT_EQ(0, test_model.child_models().size());
- ChildModel1 child1;
- child1.set_child_str1(kTestStr1);
- test_model.mutable_child_models()->push_back(child1);
- ChildModel1 child2;
- child2.set_child_str1(kTestStr2);
- test_model.mutable_child_models()->push_back(std::move(child2));
-
- int i = 0;
- for (auto child : test_model.child_models()) {
- EXPECT_FALSE(Requires<decltype(child)>(
- [](auto&& x) -> decltype(x.set_child_str1("")) {}));
- if (i++ == 0) {
- EXPECT_EQ(child.child_str1(), kTestStr1);
- } else {
- EXPECT_EQ(child.child_str1(), kTestStr2);
- }
- }
-
- i = 0;
- for (const auto& child : *test_model.mutable_child_models()) {
- if (i++ == 0) {
- EXPECT_EQ(child.child_str1(), kTestStr1);
- } else {
- EXPECT_EQ(child.child_str1(), kTestStr2);
- }
- }
-
- using testing::_;
- EXPECT_THAT(test_model.child_models(), ElementsAre(_, _));
-
- EXPECT_EQ(test_model.child_models().size(), 2);
- EXPECT_EQ(test_model.child_models()[0].child_str1(), kTestStr1);
- EXPECT_EQ(test_model.child_models()[1].child_str1(), kTestStr2);
- EXPECT_EQ((*test_model.mutable_child_models())[0].child_str1(), kTestStr1);
- EXPECT_EQ((*test_model.mutable_child_models())[1].child_str1(), kTestStr2);
- (*test_model.mutable_child_models())[0].set_child_str1("change1");
- EXPECT_EQ((*test_model.mutable_child_models())[0].child_str1(), "change1");
- test_model.mutable_child_models()->clear();
- EXPECT_EQ(test_model.mutable_child_models()->size(), 0);
-}
-
-TEST(CppGeneratedCode, EmptyRepeatedFieldProxyForMessages) {
- ::hpb::Arena arena;
- auto test_model = ::hpb::CreateMessage<TestModel>(arena);
- EXPECT_EQ(0, test_model.child_models().size());
- ChildModel1 child1;
- child1.set_child_str1(kTestStr1);
-
- EXPECT_EQ(test_model.child_models().size(), 0);
- EXPECT_EQ(std::distance(test_model.child_models().begin(),
- test_model.child_models().end()),
- 0);
-}
-
-TEST(CppGeneratedCode, RepeatedFieldProxyForMessagesIndexOperator) {
- ::hpb::Arena arena;
- auto test_model = ::hpb::CreateMessage<TestModel>(arena);
- EXPECT_EQ(0, test_model.child_models().size());
- ChildModel1 child1;
- child1.set_child_str1(kTestStr1);
- test_model.mutable_child_models()->push_back(child1);
- ChildModel1 child2;
-
- child2.set_child_str1(kTestStr2);
- test_model.mutable_child_models()->push_back(std::move(child2));
- ASSERT_EQ(test_model.child_models().size(), 2);
-
- // test_model.child_models()[0].set_child_str1("change1");
- (*test_model.mutable_child_models())[0].set_child_str1("change1");
- EXPECT_EQ((*test_model.mutable_child_models())[0].child_str1(), "change1");
-}
-
-TEST(CppGeneratedCode, RepeatedStrings) {
- ::hpb::Arena arena;
- auto test_model = ::hpb::CreateMessage<TestModel>(arena);
- EXPECT_EQ(0, test_model.repeated_string_size());
- // Should be able to clear repeated field when empty.
- test_model.mutable_repeated_string()->clear();
- EXPECT_EQ(0, test_model.repeated_string_size());
- // Add 2 children.
- EXPECT_EQ(true, test_model.add_repeated_string("Hello"));
- EXPECT_EQ(true, test_model.add_repeated_string("World"));
- EXPECT_EQ(2, test_model.repeated_string_size());
- EXPECT_EQ("Hello", test_model.repeated_string(0));
- EXPECT_EQ("World", test_model.repeated_string(1));
- EXPECT_EQ(true, test_model.resize_repeated_string(3));
- EXPECT_EQ(3, test_model.repeated_string_size());
- test_model.set_repeated_string(2, "Test");
- EXPECT_EQ("Hello", test_model.repeated_string(0));
- EXPECT_EQ("World", test_model.repeated_string(1));
- EXPECT_EQ("Test", test_model.repeated_string(2));
-}
-
TEST(CppGeneratedCode, MessageMapInt32KeyMessageValue) {
const int key_test_value = 3;
::hpb::Arena arena;