package org.openbel.framework.test;
import static org.hamcrest.CoreMatchers.is;
import static org.openbel.framework.test.WebAPIHelper.createWebAPI;
import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.CoreMatchers.nullValue;
import static org.junit.Assert.assertThat;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.BeforeClass;
import org.junit.Test;
import org.openbel.framework.ws.model.BelStatement;
import org.openbel.framework.ws.model.EdgeFilter;
import org.openbel.framework.ws.model.FindKamEdgesRequest;
import org.openbel.framework.ws.model.FindKamEdgesResponse;
import org.openbel.framework.ws.model.FindKamNodesByPatternsRequest;
import org.openbel.framework.ws.model.FindKamNodesByPatternsResponse;
import org.openbel.framework.ws.model.GetCatalogResponse;
import org.openbel.framework.ws.model.GetSupportingEvidenceRequest;
import org.openbel.framework.ws.model.GetSupportingEvidenceResponse;
import org.openbel.framework.ws.model.KAMLoadStatus;
import org.openbel.framework.ws.model.Kam;
import org.openbel.framework.ws.model.KamEdge;
import org.openbel.framework.ws.model.KamHandle;
import org.openbel.framework.ws.model.KamNode;
import org.openbel.framework.ws.model.LoadKamRequest;
import org.openbel.framework.ws.model.LoadKamResponse;
import org.openbel.framework.ws.model.ObjectFactory;
import org.openbel.framework.ws.model.RelationshipType;
import org.openbel.framework.ws.model.RelationshipTypeFilterCriteria;
import org.openbel.framework.ws.model.WebAPI;
public class BELCompilerIT {
private static final ObjectFactory factory = new ObjectFactory();
private static Map<String, Kam> name2Kams;
private static EdgeFilter allEdges;
private static WebAPI webAPI = createWebAPI();
static {
// factory.create edge filter for all rtypes
allEdges = new EdgeFilter();
final RelationshipTypeFilterCriteria rcrit =
new RelationshipTypeFilterCriteria();
rcrit.getValueSet().addAll(Arrays.asList(RelationshipType.values()));
allEdges.getRelationshipCriteria().add(rcrit);
}
@BeforeClass
public static void establishWebAPI() {
assertThat(webAPI, is(not(nullValue())));
final GetCatalogResponse catres = webAPI.getCatalog(null);
assertThat(catres, is(not(nullValue())));
final List<Kam> catalog = catres.getKams();
assertThat(catalog, is(not(nullValue())));
assertThat(catalog.isEmpty(), is(false));
name2Kams = new HashMap<String, Kam>(catalog.size());
for (final Kam kam : catalog) {
name2Kams.put(kam.getName(), kam);
}
}
@Test
public void unitTest1() {
runKamTest("test1a", 6, 5);
runKamTest("test1b", 10, 10);
runKamTest("test1c", 2, 1);
}
@Test
public void unitTest2() {
runKamTest("test2a", 13, 12);
runKamTest("test2b", 4, 3);
}
@Test
public void unitTest3() {
runKamTest("test3a", 19, 18);
}
@Test
public void unitTest4() {
runKamTest("test4a", 34, 32);
runKamTest("test4b", 14, 12);
}
@Test
public void unitTest5() {
runKamTest("test5a", 4, 4);
}
@Test
public void unitTest6() {
runKamTest("test6a", 5, 4);
}
@Test
public void unitTest7() {
runKamTest("test7a", 16, 15);
}
@Test
public void unitTest8() {
runKamTest("test8a", 14, 15);
}
@Test
public void unitTest9() {
runKamTest("test9a", 18, 16);
}
@Test
public void unitTest10() {
runKamTest("test10a", 25, 24);
}
@Test
public void unitTest12() {
runKamTest("test12", 12, 12);
}
@Test
public void unitTest13() {
runKamTest("test13", 4, 4);
}
@Test
public void unitTest14() {
runKamTest("test14", 4, 4);
}
@Test
public void unitTest15() {
runKamTest("test15", 8, 6);
}
@Test
public void unitTest16() {
runKamTest("test16", 46, 46);
}
@Test
public void unitTest17() {
runKamTest("test17", 4, 3);
}
@Test
public void unitTest18() {
runKamTest("test18", 7, 6);
// test 2 statements supporting the => edge
List<KamEdge> edges = findEdge("test18",
RelationshipType.DIRECTLY_INCREASES);
assertThat(edges.size(), is(1));
KamEdge edge = edges.iterator().next();
validateStatementCount(edge, 2);
}
private void runKamTest(final String kamName, final int nodes,
final int edges) {
assertThat(kamName, is(not(nullValue())));
final KamHandle handle = loadKam(kamName);
final FindKamNodesByPatternsRequest fknreq =
factory.createFindKamNodesByPatternsRequest();
fknreq.getPatterns().add(".*");
fknreq.setHandle(handle);
final FindKamNodesByPatternsResponse fknres = webAPI
.findKamNodesByPatterns(fknreq);
final List<KamNode> kamNodes = fknres.getKamNodes();
assertThat(kamNodes, is(not(nullValue())));
assertThat(kamNodes.size(), is(nodes));
final FindKamEdgesRequest fkereq = factory.createFindKamEdgesRequest();
fkereq.setFilter(allEdges);
fkereq.setHandle(handle);
final FindKamEdgesResponse fkeres = webAPI.findKamEdges(fkereq);
final List<KamEdge> kamEdges = fkeres.getKamEdges();
assertThat(kamEdges, is(not(nullValue())));
assertThat(kamEdges.size(), is(edges));
}
private void validateStatementCount(final KamEdge edge, final int sc) {
assertThat(edge, is(not(nullValue())));
GetSupportingEvidenceRequest evreq = factory
.createGetSupportingEvidenceRequest();
evreq.setKamEdge(edge);
GetSupportingEvidenceResponse evres = webAPI.getSupportingEvidence(evreq);
List<BelStatement> statements = evres.getStatements();
assertThat(statements.size(), is(sc));
}
private List<KamEdge> findEdge(final String kamName,
final RelationshipType r) {
assertThat(kamName, is(not(nullValue())));
assertThat(r, is(not(nullValue())));
final KamHandle handle = loadKam(kamName);
EdgeFilter f = factory.createEdgeFilter();
RelationshipTypeFilterCriteria c = factory
.createRelationshipTypeFilterCriteria();
c.getValueSet().add(r);
f.getRelationshipCriteria().add(c);
final FindKamEdgesRequest ereq = factory.createFindKamEdgesRequest();
ereq.setFilter(f);
ereq.setHandle(handle);
FindKamEdgesResponse eres = webAPI.findKamEdges(ereq);
return eres.getKamEdges();
}
private KamHandle loadKam(final String kamName) {
final Kam kam = name2Kams.get(kamName);
assertThat(kam, is(not(nullValue())));
final LoadKamRequest lkreq = factory.createLoadKamRequest();
lkreq.setKam(kam);
LoadKamResponse lkres = webAPI.loadKam(lkreq);
KAMLoadStatus status = lkres.getLoadStatus();
while (status == KAMLoadStatus.IN_PROCESS) {
// sleep 1/2 a second and retry
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// do nothing
}
lkres = webAPI.loadKam(lkreq);
status = lkres.getLoadStatus();
}
final KamHandle handle = lkres.getHandle();
assertThat(handle, is(not(nullValue())));
return handle;
}
}