| package backport; | |
| import java.util.Objects; | |
| public final class ObjectsBackportJava9Main { | |
| public static void main(String[] args) { | |
| boolean isAndroid = "Dalvik".equals(System.getProperty("java.vm.name")); | |
| String majorVersion = System.getProperty("java.vm.version").split("\\.", -1)[0]; | |
| testRequireNonNullElse(); | |
| if (!isAndroid || Integer.parseInt(majorVersion) >= 7) { | |
| // TODO desugaring desugaredlibrary is blocked by | |
| // https://issuetracker.google.com/issues/114481425 | |
| testRequireNonNullElseGet(); | |
| } | |
| testCheckIndex(); | |
| testCheckFromToIndex(); | |
| testCheckFromIndexSize(); | |
| } | |
| private static void testRequireNonNullElse() { | |
| Object one = new Object(); | |
| Object two = new Object(); | |
| assertSame(one, Objects.requireNonNullElse(one, two)); | |
| assertSame(two, Objects.requireNonNullElse(null, two)); | |
| try { | |
| throw new AssertionError(Objects.requireNonNullElse(null, null)); | |
| } catch (NullPointerException expected) { | |
| } | |
| } | |
| private static void testRequireNonNullElseGet() { | |
| Object one = new Object(); | |
| Object two = new Object(); | |
| assertSame(one, Objects.requireNonNullElseGet(one, () -> two)); | |
| assertSame(two, Objects.requireNonNullElseGet(null, () -> two)); | |
| try { | |
| throw new AssertionError(Objects.requireNonNullElseGet(null, null)); | |
| } catch (NullPointerException expected) { | |
| } | |
| try { | |
| throw new AssertionError(Objects.requireNonNullElseGet(null, () -> null)); | |
| } catch (NullPointerException expected) { | |
| } | |
| } | |
| private static void testCheckIndex() { | |
| for (int i = 0; i < 10; i++) { | |
| assertEquals(i, Objects.checkIndex(i, 10)); | |
| } | |
| try { | |
| throw new AssertionError(Objects.checkIndex(-1, 10)); | |
| } catch (IndexOutOfBoundsException expected) { | |
| } | |
| try { | |
| throw new AssertionError(Objects.checkIndex(10, 0)); | |
| } catch (IndexOutOfBoundsException expected) { | |
| } | |
| try { | |
| throw new AssertionError(Objects.checkIndex(0, 0)); | |
| } catch (IndexOutOfBoundsException expected) { | |
| } | |
| } | |
| private static void testCheckFromToIndex() { | |
| for (int i = 0; i <= 10; i++) { | |
| for (int j = i; j <= 10; j++) { | |
| assertEquals(i, Objects.checkFromToIndex(i, j, 10)); | |
| } | |
| } | |
| assertEquals(0, Objects.checkFromToIndex(0, 0, 0)); | |
| try { | |
| throw new AssertionError(Objects.checkFromToIndex(4, 2, 10)); | |
| } catch (IndexOutOfBoundsException expected) { | |
| } | |
| try { | |
| throw new AssertionError(Objects.checkFromToIndex(-1, 5, 10)); | |
| } catch (IndexOutOfBoundsException expected) { | |
| } | |
| try { | |
| throw new AssertionError(Objects.checkFromToIndex(0, -1, 10)); | |
| } catch (IndexOutOfBoundsException expected) { | |
| } | |
| try { | |
| throw new AssertionError(Objects.checkFromToIndex(11, 11, 10)); | |
| } catch (IndexOutOfBoundsException expected) { | |
| } | |
| try { | |
| throw new AssertionError(Objects.checkFromToIndex(0, 1, 0)); | |
| } catch (IndexOutOfBoundsException expected) { | |
| } | |
| try { | |
| throw new AssertionError(Objects.checkFromToIndex(1, 1, 0)); | |
| } catch (IndexOutOfBoundsException expected) { | |
| } | |
| } | |
| private static void testCheckFromIndexSize() { | |
| for (int i = 0; i <= 10; i++) { | |
| for (int j = 10 - i; j >= 0; j--) { | |
| assertEquals(i, Objects.checkFromIndexSize(i, j, 10)); | |
| } | |
| } | |
| assertEquals(0, Objects.checkFromIndexSize(0, 0, 0)); | |
| try { | |
| throw new AssertionError(Objects.checkFromIndexSize(8, 4, 10)); | |
| } catch (IndexOutOfBoundsException expected) { | |
| } | |
| try { | |
| throw new AssertionError(Objects.checkFromIndexSize(-1, 5, 10)); | |
| } catch (IndexOutOfBoundsException expected) { | |
| } | |
| try { | |
| throw new AssertionError(Objects.checkFromIndexSize(11, 0, 10)); | |
| } catch (IndexOutOfBoundsException expected) { | |
| } | |
| try { | |
| throw new AssertionError(Objects.checkFromIndexSize(0, 1, 0)); | |
| } catch (IndexOutOfBoundsException expected) { | |
| } | |
| try { | |
| throw new AssertionError(Objects.checkFromIndexSize(1, 1, 0)); | |
| } catch (IndexOutOfBoundsException expected) { | |
| } | |
| // Check for cases where overflow might occur producing incorrect results. | |
| try { | |
| throw new AssertionError(Objects.checkFromIndexSize(Integer.MAX_VALUE, 1, Integer.MAX_VALUE)); | |
| } catch (IndexOutOfBoundsException expected) { | |
| } | |
| try { | |
| throw new AssertionError(Objects.checkFromIndexSize(0, 1, Integer.MIN_VALUE)); | |
| } catch (IndexOutOfBoundsException expected) { | |
| } | |
| } | |
| private static void assertEquals(int expected, int actual) { | |
| if (expected != actual) { | |
| throw new AssertionError("Expected <" + expected + "> but was <" + actual + '>'); | |
| } | |
| } | |
| private static void assertSame(Object expected, Object actual) { | |
| if (expected != actual) { | |
| throw new AssertionError( | |
| "Expected <" + expected + "> to be same instance as <" + actual + '>'); | |
| } | |
| } | |
| } |