fix: apply orDefault function when already completed

This commit is contained in:
2025-10-04 19:02:27 +01:00
parent 51fac28604
commit df1ee340dd
4 changed files with 21 additions and 8 deletions

View File

@@ -504,11 +504,12 @@ public abstract class AbstractPromise<T> implements Promise<T> {
@Override
public @NotNull Promise<T> orDefault(@NotNull ExceptionalFunction<Throwable, T> function) {
PromiseFactory factory = getFactory();
return useCompletion(() -> {
CompletablePromise<T> promise = createLinked();
addDirectListener(promise::complete, e -> runCompleter(promise, () -> promise.complete(function.apply(e))));
return promise;
}, getFactory()::resolve, getFactory()::error);
}, factory::resolve, e -> supplySafe(() -> factory.resolve(function.apply(e)), factory::error));
}
private static class DeferredExecutionException extends ExecutionException {

View File

@@ -211,6 +211,18 @@ public final class PromiseTests {
assert res.get() == 10;
}
@Test
public void testOrDefaultFunctionCompleted() {
CompletablePromise<Integer> promise = promises.unresolved();
promise.completeExceptionally(new IllegalStateException("Test"));
AtomicReference<Integer> res = new AtomicReference<>();
promise.orDefault(e -> {
assert e instanceof IllegalStateException;
return 10;
}).thenPopulateReference(res);
assert res.get() == 10;
}
@Test
public void testOrDefaultError() {
CompletablePromise<Integer> promise = promises.unresolved();