package uk.ac.ox.zoo.seeg.abraid.mp.common.service.workflow.support.runrequest; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; import uk.ac.ox.zoo.seeg.abraid.mp.common.config.ModellingConfiguration; import uk.ac.ox.zoo.seeg.abraid.mp.common.domain.CovariateFile; import uk.ac.ox.zoo.seeg.abraid.mp.common.domain.CovariateSubFile; import uk.ac.ox.zoo.seeg.abraid.mp.common.domain.DiseaseGroup; import java.io.File; import java.io.IOException; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; import static com.googlecode.catchexception.CatchException.catchException; import static com.googlecode.catchexception.CatchException.caughtException; import static java.nio.charset.Charset.defaultCharset; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.util.Files.contentOf; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; /** * Tests the FreemarkerScriptGenerator class. * Copyright (c) 2014 University of Oxford */ public class FreemarkerScriptGeneratorTest { @Rule public TemporaryFolder testFolder = new TemporaryFolder(); ///CHECKSTYLE:SUPPRESS VisibilityModifier @Test public void generateScriptShouldReturnAFileThatItHasCreated() throws Exception { // Arrange ScriptGenerator target = new FreemarkerScriptGenerator(); ModellingConfiguration conf = createBasicConfiguration(); DiseaseGroup dg = createDiseaseGroup(); Collection<CovariateFile> covariates = Arrays.asList(createCovariate(1, 1), createCovariate(2, 2)); // Act File result = target.generateScript(conf, testFolder.getRoot(), dg, covariates); // Assert assertThat(result).isNotNull(); assertThat(result).exists(); assertThat(result).isFile(); assertThat(result).canRead(); } @Test public void generateScriptShouldReturnAFileThatIsBasedOnTheCorrectTemplate() throws Exception { // Arrange ScriptGenerator target = new FreemarkerScriptGenerator(); ModellingConfiguration conf = createBasicConfiguration(); DiseaseGroup dg = createDiseaseGroup(); Collection<CovariateFile> covariates = Arrays.asList(createCovariate(1, 1), createCovariate(2, 2)); // Act File result = target.generateScript(conf, testFolder.getRoot(), dg, covariates); // Assert assertThat(contentOf(result, defaultCharset())).startsWith("# A launch script for the ABRAID-MP disease risk model"); } @Test public void generateScriptShouldReturnAddCorrectDataToTheScript() throws Exception { // Arrange ScriptGenerator target = new FreemarkerScriptGenerator(); int maxCPUs = 123; ModellingConfiguration conf = new ModellingConfiguration(maxCPUs, false, false); DiseaseGroup dg = createDiseaseGroup(); Collection<CovariateFile> covariates = Arrays.asList(createCovariate(1, 1), createCovariate(2, 2)); // Act File result = target.generateScript(conf, testFolder.getRoot(), dg, covariates); // Assert assertThat(contentOf(result, Charset.forName("US-ASCII"))).contains("max_cpus <- " + maxCPUs); assertThat(contentOf(result, Charset.forName("US-ASCII"))).contains("verbose <- FALSE"); assertThat(contentOf(result, Charset.forName("US-ASCII"))).contains("max_cpus <- " + maxCPUs); assertThat(contentOf(result, Charset.forName("US-ASCII"))).contains( " covariate_paths <- list(" + System.lineSeparator() + " \"id1\"=\"covariates/c/1_1.tif\"," + System.lineSeparator() + " \"id2\"=list(" + System.lineSeparator() + " \"2015-01\"=\"covariates/c/2_1.tif\"," + System.lineSeparator() + " \"2015-02\"=\"covariates/c/2_2.tif\"" + System.lineSeparator() + " )" + System.lineSeparator() + " )" + System.lineSeparator()); assertThat(contentOf(result, Charset.forName("US-ASCII"))).contains( " covariate_factors <- list(" + System.lineSeparator() + " \"id1\"=FALSE," + System.lineSeparator() + " \"id2\"=FALSE" + System.lineSeparator() + " )" + System.lineSeparator()); } @Test public void generateScriptShouldThrowIfScriptCanNotBeWritten() throws Exception { // Arrange ScriptGenerator target = new FreemarkerScriptGenerator(); ModellingConfiguration conf = createBasicConfiguration(); DiseaseGroup dg = createDiseaseGroup(); Collection<CovariateFile> covariates = Arrays.asList(createCovariate(1, 1), createCovariate(2, 2)); // Act catchException(target).generateScript(conf, new File("non-existent"), dg, covariates); Exception result = caughtException(); // Assert assertThat(result).isInstanceOf(IOException.class); } @Test public void generateScriptShouldThrowIfWorkingDirectoryIsAFile() throws Exception { // Arrange ScriptGenerator target = new FreemarkerScriptGenerator(); ModellingConfiguration conf = createBasicConfiguration(); DiseaseGroup dg = createDiseaseGroup(); Collection<CovariateFile> covariates = Arrays.asList(createCovariate(1, 1), createCovariate(2, 2)); // Act catchException(target).generateScript(conf, testFolder.newFile(), dg, covariates); Exception result = caughtException(); // Assert assertThat(result).isInstanceOf(IOException.class); } private ModellingConfiguration createBasicConfiguration() throws IOException { return new ModellingConfiguration(1, false, false); } private DiseaseGroup createDiseaseGroup() { DiseaseGroup dg = mock(DiseaseGroup.class); when(dg.getId()).thenReturn(123); when(dg.getModelMode()).thenReturn("thismode"); return dg; } private CovariateFile createCovariate(int id, int subCount) { CovariateFile cov = mock(CovariateFile.class); List<CovariateSubFile> files = new ArrayList<>(); for (int i = 1; i <= subCount; i++) { CovariateSubFile subObj = mock(CovariateSubFile.class); when(subObj.getId()).thenReturn((id * 1000) + i); when(subObj.getQualifier()).thenReturn(subCount == 1 ? null : "2015-0" + i); when(subObj.getFile()).thenReturn("c/" + id + "_" + i + ".tif"); files.add(subObj); } when(cov.getFiles()).thenReturn(files); when(cov.getId()).thenReturn(id); when(cov.getDiscrete()).thenReturn(false); return cov; } }