package org.openlca.core.database;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import java.util.List;
import java.util.UUID;
import org.junit.Assert;
import org.junit.Test;
import org.openlca.core.ListUtils;
import org.openlca.core.Tests;
import org.openlca.core.model.Actor;
import org.openlca.core.model.CategorizedEntity;
import org.openlca.core.model.Category;
import org.openlca.core.model.Currency;
import org.openlca.core.model.Flow;
import org.openlca.core.model.FlowProperty;
import org.openlca.core.model.ImpactMethod;
import org.openlca.core.model.ModelType;
import org.openlca.core.model.ProductSystem;
import org.openlca.core.model.Project;
import org.openlca.core.model.SocialIndicator;
import org.openlca.core.model.Source;
import org.openlca.core.model.UnitGroup;
import org.openlca.core.model.descriptors.BaseDescriptor;
import org.openlca.core.model.descriptors.CategorizedDescriptor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.Optional;
public class CategorizedEntityDaoTest {
private Logger log = LoggerFactory.getLogger(getClass());
@Test
public void runCrudTests() throws Exception {
IDatabase database = Tests.getDb();
run(Actor.class, new ActorDao(database));
run(Source.class, new SourceDao(database));
run(UnitGroup.class, new UnitGroupDao(database));
run(FlowProperty.class, new FlowPropertyDao(database));
run(Flow.class, new FlowDao(database));
run(org.openlca.core.model.Process.class, new ProcessDao(database));
run(ImpactMethod.class, new ImpactMethodDao(database));
run(ProductSystem.class, new ProductSystemDao(database));
run(Project.class, new ProjectDao(database));
run(Currency.class, new CurrencyDao(database));
run(SocialIndicator.class, new SocialIndicatorDao(database));
}
private <T extends CategorizedEntity, V extends CategorizedDescriptor> void run(
Class<T> clazz, CategorizedEntityDao<T, V> dao) throws Exception {
log.trace("run category entity tests for {}", clazz);
T instance = makeNew(clazz);
dao.insert(instance);
testFindForNullCategory(dao, instance);
Category category = addCategory(clazz, dao, instance);
testGetDescriptorsForCategory(dao, instance, category);
testGetForRefId(dao, instance);
}
private <T extends CategorizedEntity> void testGetForRefId(
CategorizedEntityDao<T, ?> dao, T instance) {
T clone = dao.getForRefId(instance.getRefId());
assertEquals(instance, clone);
assertNull(dao.getForRefId(UUID.randomUUID().toString()));
}
private <T extends CategorizedEntity, V extends CategorizedDescriptor> void testFindForNullCategory(
CategorizedEntityDao<T, V> dao, T instance) {
Category cat = null;
List<V> descriptors = dao.getDescriptors(Optional.fromNullable(cat));
BaseDescriptor descriptor = ListUtils.findDescriptor(instance.getId(),
descriptors);
Assert.assertNotNull(descriptor);
}
private <T extends CategorizedEntity, V extends CategorizedDescriptor> Category addCategory(
Class<T> clazz, CategorizedEntityDao<T, V> dao, T instance) {
Category category = new Category();
category.setRefId(UUID.randomUUID().toString());
category.setName("test_category");
category.setModelType(ModelType.forModelClass(clazz));
BaseDao<Category> catDao = Tests.getDb().createDao(
Category.class);
catDao.insert(category);
instance.setCategory(category);
dao.update(instance);
return category;
}
private <T extends CategorizedEntity, V extends CategorizedDescriptor> void testGetDescriptorsForCategory(
CategorizedEntityDao<T, V> dao, T instance, Category category) {
List<V> descriptors = dao.getDescriptors(Optional
.fromNullable(category));
BaseDescriptor descriptor = ListUtils.findDescriptor(instance.getId(),
descriptors);
Assert.assertNotNull(descriptor);
Tests.getDb().createDao(Category.class)
.delete(category);
}
private <T extends CategorizedEntity> T makeNew(Class<T> clazz)
throws Exception {
T instance = clazz.newInstance();
instance.setDescription("descriptiom");
instance.setName("name");
instance.setRefId(UUID.randomUUID().toString());
return instance;
}
}