/**
* Copyright (c) 2006-2011 Floggy Open Source Group. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.sourceforge.floggy.persistence.rms;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Hashtable;
import javax.microedition.rms.InvalidRecordIDException;
import net.sourceforge.floggy.persistence.Filter;
import net.sourceforge.floggy.persistence.FloggyBaseTest;
import net.sourceforge.floggy.persistence.FloggyException;
import net.sourceforge.floggy.persistence.ObjectSet;
import net.sourceforge.floggy.persistence.Persistable;
import net.sourceforge.floggy.persistence.SingleObjectSet;
import net.sourceforge.floggy.persistence.migration.Enumeration;
import net.sourceforge.floggy.persistence.migration.MigrationManager;
/**
* DOCUMENT ME!
*
* @author <a href="mailto:thiago.moreira@floggy.org">Thiago Moreira</a>
* @version $Revision$
*/
public abstract class AbstractTest extends FloggyBaseTest {
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public Filter getFilter() {
return new Filter() {
public boolean matches(Persistable persistable) {
Object temp = getValueForSetMethod();
Object array = null;
try {
array = getX(persistable);
} catch (Exception e) {
throw new RuntimeException(e.getMessage());
}
if (temp != null) {
if (temp.getClass().isArray()) {
Class clazz = temp.getClass().getComponentType();
if (clazz == short.class) {
return Arrays.equals((short[]) temp, (short[]) array);
} else if (clazz == boolean.class) {
return Arrays.equals((boolean[]) temp, (boolean[]) array);
} else if (clazz == byte.class) {
return Arrays.equals((byte[]) temp, (byte[]) array);
} else if (clazz == char.class) {
return Arrays.equals((char[]) temp, (char[]) array);
} else if (clazz == double.class) {
return Arrays.equals((double[]) temp, (double[]) array);
} else if (clazz == int.class) {
return Arrays.equals((int[]) temp, (int[]) array);
} else if (clazz == float.class) {
return Arrays.equals((float[]) temp, (float[]) array);
} else if (clazz == long.class) {
return Arrays.equals((long[]) temp, (long[]) array);
} else {
return Arrays.equals((Object[]) temp, (Object[]) array);
}
} else {
return temp.equals(array);
}
} else
return temp == array;
}
};
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public abstract Object getValueForSetMethod();
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public String getNameForGetMethod() {
return "getX";
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public String getNameForSetMethod() {
return "setX";
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public Object getNewValueForSetMethod() {
return null;
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public abstract Persistable newInstance();
/**
* DOCUMENT ME!
*
* @throws Exception DOCUMENT ME!
*/
public void testDelete() throws Exception {
Persistable object = newInstance();
int id = manager.save(object);
manager.delete(object);
object = newInstance();
try {
manager.load(object, id);
fail("This object must was deleted!");
} catch (Exception e) {
assertEquals(FloggyException.class, e.getClass());
}
}
/**
* DOCUMENT ME!
*
* @throws Exception DOCUMENT ME!
*/
public void testDeleteAll() throws Exception {
Persistable object = newInstance();
manager.deleteAll(object.getClass());
assertEquals(0, manager.find(object.getClass(), null, null).size());
manager.save(object);
assertEquals(1, manager.find(object.getClass(), null, null).size());
manager.deleteAll(object.getClass());
assertEquals(0, manager.find(object.getClass(), null, null).size());
}
/**
* DOCUMENT ME!
*/
public void testDeleteWithNullObject() {
try {
manager.delete(null);
fail("A IllegalArgumentException must be throw!");
} catch (Exception e) {
assertEquals(e.getClass(), IllegalArgumentException.class);
}
}
/**
* DOCUMENT ME!
*/
public void testDeleteWithoutSave() {
Persistable instance = newInstance();
try {
manager.delete(instance);
assertTrue("Nothing happend because nothing was saved!", true);
} catch (Exception e) {
fail("No exception should be throwed!");
}
}
/**
* DOCUMENT ME!
*
* @throws Exception DOCUMENT ME!
*/
public void testFR2422928Delete() throws Exception {
Persistable object = newInstance();
int recordId = manager.save(object);
MigrationManager um = MigrationManager.getInstance();
Enumeration enumeration = um.start(object.getClass(), null);
try {
while (enumeration.hasMoreElements()) {
enumeration.nextElement();
int newRecordId = enumeration.delete();
assertEquals(recordId, newRecordId);
}
try {
manager.load(newInstance(), recordId);
fail("It should throw a InvalidRecordIDException");
} catch (Exception ex) {
assertEquals(InvalidRecordIDException.class.getName(), ex.getMessage());
}
} finally {
um.finish(object.getClass());
}
}
/**
* DOCUMENT ME!
*
* @throws Exception DOCUMENT ME!
*/
public void testFR2422928Read() throws Exception {
Persistable object = newInstance();
setX(object, getValueForSetMethod());
manager.save(object);
MigrationManager um = MigrationManager.getInstance();
Enumeration enumeration = um.start(object.getClass(), null);
try {
while (enumeration.hasMoreElements()) {
Hashtable data = (Hashtable) enumeration.nextElement();
assertFalse("Should not be empty!", data.isEmpty());
equals(data.get("x"), getValueForSetMethod());
}
} finally {
manager.delete(object);
um.finish(object.getClass());
}
}
/**
* DOCUMENT ME!
*
* @throws Exception DOCUMENT ME!
*/
public void testFR2422928Update() throws Exception {
Persistable oldObject = newInstance();
setX(oldObject, getValueForSetMethod());
manager.save(oldObject);
Persistable newObject = newInstance();
MigrationManager um = MigrationManager.getInstance();
Enumeration enumeration = um.start(oldObject.getClass(), null);
try {
assertEquals(1, enumeration.getSize());
while (enumeration.hasMoreElements()) {
Hashtable data = (Hashtable) enumeration.nextElement();
setX(newObject, data.get("x"));
int oldId = manager.getId(oldObject);
int newId = enumeration.update(newObject);
assertEquals(oldId, newId);
manager.load(newObject, newId);
equals(getX(oldObject), getX(newObject));
}
} finally {
um.finish(oldObject.getClass());
manager.delete(newObject);
}
}
/**
* DOCUMENT ME!
*
* @throws Exception DOCUMENT ME!
*/
public void testFR2816948() throws Exception {
Persistable object = newInstance();
try {
int id = manager.getId(object);
assertEquals(-1, id);
id = manager.save(object);
assertTrue("Deveria ser diferente de -1!", id != -1);
int temp = manager.getId(object);
assertEquals(id, temp);
} finally {
manager.delete(object);
}
}
/**
* DOCUMENT ME!
*
* @throws Exception DOCUMENT ME!
*/
public void testFind() throws Exception {
Persistable object = newInstance();
setX(object, getValueForSetMethod());
manager.save(object);
try {
ObjectSet set = manager.find(object.getClass(), null, null);
assertEquals(1, set.size());
} finally {
manager.delete(object);
}
}
/**
* DOCUMENT ME!
*
* @throws Exception DOCUMENT ME!
*/
public void testFindPersistableClassIsNotAValidPersistableClass()
throws Exception {
try {
manager.find(String.class, null, null);
fail("A IllegalArgumentException must be throw!");
} catch (Exception e) {
assertEquals(e.getClass(), IllegalArgumentException.class);
}
}
/**
* DOCUMENT ME!
*
* @throws Exception DOCUMENT ME!
*/
public void testFindPersistableClassIsNull() throws Exception {
try {
manager.find(null, getFilter(), null);
fail("A IllegalArgumentException must be throw!");
} catch (Exception e) {
assertEquals(e.getClass(), IllegalArgumentException.class);
}
}
/**
* DOCUMENT ME!
*
* @throws Exception DOCUMENT ME!
*/
public void testFindWithFilter() throws Exception {
Persistable object = newInstance();
setX(object, getValueForSetMethod());
int id = manager.save(object);
try {
SingleObjectSet set = manager.find(object.getClass(), getFilter(), null);
assertEquals(1, set.size());
assertEquals(set.getId(0), id);
equals(getValueForSetMethod(), getX(set.get(0)));
} finally {
manager.delete(object);
}
}
/**
* DOCUMENT ME!
*
* @throws Exception DOCUMENT ME!
*/
public void testIsPersisted() throws Exception {
Persistable object = newInstance();
boolean isPersisted = manager.isPersisted(object);
assertFalse(isPersisted);
manager.save(object);
try {
isPersisted = manager.isPersisted(object);
assertTrue(isPersisted);
} finally {
manager.delete(object);
}
}
/**
* DOCUMENT ME!
*/
public void testLoadWithNullObject() {
try {
manager.load(null, 0);
fail("A IllegalArgumentException must be throw!");
} catch (Exception e) {
assertEquals(e.getClass(), IllegalArgumentException.class);
}
}
/**
* DOCUMENT ME!
*
* @throws Exception DOCUMENT ME!
*/
public void testNotNullAttribute() throws Exception {
Persistable object = newInstance();
setX(object, getValueForSetMethod());
int id = manager.save(object);
try {
assertTrue("Deveria ser diferente de -1!", id != -1);
object = newInstance();
manager.load(object, id);
assertNotNull("Não deveria ser null!", getX(object));
equals(getValueForSetMethod(), getX(object));
} finally {
manager.delete(object);
}
}
/**
* DOCUMENT ME!
*
* @throws Exception DOCUMENT ME!
*/
public void testNullAttribute() throws Exception {
Persistable object = newInstance();
int id = manager.save(object);
try {
assertTrue("Deveria ser diferente de -1!", id != -1);
object = newInstance();
manager.load(object, id);
assertNull("Deveria ser null!", getX(object));
} finally {
manager.delete(object);
}
}
/**
* DOCUMENT ME!
*
* @throws Exception DOCUMENT ME!
*/
public void testSaveAndEdit() throws Exception {
Persistable object = newInstance();
int id = manager.save(object);
try {
assertTrue("Deveria ser diferente de -1!", id != -1);
object = newInstance();
manager.load(object, id);
setX(object, getNewValueForSetMethod());
int tempId = manager.save(object);
assertEquals(id, tempId);
} finally {
manager.delete(object);
}
}
/**
* DOCUMENT ME!
*/
public void testSaveWithNullObject() {
try {
manager.save(null);
fail("A IllegalArgumentException must be throw!");
} catch (Exception e) {
assertEquals(e.getClass(), IllegalArgumentException.class);
}
}
/**
* DOCUMENT ME!
*/
public void testSaveWithRecordIdThatDontExist() {
try {
manager.load(newInstance(), 123234);
fail("A RecordStore exception must be throwed!");
} catch (Exception ex) {
assertEquals(InvalidRecordIDException.class.getName(), ex.getMessage());
}
}
/**
* DOCUMENT ME!
*
* @param o1 DOCUMENT ME!
* @param o2 DOCUMENT ME!
*/
protected void equals(Object o1, Object o2) {
if ((o1 != null) && o2.getClass().isArray()) {
Class clazz = o1.getClass().getComponentType();
if (clazz == short.class) {
assertTrue("Deveria ser igual(arrays) !",
Arrays.equals((short[]) o1, (short[]) o2));
} else if (clazz == boolean.class) {
assertTrue("Deveria ser igual(o2s) !",
Arrays.equals((boolean[]) o1, (boolean[]) o2));
} else if (clazz == byte.class) {
assertTrue("Deveria ser igual(arrays) !",
Arrays.equals((byte[]) o1, (byte[]) o2));
} else if (clazz == char.class) {
assertTrue("Deveria ser igual(arrays) !",
Arrays.equals((char[]) o1, (char[]) o2));
} else if (clazz == double.class) {
assertTrue("Deveria ser igual(arrays) !",
Arrays.equals((double[]) o1, (double[]) o2));
} else if (clazz == int.class) {
assertTrue("Deveria ser igual(arrays) !",
Arrays.equals((int[]) o1, (int[]) o2));
} else if (clazz == float.class) {
assertTrue("Deveria ser igual(arrays) !",
Arrays.equals((float[]) o1, (float[]) o2));
} else if (clazz == long.class) {
assertTrue("Deveria ser igual(arrays) !",
Arrays.equals((long[]) o1, (long[]) o2));
} else {
assertTrue("Deveria ser igual(arrays) !",
Arrays.equals((Object[]) o1, (Object[]) o2));
}
} else {
assertEquals("Deveria ser igual!", o1, o2);
}
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
protected abstract Class getParameterType();
/**
* DOCUMENT ME!
*
* @param object DOCUMENT ME!
*
* @return DOCUMENT ME!
*
* @throws Exception DOCUMENT ME!
*/
protected Object getX(Object object) throws Exception {
Method method =
object.getClass().getMethod(getNameForGetMethod(), new Class[0]);
return method.invoke(object, new Object[0]);
}
/**
* DOCUMENT ME!
*
* @param object DOCUMENT ME!
* @param param DOCUMENT ME!
*
* @throws Exception DOCUMENT ME!
*/
protected void setX(Object object, Object param) throws Exception {
Method method =
object.getClass()
.getMethod(getNameForSetMethod(), new Class[] { getParameterType() });
method.invoke(object, new Object[] { param });
}
}