Skip to content

Commit f0aa895

Browse files
zbynektbroyer
andauthored
Add emulation for Java 9 additions to Objects class (#10107)
Add emulation for Objects methods * requireNonNullElse * requireNonNullElseGet * checkIndex * checkFromToIndex * checkFromIndexSize Does *not* cover the Java 16 versions of these that accept `long` instead of `int`. --------- Co-authored-by: Thomas Broyer <[email protected]>
1 parent 0396c65 commit f0aa895

File tree

2 files changed

+106
-0
lines changed

2 files changed

+106
-0
lines changed

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

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,38 @@ 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(requireNonNull(supplier, "supplier").get());
138+
}
139+
140+
public static int checkIndex(int index, int length) {
141+
if (index < 0 || index >= length) {
142+
throw 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+
throw new IndexOutOfBoundsException("Range [" + fromIndex + ", " + toIndex
150+
+ ") out of bounds for length " + length);
151+
}
152+
return fromIndex;
153+
}
154+
155+
public static int checkFromIndexSize(int fromIndex, int size, int length) {
156+
// in JS fromIndex + size cannot overflow because int is not limited to 32 bits
157+
if (fromIndex < 0 || size < 0 || fromIndex + size > length) {
158+
throw new IndexOutOfBoundsException("Range [" + fromIndex + ", " + (fromIndex + size)
159+
+ ") out of bounds for length " + length);
160+
}
161+
return fromIndex;
162+
}
163+
132164
public static String toString(Object o) {
133165
return String.valueOf(o);
134166
}

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

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,4 +102,78 @@ 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+
assertEquals("bar", Objects.requireNonNullElse(hideFromCompiler(null), "bar"));
115+
assertThrows(NullPointerException.class,
116+
() -> Objects.requireNonNullElse(hideFromCompiler(null), null));
117+
}
118+
119+
public void testRequireNonNullElseGet() {
120+
assertEquals("foo",
121+
Objects.requireNonNullElseGet(hideFromCompiler("foo"), () -> "bar"));
122+
assertEquals("bar",
123+
Objects.requireNonNullElseGet(hideFromCompiler(null), () -> "bar"));
124+
assertThrows(NullPointerException.class,
125+
() -> Objects.requireNonNullElseGet(hideFromCompiler(null), null));
126+
assertThrows(NullPointerException.class,
127+
() -> Objects.requireNonNullElseGet(hideFromCompiler(null), () -> null));
128+
}
129+
130+
private String hideFromCompiler(String value) {
131+
if (Math.random() > 2) {
132+
return "unreachable";
133+
}
134+
return value;
135+
}
136+
137+
public void testCheckIndex() {
138+
assertEquals(5, Objects.checkIndex(5, 10));
139+
assertThrows(IndexOutOfBoundsException.class,
140+
() -> Objects.checkIndex(-5, 5));
141+
assertThrows(IndexOutOfBoundsException.class,
142+
() -> Objects.checkIndex(10, 5));
143+
assertThrows(IndexOutOfBoundsException.class,
144+
() -> Objects.checkIndex(5, 5));
145+
}
146+
147+
public void testCheckFromToIndex() {
148+
assertEquals(5, Objects.checkFromToIndex(5, 7, 10));
149+
assertEquals(0, Objects.checkFromToIndex(0, 10, 10));
150+
assertThrows(IndexOutOfBoundsException.class,
151+
() -> Objects.checkFromToIndex(-5, 1, 5));
152+
assertThrows(IndexOutOfBoundsException.class,
153+
() -> Objects.checkFromToIndex(10, 1, 5));
154+
assertThrows(IndexOutOfBoundsException.class,
155+
() -> Objects.checkFromToIndex(1, 10, 5));
156+
}
157+
158+
public void testCheckFromIndexSize() {
159+
assertEquals(5, Objects.checkFromIndexSize(5, 2, 10));
160+
assertEquals(0, Objects.checkFromIndexSize(0, 10, 10));
161+
assertThrows(IndexOutOfBoundsException.class,
162+
() -> Objects.checkFromIndexSize(-5, 1, 5));
163+
assertThrows(IndexOutOfBoundsException.class,
164+
() -> Objects.checkFromIndexSize(10, 1, 5));
165+
assertThrows(IndexOutOfBoundsException.class,
166+
() -> Objects.checkFromIndexSize(1, 10, 5));
167+
assertThrows(IndexOutOfBoundsException.class,
168+
() -> Objects.checkFromIndexSize(1, -5, 5));
169+
}
170+
171+
private void assertThrows(Class<? extends Exception> thrownCheck, Runnable toTest) {
172+
try {
173+
toTest.run();
174+
fail("Should have failed");
175+
} catch (Exception ex) {
176+
assertEquals(thrownCheck, ex.getClass());
177+
}
178+
}
105179
}

0 commit comments

Comments
 (0)