package uk.ac.ox.zoo.seeg.abraid.mp.common.service.workflow.support.runrequest.data; import org.apache.commons.io.FileUtils; import org.geotools.coverage.grid.io.GridCoverage2DReader; import org.geotools.factory.Hints; import org.geotools.gce.geotiff.GeoTiffReader; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; import uk.ac.ox.zoo.seeg.abraid.mp.common.domain.AdminUnitDiseaseExtentClass; import uk.ac.ox.zoo.seeg.abraid.mp.common.domain.AdminUnitGlobalOrTropical; import uk.ac.ox.zoo.seeg.abraid.mp.common.domain.DiseaseExtentClass; import java.awt.image.Raster; import java.io.File; import java.io.IOException; import java.nio.file.Paths; import java.util.*; import static com.googlecode.catchexception.CatchException.catchException; import static com.googlecode.catchexception.CatchException.caughtException; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; /** * Tests for ExtentDataWriter. * Copyright (c) 2014 University of Oxford */ public class ExtentDataWriterTest { public static final String SMALL_RASTER = "Common/test/uk/ac/ox/zoo/seeg/abraid/mp/common/service/workflow/support/runrequest/data/testdata/SmallRaster.tif"; public static final String SMALL_RASTER_TRANSFORMED = "Common/test/uk/ac/ox/zoo/seeg/abraid/mp/common/service/workflow/support/runrequest/data/testdata/SmallRaster_transformed.tif"; @Rule public TemporaryFolder testFolder = new TemporaryFolder(); ///CHECKSTYLE:SUPPRESS VisibilityModifier @Test public void writeShouldProduceCorrectOutputAndSetAnyUnknownValuesToNoData() throws Exception { // Arrange File sourceRaster = new File(SMALL_RASTER); File result = Paths.get(testFolder.newFolder().toString(), "foo.tif").toFile(); ExtentDataWriter target = new ExtentDataWriterImpl(); Collection<AdminUnitDiseaseExtentClass> extent = Arrays.asList( createMockAdminUnitDiseaseExtentClass(1, -100), createMockAdminUnitDiseaseExtentClass(2, -50), createMockAdminUnitDiseaseExtentClass(3, 0), createMockAdminUnitDiseaseExtentClass(4, 50), createMockAdminUnitDiseaseExtentClass(5, 100) ); // Act target.write(extent, sourceRaster, result); // Assert GridCoverage2DReader reader = new GeoTiffReader(result, new Hints(Hints.FORCE_LONGITUDE_FIRST_AXIS_ORDER, Boolean.TRUE)); Raster transformed = reader.read(null).getRenderedImage().getData(); assertThat(transformed.getSample(0, 0, 0)).isEqualTo(-100); assertThat(transformed.getSample(1, 0, 0)).isEqualTo(-50); assertThat(transformed.getSample(2, 0, 0)).isEqualTo(0); assertThat(transformed.getSample(0, 1, 0)).isEqualTo(50); assertThat(transformed.getSample(1, 1, 0)).isEqualTo(100); assertThat(transformed.getSample(2, 1, 0)).isEqualTo(-9999); assertThat(transformed.getSample(0, 2, 0)).isEqualTo(-9999); assertThat(transformed.getSample(1, 2, 0)).isEqualTo(-9999); assertThat(transformed.getSample(2, 2, 0)).isEqualTo(-9999); // Verify the meta data fields assertThat(result).hasContentEqualTo(new File(SMALL_RASTER_TRANSFORMED)); } private AdminUnitDiseaseExtentClass createMockAdminUnitDiseaseExtentClass(int gaul, int weighting) { AdminUnitDiseaseExtentClass obj = mock(AdminUnitDiseaseExtentClass.class); when(obj.getDiseaseExtentClass()).thenReturn(mock(DiseaseExtentClass.class)); when(obj.getDiseaseExtentClass().getWeighting()).thenReturn(weighting); when(obj.getAdminUnitGlobalOrTropical()).thenReturn(mock(AdminUnitGlobalOrTropical.class)); when(obj.getAdminUnitGlobalOrTropical().getGaulCode()).thenReturn(gaul); return obj; } @Test public void writeThrowIfSourceRasterCannotBeRead() throws Exception { // Arrange File sourceRaster = testFolder.newFile(); FileUtils.writeStringToFile(sourceRaster, "nonsense", "UTF-8"); File result = Paths.get(testFolder.newFolder().toString(), "foo.asc").toFile(); ExtentDataWriter target = new ExtentDataWriterImpl(); Collection<AdminUnitDiseaseExtentClass> extent = new ArrayList<>(); // Act catchException(target).write(extent, sourceRaster, result); // Assert assertThat(caughtException()).isInstanceOf(IOException.class); } @Test public void writeThrowIfTargetRasterCannotBeSaved() throws Exception { // Arrange File sourceRaster = testFolder.newFile(); FileUtils.writeStringToFile(sourceRaster, SMALL_RASTER, "UTF-8"); File result = testFolder.newFolder(); // already exists as a directory ExtentDataWriter target = new ExtentDataWriterImpl(); Collection<AdminUnitDiseaseExtentClass> extent = new ArrayList<>(); // Act catchException(target).write(extent, sourceRaster, result); // Assert assertThat(caughtException()).isInstanceOf(IOException.class); } }