wangle::detail::FSM
[folly.git] / folly / wangle / test / FSM.cpp
1 /*
2  * Copyright 2014 Facebook, Inc.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *   http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #include <gtest/gtest.h>
18 #include <folly/wangle/detail/FSM.h>
19
20 using namespace folly::wangle::detail;
21
22 enum class State { A, B };
23
24 TEST(FSM, ctor) {
25   FSM<State> fsm(State::A);
26   EXPECT_EQ(State::A, fsm.getState());
27 }
28
29 TEST(FSM, update) {
30   FSM<State> fsm(State::A);
31   EXPECT_TRUE(fsm.updateState(State::A, State::B, []{}));
32   EXPECT_EQ(State::B, fsm.getState());
33 }
34
35 TEST(FSM, badUpdate) {
36   FSM<State> fsm(State::A);
37   EXPECT_FALSE(fsm.updateState(State::B, State::A, []{}));
38 }
39
40 TEST(FSM, actionOnUpdate) {
41   FSM<State> fsm(State::A);
42   size_t count = 0;
43   fsm.updateState(State::A, State::B, [&]{ count++; });
44   EXPECT_EQ(1, count);
45 }
46
47 TEST(FSM, noActionOnBadUpdate) {
48   FSM<State> fsm(State::A);
49   size_t count = 0;
50   fsm.updateState(State::B, State::A, [&]{ count++; });
51   EXPECT_EQ(0, count);
52 }
53
54 TEST(FSM, magicMacros) {
55   struct MyFSM : public FSM<State> {
56     size_t count = 0;
57     MyFSM() : FSM<State>(State::A) {}
58     void twiddle() {
59       FSM_START
60         FSM_UPDATE(State::A, State::B, [&]{ count++; });
61         FSM_UPDATE(State::B, State::A, [&]{ count--; });
62       FSM_END
63     }
64   };
65
66   MyFSM fsm;
67
68   fsm.twiddle();
69   EXPECT_EQ(State::B, fsm.getState());
70   EXPECT_EQ(1, fsm.count);
71
72   fsm.twiddle();
73   EXPECT_EQ(State::A, fsm.getState());
74   EXPECT_EQ(0, fsm.count);
75 }
76
77 TEST(FSM, magicMacros2) {
78   struct MyFSM : public FSM<State> {
79     size_t count = 0;
80     size_t count2 = 0;
81     MyFSM() : FSM<State>(State::A) {}
82     void twiddle() {
83       FSM_START
84         FSM_UPDATE2(State::A, State::B, [&]{ count++; }, count2++);
85         FSM_UPDATE2(State::B, State::A, [&]{ count--; }, count2--);
86       FSM_END
87     }
88   };
89
90   MyFSM fsm;
91
92   fsm.twiddle();
93   EXPECT_EQ(State::B, fsm.getState());
94   EXPECT_EQ(1, fsm.count);
95   EXPECT_EQ(1, fsm.count2);
96
97   fsm.twiddle();
98   EXPECT_EQ(State::A, fsm.getState());
99   EXPECT_EQ(0, fsm.count);
100   EXPECT_EQ(0, fsm.count2);
101 }