StateMachineTest.cpp 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. /*
  2. * Author: Patrick-Christopher Mattulat
  3. * Company: Lynar Studios
  4. * E-Mail: webmaster@lynarstudios.com
  5. * Created: 2020-09-09
  6. * Changed: 2020-09-16
  7. *
  8. * */
  9. #include <gtest/gtest.h>
  10. #include "../../../source/logic/StateMachine.hpp"
  11. namespace {
  12. class StateMachineTest : public ::testing::Test {
  13. protected:
  14. StateMachineTest() = default;
  15. ~StateMachineTest() override = default;
  16. void SetUp() override {}
  17. void TearDown() override {}
  18. static ls_std::StateMachine _createStateMachine() {
  19. ls_std::StateMachine stateMachine {"test_machine"};
  20. std::shared_ptr<ls_std::State> stateA = std::make_shared<ls_std::State>("A");
  21. std::shared_ptr<ls_std::State> stateB = std::make_shared<ls_std::State>("B");
  22. std::shared_ptr<ls_std::State> stateC = std::make_shared<ls_std::State>("C");
  23. std::shared_ptr<ls_std::State> stateD = std::make_shared<ls_std::State>("D");
  24. std::shared_ptr<ls_std::State> stateE = std::make_shared<ls_std::State>("E");
  25. // add states
  26. stateMachine.addState(stateA);
  27. stateMachine.addState(stateB);
  28. stateMachine.addState(stateC);
  29. stateMachine.addState(stateD);
  30. stateMachine.addState(stateE);
  31. // add connections / see state_machine_test.png
  32. stateA->addStateConnection("AB", stateB);
  33. stateB->addStateConnection("BC", stateC);
  34. stateB->addStateConnection("BD", stateD);
  35. stateC->addStateConnection("CB", stateB);
  36. stateC->addStateConnection("CE", stateE);
  37. stateD->addStateConnection("DE", stateE);
  38. return stateMachine;
  39. }
  40. };
  41. TEST_F(StateMachineTest, addStateConnection)
  42. {
  43. ls_std::StateMachine stateMachine {"test_machine"};
  44. ASSERT_TRUE(stateMachine.addState(std::make_shared<ls_std::State>("A")));
  45. }
  46. TEST_F(StateMachineTest, addStateConnectionNegative)
  47. {
  48. ls_std::StateMachine stateMachine {"test_machine"};
  49. ASSERT_TRUE(stateMachine.addState(std::make_shared<ls_std::State>("A")));
  50. ASSERT_FALSE(stateMachine.addState(std::make_shared<ls_std::State>("A")));
  51. }
  52. TEST_F(StateMachineTest, getCurrentState)
  53. {
  54. ls_std::StateMachine stateMachine {"test_machine"};
  55. ASSERT_TRUE(stateMachine.addState(std::make_shared<ls_std::State>("A")));
  56. ASSERT_TRUE(stateMachine.getCurrentState() == nullptr);
  57. }
  58. TEST_F(StateMachineTest, getMemory)
  59. {
  60. ls_std::StateMachine stateMachine = _createStateMachine();
  61. ASSERT_STREQ("test_machine", stateMachine.getName().c_str());
  62. ASSERT_EQ(0, stateMachine.getMemory().size());
  63. stateMachine.setStartState("A");
  64. ASSERT_EQ(1, stateMachine.getMemory().size());
  65. ASSERT_STREQ("A", stateMachine.getMemory().at(0).c_str());
  66. ASSERT_FALSE(stateMachine.proceed());
  67. ASSERT_EQ(1, stateMachine.getMemory().size());
  68. ASSERT_STREQ("A", stateMachine.getMemory().at(0).c_str());
  69. stateMachine.getCurrentState()->getConnectedStates().at("AB")->updatePassCondition(true);
  70. ASSERT_TRUE(stateMachine.proceed());
  71. ASSERT_EQ(2, stateMachine.getMemory().size());
  72. ASSERT_STREQ("A", stateMachine.getMemory().at(0).c_str());
  73. ASSERT_STREQ("B", stateMachine.getMemory().at(1).c_str());
  74. stateMachine.getCurrentState()->getConnectedStates().at("BC")->updatePassCondition(true);
  75. ASSERT_TRUE(stateMachine.proceed());
  76. ASSERT_EQ(3, stateMachine.getMemory().size());
  77. ASSERT_STREQ("A", stateMachine.getMemory().at(0).c_str());
  78. ASSERT_STREQ("B", stateMachine.getMemory().at(1).c_str());
  79. ASSERT_STREQ("C", stateMachine.getMemory().at(2).c_str());
  80. stateMachine.getCurrentState()->getConnectedStates().at("CB")->updatePassCondition(true);
  81. ASSERT_TRUE(stateMachine.proceed());
  82. ASSERT_EQ(4, stateMachine.getMemory().size());
  83. ASSERT_STREQ("A", stateMachine.getMemory().at(0).c_str());
  84. ASSERT_STREQ("B", stateMachine.getMemory().at(1).c_str());
  85. ASSERT_STREQ("C", stateMachine.getMemory().at(2).c_str());
  86. ASSERT_STREQ("B", stateMachine.getMemory().at(3).c_str());
  87. }
  88. TEST_F(StateMachineTest, getName)
  89. {
  90. ls_std::StateMachine stateMachine {"test_machine"};
  91. ASSERT_STREQ("test_machine", stateMachine.getName().c_str());
  92. }
  93. TEST_F(StateMachineTest, getStates)
  94. {
  95. ls_std::StateMachine stateMachine = _createStateMachine();
  96. ASSERT_TRUE(!stateMachine.getStates().empty());
  97. ASSERT_EQ(5, stateMachine.getStates().size());
  98. }
  99. TEST_F(StateMachineTest, hasState)
  100. {
  101. ls_std::StateMachine stateMachine = _createStateMachine();
  102. ASSERT_TRUE(stateMachine.hasState("A"));
  103. ASSERT_TRUE(stateMachine.hasState("B"));
  104. ASSERT_TRUE(stateMachine.hasState("C"));
  105. ASSERT_TRUE(stateMachine.hasState("D"));
  106. ASSERT_TRUE(stateMachine.hasState("E"));
  107. }
  108. TEST_F(StateMachineTest, hasStateNegative)
  109. {
  110. ls_std::StateMachine stateMachine = _createStateMachine();
  111. ASSERT_FALSE(stateMachine.hasState("F"));
  112. }
  113. TEST_F(StateMachineTest, proceed)
  114. {
  115. ls_std::StateMachine stateMachine = _createStateMachine();
  116. ASSERT_STREQ("test_machine", stateMachine.getName().c_str());
  117. ASSERT_TRUE(stateMachine.setStartState("A"));
  118. ASSERT_FALSE(stateMachine.proceed());
  119. // activate AB
  120. stateMachine.getCurrentState()->getConnectedStates().at("AB")->updatePassCondition(true);
  121. ASSERT_TRUE(stateMachine.proceed());
  122. ASSERT_STREQ("B", stateMachine.getCurrentState()->getId().c_str());
  123. // activate BC and BD
  124. stateMachine.getCurrentState()->getConnectedStates().at("BC")->updatePassCondition(true);
  125. stateMachine.getCurrentState()->getConnectedStates().at("BD")->updatePassCondition(true);
  126. ASSERT_FALSE(stateMachine.proceed());
  127. // BC only!
  128. stateMachine.getCurrentState()->getConnectedStates().at("BD")->updatePassCondition(false);
  129. ASSERT_TRUE(stateMachine.proceed());
  130. ASSERT_STREQ("C", stateMachine.getCurrentState()->getId().c_str());
  131. // activate CB
  132. stateMachine.getCurrentState()->getConnectedStates().at("CB")->updatePassCondition(true);
  133. ASSERT_TRUE(stateMachine.proceed());
  134. ASSERT_STREQ("B", stateMachine.getCurrentState()->getId().c_str());
  135. // BD only!
  136. stateMachine.getCurrentState()->getConnectedStates().at("BD")->updatePassCondition(true);
  137. stateMachine.getCurrentState()->getConnectedStates().at("BC")->updatePassCondition(false);
  138. ASSERT_TRUE(stateMachine.proceed());
  139. ASSERT_STREQ("D", stateMachine.getCurrentState()->getId().c_str());
  140. // activate DE
  141. stateMachine.getCurrentState()->getConnectedStates().at("DE")->updatePassCondition(true);
  142. ASSERT_TRUE(stateMachine.proceed());
  143. ASSERT_STREQ("E", stateMachine.getCurrentState()->getId().c_str());
  144. // end reached
  145. ASSERT_FALSE(stateMachine.proceed());
  146. ASSERT_STREQ("E", stateMachine.getCurrentState()->getId().c_str());
  147. }
  148. TEST_F(StateMachineTest, setStartState)
  149. {
  150. ls_std::StateMachine stateMachine {"test_machine"};
  151. ASSERT_FALSE(stateMachine.getCurrentState() != nullptr);
  152. ASSERT_TRUE(stateMachine.addState(std::make_shared<ls_std::State>("A")));
  153. ASSERT_TRUE(stateMachine.setStartState("A"));
  154. ASSERT_TRUE(stateMachine.getCurrentState() != nullptr);
  155. }
  156. }