diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ec4fbce2..19f1356c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -17,7 +17,7 @@ jobs: fail-fast: false matrix: os: [ ubuntu-latest, windows-latest, macos-latest ] - java: [ 8, 11, 17, 18 ] + java: [ 8, 11, 17, 20 ] runs-on: ${{ matrix.os }} permissions: checks: write diff --git a/common/common-lang/src/main/java/com/twelvemonkeys/lang/StringUtil.java b/common/common-lang/src/main/java/com/twelvemonkeys/lang/StringUtil.java index d1f88c93..3a6b1bf0 100755 --- a/common/common-lang/src/main/java/com/twelvemonkeys/lang/StringUtil.java +++ b/common/common-lang/src/main/java/com/twelvemonkeys/lang/StringUtil.java @@ -904,7 +904,7 @@ public final class StringUtil { } catch (ParseException pe) { // Wrap in RuntimeException - throw new IllegalArgumentException(pe.getMessage()); + throw new IllegalArgumentException(pe.getMessage() + " at pos " + pe.getErrorOffset()); } } diff --git a/common/common-lang/src/test/java/com/twelvemonkeys/lang/StringUtilTest.java b/common/common-lang/src/test/java/com/twelvemonkeys/lang/StringUtilTest.java index 923cffd0..c6863961 100644 --- a/common/common-lang/src/test/java/com/twelvemonkeys/lang/StringUtilTest.java +++ b/common/common-lang/src/test/java/com/twelvemonkeys/lang/StringUtilTest.java @@ -593,8 +593,8 @@ public class StringUtilTest { cal.clear(); cal.set(Calendar.HOUR, 1); cal.set(Calendar.MINUTE, 2); - date = StringUtil.toDate("1:02 am", - DateFormat.getTimeInstance(DateFormat.SHORT, Locale.US)); + format = new SimpleDateFormat("HH:mm"); + date = StringUtil.toDate("1:02", format); assertNotNull(date); assertEquals(cal.getTime(), date); } diff --git a/imageio/imageio-core/src/test/java/com/twelvemonkeys/imageio/color/KCMSSanitizerStrategyTest.java b/imageio/imageio-core/src/test/java/com/twelvemonkeys/imageio/color/KCMSSanitizerStrategyTest.java index 3cf80a29..c8b8ae61 100644 --- a/imageio/imageio-core/src/test/java/com/twelvemonkeys/imageio/color/KCMSSanitizerStrategyTest.java +++ b/imageio/imageio-core/src/test/java/com/twelvemonkeys/imageio/color/KCMSSanitizerStrategyTest.java @@ -36,9 +36,11 @@ import java.awt.color.ColorSpace; import java.awt.color.ICC_ColorSpace; import java.awt.color.ICC_Profile; import java.io.IOException; +import java.lang.reflect.Method; import java.util.Arrays; import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assume.assumeFalse; import static org.mockito.Mockito.*; public class KCMSSanitizerStrategyTest { @@ -56,6 +58,8 @@ public class KCMSSanitizerStrategyTest { @Test public void testFixProfileUpdateHeader() throws Exception { + assumeICC_ProfileNotSealed(); // Ignores test for JDK 19+ + byte[] header = new byte[128]; header[ICC_Profile.icHdrRenderingIntent + 3] = 1; ICC_Profile profile = mock(ICC_Profile.class); @@ -69,6 +73,17 @@ public class KCMSSanitizerStrategyTest { verify(profile).setData(eq(ICC_Profile.icSigHead), any(byte[].class)); } + static void assumeICC_ProfileNotSealed() { + try { + Method isSealed = Class.class.getMethod("isSealed"); + Boolean result = (Boolean) isSealed.invoke(ICC_Profile.class); + assumeFalse("Can't mock ICC_Profile, class is sealed (as of JDK 19).", result); + } + catch (ReflectiveOperationException ignore) { + // We can't have sealed classes if we don't have the isSealed method... + } + } + @Test public void testFixProfileCorbisRGB() throws IOException { // TODO: Consider re-writing this using mocks, to avoid dependencies on the CMS implementation diff --git a/imageio/imageio-core/src/test/java/com/twelvemonkeys/imageio/color/LCMSSanitizerStrategyTest.java b/imageio/imageio-core/src/test/java/com/twelvemonkeys/imageio/color/LCMSSanitizerStrategyTest.java index d7b63ea2..cff1acbd 100644 --- a/imageio/imageio-core/src/test/java/com/twelvemonkeys/imageio/color/LCMSSanitizerStrategyTest.java +++ b/imageio/imageio-core/src/test/java/com/twelvemonkeys/imageio/color/LCMSSanitizerStrategyTest.java @@ -34,6 +34,7 @@ import org.junit.Test; import java.awt.color.ICC_Profile; +import static com.twelvemonkeys.imageio.color.KCMSSanitizerStrategyTest.assumeICC_ProfileNotSealed; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verifyNoMoreInteractions; @@ -46,6 +47,8 @@ public class LCMSSanitizerStrategyTest { @Test public void testFixProfile() throws Exception { + assumeICC_ProfileNotSealed(); // Ignores test for JDK 19+ + ICC_Profile profile = mock(ICC_Profile.class); new LCMSSanitizerStrategy().fixProfile(profile); diff --git a/pom.xml b/pom.xml index 7869e718..f7d51e1e 100644 --- a/pom.xml +++ b/pom.xml @@ -224,8 +224,8 @@ 3.11.0 true - 1.7 - 1.7 + 8 + 8 false source,lines