package org.openlca.core.database.usage;
import java.util.Arrays;
import java.util.List;
import java.util.Stack;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.openlca.core.Tests;
import org.openlca.core.database.BaseDao;
import org.openlca.core.database.IDatabase;
import org.openlca.core.database.ProcessDao;
import org.openlca.core.model.CategorizedEntity;
import org.openlca.core.model.Exchange;
import org.openlca.core.model.Flow;
import org.openlca.core.model.Process;
import org.openlca.core.model.ProcessLink;
import org.openlca.core.model.ProductSystem;
import org.openlca.core.model.descriptors.CategorizedDescriptor;
/**
* Creates a simple product system with 2 processes p and q. Process p has 3
* outputs and process q has 3 inputs with the same flows. The product system
* has the first output of p as quantitative reference. The second output of p
* and the second input of q are linked in this product system. The tests search
* for the the usage of the exchanges of p.
*/
public class ExchangeUseSearchTest {
private final String SYS_NAME = "ExchangeUseSearchTest_System";
private Process p;
private Process q;
private Stack<CategorizedEntity> modelStack = new Stack<>();
private IDatabase database = Tests.getDb();
@Before
public void setUp() {
p = new Process();
q = new Process();
addExchanges();
ProcessDao dao = new ProcessDao(database);
p = dao.insert(p);
q = dao.insert(q);
modelStack.push(p);
modelStack.push(q);
createSystem();
}
private void addExchanges() {
for (int i = 1; i < 4; i++) {
Flow flow = new Flow();
flow.setName("flow_" + 1);
flow = database.createDao(Flow.class).insert(flow);
modelStack.push(flow);
Exchange ep = new Exchange();
ep.setFlow(flow);
ep.setInput(false);
p.getExchanges().add(ep);
Exchange eq = ep.clone();
eq.setInput(true);
q.getExchanges().add(eq);
}
}
private void createSystem() {
ProductSystem system = new ProductSystem();
system.setName(SYS_NAME);
system.setReferenceProcess(p);
system.setReferenceExchange(p.getExchanges().get(0));
Flow linkFlow = p.getExchanges().get(1).getFlow();
ProcessLink link = new ProcessLink();
link.providerId = p.getId();
link.processId = q.getId();
link.flowId = linkFlow.getId();
system.getProcessLinks().add(link);
system = database.createDao(ProductSystem.class).insert(system);
modelStack.push(system);
}
@After
public void tearDown() {
while (!modelStack.isEmpty()) {
CategorizedEntity entity = modelStack.pop();
@SuppressWarnings("unchecked")
BaseDao<CategorizedEntity> dao = (BaseDao<CategorizedEntity>) database
.createDao(entity.getClass());
dao.delete(entity);
}
}
@Test
public void testSingleFindNothing() {
ExchangeUseSearch search = new ExchangeUseSearch(database, p);
List<CategorizedDescriptor> list = search.findUses(p.getExchanges().get(2));
Assert.assertTrue(list.isEmpty());
}
@Test
public void testMultiFindNothing() {
ExchangeUseSearch search = new ExchangeUseSearch(database, q);
List<Exchange> exchanges = Arrays.asList(
q.getExchanges().get(0), q.getExchanges().get(2));
List<CategorizedDescriptor> list = search.findUses(exchanges);
Assert.assertTrue(list.isEmpty());
}
@Test
public void testFindInReference() {
ExchangeUseSearch search = new ExchangeUseSearch(database, p);
List<CategorizedDescriptor> list = search.findUses(p.getExchanges().get(0));
Assert.assertEquals(list.get(0).getName(), SYS_NAME);
Assert.assertEquals(list.size(), 1);
}
@Test
public void testFindInLinks() {
ExchangeUseSearch search = new ExchangeUseSearch(database, p);
List<CategorizedDescriptor> list = search.findUses(p.getExchanges().get(1));
Assert.assertEquals(list.get(0).getName(), SYS_NAME);
Assert.assertEquals(list.size(), 1);
}
@Test
public void testFindAllDistinct() {
ExchangeUseSearch search = new ExchangeUseSearch(database, p);
List<CategorizedDescriptor> list = search.findUses(p.getExchanges());
Assert.assertEquals(list.get(0).getName(), SYS_NAME);
Assert.assertEquals(list.size(), 1);
}
}