EventBusTest.cpp 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. /*
  2. * EventBusTest.cpp, part of VCMI engine
  3. *
  4. * Authors: listed in file AUTHORS in main folder
  5. *
  6. * License: GNU General Public License v2.0 or later
  7. * Full text of license available in license.txt file, in main folder
  8. *
  9. */
  10. #include "StdInc.h"
  11. #include <vcmi/events/Event.h>
  12. #include <vcmi/events/EventBus.h>
  13. namespace test
  14. {
  15. using namespace ::testing;
  16. using namespace ::events;
  17. class EventExample : public Event
  18. {
  19. public:
  20. using PreHandler = SubscriptionRegistry<EventExample>::PreHandler;
  21. using PostHandler = SubscriptionRegistry<EventExample>::PostHandler;
  22. using ExecHandler = SubscriptionRegistry<EventExample>::ExecHandler;
  23. MOCK_CONST_METHOD0(isEnabled, bool());
  24. public:
  25. static SubscriptionRegistry<EventExample> * getRegistry()
  26. {
  27. static auto Instance = std::make_unique<SubscriptionRegistry<EventExample>>();
  28. return Instance.get();
  29. }
  30. friend class SubscriptionRegistry<EventExample>;
  31. };
  32. class EventBusListenerMock
  33. {
  34. public:
  35. virtual ~EventBusListenerMock() = default;
  36. MOCK_METHOD1(beforeEvent, void(EventExample &));
  37. MOCK_METHOD1(onEvent, void(EventExample &));
  38. MOCK_METHOD1(afterEvent, void(const EventExample &));
  39. };
  40. class EventBusTest : public Test
  41. {
  42. public:
  43. EventExample event1;
  44. EventExample event2;
  45. EventBus subject1;
  46. EventBus subject2;
  47. StrictMock<EventBusListenerMock> listener;
  48. StrictMock<EventBusListenerMock> listener1;
  49. StrictMock<EventBusListenerMock> listener2;
  50. };
  51. TEST_F(EventBusTest, ExecuteNoListeners)
  52. {
  53. EXPECT_CALL(event1, isEnabled()).WillRepeatedly(Return(true));
  54. subject1.executeEvent(event1);
  55. }
  56. TEST_F(EventBusTest, ExecuteNoListenersWithHandler)
  57. {
  58. EXPECT_CALL(event1, isEnabled()).WillRepeatedly(Return(true));
  59. EXPECT_CALL(listener, onEvent(Ref(event1))).Times(1);
  60. subject1.executeEvent(event1, std::bind(&EventBusListenerMock::onEvent, &listener, _1));
  61. }
  62. TEST_F(EventBusTest, ExecuteIgnoredSubscription)
  63. {
  64. EXPECT_CALL(event1, isEnabled()).WillRepeatedly(Return(true));
  65. subject1.subscribeBefore<EventExample>(std::bind(&EventBusListenerMock::beforeEvent, &listener, _1));
  66. subject1.subscribeAfter<EventExample>(std::bind(&EventBusListenerMock::afterEvent, &listener, _1));
  67. EXPECT_CALL(listener, beforeEvent(_)).Times(0);
  68. EXPECT_CALL(listener, afterEvent(_)).Times(0);
  69. subject1.executeEvent(event1);
  70. }
  71. TEST_F(EventBusTest, ExecuteSequence)
  72. {
  73. EXPECT_CALL(event1, isEnabled()).WillRepeatedly(Return(true));
  74. auto subscription1 = subject1.subscribeBefore<EventExample>(std::bind(&EventBusListenerMock::beforeEvent, &listener1, _1));
  75. auto subscription2 = subject1.subscribeAfter<EventExample>(std::bind(&EventBusListenerMock::afterEvent, &listener1, _1));
  76. auto subscription3 = subject1.subscribeBefore<EventExample>(std::bind(&EventBusListenerMock::beforeEvent, &listener2, _1));
  77. auto subscription4 = subject1.subscribeAfter<EventExample>(std::bind(&EventBusListenerMock::afterEvent, &listener2, _1));
  78. {
  79. InSequence sequence;
  80. EXPECT_CALL(listener1, beforeEvent(Ref(event1))).Times(1);
  81. EXPECT_CALL(listener2, beforeEvent(Ref(event1))).Times(1);
  82. EXPECT_CALL(listener, onEvent(Ref(event1))).Times(1);
  83. EXPECT_CALL(listener1, afterEvent(Ref(event1))).Times(1);
  84. EXPECT_CALL(listener2, afterEvent(Ref(event1))).Times(1);
  85. }
  86. subject1.executeEvent(event1, std::bind(&EventBusListenerMock::onEvent, &listener, _1));
  87. }
  88. TEST_F(EventBusTest, BusesAreIndependent)
  89. {
  90. EXPECT_CALL(event1, isEnabled()).WillRepeatedly(Return(true));
  91. auto subscription1 = subject1.subscribeBefore<EventExample>(std::bind(&EventBusListenerMock::beforeEvent, &listener1, _1));
  92. auto subscription2 = subject1.subscribeAfter<EventExample>(std::bind(&EventBusListenerMock::afterEvent, &listener1, _1));
  93. auto subscription3 = subject2.subscribeBefore<EventExample>(std::bind(&EventBusListenerMock::beforeEvent, &listener2, _1));
  94. auto subscription4 = subject2.subscribeAfter<EventExample>(std::bind(&EventBusListenerMock::afterEvent, &listener2, _1));
  95. EXPECT_CALL(listener1, beforeEvent(_)).Times(1);
  96. EXPECT_CALL(listener2, beforeEvent(_)).Times(0);
  97. EXPECT_CALL(listener1, afterEvent(_)).Times(1);
  98. EXPECT_CALL(listener2, afterEvent(_)).Times(0);
  99. subject1.executeEvent(event1);
  100. }
  101. TEST_F(EventBusTest, DisabledTestDontExecute)
  102. {
  103. EXPECT_CALL(event1, isEnabled()).Times(AtLeast(1)).WillRepeatedly(Return(false));
  104. EXPECT_CALL(listener, onEvent(Ref(event1))).Times(0);
  105. subject1.executeEvent(event1, std::bind(&EventBusListenerMock::onEvent, &listener, _1));
  106. }
  107. TEST_F(EventBusTest, DisabledTestDontExecutePostHandler)
  108. {
  109. EXPECT_CALL(event1, isEnabled()).Times(AtLeast(1)).WillRepeatedly(Return(false));
  110. EXPECT_CALL(listener, onEvent(Ref(event1))).WillRepeatedly(Return());
  111. EXPECT_CALL(listener1, afterEvent(Ref(event1))).Times(0);
  112. auto subscription1 = subject1.subscribeAfter<EventExample>(std::bind(&EventBusListenerMock::afterEvent, &listener1, _1));
  113. subject1.executeEvent(event1, std::bind(&EventBusListenerMock::onEvent, &listener, _1));
  114. }
  115. TEST_F(EventBusTest, DisabledTestExecutePreHandler)
  116. {
  117. EXPECT_CALL(event1, isEnabled()).Times(AtLeast(1)).WillRepeatedly(Return(false));
  118. EXPECT_CALL(listener, onEvent(Ref(event1))).WillRepeatedly(Return());
  119. EXPECT_CALL(listener1, beforeEvent(Ref(event1))).Times(1);
  120. auto subscription1 = subject1.subscribeBefore<EventExample>(std::bind(&EventBusListenerMock::beforeEvent, &listener1, _1));
  121. subject1.executeEvent(event1, std::bind(&EventBusListenerMock::onEvent, &listener, _1));
  122. }
  123. //TODO: test sending event to destroyed event bus
  124. }