blob: 0bd63f8941152dc492e642610f46440172d7f98b [file] [log] [blame]
//////////////////////////////////////////////////////////////////////////////
// Copyright 2005-2006 Andreas Huber Doenni
// Distributed under the Boost Software License, Version 1.0. (See accompany-
// ing file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//////////////////////////////////////////////////////////////////////////////
#include <boost/statechart/state_machine.hpp>
#include <boost/statechart/simple_state.hpp>
#include <boost/test/test_tools.hpp>
namespace sc = boost::statechart;
struct A;
struct TypeInfoTest : sc::state_machine< TypeInfoTest, A > {};
struct B;
struct A : sc::simple_state< A, TypeInfoTest, B > {};
struct B : sc::simple_state< B, A > {};
int test_main( int, char* [] )
{
TypeInfoTest machine;
machine.initiate();
const TypeInfoTest::state_base_type & activeState =
*machine.state_begin();
const TypeInfoTest::state_base_type::id_type bType =
activeState.dynamic_type();
const TypeInfoTest::state_base_type::id_type aType =
activeState.outer_state_ptr()->dynamic_type();
BOOST_REQUIRE( bType == B::static_type() );
BOOST_REQUIRE( bType != A::static_type() );
BOOST_REQUIRE( aType == A::static_type() );
BOOST_REQUIRE( aType != B::static_type() );
#ifndef BOOST_STATECHART_USE_NATIVE_RTTI
// Ensure that a null custom type id pointer can be of any type
BOOST_REQUIRE( activeState.custom_dynamic_type_ptr< void >() == 0 );
BOOST_REQUIRE( activeState.custom_dynamic_type_ptr< char >() == 0 );
BOOST_REQUIRE( activeState.custom_dynamic_type_ptr< bool >() == 0 );
BOOST_REQUIRE(
activeState.outer_state_ptr()->custom_dynamic_type_ptr< void >() == 0 );
BOOST_REQUIRE(
activeState.outer_state_ptr()->custom_dynamic_type_ptr< char >() == 0 );
BOOST_REQUIRE(
activeState.outer_state_ptr()->custom_dynamic_type_ptr< bool >() == 0 );
const char * bCustomType = "B";
const char * aCustomType = "A";
B::custom_static_type_ptr( bCustomType );
A::custom_static_type_ptr( aCustomType );
BOOST_REQUIRE( B::custom_static_type_ptr< char >() == bCustomType );
BOOST_REQUIRE( A::custom_static_type_ptr< char >() == aCustomType );
BOOST_REQUIRE(
activeState.custom_dynamic_type_ptr< char >() == bCustomType );
BOOST_REQUIRE(
activeState.outer_state_ptr()->custom_dynamic_type_ptr< char >() ==
aCustomType );
// Ensure that a null custom type id pointer can be of any type
bool * pNull = 0;
B::custom_static_type_ptr( pNull );
A::custom_static_type_ptr( pNull );
BOOST_REQUIRE( activeState.custom_dynamic_type_ptr< char >() == 0 );
BOOST_REQUIRE(
activeState.outer_state_ptr()->custom_dynamic_type_ptr< char >() == 0 );
#endif
return 0;
}