// Boost.TypeErasure library // // Copyright 2012 Steven Watanabe // // Distributed under the Boost Software License Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // // $Id$ #include #include #include #include #include #include #define BOOST_TEST_MAIN #include using namespace boost::type_erasure; BOOST_AUTO_TEST_CASE(test_empty_binding) { boost::mpl::map<> m1; binding > b1(m1); binding > b2(make_binding >()); BOOST_CHECK(b1 == b2); BOOST_CHECK(!(b1 != b2)); boost::mpl::map > m2; binding > b3(m2); BOOST_CHECK(b3 == b1); BOOST_CHECK(!(b3 != b1)); binding > b4(make_binding > >()); BOOST_CHECK(b4 == b1); BOOST_CHECK(!(b4 != b1)); binding > b5(b1, m1); BOOST_CHECK(b5 == b1); BOOST_CHECK(!(b5 != b1)); binding > b6(b1, make_binding >()); BOOST_CHECK(b6 == b1); BOOST_CHECK(!(b6 != b1)); boost::mpl::map > m3; binding > b7(b1, m3); BOOST_CHECK(b7 == b1); BOOST_CHECK(!(b7 != b1)); binding > b8(b1, make_binding > >()); BOOST_CHECK(b8 == b1); BOOST_CHECK(!(b8 != b1)); } BOOST_AUTO_TEST_CASE(test_binding_one) { boost::mpl::map > m1; binding > b1(m1); BOOST_CHECK(b1.find >()() == typeid(int)); binding > b2(make_binding > >()); BOOST_CHECK(b2.find >()() == typeid(int)); BOOST_CHECK(b1 == b2); BOOST_CHECK(!(b1 != b2)); boost::mpl::map > m2; binding > b3(b1, m2); BOOST_CHECK(b3.find >()() == typeid(int)); BOOST_CHECK(b3 == b1); BOOST_CHECK(!(b3 != b1)); binding > b4(b1, make_binding > >()); BOOST_CHECK(b4.find >()() == typeid(int)); BOOST_CHECK(b4 == b1); BOOST_CHECK(!(b4 != b1)); boost::mpl::map > m3; binding > b5(b1, m3); BOOST_CHECK(b5.find >()() == typeid(int)); binding > b6(b1, make_binding > >()); BOOST_CHECK(b6.find >()() == typeid(int)); } BOOST_AUTO_TEST_CASE(test_binding_two) { boost::mpl::map, boost::mpl::pair<_b, char> > m1; binding, typeid_<_b> > > b1(m1); BOOST_CHECK(b1.find >()() == typeid(int)); BOOST_CHECK(b1.find >()() == typeid(char)); binding, typeid_<_b> > > b2( make_binding, boost::mpl::pair<_b, char> > >()); BOOST_CHECK(b2.find >()() == typeid(int)); BOOST_CHECK(b2.find >()() == typeid(char)); BOOST_CHECK(b1 == b2); BOOST_CHECK(!(b1 != b2)); // select the first boost::mpl::map > m2; binding > b3(b1, m2); BOOST_CHECK(b3.find >()() == typeid(int)); binding > b4(b1, make_binding > >()); BOOST_CHECK(b4.find >()() == typeid(int)); // select the second boost::mpl::map > m3; binding > b5(b1, m3); BOOST_CHECK(b5.find >()() == typeid(char)); binding > b6(b1, make_binding > >()); BOOST_CHECK(b6.find >()() == typeid(char)); // rename both boost::mpl::map, boost::mpl::pair<_d, _b> > m4; binding, typeid_<_d> > > b7(b1, m4); BOOST_CHECK(b7.find >()() == typeid(int)); BOOST_CHECK(b7.find >()() == typeid(char)); binding, typeid_<_d> > > b8(b1, make_binding, boost::mpl::pair<_d, _b> > >()); BOOST_CHECK(b8.find >()() == typeid(int)); BOOST_CHECK(b8.find >()() == typeid(char)); // switch the placeholders boost::mpl::map, boost::mpl::pair<_b, _a> > m5; binding, typeid_<_b> > > b9(b1, m5); BOOST_CHECK(b9.find >()() == typeid(int)); BOOST_CHECK(b9.find >()() == typeid(char)); binding, typeid_<_b> > > b10(b1, make_binding, boost::mpl::pair<_b, _a> > >()); BOOST_CHECK(b10.find >()() == typeid(int)); BOOST_CHECK(b10.find >()() == typeid(char)); }