package org.molgenis.data.mapper.algorithmgenerator.generator; import org.molgenis.data.mapper.service.UnitResolver; import org.molgenis.data.mapper.service.impl.UnitResolverImpl; 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.ontology.core.model.Ontology; import org.molgenis.ontology.core.service.OntologyService; import org.molgenis.test.data.AbstractMolgenisSpringTest; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.test.context.ContextConfiguration; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import static java.util.Arrays.asList; import static java.util.Collections.singletonList; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import static org.molgenis.data.meta.AttributeType.DECIMAL; import static org.testng.Assert.*; @ContextConfiguration(classes = NumericAlgorithmGeneratorTest.Config.class) public class NumericAlgorithmGeneratorTest extends AbstractMolgenisSpringTest { @Autowired private EntityTypeFactory entityTypeFactory; @Autowired private AttributeFactory attrMetaFactory; @Autowired private OntologyService ontologyService; @Autowired private NumericAlgorithmGenerator numericAlgorithmGenerator; private EntityType targetEntityType; private Attribute targetAttribute; private EntityType sourceEntityType; private Attribute sourceAttribute; private Attribute sourceAttribute1; @BeforeMethod public void setup() { when(ontologyService.getOntology("http://purl.obolibrary.org/obo/uo.owl")) .thenReturn(Ontology.create("1", "http://purl.obolibrary.org/obo/uo.owl", "unit ontology")); targetEntityType = entityTypeFactory.create("target"); targetAttribute = attrMetaFactory.create().setName("targetHeight"); targetAttribute.setLabel("height in m"); targetAttribute.setDataType(DECIMAL); targetEntityType.addAttribute(targetAttribute); sourceEntityType = entityTypeFactory.create("source"); sourceAttribute = attrMetaFactory.create().setName("sourceHeight"); sourceAttribute.setDataType(DECIMAL); sourceAttribute.setLabel("body length in cm"); sourceEntityType.addAttribute(sourceAttribute); sourceAttribute1 = attrMetaFactory.create().setName("sourceHeight1"); sourceAttribute1.setDataType(DECIMAL); sourceAttribute1.setLabel("body length in cm second time"); sourceEntityType.addAttribute(sourceAttribute1); } @Test public void generate() { String generate = numericAlgorithmGenerator .generate(targetAttribute, asList(sourceAttribute), targetEntityType, sourceEntityType); assertEquals(generate, "$('sourceHeight').unit('cm').toUnit('m').value();"); String generateAverageValue = numericAlgorithmGenerator .generate(targetAttribute, asList(sourceAttribute, sourceAttribute1), targetEntityType, sourceEntityType); String expected = "var counter = 0;\nvar SUM=newValue(0);\nif(!$('sourceHeight').isNull().value()){\n\tSUM.plus($('sourceHeight').unit('cm').toUnit('m').value());\n\tcounter++;\n}\nif(!$('sourceHeight1').isNull().value()){\n\tSUM.plus($('sourceHeight1').unit('cm').toUnit('m').value());\n\tcounter++;\n}\nif(counter !== 0){\n\tSUM.div(counter);\n\tSUM.value();\n}else{\n\tnull;\n}"; assertEquals(generateAverageValue, expected); } @Test public void generateUnitConversionAlgorithm() { String generateUnitConversionAlgorithm = numericAlgorithmGenerator .generateUnitConversionAlgorithm(targetAttribute, targetEntityType, sourceAttribute, sourceEntityType); assertEquals(generateUnitConversionAlgorithm, "$('sourceHeight').unit('cm').toUnit('m').value();"); } @Test public void isSuitable() { Attribute stringAttribute = attrMetaFactory.create().setName("source_string"); assertTrue(numericAlgorithmGenerator.isSuitable(targetAttribute, singletonList(sourceAttribute))); assertFalse(numericAlgorithmGenerator.isSuitable(targetAttribute, asList(sourceAttribute, stringAttribute))); } @Configuration public static class Config { @Bean public UnitResolver unitResolver() { return new UnitResolverImpl(ontologyService()); } @Bean public OntologyService ontologyService() { return mock(OntologyService.class); } @Bean public NumericAlgorithmGenerator numericAlgorithmGenerator() { return new NumericAlgorithmGenerator(unitResolver()); } } }