This commit is contained in:
verboomp
2026-02-19 13:25:23 +01:00
parent db58ae079f
commit 4b8c41aba7
4 changed files with 539 additions and 98 deletions

View File

@@ -186,6 +186,194 @@ class ImageUtilTest {
assertEquals((byte) 0xFF, result[2]);
}
// --- EXIF orientation: applyOrientation ---
@Test
void applyOrientation_orientation1_returnsSameInstance() {
BufferedImage image = new BufferedImage(800, 600, BufferedImage.TYPE_INT_RGB);
BufferedImage result = imageUtil.applyOrientation(image, 1);
assertSame(image, result);
}
@Test
void applyOrientation_orientation2_horizontalFlip_preservesDimensions() {
BufferedImage image = new BufferedImage(800, 600, BufferedImage.TYPE_INT_RGB);
BufferedImage result = imageUtil.applyOrientation(image, 2);
assertEquals(800, result.getWidth());
assertEquals(600, result.getHeight());
}
@Test
void applyOrientation_orientation3_rotate180_preservesDimensions() {
BufferedImage image = new BufferedImage(800, 600, BufferedImage.TYPE_INT_RGB);
BufferedImage result = imageUtil.applyOrientation(image, 3);
assertEquals(800, result.getWidth());
assertEquals(600, result.getHeight());
}
@Test
void applyOrientation_orientation4_verticalFlip_preservesDimensions() {
BufferedImage image = new BufferedImage(800, 600, BufferedImage.TYPE_INT_RGB);
BufferedImage result = imageUtil.applyOrientation(image, 4);
assertEquals(800, result.getWidth());
assertEquals(600, result.getHeight());
}
@Test
void applyOrientation_orientation5_swapsDimensions() {
BufferedImage image = new BufferedImage(800, 600, BufferedImage.TYPE_INT_RGB);
BufferedImage result = imageUtil.applyOrientation(image, 5);
assertEquals(600, result.getWidth());
assertEquals(800, result.getHeight());
}
@Test
void applyOrientation_orientation6_rotate90cw_swapsDimensions() {
BufferedImage image = new BufferedImage(800, 600, BufferedImage.TYPE_INT_RGB);
BufferedImage result = imageUtil.applyOrientation(image, 6);
assertEquals(600, result.getWidth());
assertEquals(800, result.getHeight());
}
@Test
void applyOrientation_orientation7_swapsDimensions() {
BufferedImage image = new BufferedImage(800, 600, BufferedImage.TYPE_INT_RGB);
BufferedImage result = imageUtil.applyOrientation(image, 7);
assertEquals(600, result.getWidth());
assertEquals(800, result.getHeight());
}
@Test
void applyOrientation_orientation8_rotate90ccw_swapsDimensions() {
BufferedImage image = new BufferedImage(800, 600, BufferedImage.TYPE_INT_RGB);
BufferedImage result = imageUtil.applyOrientation(image, 8);
assertEquals(600, result.getWidth());
assertEquals(800, result.getHeight());
}
@Test
void applyOrientation_unknownOrientation_returnsSameInstance() {
BufferedImage image = new BufferedImage(800, 600, BufferedImage.TYPE_INT_RGB);
BufferedImage result = imageUtil.applyOrientation(image, 99);
assertSame(image, result);
}
@Test
void applyOrientation_orientation2_flipsPixelsHorizontally() {
BufferedImage image = new BufferedImage(4, 2, BufferedImage.TYPE_INT_RGB);
image.setRGB(0, 0, 0xFF0000); // red at top-left
BufferedImage result = imageUtil.applyOrientation(image, 2);
assertEquals(0xFF0000, result.getRGB(3, 0) & 0xFFFFFF); // red at top-right
}
@Test
void applyOrientation_orientation3_rotates180() {
BufferedImage image = new BufferedImage(4, 2, BufferedImage.TYPE_INT_RGB);
image.setRGB(0, 0, 0xFF0000); // red at top-left
BufferedImage result = imageUtil.applyOrientation(image, 3);
assertEquals(0xFF0000, result.getRGB(3, 1) & 0xFFFFFF); // red at bottom-right
}
@Test
void applyOrientation_orientation6_rotates90cw_returnsNewImage() {
BufferedImage image = new BufferedImage(4, 2, BufferedImage.TYPE_INT_RGB);
BufferedImage result = imageUtil.applyOrientation(image, 6);
assertNotSame(image, result);
assertEquals(2, result.getWidth());
assertEquals(4, result.getHeight());
}
@Test
void applyOrientation_orientation8_rotates90ccw_returnsNewImage() {
BufferedImage image = new BufferedImage(4, 2, BufferedImage.TYPE_INT_RGB);
BufferedImage result = imageUtil.applyOrientation(image, 8);
assertNotSame(image, result);
assertEquals(2, result.getWidth());
assertEquals(4, result.getHeight());
}
// --- EXIF orientation: getExifOrientation ---
@Test
void getExifOrientation_pngWithNoExif_returns1() {
String base64 = createTestImageBase64(100, 100);
byte[] imageBytes = Base64.getDecoder().decode(base64);
int orientation = imageUtil.getExifOrientation(imageBytes);
assertEquals(1, orientation);
}
@Test
void getExifOrientation_invalidBytes_returns1() {
byte[] garbage = new byte[]{0x00, 0x01, 0x02, 0x03};
int orientation = imageUtil.getExifOrientation(garbage);
assertEquals(1, orientation);
}
// --- EXIF orientation through getImage (size 1 / default) ---
@Test
void getImage_size1_noExif_returnsOriginalUnchanged() {
String base64 = createTestImageBase64(400, 300);
byte[] original = Base64.getDecoder().decode(base64);
byte[] result = imageUtil.getImage(base64, 1);
assertArrayEquals(original, result);
}
@Test
void getImage_defaultSize_noExif_returnsOriginalUnchanged() {
String base64 = createTestImageBase64(400, 300);
byte[] original = Base64.getDecoder().decode(base64);
byte[] result = imageUtil.getImage(base64, 42);
assertArrayEquals(original, result);
}
// --- EXIF orientation with resize ---
@Test
void getImage_size2_rotatedImage_usesEffectiveWidthForResizeDecision() throws IOException {
// A tall image (600x800) with no EXIF won't be resized since width (600) < 1200
String base64 = createTestImageBase64(600, 800);
byte[] original = Base64.getDecoder().decode(base64);
byte[] result = imageUtil.getImage(base64, 2);
assertArrayEquals(original, result);
}
// --- Edge cases ---
@Test