package org.molgenis.data.annotation.core.entity.impl;
import org.molgenis.data.DataService;
import org.molgenis.data.Entity;
import org.molgenis.data.annotation.core.RepositoryAnnotator;
import org.molgenis.data.annotation.core.entity.AnnotatorConfig;
import org.molgenis.data.annotation.core.resources.Resources;
import org.molgenis.data.annotation.core.resources.impl.ResourcesImpl;
import org.molgenis.data.annotation.web.AnnotationService;
import org.molgenis.data.annotation.web.settings.DannAnnotatorSettings;
import org.molgenis.data.meta.model.Attribute;
import org.molgenis.data.meta.model.AttributeFactory;
import org.molgenis.data.meta.model.EntityType;
import org.molgenis.data.meta.model.EntityTypeFactory;
import org.molgenis.data.support.DynamicEntity;
import org.molgenis.data.vcf.model.VcfAttributes;
import org.molgenis.test.data.AbstractMolgenisSpringTest;
import org.molgenis.util.ResourceUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.test.context.ContextConfiguration;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.molgenis.data.meta.AttributeType.*;
import static org.molgenis.data.vcf.model.VcfAttributes.*;
import static org.testng.Assert.assertEquals;
@ContextConfiguration(classes = { DannAnnotatorTest.Config.class, DannAnnotator.class })
public class DannAnnotatorTest extends AbstractMolgenisSpringTest
{
@Autowired
ApplicationContext context;
@Autowired
AttributeFactory attributeFactory;
@Autowired
EntityTypeFactory entityTypeFactory;
@Autowired
VcfAttributes vcfAttributes;
@Autowired
RepositoryAnnotator annotator;
@Autowired
Resources resourcess;
// Can annotate
public EntityType metaDataCanAnnotate;
// Negative test cannot annotate
public EntityType metaDataCantAnnotate;
public ArrayList<Entity> input1;
public ArrayList<Entity> input2;
public ArrayList<Entity> input3;
public ArrayList<Entity> input4;
public static Entity entity;
public static Entity entity1;
public static Entity entity2;
public static Entity entity3;
public static Entity entity4;
public ArrayList<Entity> entities;
public void setValues()
{
Attribute attributeChrom = attributeFactory.create().setName(CHROM).setDataType(STRING);
Attribute attributePos = attributeFactory.create().setName(POS).setDataType(INT);
Attribute attributeRef = attributeFactory.create().setName(REF).setDataType(TEXT);
Attribute attributeAlt = attributeFactory.create().setName(ALT).setDataType(TEXT);
metaDataCanAnnotate.addAttribute(attributeChrom);
metaDataCanAnnotate.addAttribute(attributePos);
metaDataCanAnnotate.addAttribute(attributeRef);
metaDataCanAnnotate.addAttribute(attributeAlt);
metaDataCanAnnotate.addAttribute(attributeFactory.create().setName("DANN_SCORE").setDataType(STRING));
Attribute attributeCantAnnotateChrom = attributeFactory.create().setName(CHROM).setDataType(LONG);
metaDataCantAnnotate.addAttribute(attributeCantAnnotateChrom);
metaDataCantAnnotate.addAttribute(attributePos);
metaDataCantAnnotate.addAttribute(attributeRef);
metaDataCantAnnotate.addAttribute(attributeAlt);
entity = new DynamicEntity(metaDataCanAnnotate);
entity1 = new DynamicEntity(metaDataCanAnnotate);
entity2 = new DynamicEntity(metaDataCanAnnotate);
entity3 = new DynamicEntity(metaDataCanAnnotate);
entity4 = new DynamicEntity(metaDataCanAnnotate);
entities = new ArrayList<>();
entities.add(entity);
}
@BeforeClass
public void beforeClass() throws IOException
{
// Can annotate
metaDataCanAnnotate = entityTypeFactory.create().setName("test");
// Negative test cannot annotate
metaDataCantAnnotate = entityTypeFactory.create().setName("test");
AnnotatorConfig annotatorConfig = context.getBean(AnnotatorConfig.class);
annotatorConfig.init();
// Test file
// 1 10001 T A 0.164613914
// 1 10001 T C 0.439699405
// 1 10001 T G 0.381086294
input1 = new ArrayList<>();
input2 = new ArrayList<>();
input3 = new ArrayList<>();
input4 = new ArrayList<>();
setValues();
entity1.set(VcfAttributes.CHROM, "1");
entity1.set(VcfAttributes.POS, 10001);
entity1.set(VcfAttributes.REF, "T");
entity1.set(VcfAttributes.ALT, "A");
input1.add(entity1);
entity2.set(VcfAttributes.CHROM, "1");
entity2.set(VcfAttributes.POS, 10001);
entity2.set(VcfAttributes.REF, "T");
entity2.set(VcfAttributes.ALT, "X");
input2.add(entity2);
entity3.set(VcfAttributes.CHROM, "3");
entity3.set(VcfAttributes.POS, 10001);
entity3.set(VcfAttributes.REF, "T");
entity3.set(VcfAttributes.ALT, "G");
input3.add(entity3);
entity4.set(VcfAttributes.CHROM, "1");
entity4.set(VcfAttributes.POS, 10001);
entity4.set(VcfAttributes.REF, "T");
entity4.set(VcfAttributes.ALT, "G");
input4.add(entity4);
}
@Test
public void testThreeOccurencesOneMatchEntity1()
{
Iterator<Entity> results = annotator.annotate(input1);
Entity resultEntity = results.next();
assertEquals(resultEntity.get(DannAnnotator.DANN_SCORE), "0.16461391399220135");
}
@Test
public void testThreeOccurencesNoMatchEntity2()
{
Iterator<Entity> results = annotator.annotate(input2);
Entity resultEntity = results.next();
assertEquals(resultEntity.get(DannAnnotator.DANN_SCORE), null);
}
@Test
public void testNoOccurencesNoMatchEntity3()
{
Iterator<Entity> results = annotator.annotate(input3);
Entity resultEntity = results.next();
assertEquals(resultEntity.get(DannAnnotator.DANN_SCORE), null);
}
@Test
public void testThreeOccurencesOneMatchEntity4()
{
Iterator<Entity> results = annotator.annotate(input4);
Entity resultEntity = results.next();
assertEquals(resultEntity.get(DannAnnotator.DANN_SCORE), "0.38108629377072734");
}
@Test
public void canAnnotateTrueTest()
{
assertEquals(annotator.canAnnotate(metaDataCanAnnotate), "true");
}
@Test
public void canAnnotateFalseTest()
{
assertEquals(annotator.canAnnotate(metaDataCantAnnotate), "a required attribute has the wrong datatype");
}
@Configuration
@ComponentScan({ "org.molgenis.data.vcf.model" })
public static class Config
{
@Autowired
private DataService dataService;
@Bean
public Entity dannAnnotatorSettings()
{
Entity settings = mock(Entity.class);
when(settings.getString(DannAnnotatorSettings.Meta.DANN_LOCATION))
.thenReturn(ResourceUtils.getFile(getClass(), "/dann/DANN_test_set.tsv.bgz").getPath());
return settings;
}
@Bean
public DataService dataService()
{
return mock(DataService.class);
}
@Bean
public AnnotationService annotationService()
{
return mock(AnnotationService.class);
}
@Bean
public Resources resources()
{
return new ResourcesImpl();
}
}
}