/* * Copyright (c) Meta Platforms, Inc. and affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include namespace test_cpp2 { namespace cpp_reflection { FATAL_S(enum1s, "enum1"); FATAL_S(field0s, "field0"); FATAL_S(field1s, "field1"); FATAL_S(field2s, "field2"); TEST(fatal_enum, sanity_check) { using traits = fatal::enum_traits; EXPECT_SAME(); EXPECT_SAME(); EXPECT_SAME::type, traits::int_type>(); EXPECT_SAME(); EXPECT_SAME(); EXPECT_SAME(); EXPECT_SAME< std::integral_constant, traits::member::field0::value>(); EXPECT_SAME< std::integral_constant, traits::member::field1::value>(); EXPECT_SAME< std::integral_constant, traits::member::field2::value>(); EXPECT_SAME< fatal::list, fatal::transform>(); EXPECT_SAME< fatal::value_list, fatal::transform>(); EXPECT_SAME>(); EXPECT_SAME>(); EXPECT_SAME>(); EXPECT_SAME< std::integral_constant, traits::value_of>(); EXPECT_SAME< std::integral_constant, traits::value_of>(); EXPECT_SAME< std::integral_constant, traits::value_of>(); EXPECT_EQ("field0", fatal::try_enum_to_string(enum1::field0)); EXPECT_EQ("field1", fatal::try_enum_to_string(enum1::field1)); EXPECT_EQ("field2", fatal::try_enum_to_string(enum1::field2)); EXPECT_EQ(nullptr, fatal::try_enum_to_string(static_cast(99999))); EXPECT_EQ("field0", traits::to_string(enum1::field0)); EXPECT_EQ("field1", traits::to_string(enum1::field1)); EXPECT_EQ("field2", traits::to_string(enum1::field2)); EXPECT_EQ(nullptr, traits::to_string(static_cast(99999))); EXPECT_EQ(enum1::field0, traits::parse(std::string("field0"))); EXPECT_EQ(enum1::field1, traits::parse(std::string("field1"))); EXPECT_EQ(enum1::field2, traits::parse(std::string("field2"))); EXPECT_THROW(traits::parse("not a field"), std::invalid_argument); enum1 e; EXPECT_TRUE(traits::try_parse(e, std::string("field0"))); EXPECT_EQ(enum1::field0, e); EXPECT_TRUE(traits::try_parse(e, std::string("field1"))); EXPECT_EQ(enum1::field1, e); EXPECT_TRUE(traits::try_parse(e, std::string("field2"))); EXPECT_EQ(enum1::field2, e); EXPECT_FALSE(traits::try_parse(e, std::string("not a field"))); EXPECT_EQ(enum1::field2, e); } FATAL_S(enum3_annotation1k, "_now.with.an.underscore"); FATAL_S(enum3_annotation1v, "_now.with.an.underscore"); FATAL_S(enum3_annotation2k, "another.there"); FATAL_S(enum3_annotation2v, "."); FATAL_S(enum3_annotation3k, "duplicate_id_annotation_1"); FATAL_S(enum3_annotation3v, "duplicate id annotation"); FATAL_S(enum3_annotation4k, "duplicate_id_annotation_2"); FATAL_S(enum3_annotation4v, "duplicate.id.annotation"); FATAL_S(enum3_annotation5k, "one.here"); FATAL_S(enum3_annotation5v, "with some value associated"); FATAL_S(enum3_annotation6k, "yet.another"); FATAL_S(enum3_annotation6v, "and yet more text - it's that easy"); TEST(fatal_enum, annotations) { EXPECT_SAME< fatal::list<>, apache::thrift::reflect_enum::annotations::map>(); EXPECT_SAME< fatal::list<>, apache::thrift::reflect_enum::annotations::map>(); using enum3_annotations = apache::thrift::reflect_enum::annotations; EXPECT_SAME< enum3_annotation1k, enum3_annotations::keys::_now_with_an_underscore>(); EXPECT_SAME< enum3_annotation1v, enum3_annotations::values::_now_with_an_underscore>(); EXPECT_SAME(); EXPECT_SAME(); EXPECT_SAME< enum3_annotation3k, enum3_annotations::keys::duplicate_id_annotation_1>(); EXPECT_SAME< enum3_annotation3v, enum3_annotations::values::duplicate_id_annotation_1>(); EXPECT_SAME< enum3_annotation4k, enum3_annotations::keys::duplicate_id_annotation_2>(); EXPECT_SAME< enum3_annotation4v, enum3_annotations::values::duplicate_id_annotation_2>(); EXPECT_SAME(); EXPECT_SAME(); EXPECT_SAME(); EXPECT_SAME(); EXPECT_SAME< fatal::list< apache::thrift::annotation, apache::thrift::annotation, apache::thrift::annotation, apache::thrift::annotation, apache::thrift::annotation, apache::thrift::annotation>, enum3_annotations::map>(); } FATAL_S(field_annotation, "field_annotation"); FATAL_S(field_annotated, "field annotated"); FATAL_S(field_structured_annotation, "field_structured_annotation"); FATAL_S( field_structured_annotation_text, R"({"a": "foo", "b": 567, "c": true})"); FATAL_S(some_other_text, "some other text"); FATAL_S(a, "a"); FATAL_S(b, "b"); FATAL_S(c, "c"); FATAL_S(foo, "foo"); TEST(fatal_enum, field_annotations) { using info = fatal::enum_traits; using field0 = info::member::field0_3::annotations; using field1 = info::member::field1_3::annotations; using field2 = info::member::field2_3::annotations; EXPECT_SAME(); EXPECT_SAME(); EXPECT_SAME< field_structured_annotation, field2::keys::field_structured_annotation>(); EXPECT_SAME< field_structured_annotation_text, field2::values::field_structured_annotation>(); EXPECT_SAME(); EXPECT_SAME(); EXPECT_SAME, field0::map>(); EXPECT_SAME< fatal::list< apache::thrift::annotation>, field1::map>(); EXPECT_SAME< fatal::list< apache::thrift::annotation, apache::thrift::annotation< field_structured_annotation, field_structured_annotation_text>>, field2::map>(); } TEST(fatal_struct, renamed_value) { using meta = fatal::enum_traits; using vmeta = meta::member::boring_cxx_name; auto vname = fatal::to_instance(); EXPECT_EQ("fancy.idl.name", vname); } } // namespace cpp_reflection } // namespace test_cpp2