/* * 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 #include namespace test_cpp2 { namespace cpp_reflection { FATAL_S(union1s, "union1"); FATAL_S(uis, "ui"); FATAL_S(uds, "ud"); FATAL_S(uss, "us"); FATAL_S(ues, "ue"); using uii = std::integral_constant; using udi = std::integral_constant; using usi = std::integral_constant; using uei = std::integral_constant; TEST(fatal_union, variants) { using traits = fatal::variant_traits; EXPECT_SAME(); EXPECT_SAME(); EXPECT_SAME(); EXPECT_SAME(); EXPECT_SAME(); EXPECT_SAME(); EXPECT_SAME(); EXPECT_SAME< fatal::list, fatal::transform>(); EXPECT_SAME< fatal::list, fatal::transform>(); } TEST(fatal_union, by_id) { using vtraits = fatal::variant_traits; using traits = vtraits::by_id; EXPECT_SAME>(); EXPECT_SAME>(); EXPECT_SAME>(); EXPECT_SAME>(); EXPECT_SAME>(); EXPECT_SAME>(); EXPECT_SAME>(); EXPECT_SAME>(); union1 u; const union1& uc = u; union1& ul = u; union1&& ur = std::move(u); EXPECT_TRUE(vtraits::empty(u)); EXPECT_TRUE(vtraits::empty(uc)); EXPECT_TRUE(vtraits::empty(ul)); EXPECT_TRUE(vtraits::empty(ur)); traits::set(u, 10); EXPECT_FALSE(vtraits::empty(u)); EXPECT_FALSE(vtraits::empty(uc)); EXPECT_FALSE(vtraits::empty(ul)); EXPECT_FALSE(vtraits::empty(ur)); EXPECT_EQ(union1::Type::ui, u.getType()); EXPECT_EQ(union1::Type::ui, vtraits::get_id(u)); EXPECT_EQ(union1::Type::ui, vtraits::get_id(uc)); EXPECT_EQ(union1::Type::ui, vtraits::get_id(ul)); EXPECT_EQ(union1::Type::ui, vtraits::get_id(ur)); EXPECT_EQ(10, u.get_ui()); EXPECT_EQ(10, traits::get(ul)); EXPECT_EQ(10, traits::get(uc)); EXPECT_EQ(10, traits::get(ur)); traits::set(u, 5.6); EXPECT_FALSE(vtraits::empty(u)); EXPECT_FALSE(vtraits::empty(uc)); EXPECT_FALSE(vtraits::empty(ul)); EXPECT_FALSE(vtraits::empty(ur)); EXPECT_EQ(union1::Type::ud, u.getType()); EXPECT_EQ(union1::Type::ud, vtraits::get_id(u)); EXPECT_EQ(union1::Type::ud, vtraits::get_id(uc)); EXPECT_EQ(union1::Type::ud, vtraits::get_id(ul)); EXPECT_EQ(union1::Type::ud, vtraits::get_id(ur)); EXPECT_EQ(5.6, u.get_ud()); EXPECT_EQ(5.6, traits::get(ul)); EXPECT_EQ(5.6, traits::get(uc)); EXPECT_EQ(5.6, traits::get(ur)); traits::set(u, "hello"); EXPECT_FALSE(vtraits::empty(u)); EXPECT_FALSE(vtraits::empty(uc)); EXPECT_FALSE(vtraits::empty(ul)); EXPECT_FALSE(vtraits::empty(ur)); EXPECT_EQ(union1::Type::us, u.getType()); EXPECT_EQ(union1::Type::us, vtraits::get_id(u)); EXPECT_EQ(union1::Type::us, vtraits::get_id(uc)); EXPECT_EQ(union1::Type::us, vtraits::get_id(ul)); EXPECT_EQ(union1::Type::us, vtraits::get_id(ur)); EXPECT_EQ("hello", u.get_us()); EXPECT_EQ("hello", traits::get(ul)); EXPECT_EQ("hello", traits::get(uc)); EXPECT_EQ("hello", traits::get(ur)); traits::set(u, enum1::field1); EXPECT_FALSE(vtraits::empty(u)); EXPECT_FALSE(vtraits::empty(uc)); EXPECT_FALSE(vtraits::empty(ul)); EXPECT_FALSE(vtraits::empty(ur)); EXPECT_EQ(union1::Type::ue, u.getType()); EXPECT_EQ(union1::Type::ue, vtraits::get_id(u)); EXPECT_EQ(union1::Type::ue, vtraits::get_id(uc)); EXPECT_EQ(union1::Type::ue, vtraits::get_id(ul)); EXPECT_EQ(union1::Type::ue, vtraits::get_id(ur)); EXPECT_EQ(enum1::field1, u.get_ue()); EXPECT_EQ(enum1::field1, traits::get(ul)); EXPECT_EQ(enum1::field1, traits::get(uc)); EXPECT_EQ(enum1::field1, traits::get(ur)); } TEST(fatal_union, by_type) { using vtraits = fatal::variant_traits; using traits = vtraits::by_type; EXPECT_SAME>(); EXPECT_SAME>(); EXPECT_SAME>(); EXPECT_SAME>(); EXPECT_SAME>(); EXPECT_SAME>(); EXPECT_SAME>(); EXPECT_SAME>(); union1 u; const union1& uc = u; union1& ul = u; union1&& ur = std::move(u); EXPECT_TRUE(vtraits::empty(u)); EXPECT_TRUE(vtraits::empty(uc)); EXPECT_TRUE(vtraits::empty(ul)); EXPECT_TRUE(vtraits::empty(ur)); traits::set(u, 10); EXPECT_FALSE(vtraits::empty(u)); EXPECT_FALSE(vtraits::empty(uc)); EXPECT_FALSE(vtraits::empty(ul)); EXPECT_FALSE(vtraits::empty(ur)); EXPECT_EQ(union1::Type::ui, u.getType()); EXPECT_EQ(union1::Type::ui, vtraits::get_id(u)); EXPECT_EQ(union1::Type::ui, vtraits::get_id(uc)); EXPECT_EQ(union1::Type::ui, vtraits::get_id(ul)); EXPECT_EQ(union1::Type::ui, vtraits::get_id(ur)); EXPECT_EQ(10, u.get_ui()); EXPECT_EQ(10, traits::get(ul)); EXPECT_EQ(10, traits::get(uc)); EXPECT_EQ(10, traits::get(ur)); traits::set(u, 5.6); EXPECT_FALSE(vtraits::empty(u)); EXPECT_FALSE(vtraits::empty(uc)); EXPECT_FALSE(vtraits::empty(ul)); EXPECT_FALSE(vtraits::empty(ur)); EXPECT_EQ(union1::Type::ud, u.getType()); EXPECT_EQ(union1::Type::ud, vtraits::get_id(u)); EXPECT_EQ(union1::Type::ud, vtraits::get_id(uc)); EXPECT_EQ(union1::Type::ud, vtraits::get_id(ul)); EXPECT_EQ(union1::Type::ud, vtraits::get_id(ur)); EXPECT_EQ(5.6, u.get_ud()); EXPECT_EQ(5.6, traits::get(ul)); EXPECT_EQ(5.6, traits::get(uc)); EXPECT_EQ(5.6, traits::get(ur)); traits::set(u, "hello"); EXPECT_FALSE(vtraits::empty(u)); EXPECT_FALSE(vtraits::empty(uc)); EXPECT_FALSE(vtraits::empty(ul)); EXPECT_FALSE(vtraits::empty(ur)); EXPECT_EQ(union1::Type::us, u.getType()); EXPECT_EQ(union1::Type::us, vtraits::get_id(u)); EXPECT_EQ(union1::Type::us, vtraits::get_id(uc)); EXPECT_EQ(union1::Type::us, vtraits::get_id(ul)); EXPECT_EQ(union1::Type::us, vtraits::get_id(ur)); EXPECT_EQ("hello", u.get_us()); EXPECT_EQ("hello", traits::get(ul)); EXPECT_EQ("hello", traits::get(uc)); EXPECT_EQ("hello", traits::get(ur)); traits::set(u, enum1::field1); EXPECT_FALSE(vtraits::empty(u)); EXPECT_FALSE(vtraits::empty(uc)); EXPECT_FALSE(vtraits::empty(ul)); EXPECT_FALSE(vtraits::empty(ur)); EXPECT_EQ(union1::Type::ue, u.getType()); EXPECT_EQ(union1::Type::ue, vtraits::get_id(u)); EXPECT_EQ(union1::Type::ue, vtraits::get_id(uc)); EXPECT_EQ(union1::Type::ue, vtraits::get_id(ul)); EXPECT_EQ(union1::Type::ue, vtraits::get_id(ur)); EXPECT_EQ(enum1::field1, u.get_ue()); EXPECT_EQ(enum1::field1, traits::get(ul)); EXPECT_EQ(enum1::field1, traits::get(uc)); EXPECT_EQ(enum1::field1, traits::get(ur)); } FATAL_S(unionA_annotation1k, "another.annotation"); FATAL_S(unionA_annotation1v, "some more text"); FATAL_S(unionA_annotation2k, "sample.annotation"); FATAL_S(unionA_annotation2v, "some text here"); FATAL_S(union1_annotation1k, "thrift.uri"); FATAL_S( union1_annotation1v, "facebook.com/thrift/test/reflection/reflection/union1"); TEST(fatal_union, annotations) { EXPECT_SAME< fatal::list< apache::thrift::annotation>, apache::thrift::reflect_variant::annotations::map>(); EXPECT_SAME< fatal::list<>, apache::thrift::reflect_variant::annotations::map>(); EXPECT_SAME< fatal::list<>, apache::thrift::reflect_variant::annotations::map>(); using actual_unionA = apache::thrift::reflect_variant::annotations; EXPECT_SAME(); EXPECT_SAME(); EXPECT_SAME(); EXPECT_SAME(); EXPECT_SAME< fatal::list< apache::thrift::annotation, apache::thrift::annotation>, actual_unionA::map>(); } TEST(fatal_union, by_name) { using id_traits = fatal::enum_traits; using info = apache::thrift::reflect_variant; using member_info = info::by_name; union1 u; u.set_ui(10); ASSERT_EQ(u.getType(), union1::Type::ui); EXPECT_EQ(10, member_info::get(u)); } TEST(fatal_union, by_type_id) { using info = apache::thrift::reflect_variant; using member_info = info::by_type_id; union1 u; u.set_ui(10); ASSERT_EQ(u.getType(), union1::Type::ui); EXPECT_EQ(10, member_info::get(u)); } TEST(fatal_union, by_field_id) { using info = apache::thrift::reflect_variant; using member_info = info::by_field_id<1>; union1 u; u.set_ui(10); ASSERT_EQ(u.getType(), union1::Type::ui); EXPECT_EQ(10, member_info::get(u)); } TEST(fatal_struct, renamed_field) { using emeta = fatal::enum_traits; using vmeta = emeta::member::boring_cxx_name; auto vname = fatal::to_instance(); EXPECT_EQ("fancy.idl.name", vname); using umeta = apache::thrift::reflect_variant; using fmeta = umeta::by_type_id; auto fname = fatal::to_instance(); EXPECT_EQ("fancy.idl.name", fname); } } // namespace cpp_reflection } // namespace test_cpp2