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 SuperclassCachedObjectTest 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 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 boolean reloadFromCachedModel(ModelCache modelCache, CachedModel cachedModel) {
TestObject cachedTestObject = (TestObject) cachedModel;
testString = cachedTestObject.testString;
return false;
}
@Override
public String createKey(String id) {
return "test_object_" + id;
}
}
class SubclassTestObject extends TestObject {
private String extraString;
public SubclassTestObject() {
super();
}
public SubclassTestObject(String id) {
super(id);
}
public String getExtraString() {
return extraString;
}
public void setExtraString(String extraString) {
this.extraString = extraString;
}
@Override
public boolean reloadFromCachedModel(ModelCache modelCache, CachedModel cachedModel) {
super.reloadFromCachedModel(modelCache, cachedModel);
SubclassTestObject cachedTestObject = (SubclassTestObject) cachedModel;
extraString = cachedTestObject.extraString;
return false;
}
@Override
public void readFromParcel(Parcel source) throws IOException {
super.readFromParcel(source);
extraString = source.readString();
}
@Override
public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags);
dest.writeString(extraString);
}
@Override
public String createKey(String id) {
return "subclass_test_object_" + id;
}
// HAVE TO DO THIS IN ORDER TO OVERWRITE SUPERCLASS CACHE
@Override
public boolean save(ModelCache modelCache) {
return super.save(modelCache) && super.save(modelCache, super.createKey(getId()));
}
}
@Test
public void testSubclassSavesOverSuperclass() {
ModelCache modelCache = new ModelCache(2, 1, 1);
String id = "123";
TestObject testObject = new TestObject(id);
testObject.setTestString("this is a test");
testObject.save(modelCache);
SubclassTestObject subclassTestObject = new SubclassTestObject(id);
subclassTestObject.setTestString("yet another test");
subclassTestObject.setExtraString("quite a few really");
subclassTestObject.save(modelCache);
testObject.reload(modelCache);
assertEquals("yet another test", testObject.getTestString());
}
@Test
public void testSuperclassDoesntSaveOverSubclass() {
ModelCache modelCache = new ModelCache(2, 1, 1);
String id = "123";
SubclassTestObject subclassTestObject = new SubclassTestObject(id);
subclassTestObject.setTestString("this is a test");
subclassTestObject.setExtraString("yet another test");
subclassTestObject.save(modelCache);
TestObject testObject = new TestObject(id);
testObject.setTestString("quite a few really");
testObject.save(modelCache);
subclassTestObject.reload(modelCache);
assertEquals("this is a test", subclassTestObject.getTestString());
}
}