package org.gbif.checklistbank.neo.traverse;
import org.gbif.api.model.checklistbank.NameUsage;
import org.gbif.api.vocabulary.NameUsageIssue;
import org.gbif.api.vocabulary.Rank;
import org.gbif.api.vocabulary.TaxonomicStatus;
import org.gbif.checklistbank.neo.Labels;
import org.gbif.checklistbank.neo.RelType;
import org.gbif.checklistbank.neo.UsageDao;
import org.gbif.checklistbank.nub.IdGeneratorTest;
import org.gbif.nub.lookup.straight.IdLookup;
import org.junit.Test;
import org.neo4j.graphdb.Node;
import org.neo4j.graphdb.Transaction;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
public class NubMatchHandlerTest {
UsageDao dao = UsageDao.temporaryDao(10);
@Test
public void testMatching() throws Exception {
IdLookup lookup = IdGeneratorTest.newTestLookup();
try (Transaction tx = dao.beginTx()) {
Node kp = dao.create(usage("Plantae", null, Rank.KINGDOM));
kp.addLabel(Labels.ROOT);
Node kv = dao.create(usage("Viruses", null, Rank.KINGDOM));
kv.addLabel(Labels.ROOT);
Node kf = dao.create(usage("Fungi", null, Rank.KINGDOM));
kf.addLabel(Labels.ROOT);
Node a = parentOf(dao.create(usage("Abies", null, Rank.GENUS)), kp);
Node a1 = parentOf(dao.create(usage("Abies alba", null, Rank.SPECIES)), a);
Node a2 = parentOf(dao.create(usage("Abies alpina", null, Rank.SPECIES)), a);
Node a3 = parentOf(dao.create(usage("Abies alba subsp.", null, Rank.SUBSPECIES)), a1);
Node o = parentOf(dao.create(usage("Oenanthe", null, Rank.GENUS)), kp);
Node o1 = parentOf(dao.create(usage("Oenanthe sp.", null, Rank.SPECIES)), o);
Node c = parentOf(dao.create(usage("Carex", null, Rank.GENUS)), kp);
Node c1 = parentOf(dao.create(usage("Carex ×cayouettei", null, Rank.SPECIES)), c);
Node c2 = parentOf(dao.create(usage("Carex comosa × Carex lupulina", null, Rank.SPECIES)), c);
Node c3 = parentOf(dao.create(usage("Carex ×paletti", null, Rank.SPECIES)), c);
Node v1 = parentOf(dao.create(usage("Aeropyrum coil-shaped virus", null, Rank.UNRANKED)), kv);
Node v2 = parentOf(dao.create(usage("Aeropyrum coil-shaped virus 2", null, Rank.SPECIES)), kv);
// assign keys
NubMatchHandler handler = new NubMatchHandler(lookup, dao);
TreeWalker.walkAcceptedTree(dao.getNeo(), handler);
// verify keys
verifyKey(a, null);
verifyKey(a1, 9);
verifyKey(a2, null);
verifyKey(a3, null);
verifyKey(o, 3);
verifyKey(o1, null);
verifyKey(c, null);
verifyKey(c1, 14);
verifyKey(c2, 15);
verifyKey(c3, null);
verifyKey(v1, 16);
verifyKey(v2, null);
}
}
public void verifyKey(Node n, Integer key) {
NameUsage u = dao.readUsage(n, true);
if (key == null) {
assertNull(u.getNubKey());
assertTrue(u.getIssues().contains(NameUsageIssue.BACKBONE_MATCH_NONE));
} else {
assertEquals(key, u.getNubKey());
}
}
public static Node parentOf(Node child, Node parent) {
parent.createRelationshipTo(child, RelType.PARENT_OF);
return child;
}
public static NameUsage usage(String name, String author, Rank rank) {
NameUsage u = new NameUsage();
u.setTaxonomicStatus(TaxonomicStatus.ACCEPTED);
u.setScientificName(name + (author == null ? "" : " " + author));
u.setCanonicalName(name);
u.setRank(rank);
return u;
}
}