RUFsmUnitTest.cpp 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. #include "RUFsmUnitTest.h"
  2. #include "RUStateMachineLoader.h"
  3. #include "RUDelegateFactory.h"
  4. #include "RUState.h"
  5. #define FSM_TEST_FILE_1 "家装物件-单层-新样式-有预览"
  6. #define FSM_TEST_FILE_2 "家装物件-单层-新样式-无预览"
  7. #define FSM_TEST_FILE_3 "家装物件-单层-旧样式-0步建造"
  8. #define FSM_TEST_FILE_4 "家装物件-单层-旧样式-1步建造-开始有待机-结束有待机"
  9. #define FSM_TEST_FILE_5 "家装物件-多层-1旧1新"
  10. #define FSM_TEST_FILE_6 "家装物件-单层-旧样式-2步建造-开始无待机-结束无待机"
  11. NS_RU_BEGIN
  12. void FsmUnitTest::runTest()
  13. {
  14. //单层状态机测试
  15. fsmTest1();
  16. fsmTest2();
  17. fsmTest3();
  18. fsmTest4();
  19. // fsmTest5();
  20. fsmTest6();
  21. fsmTest7();
  22. //分层状态机测试
  23. hfsmTest1();
  24. hfsmTest2();
  25. hfsmTest3();
  26. hfsmTest4();
  27. hfsmTest5();
  28. }
  29. void FsmUnitTest::fsmTest1()
  30. {
  31. FSMLOG("[单元测试][fsmTest1开始]");
  32. StateMachine* fsm = StateMachineLoader::getInstance()->createStateMachine(FSM_TEST_FILE_1);
  33. fsm->debugInfo();
  34. FSMLOG("[单元测试][fsmTest1结束]");
  35. }
  36. void FsmUnitTest::fsmTest2()
  37. {
  38. FSMLOG("[单元测试][fsmTest2开始]");
  39. StateMachine* fsm = StateMachineLoader::getInstance()->createStateMachine(FSM_TEST_FILE_1);
  40. fsm->debugInfo();
  41. fsm->runMachine();
  42. CCASSERT(fsm->getRunningStateNames() == std::vector<std::string>({"预览状态"}), "wtf");
  43. fsm->handleEvent("确认_改变样式");
  44. CCASSERT(fsm->getRunningStateNames() == std::vector<std::string>({"待机状态"}), "wtf");
  45. FSMLOG("[单元测试][fsmTest2结束]");
  46. }
  47. void FsmUnitTest::fsmTest3()
  48. {
  49. FSMLOG("[单元测试][fsmTest3开始]");
  50. StateMachine* fsm = StateMachineLoader::getInstance()->createStateMachine(FSM_TEST_FILE_1);
  51. fsm->debugInfo();
  52. fsm->setRunningStateName("待机状态");
  53. fsm->runMachine();
  54. CCASSERT(fsm->getRunningStateNames() == std::vector<std::string>({"待机状态"}), "wtf");
  55. fsm->handleEvent("长按TOUCH");
  56. CCASSERT(fsm->getRunningStateNames() == std::vector<std::string>({"预览状态"}), "wtf");
  57. FSMLOG("[单元测试][fsmTest3结束]");
  58. }
  59. void FsmUnitTest::fsmTest4()
  60. {
  61. FSMLOG("[单元测试][fsmTest4开始]");
  62. StateMachine* fsm = StateMachineLoader::getInstance()->createStateMachine(FSM_TEST_FILE_1);
  63. fsm->debugInfo();
  64. fsm->setRunningStateName("待机状态");
  65. fsm->handleEvent("长按TOUCH");
  66. fsm->runMachine();
  67. CCASSERT(fsm->getRunningStateNames() == std::vector<std::string>({"待机状态"}), "wtf");
  68. fsm->handleEvent("长按TOUCH1");
  69. fsm->handleEvent("长按TOUCH");
  70. CCASSERT(fsm->getRunningStateNames() == std::vector<std::string>({"预览状态"}), "wtf");
  71. FSMLOG("[单元测试][fsmTest4结束]");
  72. }
  73. void FsmUnitTest::fsmTest5()
  74. {
  75. FSMLOG("[单元测试][fsmTest5开始]");
  76. auto testStateDelegateCreator = [=](void){
  77. TestStateDelegate* stateDelegate = new TestStateDelegate();
  78. return stateDelegate;
  79. };
  80. DelegateFactory::getInstance()->registerStateDelegateCreator("家装物件", testStateDelegateCreator);
  81. std::string * userObj4StateDelegate = new std::string("我是状态代理类的userObject");
  82. StateMachine* fsm = StateMachineLoader::getInstance()->createStateMachine(FSM_TEST_FILE_1, userObj4StateDelegate);
  83. fsm->debugInfo();
  84. fsm->runMachine();
  85. FSMLOG("[单元测试][fsmTest5结束]");
  86. }
  87. void FsmUnitTest::fsmTest6()
  88. {
  89. FSMLOG("[单元测试][fsmTest6开始]");
  90. auto testStateDelegateCreator = [=](void){
  91. TestStateDelegate* stateDelegate = new TestStateDelegate();
  92. return stateDelegate;
  93. };
  94. DelegateFactory::getInstance()->registerStateDelegateCreator("家装物件", testStateDelegateCreator);
  95. std::string * userObj4StateDelegate = new std::string("我是状态代理类的userObject");
  96. StateMachine* fsm = StateMachineLoader::getInstance()->createStateMachine(FSM_TEST_FILE_1, userObj4StateDelegate);
  97. fsm->debugInfo();
  98. fsm->runMachine();
  99. fsm->handleEvent("确认_改变样式",{{"key1","value1"},{"key2","value2"}});
  100. FSMLOG("[单元测试][fsmTest6结束]");
  101. }
  102. void FsmUnitTest::fsmTest7()
  103. {
  104. FSMLOG("[单元测试][fsmTest7开始]");
  105. StateMachine* fsm = StateMachineLoader::getInstance()->createStateMachine(FSM_TEST_FILE_6);
  106. fsm->debugInfo();
  107. fsm->runMachine();
  108. CCASSERT(fsm->getRunningStateNames() == std::vector<std::string>({"开始待机状态"}), "wtf");
  109. fsm->handleEvent("建造");
  110. CCASSERT(fsm->getRunningStateNames() == std::vector<std::string>({"建造1步后待机状态"}), "wtf");
  111. fsm->handleEvent("建造");
  112. CCASSERT(fsm->getRunningStateNames() == std::vector<std::string>({"结束待机状态"}), "wtf");
  113. FSMLOG("[单元测试][fsmTest7结束]");
  114. }
  115. void FsmUnitTest::hfsmTest1()
  116. {
  117. FSMLOG("[单元测试][hfsmTest1开始]");
  118. StateMachine* fsm = StateMachineLoader::getInstance()->createStateMachine(FSM_TEST_FILE_5);
  119. fsm->debugInfo();
  120. FSMLOG("[单元测试][hfsmTest1结束]");
  121. }
  122. void FsmUnitTest::hfsmTest2()
  123. {
  124. FSMLOG("[单元测试][hfsmTest2开始]");
  125. std::map<std::vector<std::string>, std::string> stateMachine4FullStatePath = {
  126. {{"旧样式状态"},FSM_TEST_FILE_3},
  127. {{"旧样式状态","待机状态"},FSM_TEST_FILE_3},
  128. {{"新样式状态"},FSM_TEST_FILE_2}
  129. };
  130. StateMachine* fsm = StateMachineLoader::getInstance()->createStateMachine(FSM_TEST_FILE_5);
  131. fsm->debugInfo();
  132. FSMLOG("[单元测试][hfsmTest2结束]");
  133. }
  134. void FsmUnitTest::hfsmTest3()
  135. {
  136. FSMLOG("[单元测试][hfsmTest3开始]");
  137. StateMachine* fsm = StateMachineLoader::getInstance()->createStateMachine(FSM_TEST_FILE_5);
  138. fsm->debugInfo();
  139. fsm->runMachine();
  140. CCASSERT(fsm->getRunningStateNames() == std::vector<std::string>({"旧样式状态","待机状态"}), "wtf");
  141. fsm->handleEvent("建造");
  142. CCASSERT(fsm->getRunningStateNames() == std::vector<std::string>({"新样式状态","待机状态"}), "wtf");
  143. FSMLOG("[单元测试][hfsmTest3结束]");
  144. }
  145. void FsmUnitTest::hfsmTest4()
  146. {
  147. FSMLOG("[单元测试][hfsmTest4开始]");
  148. StateMachine* fsm = StateMachineLoader::getInstance()->createStateMachine(FSM_TEST_FILE_5);
  149. fsm->debugInfo();
  150. fsm->setRunningStateNames({"新样式状态","待机状态"});
  151. fsm->runMachine();
  152. CCASSERT(fsm->getRunningStateNames() == std::vector<std::string>({"新样式状态","待机状态"}), "wtf");
  153. fsm->handleEvent("长按TOUCH");
  154. CCASSERT(fsm->getRunningStateNames() == std::vector<std::string>({"新样式状态","预览状态"}), "wtf");
  155. FSMLOG("[单元测试][hfsmTest4结束]");
  156. }
  157. void FsmUnitTest::hfsmTest5()
  158. {
  159. FSMLOG("[单元测试][hfsmTest5开始]");
  160. StateMachine* fsm = StateMachineLoader::getInstance()->createStateMachine(FSM_TEST_FILE_5);
  161. fsm->debugInfo();
  162. fsm->runMachine();
  163. CCASSERT(fsm->getRunningStateNames() == std::vector<std::string>({"旧样式状态","待机状态"}), "wtf");
  164. fsm->handleEvent("建造");
  165. CCASSERT(fsm->getRunningStateNames() == std::vector<std::string>({"旧样式状态","建造1步后待机状态"}), "wtf");
  166. fsm->handleEvent("建造");
  167. CCASSERT(fsm->getRunningStateNames() == std::vector<std::string>({"新样式状态","待机状态"}), "wtf");
  168. FSMLOG("[单元测试][hfsmTest5结束]");
  169. }
  170. void TestStateDelegate::beforeSwitch(State* state, const std::vector<StateActInfo>& stateActInfo, StateActInfo evt, std::function<void(void)> actFinishCb) {
  171. StateDelegate::beforeSwitch(state, stateActInfo, evt, actFinishCb);
  172. }
  173. void TestStateDelegate::execStateAct(State* state, const StateActInfo* stateActInfo, const std::map<string, string>& eventParams, const std::function<void(void)>& actFinishCb)
  174. {
  175. std::vector<std::string> fullStatePath = state->getFullStatePath();
  176. std::string* userObject = (std::string *)getUserObject();
  177. if(userObject){
  178. FSMLOG("[状态代理的userObject\"%s\"]",userObject->c_str());
  179. }
  180. /// 打印日志
  181. std::string stateLog;
  182. for (int i = 0; i < fullStatePath.size(); i++) {
  183. if (i == fullStatePath.size() - 1) {
  184. stateLog = stateLog + fullStatePath[i];
  185. }else{
  186. stateLog = stateLog + fullStatePath[i] + "#";
  187. }
  188. }
  189. std::string paramsLog;
  190. paramsLog = paramsLog+"{";
  191. for(auto paramIter : eventParams ){
  192. std::string paramKey = paramIter.first;
  193. std::string paramValue = paramIter.second;
  194. paramsLog = paramsLog + "\"" + paramKey +"\":\"" + paramValue +"\":";
  195. }
  196. paramsLog = paramsLog+"}";
  197. FSMLOG("[执行动作...][状态名:\"%s\",事件参数:%s]",stateLog.c_str(),paramsLog.c_str());
  198. if (actFinishCb) {
  199. actFinishCb();
  200. }
  201. }
  202. NS_RU_END