/* * Copyright 2013 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "SkMessageBus.h" #include "Test.h" namespace { struct TestMessage { bool shouldSend(uint32_t inboxID) const { return true; } TestMessage(int i, float f) : x(i), y(f) {} int x; float y; }; } DECLARE_SKMESSAGEBUS_MESSAGE(TestMessage) DEF_TEST(MessageBus, r) { // Register two inboxes to receive all TestMessages. SkMessageBus::Inbox inbox1, inbox2; // Send two messages. const TestMessage m1 = { 5, 4.2f }; const TestMessage m2 = { 6, 4.3f }; SkMessageBus::Post(m1); SkMessageBus::Post(m2); // Make sure we got two. SkTArray messages; inbox1.poll(&messages); REPORTER_ASSERT(r, 2 == messages.count()); REPORTER_ASSERT(r, 5 == messages[0].x); REPORTER_ASSERT(r, 6 == messages[1].x); // Send another; check we get just that one. const TestMessage m3 = { 1, 0.3f }; SkMessageBus::Post(m3); inbox1.poll(&messages); REPORTER_ASSERT(r, 1 == messages.count()); REPORTER_ASSERT(r, 1 == messages[0].x); // Nothing was sent since the last read. inbox1.poll(&messages); REPORTER_ASSERT(r, 0 == messages.count()); // Over all this time, inbox2 should have piled up 3 messages. inbox2.poll(&messages); REPORTER_ASSERT(r, 3 == messages.count()); REPORTER_ASSERT(r, 5 == messages[0].x); REPORTER_ASSERT(r, 6 == messages[1].x); REPORTER_ASSERT(r, 1 == messages[2].x); } namespace { struct AddressedMessage { uint32_t fInboxID; bool shouldSend(uint32_t inboxID) const { SkASSERT(inboxID); if (!fInboxID) { return true; } return inboxID == fInboxID; } }; } DECLARE_SKMESSAGEBUS_MESSAGE(AddressedMessage) DEF_TEST(MessageBus_shouldSend, r) { SkMessageBus::Inbox inbox1(1), inbox2(2); SkMessageBus::Post({0}); // Should go to both SkMessageBus::Post({1}); // Should go to inbox1 SkMessageBus::Post({2}); // Should go to inbox2 SkMessageBus::Post({3}); // Should go nowhere SkTArray messages; inbox1.poll(&messages); REPORTER_ASSERT(r, messages.count() == 2); if (messages.count() == 2) { REPORTER_ASSERT(r, messages[0].fInboxID == 0); REPORTER_ASSERT(r, messages[1].fInboxID == 1); } inbox2.poll(&messages); REPORTER_ASSERT(r, messages.count() == 2); if (messages.count() == 2) { REPORTER_ASSERT(r, messages[0].fInboxID == 0); REPORTER_ASSERT(r, messages[1].fInboxID == 2); } } // Multithreaded tests tbd.