/* * Copyright (c) 2010 Remko Tronçon * Licensed under the GNU General Public License v3. * See Documentation/Licenses/GPLv3.txt for more information. */ #include #include #include #include "Swiften/JID/JID.h" #include "Swiften/Base/String.h" #include "Swiften/Avatars/CombinedAvatarProvider.h" using namespace Swift; class CombinedAvatarProviderTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(CombinedAvatarProviderTest); CPPUNIT_TEST(testGetAvatarWithNoAvatarProviderReturnsEmpty); CPPUNIT_TEST(testGetAvatarWithSingleAvatarProvider); CPPUNIT_TEST(testGetAvatarWithMultipleAvatarProviderReturnsFirstAvatar); CPPUNIT_TEST(testGetAvatarWithMultipleAvatarProviderAndFailingFirstProviderReturnsSecondAvatar); CPPUNIT_TEST(testProviderUpdateTriggersChange); CPPUNIT_TEST(testProviderUpdateWithoutChangeDoesNotTriggerChange); CPPUNIT_TEST(testProviderSecondUpdateTriggersChange); CPPUNIT_TEST(testProviderUpdateWithAvatarDisappearingTriggersChange); CPPUNIT_TEST(testProviderUpdateAfterAvatarDisappearedTriggersChange); CPPUNIT_TEST(testRemoveProviderDisconnectsUpdates); CPPUNIT_TEST_SUITE_END(); public: void setUp() { avatarProvider1 = new DummyAvatarProvider(); avatarProvider2 = new DummyAvatarProvider(); user1 = JID("user1@bar.com/bla"); user2 = JID("user2@foo.com/baz"); avatarHash1 = "ABCDEFG"; avatarHash2 = "XYZU"; avatarHash3 = "IDGH"; } void tearDown() { delete avatarProvider1; delete avatarProvider2; } void testGetAvatarWithNoAvatarProviderReturnsEmpty() { std::auto_ptr testling(createProvider()); CPPUNIT_ASSERT(testling->getAvatarHash(user1).isEmpty()); } void testGetAvatarWithSingleAvatarProvider() { std::auto_ptr testling(createProvider()); avatarProvider1->avatars[user1] = avatarHash1; testling->addProvider(avatarProvider1); CPPUNIT_ASSERT_EQUAL(avatarHash1, testling->getAvatarHash(user1)); } void testGetAvatarWithMultipleAvatarProviderReturnsFirstAvatar() { std::auto_ptr testling(createProvider()); avatarProvider1->avatars[user1] = avatarHash1; avatarProvider2->avatars[user1] = avatarHash2; testling->addProvider(avatarProvider1); testling->addProvider(avatarProvider2); CPPUNIT_ASSERT_EQUAL(avatarHash1, testling->getAvatarHash(user1)); } void testGetAvatarWithMultipleAvatarProviderAndFailingFirstProviderReturnsSecondAvatar() { std::auto_ptr testling(createProvider()); avatarProvider2->avatars[user1] = avatarHash2; testling->addProvider(avatarProvider1); testling->addProvider(avatarProvider2); CPPUNIT_ASSERT_EQUAL(avatarHash2, testling->getAvatarHash(user1)); } void testProviderUpdateTriggersChange() { std::auto_ptr testling(createProvider()); testling->addProvider(avatarProvider1); avatarProvider1->avatars[user1] = avatarHash1; avatarProvider1->onAvatarChanged(user1); CPPUNIT_ASSERT_EQUAL(1, static_cast(changes.size())); CPPUNIT_ASSERT_EQUAL(user1, changes[0]); } void testProviderUpdateWithoutChangeDoesNotTriggerChange() { std::auto_ptr testling(createProvider()); testling->addProvider(avatarProvider1); testling->addProvider(avatarProvider2); avatarProvider1->avatars[user1] = avatarHash1; avatarProvider1->onAvatarChanged(user1); changes.clear(); avatarProvider2->avatars[user1] = avatarHash2; avatarProvider2->onAvatarChanged(user1); CPPUNIT_ASSERT_EQUAL(0, static_cast(changes.size())); } void testProviderSecondUpdateTriggersChange() { std::auto_ptr testling(createProvider()); testling->addProvider(avatarProvider1); avatarProvider1->avatars[user1] = avatarHash1; avatarProvider1->onAvatarChanged(user1); changes.clear(); avatarProvider1->avatars[user1] = avatarHash2; avatarProvider1->onAvatarChanged(user1); CPPUNIT_ASSERT_EQUAL(1, static_cast(changes.size())); CPPUNIT_ASSERT_EQUAL(user1, changes[0]); } void testProviderUpdateWithAvatarDisappearingTriggersChange() { std::auto_ptr testling(createProvider()); testling->addProvider(avatarProvider1); avatarProvider1->avatars[user1] = avatarHash1; avatarProvider1->onAvatarChanged(user1); changes.clear(); avatarProvider1->avatars.clear(); avatarProvider1->onAvatarChanged(user1); CPPUNIT_ASSERT_EQUAL(1, static_cast(changes.size())); CPPUNIT_ASSERT_EQUAL(user1, changes[0]); } void testProviderUpdateAfterAvatarDisappearedTriggersChange() { std::auto_ptr testling(createProvider()); testling->addProvider(avatarProvider1); avatarProvider1->avatars[user1] = avatarHash1; avatarProvider1->onAvatarChanged(user1); avatarProvider1->avatars.clear(); avatarProvider1->onAvatarChanged(user1); changes.clear(); avatarProvider1->avatars[user1] = avatarHash1; avatarProvider1->onAvatarChanged(user1); CPPUNIT_ASSERT_EQUAL(1, static_cast(changes.size())); CPPUNIT_ASSERT_EQUAL(user1, changes[0]); } void testRemoveProviderDisconnectsUpdates() { std::auto_ptr testling(createProvider()); testling->addProvider(avatarProvider1); testling->addProvider(avatarProvider2); testling->removeProvider(avatarProvider1); avatarProvider1->avatars[user1] = avatarHash1; avatarProvider2->avatars[user1] = avatarHash2; avatarProvider1->onAvatarChanged(user1); CPPUNIT_ASSERT_EQUAL(0, static_cast(changes.size())); } private: std::auto_ptr createProvider() { std::auto_ptr result(new CombinedAvatarProvider()); result->onAvatarChanged.connect(boost::bind(&CombinedAvatarProviderTest::handleAvatarChanged, this, _1)); return result; } void handleAvatarChanged(const JID& jid) { changes.push_back(jid); } private: struct DummyAvatarProvider : public AvatarProvider { String getAvatarHash(const JID& jid) const { std::map::const_iterator i = avatars.find(jid); if (i != avatars.end()) { return i->second; } else { return String(); } } std::map avatars; }; DummyAvatarProvider* avatarProvider1; DummyAvatarProvider* avatarProvider2; JID user1; JID user2; String avatarHash1; String avatarHash2; String avatarHash3; std::vector changes; }; CPPUNIT_TEST_SUITE_REGISTRATION(CombinedAvatarProviderTest);