/******************************************************************************* * Copyright (c) 2002, 2014 Innoopract Informationssysteme GmbH and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Innoopract Informationssysteme GmbH - initial API and implementation * EclipseSource - ongoing development * Frank Appel - replaced singletons and static fields (Bug 337787) ******************************************************************************/ package org.eclipse.swt.internal.graphics; import static org.eclipse.rap.rwt.testfixture.internal.TestUtil.createImage; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import java.io.BufferedInputStream; import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; import org.eclipse.rap.rwt.RWT; import org.eclipse.rap.rwt.testfixture.internal.Fixture; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.ImageData; import org.eclipse.swt.graphics.PaletteData; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.widgets.Display; import org.junit.After; import org.junit.Before; import org.junit.Test; public class InternalImageFactory_Test { private static final ClassLoader CLASS_LOADER = InternalImageFactory_Test.class.getClassLoader(); private static final String IMAGE_SAMPLE1 = "resources/images/image-sample1.png"; private static final String IMAGE_SAMPLE2 = "resources/images/image-sample2.png"; private static final String IMAGE_OK = "resources/images/ok.png"; private static final String IMAGE_OK_BLACK = "resources/images/ok-black.png"; private InternalImageFactory internalImageFactory; @Before public void setUp() { Fixture.createApplicationContext( true ); Fixture.createServiceContext(); internalImageFactory = new InternalImageFactory(); } @After public void tearDown() { Fixture.disposeOfServiceContext(); Fixture.disposeOfApplicationContext(); } @Test public void testRegisterResource() throws IOException { InputStream inputStream = CLASS_LOADER.getResourceAsStream( Fixture.IMAGE_100x50 ); String name = "testName"; RWT.getResourceManager().register( name, inputStream ); inputStream.close(); assertTrue( RWT.getResourceManager().isRegistered( name ) ); } @Test public void testReadImageData() throws IOException { InputStream inputStream = CLASS_LOADER.getResourceAsStream( Fixture.IMAGE_100x50 ); ImageData data = InternalImageFactory.readImageData( new BufferedInputStream( inputStream ) ); inputStream.close(); assertEquals( 100, data.width ); assertEquals( 50, data.height ); } @Test public void testImageWithUndefinedType() { // imageData without type field should not throw SWT exception assertNotNull( InternalImageFactory.createInputStream( createImageDataWithoutType() ) ); } @Test public void testInternalImagesFromInputStreamAreCached() throws IOException { InputStream stream1 = CLASS_LOADER.getResourceAsStream( Fixture.IMAGE_100x50 ); InternalImage internalImage1 = internalImageFactory.findInternalImage( stream1 ); stream1.close(); InputStream stream2 = CLASS_LOADER.getResourceAsStream( Fixture.IMAGE_100x50 ); InternalImage internalImage2 = internalImageFactory.findInternalImage( stream2 ); stream2.close(); assertNotNull( internalImage1 ); assertSame( internalImage1, internalImage2 ); } @Test public void testInternalImagesFromFilenameAreCached() throws IOException { File imageFile = new File( Fixture.TEMP_DIR, "test.gif" ); Fixture.copyTestResource( Fixture.IMAGE1, imageFile ); String path = imageFile.getAbsolutePath(); InternalImage internalImage1 = internalImageFactory.findInternalImage( path ); InternalImage internalImage2 = internalImageFactory.findInternalImage( path ); assertNotNull( internalImage1 ); assertSame( internalImage1, internalImage2 ); } @Test public void testInternalImagesFromImageDataAreCached() throws IOException { Display display = new Display(); Image image = createImage( display, Fixture.IMAGE_100x50 ); ImageData imageData1 = image.getImageData(); ImageData imageData2 = image.getImageData(); assertNotSame( imageData1, imageData2 ); InternalImage internalImage1 = internalImageFactory.findInternalImage( imageData1 ); InternalImage internalImage2 = internalImageFactory.findInternalImage( imageData2 ); assertNotNull( internalImage1 ); assertSame( internalImage1, internalImage2 ); } @Test public void testInternalImagesDifferForDifferentPalettes() { PaletteData palette1 = new PaletteData( new RGB[] { new RGB( 23, 1, 7 ) } ); PaletteData palette2 = new PaletteData( new RGB[] { new RGB( 3, 5, 42 ) } ); ImageData imageData1 = new ImageData( 8, 8, 8, palette1 ); ImageData imageData2 = new ImageData( 8, 8, 8, palette2 ); InternalImage internalImage1 = internalImageFactory.findInternalImage( imageData1 ); InternalImage internalImage2 = internalImageFactory.findInternalImage( imageData2 ); assertNotSame( internalImage1, internalImage2 ); } @Test public void testInternalImagesDifferForDifferentPalettes2() { PaletteData palette1 = new PaletteData( new RGB[] { new RGB( 1, 2, 3 ) } ); PaletteData palette2 = new PaletteData( 1, 2, 3 ); ImageData imageData1 = new ImageData( 8, 8, 8, palette1 ); ImageData imageData2 = new ImageData( 8, 8, 8, palette2 ); InternalImage internalImage1 = internalImageFactory.findInternalImage( imageData1 ); InternalImage internalImage2 = internalImageFactory.findInternalImage( imageData2 ); assertNotSame( internalImage1, internalImage2 ); } // Regression test for bug 326888 @Test public void testInternalImagesDifferForSimilarImageData() throws IOException { InputStream stream1 = CLASS_LOADER.getResourceAsStream( IMAGE_SAMPLE1 ); InternalImage internalImage1 = internalImageFactory.findInternalImage( stream1 ); stream1.close(); InputStream stream2 = CLASS_LOADER.getResourceAsStream( IMAGE_SAMPLE2 ); InternalImage internalImage2 = internalImageFactory.findInternalImage( stream2 ); stream2.close(); assertNotNull( internalImage1 ); assertNotSame( internalImage1, internalImage2 ); } // Regression test for bug 326888 @Test public void testInternalImagesDifferForDifferentColor() throws IOException { InputStream stream1 = CLASS_LOADER.getResourceAsStream( IMAGE_OK ); InternalImage internalImage1 = internalImageFactory.findInternalImage( stream1 ); stream1.close(); InputStream stream2 = CLASS_LOADER.getResourceAsStream( IMAGE_OK_BLACK ); InternalImage internalImage2 = internalImageFactory.findInternalImage( stream2 ); stream2.close(); assertNotNull( internalImage1 ); assertNotSame( internalImage1, internalImage2 ); } @Test public void testFindInternalImageWithPath() throws IOException { InputStream stream = CLASS_LOADER.getResourceAsStream( Fixture.IMAGE1 ); String key = "testkey"; InternalImage internalImage1 = internalImageFactory.findInternalImage( key, stream ); stream.close(); assertNotNull( internalImage1 ); // second stream is not read InputStream stream2 = new ByteArrayInputStream( new byte[ 0 ] ); InternalImage internalImage2 = internalImageFactory.findInternalImage( key, stream2 ); assertSame( internalImage1, internalImage2 ); } @Test public void testImageExtension_PNG() throws IOException { InputStream stream = CLASS_LOADER.getResourceAsStream( IMAGE_OK ); InternalImage internalImage = internalImageFactory.findInternalImage( stream ); stream.close(); assertTrue( internalImage.getResourceName().endsWith( ".png" ) ); } @Test public void testImageExtension_GIF() throws IOException { InputStream stream = CLASS_LOADER.getResourceAsStream( Fixture.IMAGE1 ); InternalImage internalImage = internalImageFactory.findInternalImage( stream ); stream.close(); assertTrue( internalImage.getResourceName().endsWith( ".gif" ) ); } @Test public void testImageExtension_UndefinedType() throws IOException { InputStream stream = InternalImageFactory.createInputStream( createImageDataWithoutType() ); InternalImage internalImage = internalImageFactory.findInternalImage( stream ); stream.close(); assertTrue( internalImage.getResourceName().endsWith( ".png" ) ); } private ImageData createImageDataWithoutType() { PaletteData paletteData = new PaletteData( new RGB[]{ new RGB( 255, 0, 0 ), new RGB( 0, 255, 0 ) } ); ImageData result = new ImageData( 48, 48, 1, paletteData ); for( int x = 11; x < 35; x++ ) { for( int y = 11; y < 35; y++ ) { result.setPixel( x, y, 1 ); } } return result; } }