package com.octo.android.robospice.persistence; import java.util.ArrayList; import java.util.List; import android.test.AndroidTestCase; import android.test.suitebuilder.annotation.SmallTest; import com.octo.android.robospice.persistence.exception.CacheCreationException; import com.octo.android.robospice.persistence.exception.CacheLoadingException; import com.octo.android.robospice.persistence.exception.CacheSavingException; @SmallTest public class CacheManagerTest extends AndroidTestCase { private static final String TEST_PERSISTED_STRING = "TEST"; private static final Integer TEST_PERSISTED_INTEGER = Integer.valueOf(0); private CacheManager cacheManager; @Override protected void setUp() throws Exception { cacheManager = new CacheManager(); } public void testGetObjectPersister_fails_to_return_a_persister_when_no_persister_is_registered() { // given try { // when cacheManager.getObjectPersister(Object.class); fail("No data class persistence manager should have been found as none had been registered"); } catch (Exception ex) { // then assertTrue(true); } } public void testGetObjectPersister_returns_a_persister_when_one_persister_is_registered() throws CacheCreationException { // given MockStringPersistenceManager mockStringPersistenceManager = new MockStringPersistenceManager(); cacheManager.addPersister(mockStringPersistenceManager); // when ObjectPersister<?> actual = cacheManager.getObjectPersister(String.class); // then assertEquals(mockStringPersistenceManager, actual); } public void testGetObjectPersister_returns_ordered_persister_when_2_persisters_are_registered() throws CacheCreationException { // given // register a data class persistence manager first MockStringPersistenceManager mockStringPersistenceManager = new MockStringPersistenceManager(); cacheManager.addPersister(mockStringPersistenceManager); // register a second data class persistence manager MockStringPersistenceManager mockDataClassPersistenceManager2 = new MockStringPersistenceManager(); cacheManager.addPersister(mockDataClassPersistenceManager2); // when ObjectPersister<?> actual = cacheManager.getObjectPersister(String.class); // then assertEquals(mockStringPersistenceManager, actual); } public void testGetObjectPersister_returns_no_persister_when_persister_has_been_unregistered() throws CacheCreationException { // given // register a data class persistence manager first MockStringPersistenceManager mockStringPersistenceManager = new MockStringPersistenceManager(); cacheManager.addPersister(mockStringPersistenceManager); ObjectPersister<?> actual = cacheManager.getObjectPersister(String.class); assertEquals(mockStringPersistenceManager, actual); // unregister it cacheManager.removePersister(mockStringPersistenceManager); // no persistence manager should be found any more try { // when cacheManager.getObjectPersister(String.class); fail("No data class persistence manager should have been found as none had been registered"); } catch (Exception ex) { // then assertTrue(true); } } public void testGetObjectPersister_returns_no_persister_when_2_were_added_and_good_is_gone() throws CacheCreationException { // given // register 2 data class persistence manager first MockStringPersistenceManager mockStringPersistenceManager = new MockStringPersistenceManager(); cacheManager.addPersister(mockStringPersistenceManager); MockIntegerPersistenceManager mockIntegerPersistenceManager = new MockIntegerPersistenceManager(); cacheManager.addPersister(mockIntegerPersistenceManager); // when ObjectPersister<?> persisterString = cacheManager.getObjectPersister(String.class); ObjectPersister<?> persisterInteger = cacheManager.getObjectPersister(Integer.class); // then assertEquals(mockStringPersistenceManager, persisterString); assertEquals(mockIntegerPersistenceManager, persisterInteger); // given // unregister it cacheManager.removePersister(mockStringPersistenceManager); // no persistence manager should be found any more try { // when cacheManager.getObjectPersister(String.class); fail("No data class persistence manager should have been found as none had been registered"); } catch (Exception ex) { // then assertTrue(true); } // when persisterInteger = cacheManager.getObjectPersister(Integer.class); // then assertEquals(mockIntegerPersistenceManager, persisterInteger); } // ---------------------------------- // CLASSES UNDER TEST // ---------------------------------- private class MockStringPersistenceManager extends ObjectPersister<String> { public MockStringPersistenceManager() { super(null, String.class); } @Override public boolean canHandleClass(Class<?> arg0) { return arg0.equals(String.class); } @Override public String loadDataFromCache(Object arg0, long arg1) throws CacheLoadingException { return TEST_PERSISTED_STRING; } @Override public String saveDataToCacheAndReturnData(String arg0, Object arg1) throws CacheSavingException { return TEST_PERSISTED_STRING; } @Override public void removeAllDataFromCache() { } @Override public boolean removeDataFromCache(Object arg0) { return true; } @Override public List<String> loadAllDataFromCache() throws CacheLoadingException { ArrayList<String> listString = new ArrayList<String>(); listString.add(TEST_PERSISTED_STRING); return listString; } @Override public List<Object> getAllCacheKeys() { return null; } @Override public long getCreationDateInCache(Object cacheKey) throws CacheLoadingException { return 0; } @Override public boolean isDataInCache(Object cacheKey, long maxTimeInCacheBeforeExpiry) { return true; } } private class MockIntegerPersistenceManager extends ObjectPersister<Integer> { public MockIntegerPersistenceManager() { super(null, Integer.class); } @Override public boolean canHandleClass(Class<?> arg0) { return arg0.equals(Integer.class); } @Override public Integer loadDataFromCache(Object arg0, long arg1) throws CacheLoadingException { return TEST_PERSISTED_INTEGER; } @Override public Integer saveDataToCacheAndReturnData(Integer arg0, Object arg1) throws CacheSavingException { return TEST_PERSISTED_INTEGER; } @Override public void removeAllDataFromCache() { } @Override public boolean removeDataFromCache(Object arg0) { return true; } @Override public List<Integer> loadAllDataFromCache() throws CacheLoadingException { ArrayList<Integer> listString = new ArrayList<Integer>(); listString.add(TEST_PERSISTED_INTEGER); return listString; } @Override public List<Object> getAllCacheKeys() { return null; } @Override public long getCreationDateInCache(Object cacheKey) throws CacheLoadingException { return 0; } @Override public boolean isDataInCache(Object cacheKey, long maxTimeInCacheBeforeExpiry) { return true; } } }