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