/* * Copyright (C) 2015 Patryk Strach * * This file is part of Virtual Slide Viewer. * * Virtual Slide Viewer is free software: you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software Foundation, * either version 3 of the License, or (at your option) any later version. * * Virtual Slide Viewer is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with Virtual Slide Viewer. * If not, see <http://www.gnu.org/licenses/>. */ package virtualslideviewer.core; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.*; import java.awt.Dimension; import java.awt.Rectangle; import org.junit.Before; import org.junit.Test; import org.mockito.Mockito; import virtualslideviewer.core.BufferedVirtualSlideImage; import virtualslideviewer.core.ImageIndex; import virtualslideviewer.core.Tile; import virtualslideviewer.core.TileCache; import virtualslideviewer.core.VirtualSlideImage; public class BufferedVirtualSlideImageTest { private VirtualSlideImage mImageMock; private TileCache mCacheMock; private BufferedVirtualSlideImage mTestedImage; @Before public void setUp() throws Exception { mImageMock = Mockito.mock(VirtualSlideImage.class); mCacheMock = Mockito.mock(TileCache.class); mTestedImage = new BufferedVirtualSlideImage(mImageMock, mCacheMock); Mockito.when(mCacheMock.getTileData(Mockito.eq(mTestedImage), Mockito.any())).thenReturn(new byte[] { 1, 2, 3 }); } @Test public void testGetTileDataAddsTileToCacheIfItIsNotThereAlreadyAndThenReturnsIt() { Mockito.when(mCacheMock.hasTile(Mockito.eq(mTestedImage), Mockito.any())).thenReturn(false); Tile tileToGet = new Tile(0, 0, 0); byte[] returnedBytes = new byte[3]; mTestedImage.getTileData(returnedBytes, tileToGet); Mockito.verify(mImageMock).getTileData(Mockito.eq(tileToGet)); Mockito.verify(mCacheMock).addTile(Mockito.eq(mTestedImage), Mockito.eq(tileToGet), Mockito.any()); assertThat(returnedBytes, is(new byte[] { 1, 2, 3 })); } @Test public void testGetTileDataDoesNotLoadDataIfItIsAlreadyInCacheAndReturnsDataFromCache() { Mockito.when(mCacheMock.hasTile(Mockito.eq(mTestedImage), Mockito.any())).thenReturn(true); Tile tileToGet = new Tile(0, 0, 0); byte[] returnedBytes = new byte[3]; mTestedImage.getTileData(returnedBytes, tileToGet); Mockito.verify(mCacheMock).getTileData(Mockito.eq(mTestedImage), Mockito.eq(tileToGet)); Mockito.verify(mImageMock, Mockito.never()).getTileData(Mockito.any()); assertThat(returnedBytes, is(new byte[] { 1, 2, 3 })); } @Test public void testGetTileDataPadsBiggerBufferWithZeros() { byte[] returnedBytes = new byte[5]; mTestedImage.getTileData(returnedBytes, new Tile(0, 0, 0)); assertThat(returnedBytes, is(new byte[] { 1, 2, 3, 0, 0 })); } @Test public void testEnsureTileDataCachedAddsTileToCacheIfItIsNotThereAlready() { Mockito.when(mCacheMock.hasTile(Mockito.eq(mTestedImage), Mockito.any())).thenReturn(false); Tile tile = new Tile(0, 0, 0); mTestedImage.ensureTileDataCached(tile); Mockito.verify(mImageMock).getTileData(Mockito.eq(tile)); Mockito.verify(mCacheMock).addTile(Mockito.eq(mTestedImage), Mockito.eq(tile), Mockito.any()); } @Test public void testEnsureTileDataCachedDoesNotLoadDataIfItIsAlreadyInCache() { Mockito.when(mCacheMock.hasTile(Mockito.eq(mTestedImage), Mockito.any())).thenReturn(true); Tile tile = new Tile(0, 0, 0); mTestedImage.ensureTileDataCached(tile); Mockito.verify(mImageMock, Mockito.never()).getTileData(Mockito.any()); } @Test public void testIsImageInCacheReturnsTrueIfSingleTileIsInCache() { Mockito.when(mImageMock.getTileSize(1)).thenReturn(new Dimension(100, 150)); Mockito.when(mCacheMock.hasTile(mTestedImage, new Tile(5, 6, 1))).thenReturn(true); assertTrue(mTestedImage.isImageInCache(new Rectangle(500, 900, 100, 150), new ImageIndex(1))); } @Test public void testIsImageInCacheReturnsFalseIfSingleTileIsNotInCache() { Mockito.when(mImageMock.getTileSize(1)).thenReturn(new Dimension(100, 150)); Mockito.when(mCacheMock.hasTile(Mockito.eq(mTestedImage), Mockito.any())).thenReturn(false); assertFalse(mTestedImage.isImageInCache(new Rectangle(500, 900, 100, 150), new ImageIndex(1))); } @Test public void testIsImageInCacheReturnsFalseIfResolutionIndexesAreDifferent() { Mockito.when(mImageMock.getTileSize(1)).thenReturn(new Dimension(100, 150)); Mockito.when(mCacheMock.hasTile(mTestedImage, new Tile(5, 6, 2))).thenReturn(true); assertFalse(mTestedImage.isImageInCache(new Rectangle(500, 900, 100, 150), new ImageIndex(1))); } @Test public void testIsImageInCacheReturnsTrueForImageComposedFromMultipleTilesIfAllOfItsTilesAreInCache() { Mockito.when(mImageMock.getTileSize(1)).thenReturn(new Dimension(100, 150)); Mockito.when(mCacheMock.hasTile(Mockito.eq(mTestedImage), Mockito.any())).thenReturn(false); Mockito.when(mCacheMock.hasTile(mTestedImage, new Tile(1, 3, 1))).thenReturn(true); Mockito.when(mCacheMock.hasTile(mTestedImage, new Tile(2, 3, 1))).thenReturn(true); Mockito.when(mCacheMock.hasTile(mTestedImage, new Tile(3, 3, 1))).thenReturn(true); Mockito.when(mCacheMock.hasTile(mTestedImage, new Tile(4, 3, 1))).thenReturn(true); Mockito.when(mCacheMock.hasTile(mTestedImage, new Tile(1, 4, 1))).thenReturn(true); Mockito.when(mCacheMock.hasTile(mTestedImage, new Tile(2, 4, 1))).thenReturn(true); Mockito.when(mCacheMock.hasTile(mTestedImage, new Tile(3, 4, 1))).thenReturn(true); Mockito.when(mCacheMock.hasTile(mTestedImage, new Tile(4, 4, 1))).thenReturn(true); assertTrue(mTestedImage.isImageInCache(new Rectangle(170, 450, 220, 175), new ImageIndex(1))); } @Test public void testIsImageInCacheReturnsFalseForImageComposedFromMultipleTilesWhenSomeOfItTilesAreNotInCache() { Mockito.when(mImageMock.getTileSize(1)).thenReturn(new Dimension(100, 150)); Mockito.when(mCacheMock.hasTile(Mockito.eq(mTestedImage), Mockito.any())).thenReturn(false); Mockito.when(mCacheMock.hasTile(mTestedImage, new Tile(2, 3, 1))).thenReturn(true); Mockito.when(mCacheMock.hasTile(mTestedImage, new Tile(3, 3, 1))).thenReturn(true); Mockito.when(mCacheMock.hasTile(mTestedImage, new Tile(4, 3, 1))).thenReturn(true); Mockito.when(mCacheMock.hasTile(mTestedImage, new Tile(1, 4, 1))).thenReturn(true); Mockito.when(mCacheMock.hasTile(mTestedImage, new Tile(3, 4, 1))).thenReturn(true); Mockito.when(mCacheMock.hasTile(mTestedImage, new Tile(4, 4, 1))).thenReturn(true); assertFalse(mTestedImage.isImageInCache(new Rectangle(170, 450, 220, 175), new ImageIndex(1))); } }