1 | ////////////////////////////////////////////////////////////////////////////// |
---|---|
2 | // Copyright 2005-2006 Andreas Huber Doenni |
3 | // Distributed under the Boost Software License, Version 1.0. (See accompany- |
4 | // ing file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) |
5 | ////////////////////////////////////////////////////////////////////////////// |
6 | |
7 | |
8 | |
9 | #include <boost/statechart/state_machine.hpp> |
10 | #include <boost/statechart/simple_state.hpp> |
11 | |
12 | #include <boost/test/test_tools.hpp> |
13 | |
14 | |
15 | |
16 | namespace sc = boost::statechart; |
17 | |
18 | |
19 | |
20 | struct A; |
21 | struct TypeInfoTest : sc::state_machine< TypeInfoTest, A > {}; |
22 | |
23 | struct B; |
24 | struct A : sc::simple_state< A, TypeInfoTest, B > {}; |
25 | |
26 | struct B : sc::simple_state< B, A > {}; |
27 | |
28 | |
29 | int test_main( int, char* [] ) |
30 | { |
31 | TypeInfoTest machine; |
32 | machine.initiate(); |
33 | |
34 | const TypeInfoTest::state_base_type & activeState = |
35 | *machine.state_begin(); |
36 | const TypeInfoTest::state_base_type::id_type bType = |
37 | activeState.dynamic_type(); |
38 | const TypeInfoTest::state_base_type::id_type aType = |
39 | activeState.outer_state_ptr()->dynamic_type(); |
40 | |
41 | BOOST_REQUIRE( bType == B::static_type() ); |
42 | BOOST_REQUIRE( bType != A::static_type() ); |
43 | BOOST_REQUIRE( aType == A::static_type() ); |
44 | BOOST_REQUIRE( aType != B::static_type() ); |
45 | |
46 | #ifndef BOOST_STATECHART_USE_NATIVE_RTTI |
47 | // Ensure that a null custom type id pointer can be of any type |
48 | BOOST_REQUIRE( activeState.custom_dynamic_type_ptr< void >() == 0 ); |
49 | BOOST_REQUIRE( activeState.custom_dynamic_type_ptr< char >() == 0 ); |
50 | BOOST_REQUIRE( activeState.custom_dynamic_type_ptr< bool >() == 0 ); |
51 | BOOST_REQUIRE( |
52 | activeState.outer_state_ptr()->custom_dynamic_type_ptr< void >() == 0 ); |
53 | BOOST_REQUIRE( |
54 | activeState.outer_state_ptr()->custom_dynamic_type_ptr< char >() == 0 ); |
55 | BOOST_REQUIRE( |
56 | activeState.outer_state_ptr()->custom_dynamic_type_ptr< bool >() == 0 ); |
57 | |
58 | const char * bCustomType = "B"; |
59 | const char * aCustomType = "A"; |
60 | B::custom_static_type_ptr( pCustomId: bCustomType ); |
61 | A::custom_static_type_ptr( pCustomId: aCustomType ); |
62 | BOOST_REQUIRE( B::custom_static_type_ptr< char >() == bCustomType ); |
63 | BOOST_REQUIRE( A::custom_static_type_ptr< char >() == aCustomType ); |
64 | BOOST_REQUIRE( |
65 | activeState.custom_dynamic_type_ptr< char >() == bCustomType ); |
66 | BOOST_REQUIRE( |
67 | activeState.outer_state_ptr()->custom_dynamic_type_ptr< char >() == |
68 | aCustomType ); |
69 | |
70 | // Ensure that a null custom type id pointer can be of any type |
71 | bool * pNull = 0; |
72 | B::custom_static_type_ptr( pCustomId: pNull ); |
73 | A::custom_static_type_ptr( pCustomId: pNull ); |
74 | BOOST_REQUIRE( activeState.custom_dynamic_type_ptr< char >() == 0 ); |
75 | BOOST_REQUIRE( |
76 | activeState.outer_state_ptr()->custom_dynamic_type_ptr< char >() == 0 ); |
77 | #endif |
78 | |
79 | return 0; |
80 | } |
81 |