@@ -12230,10 +12230,9 @@ TEST_F(DescriptorPoolFeaturesTest, ResolvesFeaturesFor) {
12230
12230
12231
12231
class DescriptorPoolMemoizationTest : public ::testing::Test {
12232
12232
protected:
12233
- template <typename Func>
12234
- const auto& MemoizeProjection(const DescriptorPool* pool,
12235
- const FieldDescriptor* field, Func func) {
12236
- return pool->MemoizeProjection(field, func);
12233
+ template <typename Desc, typename Func>
12234
+ const auto& MemoizeProjection(const Desc* descriptor, Func func) {
12235
+ return DescriptorPool::MemoizeProjection(descriptor, func);
12237
12236
};
12238
12237
};
12239
12238
@@ -12243,13 +12242,12 @@ TEST_F(DescriptorPoolMemoizationTest, MemoizeProjectionBasic) {
12243
12242
counter++;
12244
12243
return field->full_name();
12245
12244
};
12246
- proto2_unittest::TestAllTypes message;
12247
- const Descriptor* descriptor = message.GetDescriptor();
12245
+ const Descriptor* descriptor = proto2_unittest::TestAllTypes::descriptor();
12248
12246
12249
12247
const auto& name = DescriptorPoolMemoizationTest::MemoizeProjection(
12250
- descriptor->file()->pool(), descriptor-> field(0), name_lambda);
12248
+ descriptor->field(0), name_lambda);
12251
12249
const auto& dupe_name = DescriptorPoolMemoizationTest::MemoizeProjection(
12252
- descriptor->file()->pool(), descriptor-> field(0), name_lambda);
12250
+ descriptor->field(0), name_lambda);
12253
12251
12254
12252
ASSERT_EQ(counter, 1);
12255
12253
ASSERT_EQ(name, "proto2_unittest.TestAllTypes.optional_int32");
@@ -12261,12 +12259,36 @@ TEST_F(DescriptorPoolMemoizationTest, MemoizeProjectionBasic) {
12261
12259
EXPECT_EQ(&name, &dupe_name);
12262
12260
12263
12261
auto other_name = DescriptorPoolMemoizationTest::MemoizeProjection(
12264
- descriptor->file()->pool(), descriptor-> field(1), name_lambda);
12262
+ descriptor->field(1), name_lambda);
12265
12263
12266
12264
ASSERT_EQ(counter, 2);
12267
12265
ASSERT_NE(other_name, "proto2_unittest.TestAllTypes.optional_int32");
12268
12266
}
12269
12267
12268
+ TEST_F(DescriptorPoolMemoizationTest, SupportsDifferentDescriptorTypes) {
12269
+ static int counter;
12270
+ counter = 0;
12271
+ auto name_lambda = [](const auto* field) {
12272
+ counter++;
12273
+ return field->full_name();
12274
+ };
12275
+
12276
+ const Descriptor* descriptor = proto2_unittest::TestAllTypes::descriptor();
12277
+
12278
+ // Different descriptor types should be accepted and return the appropriate
12279
+ // result, even when reusing the same lambda type.
12280
+ EXPECT_EQ("proto2_unittest.TestAllTypes.optional_int32",
12281
+ DescriptorPoolMemoizationTest::MemoizeProjection(
12282
+ descriptor->field(0), name_lambda));
12283
+ EXPECT_EQ("proto2_unittest.TestAllTypes",
12284
+ DescriptorPoolMemoizationTest::MemoizeProjection(descriptor,
12285
+ name_lambda));
12286
+ EXPECT_EQ("proto2_unittest.TestAllTypes.NestedMessage",
12287
+ DescriptorPoolMemoizationTest::MemoizeProjection(
12288
+ descriptor->nested_type(0), name_lambda));
12289
+ EXPECT_EQ(counter, 3);
12290
+ }
12291
+
12270
12292
TEST_F(DescriptorPoolMemoizationTest, MemoizeProjectionMultithreaded) {
12271
12293
auto name_lambda = [](const FieldDescriptor* field) {
12272
12294
return field->full_name();
@@ -12277,9 +12299,9 @@ TEST_F(DescriptorPoolMemoizationTest, MemoizeProjectionMultithreaded) {
12277
12299
for (int i = 0; i < descriptor->field_count(); ++i) {
12278
12300
threads.emplace_back([this, name_lambda, descriptor, i]() {
12279
12301
auto name = DescriptorPoolMemoizationTest::MemoizeProjection(
12280
- descriptor->file()->pool(), descriptor-> field(i), name_lambda);
12302
+ descriptor->field(i), name_lambda);
12281
12303
auto first_name = DescriptorPoolMemoizationTest::MemoizeProjection(
12282
- descriptor->file()->pool(), descriptor-> field(0), name_lambda);
12304
+ descriptor->field(0), name_lambda);
12283
12305
ASSERT_THAT(name, HasSubstr("proto2_unittest.TestAllTypes"));
12284
12306
if (i != 0) {
12285
12307
ASSERT_NE(name, "proto2_unittest.TestAllTypes.optional_int32");
@@ -12303,7 +12325,7 @@ TEST_F(DescriptorPoolMemoizationTest, MemoizeProjectionInsertionRace) {
12303
12325
for (int j = 0; j < 3; ++j) {
12304
12326
threads.emplace_back([this, name_lambda, descriptor, i]() {
12305
12327
auto name = DescriptorPoolMemoizationTest::MemoizeProjection(
12306
- descriptor->file()->pool(), descriptor-> field(i), name_lambda);
12328
+ descriptor->field(i), name_lambda);
12307
12329
ASSERT_THAT(name, HasSubstr("proto2_unittest.TestAllTypes"));
12308
12330
});
12309
12331
}
0 commit comments