1 package com.atlassian.core.util.thumbnail;
2
3 import com.atlassian.core.util.ReusableBufferedInputStream;
4 import com.google.common.base.Optional;
5 import org.junit.Before;
6 import org.junit.Test;
7 import org.mockito.Mock;
8 import org.mockito.MockitoAnnotations;
9
10 import javax.imageio.ImageReadParam;
11 import javax.imageio.ImageReader;
12 import javax.imageio.stream.ImageInputStream;
13 import java.awt.image.BufferedImage;
14 import java.io.IOException;
15 import java.io.InputStream;
16
17 import static org.junit.Assert.assertEquals;
18 import static org.mockito.Mockito.mock;
19 import static org.mockito.Mockito.verify;
20 import static org.mockito.Mockito.when;
21
22 public class StreamImageScaleTest {
23
24 @Mock private DimensionsHelper dimensionsHelper;
25 @Mock private ReusableBufferedInputStream inputStream;
26
27 @Before
28 public void setUp() throws Exception {
29 MockitoAnnotations.initMocks(this);
30 }
31
32 @Test
33 public void testStreamImageHappyPath() throws Exception {
34 final ImageReader imageReader = mock(ImageReader.class);
35 final ImageReadParam readParam = mock(ImageReadParam.class);
36 final BufferedImage scaledImage = mock(BufferedImage.class);
37 final BufferedImage croppedImage = mock(BufferedImage.class);
38
39 final StreamImageScale imageScale = create(imageReader);
40 when(imageReader.getWidth(0)).thenReturn(200);
41 when(imageReader.getHeight(0)).thenReturn(400);
42 when(dimensionsHelper.determineScaledDimensions(100, 100, 200, 400)).thenReturn(new Dimensions(50, 100));
43 when(imageReader.getDefaultReadParam()).thenReturn(readParam);
44 when(imageReader.read(0, readParam)).thenReturn(scaledImage);
45 when(scaledImage.getWidth()).thenReturn(49);
46 when(scaledImage.getHeight()).thenReturn(99);
47 when(scaledImage.getSubimage(0, 0, 49, 99)).thenReturn(croppedImage);
48
49 final BufferedImage bufferedImage = imageScale.scaleImage(100, 100, inputStream);
50
51 assertEquals(croppedImage, bufferedImage);
52 verify(readParam).setSourceSubsampling(4, 4, 0, 0);
53
54 verify(imageReader).dispose();
55 }
56
57 @Test(expected = IOException.class)
58 public void testInvalidImageThrowsIOException() throws Exception {
59 final StreamImageScale streamImageScale = create(null);
60 streamImageScale.scaleImage(100, 100, inputStream);
61 }
62
63 private StreamImageScale create(final ImageReader imageReader)
64 {
65 return new StreamImageScale(dimensionsHelper)
66 {
67 @Override
68 ImageInputStream getImageInputStream(InputStream inputStream) throws IOException {
69 return null;
70 }
71
72 @Override
73 Optional<ImageReader> getImageReader(ImageInputStream inputStream) throws IOException {
74 return Optional.fromNullable(imageReader);
75 }
76 };
77 }
78
79 }