package org.gbif.checklistbank.nub; import org.gbif.api.vocabulary.Kingdom; import org.gbif.api.vocabulary.Rank; import org.gbif.nub.lookup.straight.IdLookup; import org.gbif.nub.lookup.straight.IdLookupImpl; import org.gbif.nub.lookup.straight.LookupUsage; import java.util.Collection; import com.google.common.collect.Lists; import it.unimi.dsi.fastutil.ints.Int2IntArrayMap; import it.unimi.dsi.fastutil.ints.Int2IntMap; import org.junit.Test; import static org.junit.Assert.assertEquals; public class IdGeneratorTest { public static IdLookup newTestLookup() { Collection<LookupUsage> usages = Lists.newArrayList( new LookupUsage(1, "Animalia", null, null, Rank.KINGDOM, Kingdom.ANIMALIA, false), new LookupUsage(2, "Oenanthe", "Vieillot", "1816", Rank.GENUS, Kingdom.ANIMALIA, false), new LookupUsage(3, "Oenanthe", "Linnaeus", "1753", Rank.GENUS, Kingdom.PLANTAE, false), new LookupUsage(4, "Oenanthe aquatica", "Poir.", null, Rank.SPECIES, Kingdom.PLANTAE, false), new LookupUsage(5, "Oenanthe aquatica", "Senser", "1957", Rank.SPECIES, Kingdom.PLANTAE, false), new LookupUsage(6, "Oenanthe aquatica", null, null, Rank.SPECIES, Kingdom.PLANTAE, true), new LookupUsage(7, "Rodentia", "Bowdich", "1821", Rank.ORDER, Kingdom.ANIMALIA, false), new LookupUsage(8, "Rodentia", null, null, Rank.GENUS, Kingdom.ANIMALIA, true), new LookupUsage(9, "Abies alba", null, null, Rank.SPECIES, Kingdom.PLANTAE, false), new LookupUsage(10, "Abies alba", "Mumpf.", null, Rank.SPECIES, Kingdom.PLANTAE, true), new LookupUsage(11, "Abies alba", null, "1778", Rank.SPECIES, Kingdom.PLANTAE, true), new LookupUsage(12, "Picea alba", null, "1778", Rank.SPECIES, Kingdom.PLANTAE, true), new LookupUsage(13, "Picea", null, null, Rank.GENUS, Kingdom.PLANTAE, true), new LookupUsage(14, "Carex cayouettei", null, null, Rank.SPECIES, Kingdom.PLANTAE, true), new LookupUsage(15, "Carex comosa × Carex lupulina", null, null, Rank.SPECIES, Kingdom.PLANTAE, true), new LookupUsage(16, "Aeropyrum coil-shaped virus", null, null, Rank.UNRANKED, Kingdom.VIRUSES, true), new LookupUsage(17, map(100, 17, 110, -18, 111, 19), "Admetidae", "Troschel", "1865", Rank.FAMILY, Kingdom.ANIMALIA, false), new LookupUsage(20, null, "Admetidae", null, null, Rank.FAMILY, Kingdom.ANIMALIA, true), new LookupUsage(5093664, map(5093663, 5093664, 1673124, -8431281, 1673124, 8710209), "Bombylius scintillans", "Brunetti", "1909", Rank.SPECIES, Kingdom.ANIMALIA, false) ); return IdLookupImpl.temp().load(usages); } /** * key, value, key, value, ... * pro parte maps have the parent usageKey as key, the pro parte usage key as value */ private static Int2IntMap map(int ... kvs) { Int2IntMap m = new Int2IntArrayMap(kvs.length / 2); int idx = 0; while (idx < kvs.length) { m.put(kvs[idx], kvs[idx+1]); idx = idx + 2; } return m; } @Test public void testIssueId() throws Exception { IdGenerator gen = new IdGenerator(newTestLookup(), 1000); assertEquals(1000, gen.issue("Dracula", null, null, Rank.GENUS, Kingdom.PLANTAE)); assertEquals(1, gen.issue("Animalia", null, null, Rank.KINGDOM, Kingdom.ANIMALIA)); assertEquals(8, gen.issue("Rodentia", null, null, Rank.GENUS, Kingdom.ANIMALIA)); // external issueing gen.reissue(14); // was issued already! assertEquals(1001, gen.issue("Carex cayouettei", null, null, Rank.SPECIES, Kingdom.PLANTAE)); assertEquals(1002, gen.issue("Animalia", null, null, Rank.KINGDOM, Kingdom.ANIMALIA)); assertEquals(1003, gen.issue("Carex cayouettei", null, null, Rank.SPECIES, Kingdom.PLANTAE)); } @Test public void testProParte() throws Exception { IdGenerator gen = new IdGenerator(newTestLookup(), 1000); // wrong kingdom assertEquals(1000, gen.issue("Admetidae", null, null, Rank.FAMILY, Kingdom.PLANTAE)); // regular canonical match assertEquals(20, gen.issue("Admetidae", null, null, Rank.FAMILY, Kingdom.ANIMALIA)); assertEquals(1001, gen.issue("Admetidae", null, null, Rank.FAMILY, Kingdom.ANIMALIA)); assertEquals(17, gen.issue("Admetidae", "Troschel", null, Rank.FAMILY, Kingdom.ANIMALIA)); // pro parte matching assertEquals(1002, gen.issue("Admetidae", "Troschel", null, Rank.FAMILY, Kingdom.ANIMALIA, 100)); // deleted, but reissued assertEquals(18, gen.issue("Admetidae", "Troschel", null, Rank.FAMILY, Kingdom.ANIMALIA, 110)); assertEquals(19, gen.issue("Admetidae", "Troschel", null, Rank.FAMILY, Kingdom.ANIMALIA, 111)); assertEquals(1003, gen.issue("Admetidae", "Troschel", null, Rank.FAMILY, Kingdom.ANIMALIA, 200)); assertEquals(8710209, gen.issue("Bombylius scintillans", "Brunetti", "1909", Rank.SPECIES, Kingdom.ANIMALIA, 1673124)); assertEquals(5093664, gen.issue("Bombylius scintillans", "Brunetti", "1909", Rank.SPECIES, Kingdom.ANIMALIA)); } }