parent
40ba7f0b66
commit
c9425aebf9
@ -1,48 +0,0 @@ |
||||
#include <fmt/core.h> |
||||
#include "../fsm.hpp" |
||||
|
||||
using namespace fmt; |
||||
|
||||
enum class MyState { |
||||
START, RUNNING, END |
||||
}; |
||||
|
||||
enum class MyEvent { |
||||
STARTED, PUSH, QUIT |
||||
}; |
||||
|
||||
class MyFSM : DeadSimpleFSM<MyState, MyEvent> { |
||||
public: |
||||
void event(MyEvent ev) override { |
||||
switch(_state) { |
||||
FSM_STATE(MyState, START, start, ev); |
||||
FSM_STATE(MyState, RUNNING, push, ev); |
||||
FSM_STATE(MyState, END, quit, ev); |
||||
} |
||||
} |
||||
|
||||
void start(MyEvent ev) { |
||||
println("<<< START"); |
||||
state(MyState::RUNNING); |
||||
} |
||||
|
||||
void push(MyEvent ev) { |
||||
println("<<< RUN"); |
||||
state(MyState::RUNNING); |
||||
} |
||||
|
||||
void quit(MyEvent ev) { |
||||
println("<<< STOP"); |
||||
state(MyState::END); |
||||
} |
||||
}; |
||||
|
||||
int main() { |
||||
MyFSM fsm; |
||||
|
||||
fsm.event(MyEvent::STARTED); |
||||
fsm.event(MyEvent::PUSH); |
||||
fsm.event(MyEvent::PUSH); |
||||
fsm.event(MyEvent::PUSH); |
||||
fsm.event(MyEvent::QUIT); |
||||
} |
@ -0,0 +1,67 @@ |
||||
#include <catch2/catch_test_macros.hpp> |
||||
#include <fmt/core.h> |
||||
#include <string> |
||||
#include "../fsm.hpp" |
||||
|
||||
using namespace fmt; |
||||
using std::string; |
||||
|
||||
enum class MyState { |
||||
START, RUNNING, END |
||||
}; |
||||
|
||||
enum class MyEvent { |
||||
STARTED, PUSH, QUIT |
||||
}; |
||||
|
||||
class MyFSM : public DeadSimpleFSM<MyState, MyEvent> { |
||||
public: |
||||
void event(MyEvent ev, string data="") { |
||||
switch(_state) { |
||||
FSM_STATE(MyState, START, START, ev); |
||||
FSM_STATE(MyState, RUNNING, RUNNING, ev, data); |
||||
FSM_STATE(MyState, END, END, ev); |
||||
} |
||||
} |
||||
|
||||
void START(MyEvent ev) { |
||||
println("<<< START"); |
||||
state(MyState::RUNNING); |
||||
} |
||||
|
||||
void RUNNING(MyEvent ev, string &data) { |
||||
if(ev == MyEvent::QUIT) { |
||||
println("<<< QUITTING {}", data); |
||||
state(MyState::END); |
||||
} else { |
||||
println("<<< RUN: {}", data); |
||||
state(MyState::RUNNING); |
||||
} |
||||
} |
||||
|
||||
void END(MyEvent ev) { |
||||
println("<<< STOP"); |
||||
state(MyState::END); |
||||
} |
||||
}; |
||||
|
||||
TEST_CASE("confirm fsm works with optional data", "[utils]") { |
||||
MyFSM fsm; |
||||
|
||||
REQUIRE(fsm.in_state(MyState::START)); |
||||
|
||||
fsm.event(MyEvent::STARTED); |
||||
REQUIRE(fsm.in_state(MyState::RUNNING)); |
||||
|
||||
fsm.event(MyEvent::PUSH); |
||||
REQUIRE(fsm.in_state(MyState::RUNNING)); |
||||
|
||||
fsm.event(MyEvent::PUSH); |
||||
REQUIRE(fsm.in_state(MyState::RUNNING)); |
||||
|
||||
fsm.event(MyEvent::PUSH); |
||||
REQUIRE(fsm.in_state(MyState::RUNNING)); |
||||
|
||||
fsm.event(MyEvent::QUIT, "DONE!"); |
||||
REQUIRE(fsm.in_state(MyState::END)); |
||||
} |
Loading…
Reference in new issue