EventBusTest.cpp 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  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 ListenerMock
  33. {
  34. public:
  35. MOCK_METHOD1(beforeEvent, void(EventExample &));
  36. MOCK_METHOD1(onEvent, void(EventExample &));
  37. MOCK_METHOD1(afterEvent, void(const EventExample &));
  38. };
  39. class EventBusTest : public Test
  40. {
  41. public:
  42. EventExample event1;
  43. EventExample event2;
  44. EventBus subject1;
  45. EventBus subject2;
  46. StrictMock<ListenerMock> listener;
  47. StrictMock<ListenerMock> listener1;
  48. StrictMock<ListenerMock> listener2;
  49. };
  50. TEST_F(EventBusTest, ExecuteNoListeners)
  51. {
  52. EXPECT_CALL(event1, isEnabled()).WillRepeatedly(Return(true));
  53. subject1.executeEvent(event1);
  54. }
  55. TEST_F(EventBusTest, ExecuteNoListenersWithHandler)
  56. {
  57. EXPECT_CALL(event1, isEnabled()).WillRepeatedly(Return(true));
  58. EXPECT_CALL(listener, onEvent(Ref(event1))).Times(1);
  59. subject1.executeEvent(event1, std::bind(&ListenerMock::onEvent, &listener, _1));
  60. }
  61. TEST_F(EventBusTest, ExecuteIgnoredSubscription)
  62. {
  63. EXPECT_CALL(event1, isEnabled()).WillRepeatedly(Return(true));
  64. subject1.subscribeBefore<EventExample>(std::bind(&ListenerMock::beforeEvent, &listener, _1));
  65. subject1.subscribeAfter<EventExample>(std::bind(&ListenerMock::afterEvent, &listener, _1));
  66. EXPECT_CALL(listener, beforeEvent(_)).Times(0);
  67. EXPECT_CALL(listener, afterEvent(_)).Times(0);
  68. subject1.executeEvent(event1);
  69. }
  70. TEST_F(EventBusTest, ExecuteSequence)
  71. {
  72. EXPECT_CALL(event1, isEnabled()).WillRepeatedly(Return(true));
  73. auto subscription1 = subject1.subscribeBefore<EventExample>(std::bind(&ListenerMock::beforeEvent, &listener1, _1));
  74. auto subscription2 = subject1.subscribeAfter<EventExample>(std::bind(&ListenerMock::afterEvent, &listener1, _1));
  75. auto subscription3 = subject1.subscribeBefore<EventExample>(std::bind(&ListenerMock::beforeEvent, &listener2, _1));
  76. auto subscription4 = subject1.subscribeAfter<EventExample>(std::bind(&ListenerMock::afterEvent, &listener2, _1));
  77. {
  78. InSequence sequence;
  79. EXPECT_CALL(listener1, beforeEvent(Ref(event1))).Times(1);
  80. EXPECT_CALL(listener2, beforeEvent(Ref(event1))).Times(1);
  81. EXPECT_CALL(listener, onEvent(Ref(event1))).Times(1);
  82. EXPECT_CALL(listener1, afterEvent(Ref(event1))).Times(1);
  83. EXPECT_CALL(listener2, afterEvent(Ref(event1))).Times(1);
  84. }
  85. subject1.executeEvent(event1, std::bind(&ListenerMock::onEvent, &listener, _1));
  86. }
  87. TEST_F(EventBusTest, BusesAreIndependent)
  88. {
  89. EXPECT_CALL(event1, isEnabled()).WillRepeatedly(Return(true));
  90. auto subscription1 = subject1.subscribeBefore<EventExample>(std::bind(&ListenerMock::beforeEvent, &listener1, _1));
  91. auto subscription2 = subject1.subscribeAfter<EventExample>(std::bind(&ListenerMock::afterEvent, &listener1, _1));
  92. auto subscription3 = subject2.subscribeBefore<EventExample>(std::bind(&ListenerMock::beforeEvent, &listener2, _1));
  93. auto subscription4 = subject2.subscribeAfter<EventExample>(std::bind(&ListenerMock::afterEvent, &listener2, _1));
  94. EXPECT_CALL(listener1, beforeEvent(_)).Times(1);
  95. EXPECT_CALL(listener2, beforeEvent(_)).Times(0);
  96. EXPECT_CALL(listener1, afterEvent(_)).Times(1);
  97. EXPECT_CALL(listener2, afterEvent(_)).Times(0);
  98. subject1.executeEvent(event1);
  99. }
  100. TEST_F(EventBusTest, DisabledTestDontExecute)
  101. {
  102. EXPECT_CALL(event1, isEnabled()).Times(AtLeast(1)).WillRepeatedly(Return(false));
  103. EXPECT_CALL(listener, onEvent(Ref(event1))).Times(0);
  104. subject1.executeEvent(event1, std::bind(&ListenerMock::onEvent, &listener, _1));
  105. }
  106. TEST_F(EventBusTest, DisabledTestDontExecutePostHandler)
  107. {
  108. EXPECT_CALL(event1, isEnabled()).Times(AtLeast(1)).WillRepeatedly(Return(false));
  109. EXPECT_CALL(listener, onEvent(Ref(event1))).WillRepeatedly(Return());
  110. EXPECT_CALL(listener1, afterEvent(Ref(event1))).Times(0);
  111. auto subscription1 = subject1.subscribeAfter<EventExample>(std::bind(&ListenerMock::afterEvent, &listener1, _1));
  112. subject1.executeEvent(event1, std::bind(&ListenerMock::onEvent, &listener, _1));
  113. }
  114. TEST_F(EventBusTest, DisabledTestExecutePreHandler)
  115. {
  116. EXPECT_CALL(event1, isEnabled()).Times(AtLeast(1)).WillRepeatedly(Return(false));
  117. EXPECT_CALL(listener, onEvent(Ref(event1))).WillRepeatedly(Return());
  118. EXPECT_CALL(listener1, beforeEvent(Ref(event1))).Times(1);
  119. auto subscription1 = subject1.subscribeBefore<EventExample>(std::bind(&ListenerMock::beforeEvent, &listener1, _1));
  120. subject1.executeEvent(event1, std::bind(&ListenerMock::onEvent, &listener, _1));
  121. }
  122. //TODO: test sending event to destroyed event bus
  123. }