package org.gbif.checklistbank.index;
import com.google.common.collect.Lists;
import org.apache.solr.client.solrj.util.ClientUtils;
import org.apache.solr.common.SolrInputDocument;
import org.gbif.api.model.checklistbank.NameUsage;
import org.gbif.api.model.checklistbank.SpeciesProfile;
import org.gbif.api.model.checklistbank.VernacularName;
import org.gbif.api.model.checklistbank.search.NameUsageSearchResult;
import org.gbif.api.util.ClassificationUtils;
import org.gbif.api.vocabulary.*;
import org.gbif.checklistbank.model.UsageExtensions;
import org.junit.Test;
import java.util.List;
import java.util.UUID;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.assertEquals;
public class NameUsageDocConverterTest {
@Test
public void testToObject() throws Exception {
NameUsageDocConverter conv = new NameUsageDocConverter();
NameUsage u = new NameUsage();
u.setKey(12);
u.setDatasetKey(UUID.randomUUID());
u.setScientificName("Abies alba Mill.");
u.setCanonicalName("Abies alba");
u.setRank(Rank.SPECIES);
u.setOrigin(Origin.SOURCE);
u.setTaxonomicStatus(TaxonomicStatus.ACCEPTED);
u.setParentKey(1);
u.setFamilyKey(1024);
u.setFamily("Pinaceae");
u.getIssues().add(NameUsageIssue.RANK_INVALID);
u.getIssues().add(NameUsageIssue.CLASSIFICATION_NOT_APPLIED);
UsageExtensions ext = new UsageExtensions();
SpeciesProfile sp = new SpeciesProfile();
sp.setTerrestrial(true);
sp.setHabitat("brackish");
ext.speciesProfiles.add(sp);
VernacularName v1 = new VernacularName();
v1.setLanguage(Language.GERMAN);
v1.setVernacularName("Weißtanne");
VernacularName v2 = new VernacularName();
v2.setLanguage(Language.GERMAN);
v2.setVernacularName("Kohl Tanne");
ext.vernacularNames.add(v1);
ext.vernacularNames.add(v2);
SolrInputDocument doc = conv.toDoc(u, Lists.newArrayList(12, 15, 20, 100), ext);
assertEquals(u.getKey(), doc.get("key").getValue());
assertEquals(u.getDatasetKey().toString(), doc.get("dataset_key").getValue());
assertEquals(u.getParentKey(), doc.get("parent_key").getValue());
assertEquals(u.getFamily(), doc.get("family").getValue());
assertEquals(u.getFamilyKey(), doc.get("family_key").getValue());
assertEquals(u.getScientificName(), doc.get("scientific_name").getValue());
assertEquals(u.getCanonicalName(), doc.get("canonical_name").getValue());
assertEquals(u.getOrigin().ordinal(), doc.get("origin_key").getValue());
assertEquals(u.getTaxonomicStatus().ordinal(), doc.get("taxonomic_status_key").getValue());
assertEquals(u.getRank().ordinal(), doc.get("rank_key").getValue());
assertThat((List<Integer>) doc.get("issues").getValue()).contains(NameUsageIssue.RANK_INVALID.ordinal(),
NameUsageIssue.CLASSIFICATION_NOT_APPLIED.ordinal());
assertThat((List<Integer>) doc.get("habitat_key").getValue()).containsOnlyOnce(Habitat.TERRESTRIAL.ordinal(), Habitat.FRESHWATER.ordinal());
assertThat((List<Integer>) doc.get("higher_taxon_key").getValue()).containsOnlyOnce(12, 15, 20, 100);
// trip back
NameUsageSearchResult u2 = conv.toSearchUsage(ClientUtils.toSolrDocument(doc), true);
assertEquals(ClassificationUtils.getHigherClassificationMap(u2), ClassificationUtils.getHigherClassificationMap(u));
assertEquals(u2.getKey(), u.getKey());
assertEquals(u2.getDatasetKey(), u.getDatasetKey());
assertEquals(u2.getParentKey(), u.getParentKey());
assertEquals(u2.getScientificName(), u.getScientificName());
assertEquals(u2.getCanonicalName(), u.getCanonicalName());
assertEquals(u2.getOrigin(), u.getOrigin());
assertEquals(u2.getTaxonomicStatus(), u.getTaxonomicStatus());
assertEquals(u2.getRank(), u.getRank());
}
}