2
0
mirror of https://github.com/boostorg/fiber.git synced 2026-02-20 14:42:21 +00:00
Files
fiber/libs/reflection/test/parameter_map_test.cpp
Oliver Kowalke 39ec793737 initial checkin
2011-02-09 18:41:35 +01:00

129 lines
3.4 KiB
C++

/*
* 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 <cmath>
#include <iostream>
#include <string>
#define BOOST_TEST_MAIN
#define BOOST_TEST_DYN_LINK 1
#include <boost/test/unit_test.hpp>
#include <boost/reflection/parameter_map.hpp>
using boost::reflections::parameter_map;
using boost::reflections::generic_parameter;
using boost::reflections::parameter;
BOOST_AUTO_TEST_CASE(construction) {
parameter<int>* p = new parameter<int>(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<counted_creation>* p =
new parameter<counted_creation>(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<int>* p = new parameter<int>(5);
p->converts_to<float>();
p->converts_to<double>();
generic_parameter<>* g = p;
BOOST_CHECK(g->can_cast<float>());
BOOST_CHECK(g->can_cast<double>());
BOOST_CHECK(!g->can_cast<char>());
BOOST_CHECK(!g->can_cast<short>());
BOOST_CHECK_EQUAL(5.0f, g->cast<float>());
BOOST_CHECK_EQUAL(5.0, g->cast<double>());
BOOST_CHECK_EQUAL(5, g->cast<int>());
parameter_map m;
m.insert(std::make_pair("some_integer", p));
m.insert(std::make_pair("some_other_integer",
new parameter<int>(12)));
g = m.get_first<int>("some_integer");
BOOST_CHECK(g->can_cast<float>());
BOOST_CHECK(g->can_cast<double>());
BOOST_CHECK(!g->can_cast<char>());
BOOST_CHECK(!g->can_cast<short>());
BOOST_CHECK_EQUAL(5.0f, g->cast<float>());
BOOST_CHECK_EQUAL(5.0, g->cast<double>());
BOOST_CHECK_EQUAL(5, g->cast<int>());
g = m.get_first<int>("some_other_integer");
BOOST_CHECK(g->can_cast<int>());
BOOST_CHECK_EQUAL(12, g->cast<int>());
}
void FloatCeilingToInt(float* f, int* i) {
*i = static_cast<int>(std::ceil(*f));
}
BOOST_AUTO_TEST_CASE(converts_to_with_func) {
parameter<float>* p = new parameter<float>(4.9f);
p->converts_to_with_func(&FloatCeilingToInt);
BOOST_CHECK(p->can_cast<int>());
BOOST_CHECK_EQUAL(p->cast<int>(), 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<derived*>* p = new parameter<derived*>(&d);
p->converts_to<base*>();
p->converts_to_with_func<float>(&silly_convert);
generic_parameter<>* g = p;
BOOST_CHECK(g->can_cast<float>());
BOOST_CHECK(g->can_cast<base*>());
BOOST_CHECK(g->can_cast<derived*>());
BOOST_CHECK(!g->can_cast<double>());
BOOST_CHECK_EQUAL(&d, g->cast<derived*>());
BOOST_CHECK_EQUAL(86, g->cast<float>());
}