state_transitions_unittest.cc 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. // Copyright (c) 2020 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "base/state_transitions.h"
  5. #include <ostream>
  6. #include <string>
  7. #include "base/test/gtest_util.h"
  8. #include "build/build_config.h"
  9. #include "testing/gmock/include/gmock/gmock.h"
  10. #include "testing/gtest/include/gtest/gtest.h"
  11. namespace base {
  12. enum class State { kState1 = 0, kState2, kState3, kState4 };
  13. std::ostream& operator<<(std::ostream& o, const State& s) {
  14. return o << static_cast<int>(s);
  15. }
  16. TEST(StateTransitionsTest, Constructor) {
  17. // No expectations, just make sure the constructor works.
  18. const StateTransitions<State> transitions({
  19. {State::kState1, {State::kState2, State::kState3}},
  20. {State::kState2, {State::kState3, State::kState4}},
  21. });
  22. }
  23. TEST(StateTransitionsTest, GetValidTransitions) {
  24. const StateTransitions<State> transitions({
  25. {State::kState1, {State::kState2, State::kState3}},
  26. {State::kState2, {State::kState3, State::kState4}},
  27. });
  28. EXPECT_THAT(transitions.GetValidTransitions(State::kState1),
  29. testing::ElementsAre(State::kState2, State::kState3));
  30. EXPECT_THAT(transitions.GetValidTransitions(State::kState2),
  31. testing::ElementsAre(State::kState3, State::kState4));
  32. EXPECT_THAT(transitions.GetValidTransitions(State::kState3),
  33. testing::ElementsAre());
  34. EXPECT_THAT(transitions.GetValidTransitions(State::kState4),
  35. testing::ElementsAre());
  36. }
  37. TEST(StateTransitionsTest, IsTransitionValid) {
  38. const StateTransitions<State> transitions({
  39. {State::kState1, {State::kState2, State::kState3}},
  40. {State::kState2, {State::kState3, State::kState4}},
  41. });
  42. ASSERT_TRUE(transitions.IsTransitionValid(State::kState1, State::kState2));
  43. ASSERT_TRUE(transitions.IsTransitionValid(State::kState2, State::kState3));
  44. ASSERT_FALSE(transitions.IsTransitionValid(State::kState1, State::kState4));
  45. // kState3 was omitted from the definition.
  46. ASSERT_FALSE(transitions.IsTransitionValid(State::kState3, State::kState4));
  47. }
  48. TEST(StateTransitionsTest, DCHECK_STATE_TRANSITION) {
  49. const StateTransitions<State> transitions({
  50. {State::kState1, {State::kState2, State::kState3}},
  51. {State::kState2, {State::kState3, State::kState4}},
  52. });
  53. DCHECK_STATE_TRANSITION(&transitions, State::kState1, State::kState2);
  54. DCHECK_STATE_TRANSITION(&transitions, State::kState2, State::kState3);
  55. #if DCHECK_IS_ON()
  56. // EXPECT_DEATH is not defined on IOS.
  57. #if !BUILDFLAG(IS_IOS)
  58. EXPECT_DEATH(
  59. DCHECK_STATE_TRANSITION(&transitions, State::kState1, State::kState4),
  60. "Check failed.*Invalid transition: 0 -> 3");
  61. // kState3 was omitted from the definition.
  62. EXPECT_DEATH(
  63. DCHECK_STATE_TRANSITION(&transitions, State::kState3, State::kState4),
  64. "Check failed.*Invalid transition: 2 -> 3");
  65. #endif // !BUILDFLAG(IS_IOS)
  66. #endif // DCHECK_IS_ON()
  67. }
  68. // Test that everything works OK with some other data type.
  69. TEST(StateTransitionsTest, NonEnum) {
  70. const StateTransitions<std::string> transitions({
  71. {"state1", {"state2", "state3"}},
  72. {"state2", {"state3", "state4"}},
  73. });
  74. ASSERT_TRUE(transitions.IsTransitionValid("state1", "state2"));
  75. ASSERT_TRUE(transitions.IsTransitionValid("state2", "state3"));
  76. ASSERT_FALSE(transitions.IsTransitionValid("state1", "state4"));
  77. // kState3 was omitted from the definition.
  78. ASSERT_FALSE(transitions.IsTransitionValid("state3", "state4"));
  79. DCHECK_STATE_TRANSITION(&transitions, "state1", "state2");
  80. DCHECK_STATE_TRANSITION(&transitions, "state2", "state3");
  81. // Try some states that are not in the specification at all.
  82. ASSERT_FALSE(transitions.IsTransitionValid("foo", "state2"));
  83. ASSERT_FALSE(transitions.IsTransitionValid("state1", "foo"));
  84. ASSERT_FALSE(transitions.IsTransitionValid("foo", "bar"));
  85. }
  86. } // namespace base