summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/statechart/test/StateIterationTest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/boost/libs/statechart/test/StateIterationTest.cpp')
-rw-r--r--src/boost/libs/statechart/test/StateIterationTest.cpp150
1 files changed, 150 insertions, 0 deletions
diff --git a/src/boost/libs/statechart/test/StateIterationTest.cpp b/src/boost/libs/statechart/test/StateIterationTest.cpp
new file mode 100644
index 000000000..f9d80fc95
--- /dev/null
+++ b/src/boost/libs/statechart/test/StateIterationTest.cpp
@@ -0,0 +1,150 @@
+//////////////////////////////////////////////////////////////////////////////
+// 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/event.hpp>
+#include <boost/statechart/simple_state.hpp>
+#include <boost/statechart/transition.hpp>
+
+#include <boost/mpl/list.hpp>
+
+#include <boost/test/test_tools.hpp>
+
+#include <set>
+#include <map>
+#include <string>
+
+
+
+namespace sc = boost::statechart;
+namespace mpl = boost::mpl;
+
+
+
+struct EvToA : sc::event< EvToA > {};
+struct EvToB : sc::event< EvToB > {};
+struct EvToD : sc::event< EvToD > {};
+struct EvToE : sc::event< EvToE > {};
+
+struct A;
+struct StateIterationTest : sc::state_machine< StateIterationTest, A >
+{
+ public:
+ //////////////////////////////////////////////////////////////////////////
+ StateIterationTest();
+
+ void AssertInState( const std::string & stateNames ) const
+ {
+ stateNamesCache_.clear();
+
+ for ( state_iterator currentState = state_begin();
+ currentState != state_end(); ++currentState )
+ {
+ const StateNamesMap::const_iterator found =
+ stateNamesMap_.find( currentState->dynamic_type() );
+ BOOST_REQUIRE( found != stateNamesMap_.end() );
+ stateNamesCache_.insert( found->second );
+ }
+
+ std::string::const_iterator expectedName = stateNames.begin();
+
+ BOOST_REQUIRE( stateNames.size() == stateNamesCache_.size() );
+
+ for ( StateNamesCache::const_iterator actualName =
+ stateNamesCache_.begin();
+ actualName != stateNamesCache_.end(); ++actualName, ++expectedName )
+ {
+ BOOST_REQUIRE( ( *actualName )[ 0 ] == *expectedName );
+ }
+ }
+
+ private:
+ //////////////////////////////////////////////////////////////////////////
+ typedef std::map< state_base_type::id_type, std::string > StateNamesMap;
+ typedef std::set< std::string > StateNamesCache;
+
+ StateNamesMap stateNamesMap_;
+ mutable StateNamesCache stateNamesCache_;
+};
+
+struct C;
+struct D;
+struct B : sc::simple_state< B, StateIterationTest, mpl::list< C, D > >
+{
+ typedef sc::transition< EvToA, A > reactions;
+};
+
+struct A : sc::simple_state< A, StateIterationTest >
+{
+ typedef sc::transition< EvToB, B > reactions;
+};
+
+ struct F;
+ struct G;
+ struct E : sc::simple_state< E, B::orthogonal< 1 >, mpl::list< F, G > >
+ {
+ typedef sc::transition< EvToD, D > reactions;
+ };
+
+ struct F : sc::simple_state< F, E::orthogonal< 0 > > {};
+ struct G : sc::simple_state< G, E::orthogonal< 1 > > {};
+
+ struct C : sc::simple_state< C, B::orthogonal< 0 > > {};
+ struct D : sc::simple_state< D, B::orthogonal< 1 > >
+ {
+ typedef sc::transition< EvToE, E > reactions;
+ };
+
+StateIterationTest::StateIterationTest()
+{
+ // We're not using custom type information to make this test work even when
+ // BOOST_STATECHART_USE_NATIVE_RTTI is defined
+ stateNamesMap_[ A::static_type() ] = "A";
+ stateNamesMap_[ B::static_type() ] = "B";
+ stateNamesMap_[ C::static_type() ] = "C";
+ stateNamesMap_[ D::static_type() ] = "D";
+ stateNamesMap_[ E::static_type() ] = "E";
+ stateNamesMap_[ F::static_type() ] = "F";
+ stateNamesMap_[ G::static_type() ] = "G";
+}
+
+
+int test_main( int, char* [] )
+{
+ StateIterationTest machine;
+ machine.AssertInState( "" );
+
+ machine.initiate();
+ machine.AssertInState( "A" );
+
+ machine.process_event( EvToB() );
+ machine.AssertInState( "CD" );
+
+ machine.process_event( EvToA() );
+ machine.AssertInState( "A" );
+
+ machine.process_event( EvToB() );
+ machine.AssertInState( "CD" );
+
+ machine.process_event( EvToE() );
+ machine.AssertInState( "CFG" );
+
+ machine.process_event( EvToD() );
+ machine.AssertInState( "CD" );
+
+ machine.process_event( EvToE() );
+ machine.AssertInState( "CFG" );
+
+ machine.process_event( EvToA() );
+ machine.AssertInState( "A" );
+
+ machine.terminate();
+ machine.AssertInState( "" );
+
+ return 0;
+}