package com.github.droidfu.cachefu; import static org.junit.Assert.assertEquals; import java.io.IOException; import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import android.os.Parcel; import android.util.Log; import com.github.droidfu.TestBase; @RunWith(PowerMockRunner.class) @PrepareForTest({ Log.class }) public class NestedCachedObjectTest extends TestBase { class TestObject extends CachedModel { private String testString; public TestObject() { super(); } public TestObject(String id) { super(id); } public String getTestString() { return testString; } public void setTestString(String testString) { this.testString = testString; } @Override public boolean reloadFromCachedModel(ModelCache modelCache, CachedModel cachedModel) { TestObject cachedTestObject = (TestObject) cachedModel; testString = cachedTestObject.testString; return false; } @Override public void readFromParcel(Parcel source) throws IOException { super.readFromParcel(source); testString = source.readString(); } @Override public void writeToParcel(Parcel dest, int flags) { super.writeToParcel(dest, flags); dest.writeString(testString); } @Override public String createKey(String id) { return "test_object_" + id; } } public class OuterTestObject extends CachedModel { private static final long serialVersionUID = -4127153536940947286L; private TestObject internalObject; public OuterTestObject() { super(); } public OuterTestObject(String id) { super(id); } public TestObject getInternalObject() { return internalObject; } public void setInternalObject(TestObject internalObject) { this.internalObject = internalObject; } @Override public boolean reloadFromCachedModel(ModelCache modelCache, CachedModel cachedModel) { OuterTestObject cachedOuterObject = (OuterTestObject) cachedModel; internalObject = cachedOuterObject.internalObject; // HAVE TO DO THIS IN ORDER TO RELOAD NESTED OBJECT FROM CACHE boolean internalObjectReloaded = false; if (internalObject != null) { internalObjectReloaded = internalObject.reload(modelCache); } return internalObjectReloaded; } @Override public String createKey(String id) { return "outer_test_object_" + id; } } @Test public void testInternalObjectReloads() { ModelCache modelCache = new ModelCache(1, 1, 1); String id = "123"; TestObject internalTestObject = new TestObject(id); internalTestObject.setTestString("this is a test"); internalTestObject.save(modelCache); OuterTestObject outerTestObject = new OuterTestObject(id); outerTestObject.setInternalObject(internalTestObject); outerTestObject.save(modelCache); TestObject overridingTestObject = new TestObject(id); overridingTestObject.setTestString("yet another test"); overridingTestObject.save(modelCache); internalTestObject.reload(modelCache); assertEquals("yet another test", outerTestObject.getInternalObject().getTestString()); } }