Skip to content

Commit cfd11b6

Browse files
committed
Add emulation for Java 9 additions to Objects class
1 parent a5e649d commit cfd11b6

File tree

2 files changed

+97
-0
lines changed

2 files changed

+97
-0
lines changed

user/super/com/google/gwt/emul/java/util/Objects.java

+31
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,37 @@ public static <T> T requireNonNull(T obj, Supplier<String> messageSupplier) {
129129
return obj;
130130
}
131131

132+
public static <T> T requireNonNullElse(T obj, T defaultObj) {
133+
return obj != null ? obj : requireNonNull(defaultObj);
134+
}
135+
136+
public static <T> T requireNonNullElseGet(T obj, Supplier<? extends T> supplier) {
137+
return obj != null ? obj : requireNonNull(supplier.get());
138+
}
139+
140+
public static int checkIndex(int index, int length) {
141+
if (index < 0 || index >= length) {
142+
new IndexOutOfBoundsException("Index " + index + " out of bounds for length " + length);
143+
}
144+
return index;
145+
}
146+
147+
public static int checkFromToIndex(int fromIndex, int toIndex, int length) {
148+
if (fromIndex < 0 || fromIndex > toIndex || toIndex > length) {
149+
new IndexOutOfBoundsException("Range [" + fromIndex + ", " + toIndex
150+
+ ") out of bounds for length " + length);
151+
}
152+
return fromIndex;
153+
}
154+
155+
public static int checkFromIndexSize(long fromIndex, long size, long length) {
156+
if (fromIndex < 0 || size < 0 || fromIndex + size > length) {
157+
new IndexOutOfBoundsException("Range [" + fromIndex + ", " + (fromIndex + size)
158+
+ ") out of bounds for length " + length);
159+
}
160+
return fromIndex;
161+
}
162+
132163
public static String toString(Object o) {
133164
return String.valueOf(o);
134165
}

user/test/com/google/gwt/emultest/java/util/ObjectsTest.java

+66
Original file line numberDiff line numberDiff line change
@@ -102,4 +102,70 @@ public void testHashCode() {
102102
Object obj = new Object();
103103
assertEquals(obj.hashCode(), Objects.hashCode(obj));
104104
}
105+
106+
public void testRequireNonNull() {
107+
assertEquals("foo", Objects.requireNonNull(hideFromCompiler("foo")));
108+
assertThrows(NullPointerException.class,
109+
() -> Objects.requireNonNull(hideFromCompiler(null)));
110+
}
111+
112+
public void testRequireNonNullElse() {
113+
assertEquals("foo", Objects.requireNonNullElse(hideFromCompiler("foo"), "bar"));
114+
assertThrows(NullPointerException.class,
115+
() -> Objects.requireNonNullElse(hideFromCompiler(null), null));
116+
}
117+
118+
public void testRequireNonNullElseGet() {
119+
assertEquals("foo",
120+
Objects.requireNonNullElseGet(hideFromCompiler("foo"), () -> "bar"));
121+
assertThrows(NullPointerException.class,
122+
() -> Objects.requireNonNullElseGet(hideFromCompiler(null), null));
123+
assertThrows(NullPointerException.class,
124+
() -> Objects.requireNonNullElseGet(hideFromCompiler(null), () -> null));
125+
}
126+
127+
private String hideFromCompiler(String value) {
128+
if (Math.random() > 2) {
129+
return "unreachable";
130+
}
131+
return value;
132+
}
133+
134+
public void testCheckIndex() {
135+
assertEquals(5, Objects.checkIndex(5, 10));
136+
assertThrows(IndexOutOfBoundsException.class,
137+
() -> Objects.checkIndex(-5, 5));
138+
assertThrows(IndexOutOfBoundsException.class,
139+
() -> Objects.checkIndex(10, 5));
140+
}
141+
142+
public void testCheckFromToIndex() {
143+
assertEquals(5, Objects.checkFromToIndex(5, 7, 10));
144+
assertThrows(IndexOutOfBoundsException.class,
145+
() -> Objects.checkFromToIndex(-5, 1, 5));
146+
assertThrows(IndexOutOfBoundsException.class,
147+
() -> Objects.checkFromToIndex(10, 1, 5));
148+
assertThrows(IndexOutOfBoundsException.class,
149+
() -> Objects.checkFromToIndex(1, 10, 5));
150+
}
151+
152+
public void testCheckFromIndexSize() {
153+
assertEquals(5, Objects.checkFromIndexSize(5, 2, 10));
154+
assertThrows(IndexOutOfBoundsException.class,
155+
() -> Objects.checkFromIndexSize(-5, 1, 5));
156+
assertThrows(IndexOutOfBoundsException.class,
157+
() -> Objects.checkFromIndexSize(10, 1, 5));
158+
assertThrows(IndexOutOfBoundsException.class,
159+
() -> Objects.checkFromIndexSize(1, 10, 5));
160+
}
161+
162+
private void assertThrows(Class<? extends Exception> thrownCheck, Runnable toTest) {
163+
try {
164+
toTest.run();
165+
fail("Should have failed");
166+
} catch (Exception ex) {
167+
assertEquals(ex.getClass(), thrownCheck);
168+
}
169+
170+
}
105171
}

0 commit comments

Comments
 (0)