Remove ancient trunk folder from svn repository
[synfig.git] / ETL / test / smach.cpp
diff --git a/ETL/test/smach.cpp b/ETL/test/smach.cpp
new file mode 100644 (file)
index 0000000..bb5f48d
--- /dev/null
@@ -0,0 +1,207 @@
+/*! ========================================================================
+** Extended Template and Library Test Suite
+** Angle Class Test
+** $Id$
+**
+** Copyright (c) 2002 Robert B. Quattlebaum Jr.
+**
+** This package is free software; you can redistribute it and/or
+** modify it under the terms of the GNU General Public License as
+** published by the Free Software Foundation; either version 2 of
+** the License, or (at your option) any later version.
+**
+** This package is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+**
+** === N O T E S ===========================================================
+**
+** ========================================================================= */
+
+/* === H E A D E R S ======================================================= */
+
+#include <ETL/smach>
+#include <cstdio>
+
+/* === M A C R O S ========================================================= */
+
+using namespace std;
+using namespace etl;
+
+/* === C L A S S E S ======================================================= */
+
+enum EventKey
+{
+       EVENT_1,
+       EVENT_2,
+       EVENT_3,
+       EVENT_4
+};
+
+
+
+struct MachineContext
+{
+       smach<MachineContext,EventKey> machine;
+
+       MachineContext():machine(this)
+       {
+       }
+};
+
+typedef smach<MachineContext,EventKey> Smach;
+
+class Event1 : public Smach::event
+{
+public:
+       Event1():Smach::event(EVENT_1) { }
+};
+
+
+class DefaultStateContext
+{
+       MachineContext *context;
+public:
+       DefaultStateContext(MachineContext *context):context(context) { printf("Entered Default State\n"); }
+       ~DefaultStateContext() { printf("Left Default State\n"); }
+
+       Smach::event_result event1_handler(const Smach::event& x __attribute__ ((unused)))
+       {
+               printf("DEFAULT STATE: Received Event 1\n");
+               return Smach::RESULT_ACCEPT;
+       }
+};
+
+class DefaultState : public Smach::state<DefaultStateContext>
+{
+public:
+       DefaultState():Smach::state<DefaultStateContext>("DefaultState")
+       {
+               insert(event_def(EVENT_1,&DefaultStateContext::event1_handler));
+       }
+
+} default_state;
+
+
+
+
+
+
+
+class State1Context
+{
+       MachineContext *context;
+public:
+       State1Context(MachineContext *context):context(context) { printf("Entered State 1\n"); }
+       ~State1Context() { printf("Left State 1\n"); }
+
+       Smach::event_result event1_handler(const Smach::event& x __attribute__ ((unused)))
+       {
+               printf("STATE1: Received Event 1\n");
+               return Smach::RESULT_OK;
+       }
+
+       Smach::event_result event3_handler(const Smach::event& x);
+};
+
+class State1 : public Smach::state<State1Context>
+{
+public:
+       State1():Smach::state<State1Context>("State1")
+       {
+               insert(event_def(EVENT_1,&State1Context::event1_handler));
+               insert(event_def(EVENT_3,&State1Context::event3_handler));
+       }
+
+} state_1;
+
+
+class State2Context
+{
+       MachineContext *context;
+public:
+       State2Context(MachineContext *context):context(context) { printf("Entered State 2\n"); }
+       ~State2Context() { printf("Left State 2\n"); }
+
+       Smach::event_result event1_handler(const Smach::event& x __attribute__ ((unused)))
+       {
+               printf("STATE2: Received Event 1\n");
+               return Smach::RESULT_OK;
+       }
+
+       Smach::event_result event2_handler(const Smach::event& x __attribute__ ((unused)))
+       {
+               printf("STATE2: Received Event 2\n");
+               return Smach::RESULT_OK;
+       }
+
+       Smach::event_result event3_handler(const Smach::event& x __attribute__ ((unused)))
+       {
+               printf("STATE2: Received Event 3\n");
+               return Smach::RESULT_OK;
+       }
+};
+
+class State2 : public Smach::state<State2Context>
+{
+public:
+       State2():Smach::state<State2Context>("State2")
+       {
+               insert(event_def(EVENT_1,&State2Context::event1_handler));
+               insert(event_def(EVENT_2,&State2Context::event2_handler));
+               insert(event_def(EVENT_3,&State2Context::event3_handler));
+       }
+
+} state_2;
+
+Smach::event_result
+State1Context::event3_handler(const Smach::event& x __attribute__ ((unused)))
+{
+       printf("STATE1: Received Event 3, throwing state to change to...\n");
+
+       throw &state_2;
+//     context->machine.enter(&state_2);
+//     return Smach::RESULT_ACCEPT;
+}
+
+/* === G L O B A L S ======================================================= */
+
+/* === E N T R Y P O I N T ================================================= */
+
+int main()
+{
+       int error=0;
+
+       MachineContext context;
+       try
+       {
+               Smach& state_machine(context.machine);
+
+               state_machine.set_default_state(&default_state);
+
+               state_machine.enter(&state_1);
+
+               state_machine.process_event(Event1());
+               state_machine.process_event(EVENT_1);
+               state_machine.process_event(EVENT_2);
+               state_machine.process_event(EVENT_3);
+
+               state_machine.process_event(Event1());
+               state_machine.process_event(EVENT_1);
+               state_machine.process_event(EVENT_2);
+               state_machine.process_event(EVENT_3);
+
+               state_machine.process_event(Event1());
+               state_machine.process_event(EVENT_1);
+               state_machine.process_event(EVENT_2);
+               state_machine.process_event(EVENT_3);
+       }
+       catch(...)
+       {
+               printf("Uncaught exception\n");
+               error++;
+       }
+
+       return error;
+}