diff --git a/fuzztest/internal/type_support.h b/fuzztest/internal/type_support.h index 6a2dfc71..d344da73 100644 --- a/fuzztest/internal/type_support.h +++ b/fuzztest/internal/type_support.h @@ -41,6 +41,13 @@ #include "./fuzztest/internal/meta.h" #include "./fuzztest/internal/printer.h" +namespace google::protobuf { +class EnumDescriptor; + +template +const EnumDescriptor* GetEnumDescriptor(); +} // namespace google::protobuf + namespace fuzztest::internal { // Return a best effort printer for type `T`. @@ -575,7 +582,11 @@ struct UnknownPrinter { template decltype(auto) AutodetectTypePrinter() { - if constexpr (std::numeric_limits::is_integer || std::is_enum_v) { + if constexpr (is_protocol_buffer_enum_v) { + return ProtobufEnumPrinter{ + google::protobuf::GetEnumDescriptor()}; + } else if constexpr (std::numeric_limits::is_integer || + std::is_enum_v) { return IntegralPrinter{}; } else if constexpr (std::is_floating_point_v) { return FloatingPrinter{}; diff --git a/fuzztest/internal/type_support_test.cc b/fuzztest/internal/type_support_test.cc index 291768ce..bdd55876 100644 --- a/fuzztest/internal/type_support_test.cc +++ b/fuzztest/internal/type_support_test.cc @@ -273,6 +273,19 @@ TEST(ProtobufEnumTest, Printer) { EXPECT_THAT(TestPrintValue(internal::BareEnum::LABEL_OTHER, bare_domain), ElementsAre("fuzztest::internal::BareEnum::LABEL_OTHER (10)", "fuzztest::internal::BareEnum::LABEL_OTHER")); + + auto element_domain = ElementOf( + {internal::TestProtobuf::Label3, internal::TestProtobuf::Label4}); + using corpus_type = corpus_type_t; + EXPECT_THAT(TestPrintValue(corpus_type(0), element_domain), + ElementsAre("fuzztest::internal::TestProtobuf::Label3 (2)", + "fuzztest::internal::TestProtobuf::Label3")); + + auto bare_element_domain = ElementOf({internal::BareEnum::LABEL_OTHER}); + using corpus_type = corpus_type_t; + EXPECT_THAT(TestPrintValue(corpus_type(0), bare_element_domain), + ElementsAre("fuzztest::internal::BareEnum::LABEL_OTHER (10)", + "fuzztest::internal::BareEnum::LABEL_OTHER")); } TEST(ContainerTest, Printer) {