package org.geotools.image.io;
import static org.junit.Assert.*;
import java.awt.image.RenderedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.imageio.ImageIO;
import javax.imageio.stream.FileCacheImageOutputStream;
import javax.imageio.stream.ImageOutputStream;
import javax.imageio.stream.MemoryCacheImageOutputStream;
import javax.media.jai.operator.ConstantDescriptor;
import org.geotools.image.io.ImageIOExt;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class ImageIOExtTest {
private boolean useCache;
@Before
public void before() {
useCache = ImageIO.getUseCache();
}
@After
public void after() {
ImageIO.setUseCache(useCache);
}
@Test
public void testDefaultMemoryOutputStreams() throws Exception {
ImageIO.setUseCache(false);
testSameStreamClass();
}
@Test
public void testDefaultFileOutputStreams() throws Exception {
ImageIO.setUseCache(true);
testSameStreamClass();
}
@Test
public void testThreshold() throws Exception {
OutputStream os = new ByteArrayOutputStream();
ImageIOExt.setFilesystemThreshold(100 * 100 * 3l);
RenderedImage imageSmall = getTestRenderedImage(50, 50, 3);
final ImageOutputStream iosSmall = ImageIOExt.createImageOutputStream(imageSmall, os);
try {
assertEquals(MemoryCacheImageOutputStream.class, iosSmall.getClass());
} finally {
iosSmall.close();
}
RenderedImage imageLarge = getTestRenderedImage(101, 101, 3);
final ImageOutputStream iosLarge = ImageIOExt.createImageOutputStream(imageLarge, os);
try {
assertEquals(FileCacheImageOutputStream.class, iosLarge.getClass());
} finally {
iosLarge.close();
}
}
void testSameStreamClass() throws IOException {
OutputStream os = new ByteArrayOutputStream();
RenderedImage image = getTestRenderedImage(50, 50, 1);
ImageOutputStream iosExt = ImageIOExt.createImageOutputStream(image, os);
ImageOutputStream iosStd = ImageIO.createImageOutputStream(os);
assertEquals(iosExt.getClass(), iosStd.getClass());
}
RenderedImage getTestRenderedImage(int width, int height, int bands) {
Byte[] values = new Byte[bands];
for (int i = 0; i < values.length; i++) {
values[i] = new Byte((byte) 0);
}
return ConstantDescriptor.create((float) width, (float) height, values, null);
}
}