/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package project.latex.balloon.sensor;
import java.io.File;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import static org.junit.Assert.assertEquals;
import org.junit.Before;
import org.junit.Test;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import project.latex.balloon.writer.DataWriteFailedException;
import project.latex.balloon.writer.camera.CameraDataWriter;
import project.latex.balloon.writer.camera.ImageSource;
/**
*
* @author dgorst
*/
public class CameraControllerTest {
private ImageSource mockImageSource;
private CameraDataWriter cameraDataWriter;
private final String sensorName = "Camera";
private CameraController cameraController;
@Before
public void setUp() {
this.mockImageSource = mock(ImageSource.class);
this.cameraDataWriter = mock(CameraDataWriter.class);
cameraController = new CameraController(mockImageSource, cameraDataWriter, sensorName);
}
@Test
public void testHandleNewImagesNoImagesAvailable() throws DataWriteFailedException {
Set<File> availableFiles = new HashSet<>();
when(mockImageSource.getAvailableImages()).thenReturn(availableFiles);
cameraController.handleNewImages();
verify(cameraDataWriter, never()).writeImageFiles((List<File>) any());
}
@Test
public void testHandleNewImagesSendsImagesToWriterInDescendingModifiedOrder() throws DataWriteFailedException {
File mockFile1 = mock(File.class);
when(mockFile1.lastModified()).thenReturn(10L);
File mockFile2 = mock(File.class);
when(mockFile2.lastModified()).thenReturn(20L);
Set<File> availableFiles = new HashSet<>();
availableFiles.add(mockFile1);
availableFiles.add(mockFile2);
when(mockImageSource.getAvailableImages()).thenReturn(availableFiles);
cameraController.handleNewImages();
List<File> expectedFiles = new ArrayList<>();
expectedFiles.add(mockFile2);
expectedFiles.add(mockFile1);
verify(cameraDataWriter).writeImageFiles(expectedFiles);
}
@Test
public void testImagesAreMarkedAsHandledOnceTheyAreSuccessfullyWritten() throws DataWriteFailedException {
File mockFile1 = mock(File.class);
when(mockFile1.lastModified()).thenReturn(10L);
File mockFile2 = mock(File.class);
when(mockFile2.lastModified()).thenReturn(20L);
Set<File> availableFiles = new HashSet<>();
availableFiles.add(mockFile1);
availableFiles.add(mockFile2);
when(mockImageSource.getAvailableImages()).thenReturn(availableFiles);
cameraController.handleNewImages();
List<File> expectedFiles = new ArrayList<>();
expectedFiles.add(mockFile2);
expectedFiles.add(mockFile1);
verify(cameraDataWriter).writeImageFiles(expectedFiles);
Set<File> expectedHandledFiles = new HashSet<>();
expectedHandledFiles.add(mockFile2);
expectedHandledFiles.add(mockFile1);
assertEquals(expectedHandledFiles, cameraController.getHandledImages());
}
@Test
public void testImagesAreNotMarkedAsHandledIfThereIsAnErrorDuringWriting() throws DataWriteFailedException {
File mockFile1 = mock(File.class);
when(mockFile1.lastModified()).thenReturn(10L);
File mockFile2 = mock(File.class);
when(mockFile2.lastModified()).thenReturn(20L);
Set<File> availableFiles = new HashSet<>();
availableFiles.add(mockFile1);
availableFiles.add(mockFile2);
when(mockImageSource.getAvailableImages()).thenReturn(availableFiles);
doThrow(new DataWriteFailedException("test")).when(cameraDataWriter).writeImageFiles((List<File>) any());
cameraController.handleNewImages();
Set<File> expectedHandledFiles = new HashSet<>();
assertEquals(expectedHandledFiles, cameraController.getHandledImages());
}
}