/* * Boost.Reflection / basic unit test * * (C) Copyright Jeremy Pack 2008 * 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) * * See http://www.boost.org/ for latest version. */ #include #include #include #define BOOST_TEST_MAIN #define BOOST_TEST_DYN_LINK 1 #include #include using boost::reflections::parameter_map; using boost::reflections::generic_parameter; using boost::reflections::parameter; BOOST_AUTO_TEST_CASE(construction) { parameter* p = new parameter(5); parameter_map m; m.insert(std::make_pair("some_integer", p)); } // Verify that the parameter map deletes it's elements // when it is done with them. class counted_creation { public: counted_creation() { ++total_objects; } counted_creation(const counted_creation& left) { ++total_objects; } ~counted_creation() { --total_objects; } static int total_objects; }; int counted_creation::total_objects = 0; BOOST_AUTO_TEST_CASE(destroy_elements) { { parameter* p = new parameter(counted_creation()); BOOST_CHECK_EQUAL(counted_creation::total_objects, 1); parameter_map m; m.insert(std::make_pair("some_integer", p)); BOOST_CHECK_EQUAL(counted_creation::total_objects, 1); } BOOST_CHECK_EQUAL(counted_creation::total_objects, 0); } BOOST_AUTO_TEST_CASE(float_convert) { parameter* p = new parameter(5); p->converts_to(); p->converts_to(); generic_parameter<>* g = p; BOOST_CHECK(g->can_cast()); BOOST_CHECK(g->can_cast()); BOOST_CHECK(!g->can_cast()); BOOST_CHECK(!g->can_cast()); BOOST_CHECK_EQUAL(5.0f, g->cast()); BOOST_CHECK_EQUAL(5.0, g->cast()); BOOST_CHECK_EQUAL(5, g->cast()); parameter_map m; m.insert(std::make_pair("some_integer", p)); m.insert(std::make_pair("some_other_integer", new parameter(12))); g = m.get_first("some_integer"); BOOST_CHECK(g->can_cast()); BOOST_CHECK(g->can_cast()); BOOST_CHECK(!g->can_cast()); BOOST_CHECK(!g->can_cast()); BOOST_CHECK_EQUAL(5.0f, g->cast()); BOOST_CHECK_EQUAL(5.0, g->cast()); BOOST_CHECK_EQUAL(5, g->cast()); g = m.get_first("some_other_integer"); BOOST_CHECK(g->can_cast()); BOOST_CHECK_EQUAL(12, g->cast()); } void FloatCeilingToInt(float* f, int* i) { *i = static_cast(std::ceil(*f)); } BOOST_AUTO_TEST_CASE(converts_to_with_func) { parameter* p = new parameter(4.9f); p->converts_to_with_func(&FloatCeilingToInt); BOOST_CHECK(p->can_cast()); BOOST_CHECK_EQUAL(p->cast(), 5); } class base { }; class derived : public base { }; void silly_convert(derived** b, float* f) { *f = 86; } BOOST_AUTO_TEST_CASE(ptr_convert) { derived d; parameter* p = new parameter(&d); p->converts_to(); p->converts_to_with_func(&silly_convert); generic_parameter<>* g = p; BOOST_CHECK(g->can_cast()); BOOST_CHECK(g->can_cast()); BOOST_CHECK(g->can_cast()); BOOST_CHECK(!g->can_cast()); BOOST_CHECK_EQUAL(&d, g->cast()); BOOST_CHECK_EQUAL(86, g->cast()); }