ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/CompletableFutureTest.java
(Generate patch)

Comparing jsr166/src/test/tck/CompletableFutureTest.java (file contents):
Revision 1.198 by dl, Mon Sep 17 11:50:55 2018 UTC vs.
Revision 1.219 by jsr166, Sat Nov 24 18:33:26 2018 UTC

# Line 551 | Line 551 | public class CompletableFutureTest exten
551          public CompletableFuture<Integer> apply(Integer x) {
552              invoked();
553              value = x;
554 <            CompletableFuture<Integer> f = new CompletableFuture<>();
555 <            assertTrue(f.complete(inc(x)));
556 <            return f;
554 >            return CompletableFuture.completedFuture(inc(x));
555          }
556      }
557  
# Line 574 | Line 572 | public class CompletableFutureTest exten
572          ExceptionalCompletableFutureFunction(ExecutionMode m) { super(m); }
573          public CompletionStage<Integer> apply(Throwable x) {
574              invoked();
575 <            CompletableFuture<Integer> d = new CompletableFuture<Integer>();
578 <            d.complete(value);
579 <            return d;
575 >            return CompletableFuture.completedFuture(value);
576          }
577      }
578  
# Line 930 | Line 926 | public class CompletableFutureTest exten
926          for (boolean createIncomplete : new boolean[] { true, false })
927          for (Integer v1 : new Integer[] { 1, null })
928      {
929 <        final AtomicInteger a = new AtomicInteger(0);
929 >        final AtomicInteger ran = new AtomicInteger(0);
930          final CompletableFuture<Integer> f = new CompletableFuture<>();
931          if (!createIncomplete) assertTrue(f.complete(v1));
932          final CompletableFuture<Integer> g = m.exceptionally
933              (f, (Throwable t) -> {
934 <                a.getAndIncrement();
935 <                threadFail("should not be called");
940 <                return null;            // unreached
934 >                ran.getAndIncrement();
935 >                throw new AssertionError("should not be called");
936              });
937          if (createIncomplete) assertTrue(f.complete(v1));
938  
939          checkCompletedNormally(g, v1);
940          checkCompletedNormally(f, v1);
941 <        assertEquals(0, a.get());
941 >        assertEquals(0, ran.get());
942      }}
943  
944      /**
# Line 955 | Line 950 | public class CompletableFutureTest exten
950          for (boolean createIncomplete : new boolean[] { true, false })
951          for (Integer v1 : new Integer[] { 1, null })
952      {
953 <        final AtomicInteger a = new AtomicInteger(0);
953 >        final AtomicInteger ran = new AtomicInteger(0);
954          final CFException ex = new CFException();
955          final CompletableFuture<Integer> f = new CompletableFuture<>();
956          if (!createIncomplete) f.completeExceptionally(ex);
957          final CompletableFuture<Integer> g = m.exceptionally
958              (f, (Throwable t) -> {
959                  m.checkExecutionMode();
960 <                threadAssertSame(t, ex);
961 <                a.getAndIncrement();
960 >                assertSame(t, ex);
961 >                ran.getAndIncrement();
962                  return v1;
963              });
964          if (createIncomplete) f.completeExceptionally(ex);
965  
966          checkCompletedNormally(g, v1);
967 <        assertEquals(1, a.get());
967 >        assertEquals(1, ran.get());
968      }}
969  
970      /**
# Line 980 | Line 975 | public class CompletableFutureTest exten
975          for (ExecutionMode m : ExecutionMode.values())
976          for (boolean createIncomplete : new boolean[] { true, false })
977      {
978 <        final AtomicInteger a = new AtomicInteger(0);
978 >        final AtomicInteger ran = new AtomicInteger(0);
979          final CFException ex1 = new CFException();
980          final CFException ex2 = new CFException();
981          final CompletableFuture<Integer> f = new CompletableFuture<>();
# Line 988 | Line 983 | public class CompletableFutureTest exten
983          final CompletableFuture<Integer> g = m.exceptionally
984              (f, (Throwable t) -> {
985                  m.checkExecutionMode();
986 <                threadAssertSame(t, ex1);
987 <                a.getAndIncrement();
986 >                assertSame(t, ex1);
987 >                ran.getAndIncrement();
988                  throw ex2;
989              });
990          if (createIncomplete) f.completeExceptionally(ex1);
991  
992          checkCompletedWithWrappedException(g, ex2);
993          checkCompletedExceptionally(f, ex1);
994 <        assertEquals(1, a.get());
994 >        assertEquals(1, ran.get());
995      }}
996  
997      /**
# Line 1008 | Line 1003 | public class CompletableFutureTest exten
1003          for (boolean createIncomplete : new boolean[] { true, false })
1004          for (Integer v1 : new Integer[] { 1, null })
1005      {
1006 <        final AtomicInteger a = new AtomicInteger(0);
1006 >        final AtomicInteger ran = new AtomicInteger(0);
1007          final CompletableFuture<Integer> f = new CompletableFuture<>();
1008          if (!createIncomplete) assertTrue(f.complete(v1));
1009          final CompletableFuture<Integer> g = m.whenComplete
1010              (f,
1011               (Integer result, Throwable t) -> {
1012                  m.checkExecutionMode();
1013 <                threadAssertSame(result, v1);
1014 <                threadAssertNull(t);
1015 <                a.getAndIncrement();
1013 >                assertSame(result, v1);
1014 >                assertNull(t);
1015 >                ran.getAndIncrement();
1016              });
1017          if (createIncomplete) assertTrue(f.complete(v1));
1018  
1019          checkCompletedNormally(g, v1);
1020          checkCompletedNormally(f, v1);
1021 <        assertEquals(1, a.get());
1021 >        assertEquals(1, ran.get());
1022      }}
1023  
1024      /**
# Line 1034 | Line 1029 | public class CompletableFutureTest exten
1029          for (ExecutionMode m : ExecutionMode.values())
1030          for (boolean createIncomplete : new boolean[] { true, false })
1031      {
1032 <        final AtomicInteger a = new AtomicInteger(0);
1032 >        final AtomicInteger ran = new AtomicInteger(0);
1033          final CFException ex = new CFException();
1034          final CompletableFuture<Integer> f = new CompletableFuture<>();
1035          if (!createIncomplete) f.completeExceptionally(ex);
# Line 1042 | Line 1037 | public class CompletableFutureTest exten
1037              (f,
1038               (Integer result, Throwable t) -> {
1039                  m.checkExecutionMode();
1040 <                threadAssertNull(result);
1041 <                threadAssertSame(t, ex);
1042 <                a.getAndIncrement();
1040 >                assertNull(result);
1041 >                assertSame(t, ex);
1042 >                ran.getAndIncrement();
1043              });
1044          if (createIncomplete) f.completeExceptionally(ex);
1045  
1046          checkCompletedWithWrappedException(g, ex);
1047          checkCompletedExceptionally(f, ex);
1048 <        assertEquals(1, a.get());
1048 >        assertEquals(1, ran.get());
1049      }}
1050  
1051      /**
# Line 1062 | Line 1057 | public class CompletableFutureTest exten
1057          for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1058          for (boolean createIncomplete : new boolean[] { true, false })
1059      {
1060 <        final AtomicInteger a = new AtomicInteger(0);
1060 >        final AtomicInteger ran = new AtomicInteger(0);
1061          final CompletableFuture<Integer> f = new CompletableFuture<>();
1062          if (!createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning));
1063          final CompletableFuture<Integer> g = m.whenComplete
1064              (f,
1065               (Integer result, Throwable t) -> {
1066                  m.checkExecutionMode();
1067 <                threadAssertNull(result);
1068 <                threadAssertTrue(t instanceof CancellationException);
1069 <                a.getAndIncrement();
1067 >                assertNull(result);
1068 >                assertTrue(t instanceof CancellationException);
1069 >                ran.getAndIncrement();
1070              });
1071          if (createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning));
1072  
1073          checkCompletedWithWrappedCancellationException(g);
1074          checkCancelled(f);
1075 <        assertEquals(1, a.get());
1075 >        assertEquals(1, ran.get());
1076      }}
1077  
1078      /**
# Line 1089 | Line 1084 | public class CompletableFutureTest exten
1084          for (ExecutionMode m : ExecutionMode.values())
1085          for (Integer v1 : new Integer[] { 1, null })
1086      {
1087 <        final AtomicInteger a = new AtomicInteger(0);
1087 >        final AtomicInteger ran = new AtomicInteger(0);
1088          final CFException ex = new CFException();
1089          final CompletableFuture<Integer> f = new CompletableFuture<>();
1090          if (!createIncomplete) assertTrue(f.complete(v1));
# Line 1097 | Line 1092 | public class CompletableFutureTest exten
1092              (f,
1093               (Integer result, Throwable t) -> {
1094                  m.checkExecutionMode();
1095 <                threadAssertSame(result, v1);
1096 <                threadAssertNull(t);
1097 <                a.getAndIncrement();
1095 >                assertSame(result, v1);
1096 >                assertNull(t);
1097 >                ran.getAndIncrement();
1098                  throw ex;
1099              });
1100          if (createIncomplete) assertTrue(f.complete(v1));
1101  
1102          checkCompletedWithWrappedException(g, ex);
1103          checkCompletedNormally(f, v1);
1104 <        assertEquals(1, a.get());
1104 >        assertEquals(1, ran.get());
1105      }}
1106  
1107      /**
# Line 1118 | Line 1113 | public class CompletableFutureTest exten
1113          for (boolean createIncomplete : new boolean[] { true, false })
1114          for (ExecutionMode m : ExecutionMode.values())
1115      {
1116 <        final AtomicInteger a = new AtomicInteger(0);
1116 >        final AtomicInteger ran = new AtomicInteger(0);
1117          final CFException ex1 = new CFException();
1118          final CFException ex2 = new CFException();
1119          final CompletableFuture<Integer> f = new CompletableFuture<>();
# Line 1128 | Line 1123 | public class CompletableFutureTest exten
1123              (f,
1124               (Integer result, Throwable t) -> {
1125                  m.checkExecutionMode();
1126 <                threadAssertSame(t, ex1);
1127 <                threadAssertNull(result);
1128 <                a.getAndIncrement();
1126 >                assertSame(t, ex1);
1127 >                assertNull(result);
1128 >                ran.getAndIncrement();
1129                  throw ex2;
1130              });
1131          if (createIncomplete) f.completeExceptionally(ex1);
# Line 1141 | Line 1136 | public class CompletableFutureTest exten
1136              assertEquals(1, ex1.getSuppressed().length);
1137              assertSame(ex2, ex1.getSuppressed()[0]);
1138          }
1139 <        assertEquals(1, a.get());
1139 >        assertEquals(1, ran.get());
1140      }}
1141  
1142      /**
# Line 1154 | Line 1149 | public class CompletableFutureTest exten
1149          for (Integer v1 : new Integer[] { 1, null })
1150      {
1151          final CompletableFuture<Integer> f = new CompletableFuture<>();
1152 <        final AtomicInteger a = new AtomicInteger(0);
1152 >        final AtomicInteger ran = new AtomicInteger(0);
1153          if (!createIncomplete) assertTrue(f.complete(v1));
1154          final CompletableFuture<Integer> g = m.handle
1155              (f,
1156               (Integer result, Throwable t) -> {
1157                  m.checkExecutionMode();
1158 <                threadAssertSame(result, v1);
1159 <                threadAssertNull(t);
1160 <                a.getAndIncrement();
1158 >                assertSame(result, v1);
1159 >                assertNull(t);
1160 >                ran.getAndIncrement();
1161                  return inc(v1);
1162              });
1163          if (createIncomplete) assertTrue(f.complete(v1));
1164  
1165          checkCompletedNormally(g, inc(v1));
1166          checkCompletedNormally(f, v1);
1167 <        assertEquals(1, a.get());
1167 >        assertEquals(1, ran.get());
1168      }}
1169  
1170      /**
# Line 1182 | Line 1177 | public class CompletableFutureTest exten
1177          for (Integer v1 : new Integer[] { 1, null })
1178      {
1179          final CompletableFuture<Integer> f = new CompletableFuture<>();
1180 <        final AtomicInteger a = new AtomicInteger(0);
1180 >        final AtomicInteger ran = new AtomicInteger(0);
1181          final CFException ex = new CFException();
1182          if (!createIncomplete) f.completeExceptionally(ex);
1183          final CompletableFuture<Integer> g = m.handle
1184              (f,
1185               (Integer result, Throwable t) -> {
1186                  m.checkExecutionMode();
1187 <                threadAssertNull(result);
1188 <                threadAssertSame(t, ex);
1189 <                a.getAndIncrement();
1187 >                assertNull(result);
1188 >                assertSame(t, ex);
1189 >                ran.getAndIncrement();
1190                  return v1;
1191              });
1192          if (createIncomplete) f.completeExceptionally(ex);
1193  
1194          checkCompletedNormally(g, v1);
1195          checkCompletedExceptionally(f, ex);
1196 <        assertEquals(1, a.get());
1196 >        assertEquals(1, ran.get());
1197      }}
1198  
1199      /**
# Line 1212 | Line 1207 | public class CompletableFutureTest exten
1207          for (Integer v1 : new Integer[] { 1, null })
1208      {
1209          final CompletableFuture<Integer> f = new CompletableFuture<>();
1210 <        final AtomicInteger a = new AtomicInteger(0);
1210 >        final AtomicInteger ran = new AtomicInteger(0);
1211          if (!createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning));
1212          final CompletableFuture<Integer> g = m.handle
1213              (f,
1214               (Integer result, Throwable t) -> {
1215                  m.checkExecutionMode();
1216 <                threadAssertNull(result);
1217 <                threadAssertTrue(t instanceof CancellationException);
1218 <                a.getAndIncrement();
1216 >                assertNull(result);
1217 >                assertTrue(t instanceof CancellationException);
1218 >                ran.getAndIncrement();
1219                  return v1;
1220              });
1221          if (createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning));
1222  
1223          checkCompletedNormally(g, v1);
1224          checkCancelled(f);
1225 <        assertEquals(1, a.get());
1225 >        assertEquals(1, ran.get());
1226      }}
1227  
1228      /**
# Line 1240 | Line 1235 | public class CompletableFutureTest exten
1235          for (Integer v1 : new Integer[] { 1, null })
1236      {
1237          final CompletableFuture<Integer> f = new CompletableFuture<>();
1238 <        final AtomicInteger a = new AtomicInteger(0);
1238 >        final AtomicInteger ran = new AtomicInteger(0);
1239          final CFException ex = new CFException();
1240          if (!createIncomplete) assertTrue(f.complete(v1));
1241          final CompletableFuture<Integer> g = m.handle
1242              (f,
1243               (Integer result, Throwable t) -> {
1244                  m.checkExecutionMode();
1245 <                threadAssertSame(result, v1);
1246 <                threadAssertNull(t);
1247 <                a.getAndIncrement();
1245 >                assertSame(result, v1);
1246 >                assertNull(t);
1247 >                ran.getAndIncrement();
1248                  throw ex;
1249              });
1250          if (createIncomplete) assertTrue(f.complete(v1));
1251  
1252          checkCompletedWithWrappedException(g, ex);
1253          checkCompletedNormally(f, v1);
1254 <        assertEquals(1, a.get());
1254 >        assertEquals(1, ran.get());
1255      }}
1256  
1257      /**
# Line 1268 | Line 1263 | public class CompletableFutureTest exten
1263          for (boolean createIncomplete : new boolean[] { true, false })
1264          for (ExecutionMode m : ExecutionMode.values())
1265      {
1266 <        final AtomicInteger a = new AtomicInteger(0);
1266 >        final AtomicInteger ran = new AtomicInteger(0);
1267          final CFException ex1 = new CFException();
1268          final CFException ex2 = new CFException();
1269          final CompletableFuture<Integer> f = new CompletableFuture<>();
# Line 1278 | Line 1273 | public class CompletableFutureTest exten
1273              (f,
1274               (Integer result, Throwable t) -> {
1275                  m.checkExecutionMode();
1276 <                threadAssertNull(result);
1277 <                threadAssertSame(ex1, t);
1278 <                a.getAndIncrement();
1276 >                assertNull(result);
1277 >                assertSame(ex1, t);
1278 >                ran.getAndIncrement();
1279                  throw ex2;
1280              });
1281          if (createIncomplete) f.completeExceptionally(ex1);
1282  
1283          checkCompletedWithWrappedException(g, ex2);
1284          checkCompletedExceptionally(f, ex1);
1285 <        assertEquals(1, a.get());
1285 >        assertEquals(1, ran.get());
1286      }}
1287  
1288      /**
# Line 3123 | Line 3118 | public class CompletableFutureTest exten
3118          case 0:
3119              assertTrue(f.complete(v1));
3120              assertTrue(g.completeExceptionally(ex));
3121 <            h = m.thenCompose(f, (x -> g));
3121 >            h = m.thenCompose(f, x -> g);
3122              break;
3123          case 1:
3124              assertTrue(f.complete(v1));
3125 <            h = m.thenCompose(f, (x -> g));
3125 >            h = m.thenCompose(f, x -> g);
3126              assertTrue(g.completeExceptionally(ex));
3127              break;
3128          case 2:
3129              assertTrue(g.completeExceptionally(ex));
3130              assertTrue(f.complete(v1));
3131 <            h = m.thenCompose(f, (x -> g));
3131 >            h = m.thenCompose(f, x -> g);
3132              break;
3133          case 3:
3134              assertTrue(g.completeExceptionally(ex));
3135 <            h = m.thenCompose(f, (x -> g));
3135 >            h = m.thenCompose(f, x -> g);
3136              assertTrue(f.complete(v1));
3137              break;
3138          case 4:
3139 <            h = m.thenCompose(f, (x -> g));
3139 >            h = m.thenCompose(f, x -> g);
3140              assertTrue(f.complete(v1));
3141              assertTrue(g.completeExceptionally(ex));
3142              break;
3143          case 5:
3144 <            h = m.thenCompose(f, (x -> g));
3144 >            h = m.thenCompose(f, x -> g);
3145              assertTrue(f.complete(v1));
3146              assertTrue(g.completeExceptionally(ex));
3147              break;
# Line 3206 | Line 3201 | public class CompletableFutureTest exten
3201      public void testExceptionallyCompose_actionFailed() {
3202          for (ExecutionMode m : ExecutionMode.values())
3203          for (boolean createIncomplete : new boolean[] { true, false })
3209        for (Integer v1 : new Integer[] { 1, null })
3204      {
3205          final CFException ex = new CFException();
3206          final CompletableFuture<Integer> f = new CompletableFuture<>();
# Line 3221 | Line 3215 | public class CompletableFutureTest exten
3215          r.assertInvoked();
3216      }}
3217  
3218 +    /**
3219 +     * exceptionallyCompose result completes exceptionally if the
3220 +     * result of the action does
3221 +     */
3222 +    public void testExceptionallyCompose_actionReturnsFailingFuture() {
3223 +        for (ExecutionMode m : ExecutionMode.values())
3224 +        for (int order = 0; order < 6; order++)
3225 +    {
3226 +        final CFException ex0 = new CFException();
3227 +        final CFException ex = new CFException();
3228 +        final CompletableFuture<Integer> f = new CompletableFuture<>();
3229 +        final CompletableFuture<Integer> g = new CompletableFuture<>();
3230 +        final CompletableFuture<Integer> h;
3231 +        // Test all permutations of orders
3232 +        switch (order) {
3233 +        case 0:
3234 +            assertTrue(f.completeExceptionally(ex0));
3235 +            assertTrue(g.completeExceptionally(ex));
3236 +            h = m.exceptionallyCompose(f, x -> g);
3237 +            break;
3238 +        case 1:
3239 +            assertTrue(f.completeExceptionally(ex0));
3240 +            h = m.exceptionallyCompose(f, x -> g);
3241 +            assertTrue(g.completeExceptionally(ex));
3242 +            break;
3243 +        case 2:
3244 +            assertTrue(g.completeExceptionally(ex));
3245 +            assertTrue(f.completeExceptionally(ex0));
3246 +            h = m.exceptionallyCompose(f, x -> g);
3247 +            break;
3248 +        case 3:
3249 +            assertTrue(g.completeExceptionally(ex));
3250 +            h = m.exceptionallyCompose(f, x -> g);
3251 +            assertTrue(f.completeExceptionally(ex0));
3252 +            break;
3253 +        case 4:
3254 +            h = m.exceptionallyCompose(f, x -> g);
3255 +            assertTrue(f.completeExceptionally(ex0));
3256 +            assertTrue(g.completeExceptionally(ex));
3257 +            break;
3258 +        case 5:
3259 +            h = m.exceptionallyCompose(f, x -> g);
3260 +            assertTrue(f.completeExceptionally(ex0));
3261 +            assertTrue(g.completeExceptionally(ex));
3262 +            break;
3263 +        default: throw new AssertionError();
3264 +        }
3265 +
3266 +        checkCompletedExceptionally(g, ex);
3267 +        checkCompletedWithWrappedException(h, ex);
3268 +        checkCompletedExceptionally(f, ex0);
3269 +    }}
3270  
3271      // other static methods
3272  
# Line 3601 | Line 3647 | public class CompletableFutureTest exten
3647          final CompletableFuture<Integer> complete = CompletableFuture.completedFuture(v);
3648          final CompletableFuture<Integer> incomplete = new CompletableFuture<>();
3649  
3604        List<CompletableFuture<?>> futures = new ArrayList<>();
3605
3606        List<CompletableFuture<Integer>> srcs = new ArrayList<>();
3607        srcs.add(complete);
3608        srcs.add(incomplete);
3609
3650          List<CompletableFuture<?>> fs = new ArrayList<>();
3651          fs.add(incomplete.thenRunAsync(() -> {}, e));
3652          fs.add(incomplete.thenAcceptAsync(z -> {}, e));
# Line 4633 | Line 4673 | public class CompletableFutureTest exten
4673   //         return stage.toCompletableFuture().copy().isDone();
4674   //     }
4675  
4676 +    // For testing default implementations
4677 +    // Only non-default interface methods defined.
4678 +    static final class DelegatedCompletionStage<T> implements CompletionStage<T> {
4679 +        final CompletableFuture<T> cf;
4680 +        DelegatedCompletionStage(CompletableFuture<T> cf) { this.cf = cf; }
4681 +        public CompletableFuture<T> toCompletableFuture() {
4682 +            return cf; }
4683 +        public CompletionStage<Void> thenRun
4684 +            (Runnable action) {
4685 +            return cf.thenRun(action); }
4686 +        public CompletionStage<Void> thenRunAsync
4687 +            (Runnable action) {
4688 +            return cf.thenRunAsync(action); }
4689 +        public CompletionStage<Void> thenRunAsync
4690 +            (Runnable action,
4691 +             Executor executor) {
4692 +            return cf.thenRunAsync(action, executor); }
4693 +        public CompletionStage<Void> thenAccept
4694 +            (Consumer<? super T> action) {
4695 +            return cf.thenAccept(action); }
4696 +        public CompletionStage<Void> thenAcceptAsync
4697 +            (Consumer<? super T> action) {
4698 +            return cf.thenAcceptAsync(action); }
4699 +        public CompletionStage<Void> thenAcceptAsync
4700 +            (Consumer<? super T> action,
4701 +             Executor executor) {
4702 +            return cf.thenAcceptAsync(action, executor); }
4703 +        public <U> CompletionStage<U> thenApply
4704 +            (Function<? super T,? extends U> a) {
4705 +            return cf.thenApply(a); }
4706 +        public <U> CompletionStage<U> thenApplyAsync
4707 +            (Function<? super T,? extends U> fn) {
4708 +            return cf.thenApplyAsync(fn); }
4709 +        public <U> CompletionStage<U> thenApplyAsync
4710 +            (Function<? super T,? extends U> fn,
4711 +             Executor executor) {
4712 +            return cf.thenApplyAsync(fn, executor); }
4713 +        public <U,V> CompletionStage<V> thenCombine
4714 +            (CompletionStage<? extends U> other,
4715 +             BiFunction<? super T,? super U,? extends V> fn) {
4716 +            return cf.thenCombine(other, fn); }
4717 +        public <U,V> CompletionStage<V> thenCombineAsync
4718 +            (CompletionStage<? extends U> other,
4719 +             BiFunction<? super T,? super U,? extends V> fn) {
4720 +            return cf.thenCombineAsync(other, fn); }
4721 +        public <U,V> CompletionStage<V> thenCombineAsync
4722 +            (CompletionStage<? extends U> other,
4723 +             BiFunction<? super T,? super U,? extends V> fn,
4724 +             Executor executor) {
4725 +            return cf.thenCombineAsync(other, fn, executor); }
4726 +        public <U> CompletionStage<Void> thenAcceptBoth
4727 +            (CompletionStage<? extends U> other,
4728 +             BiConsumer<? super T, ? super U> action) {
4729 +            return cf.thenAcceptBoth(other, action); }
4730 +        public <U> CompletionStage<Void> thenAcceptBothAsync
4731 +            (CompletionStage<? extends U> other,
4732 +             BiConsumer<? super T, ? super U> action) {
4733 +            return cf.thenAcceptBothAsync(other, action); }
4734 +        public <U> CompletionStage<Void> thenAcceptBothAsync
4735 +            (CompletionStage<? extends U> other,
4736 +             BiConsumer<? super T, ? super U> action,
4737 +             Executor executor) {
4738 +            return cf.thenAcceptBothAsync(other, action, executor); }
4739 +        public CompletionStage<Void> runAfterBoth
4740 +            (CompletionStage<?> other,
4741 +             Runnable action) {
4742 +            return cf.runAfterBoth(other, action); }
4743 +        public CompletionStage<Void> runAfterBothAsync
4744 +            (CompletionStage<?> other,
4745 +             Runnable action) {
4746 +            return cf.runAfterBothAsync(other, action); }
4747 +        public CompletionStage<Void> runAfterBothAsync
4748 +            (CompletionStage<?> other,
4749 +             Runnable action,
4750 +             Executor executor) {
4751 +            return cf.runAfterBothAsync(other, action, executor); }
4752 +        public <U> CompletionStage<U> applyToEither
4753 +            (CompletionStage<? extends T> other,
4754 +             Function<? super T, U> fn) {
4755 +            return cf.applyToEither(other, fn); }
4756 +        public <U> CompletionStage<U> applyToEitherAsync
4757 +            (CompletionStage<? extends T> other,
4758 +             Function<? super T, U> fn) {
4759 +            return cf.applyToEitherAsync(other, fn); }
4760 +        public <U> CompletionStage<U> applyToEitherAsync
4761 +            (CompletionStage<? extends T> other,
4762 +             Function<? super T, U> fn,
4763 +             Executor executor) {
4764 +            return cf.applyToEitherAsync(other, fn, executor); }
4765 +        public CompletionStage<Void> acceptEither
4766 +            (CompletionStage<? extends T> other,
4767 +             Consumer<? super T> action) {
4768 +            return cf.acceptEither(other, action); }
4769 +        public CompletionStage<Void> acceptEitherAsync
4770 +            (CompletionStage<? extends T> other,
4771 +             Consumer<? super T> action) {
4772 +            return cf.acceptEitherAsync(other, action); }
4773 +        public CompletionStage<Void> acceptEitherAsync
4774 +            (CompletionStage<? extends T> other,
4775 +             Consumer<? super T> action,
4776 +             Executor executor) {
4777 +            return cf.acceptEitherAsync(other, action, executor); }
4778 +        public CompletionStage<Void> runAfterEither
4779 +            (CompletionStage<?> other,
4780 +             Runnable action) {
4781 +            return cf.runAfterEither(other, action); }
4782 +        public CompletionStage<Void> runAfterEitherAsync
4783 +            (CompletionStage<?> other,
4784 +             Runnable action) {
4785 +            return cf.runAfterEitherAsync(other, action); }
4786 +        public CompletionStage<Void> runAfterEitherAsync
4787 +            (CompletionStage<?> other,
4788 +             Runnable action,
4789 +             Executor executor) {
4790 +            return cf.runAfterEitherAsync(other, action, executor); }
4791 +        public <U> CompletionStage<U> thenCompose
4792 +            (Function<? super T, ? extends CompletionStage<U>> fn) {
4793 +            return cf.thenCompose(fn); }
4794 +        public <U> CompletionStage<U> thenComposeAsync
4795 +            (Function<? super T, ? extends CompletionStage<U>> fn) {
4796 +            return cf.thenComposeAsync(fn); }
4797 +        public <U> CompletionStage<U> thenComposeAsync
4798 +            (Function<? super T, ? extends CompletionStage<U>> fn,
4799 +             Executor executor) {
4800 +            return cf.thenComposeAsync(fn, executor); }
4801 +        public <U> CompletionStage<U> handle
4802 +            (BiFunction<? super T, Throwable, ? extends U> fn) {
4803 +            return cf.handle(fn); }
4804 +        public <U> CompletionStage<U> handleAsync
4805 +            (BiFunction<? super T, Throwable, ? extends U> fn) {
4806 +            return cf.handleAsync(fn); }
4807 +        public <U> CompletionStage<U> handleAsync
4808 +            (BiFunction<? super T, Throwable, ? extends U> fn,
4809 +             Executor executor) {
4810 +            return cf.handleAsync(fn, executor); }
4811 +        public CompletionStage<T> whenComplete
4812 +            (BiConsumer<? super T, ? super Throwable> action) {
4813 +            return cf.whenComplete(action); }
4814 +        public CompletionStage<T> whenCompleteAsync
4815 +            (BiConsumer<? super T, ? super Throwable> action) {
4816 +            return cf.whenCompleteAsync(action); }
4817 +        public CompletionStage<T> whenCompleteAsync
4818 +            (BiConsumer<? super T, ? super Throwable> action,
4819 +             Executor executor) {
4820 +            return cf.whenCompleteAsync(action, executor); }
4821 +        public CompletionStage<T> exceptionally
4822 +            (Function<Throwable, ? extends T> fn) {
4823 +            return cf.exceptionally(fn); }
4824 +    }
4825 +
4826 +    /**
4827 +     * default-implemented exceptionallyAsync action is not invoked when
4828 +     * source completes normally, and source result is propagated
4829 +     */
4830 +    public void testDefaultExceptionallyAsync_normalCompletion() {
4831 +        for (boolean createIncomplete : new boolean[] { true, false })
4832 +        for (Integer v1 : new Integer[] { 1, null })
4833 +    {
4834 +        final AtomicInteger ran = new AtomicInteger(0);
4835 +        final CompletableFuture<Integer> f = new CompletableFuture<>();
4836 +        final DelegatedCompletionStage<Integer> d =
4837 +            new DelegatedCompletionStage<Integer>(f);
4838 +        if (!createIncomplete) assertTrue(f.complete(v1));
4839 +        final CompletionStage<Integer> g = d.exceptionallyAsync
4840 +            ((Throwable t) -> {
4841 +                ran.getAndIncrement();
4842 +                throw new AssertionError("should not be called");
4843 +            });
4844 +        if (createIncomplete) assertTrue(f.complete(v1));
4845 +
4846 +        checkCompletedNormally(g.toCompletableFuture(), v1);
4847 +        checkCompletedNormally(f, v1);
4848 +        assertEquals(0, ran.get());
4849 +    }}
4850 +
4851 +    /**
4852 +     * default-implemented exceptionallyAsync action completes with
4853 +     * function value on source exception
4854 +     */
4855 +    public void testDefaultExceptionallyAsync_exceptionalCompletion() {
4856 +        for (boolean createIncomplete : new boolean[] { true, false })
4857 +        for (Integer v1 : new Integer[] { 1, null })
4858 +    {
4859 +        final AtomicInteger ran = new AtomicInteger(0);
4860 +        final CFException ex = new CFException();
4861 +        final CompletableFuture<Integer> f = new CompletableFuture<>();
4862 +        final DelegatedCompletionStage<Integer> d =
4863 +            new DelegatedCompletionStage<Integer>(f);
4864 +        if (!createIncomplete) f.completeExceptionally(ex);
4865 +        final CompletionStage<Integer> g = d.exceptionallyAsync
4866 +            ((Throwable t) -> {
4867 +                assertSame(t, ex);
4868 +                ran.getAndIncrement();
4869 +                return v1;
4870 +            });
4871 +        if (createIncomplete) f.completeExceptionally(ex);
4872 +
4873 +        checkCompletedNormally(g.toCompletableFuture(), v1);
4874 +        assertEquals(1, ran.get());
4875 +    }}
4876 +
4877 +    /**
4878 +     * Under default implementation, if an "exceptionally action"
4879 +     * throws an exception, it completes exceptionally with that
4880 +     * exception
4881 +     */
4882 +    public void testDefaultExceptionallyAsync_exceptionalCompletionActionFailed() {
4883 +        for (boolean createIncomplete : new boolean[] { true, false })
4884 +    {
4885 +        final AtomicInteger ran = new AtomicInteger(0);
4886 +        final CFException ex1 = new CFException();
4887 +        final CFException ex2 = new CFException();
4888 +        final CompletableFuture<Integer> f = new CompletableFuture<>();
4889 +        final DelegatedCompletionStage<Integer> d =
4890 +            new DelegatedCompletionStage<Integer>(f);
4891 +        if (!createIncomplete) f.completeExceptionally(ex1);
4892 +        final CompletionStage<Integer> g = d.exceptionallyAsync
4893 +            ((Throwable t) -> {
4894 +                assertSame(t, ex1);
4895 +                ran.getAndIncrement();
4896 +                throw ex2;
4897 +            });
4898 +        if (createIncomplete) f.completeExceptionally(ex1);
4899 +
4900 +        checkCompletedWithWrappedException(g.toCompletableFuture(), ex2);
4901 +        checkCompletedExceptionally(f, ex1);
4902 +        checkCompletedExceptionally(d.toCompletableFuture(), ex1);
4903 +        assertEquals(1, ran.get());
4904 +    }}
4905 +
4906 +    /**
4907 +     * default-implemented exceptionallyCompose result completes
4908 +     * normally after normal completion of source
4909 +     */
4910 +    public void testDefaultExceptionallyCompose_normalCompletion() {
4911 +        for (boolean createIncomplete : new boolean[] { true, false })
4912 +        for (Integer v1 : new Integer[] { 1, null })
4913 +    {
4914 +        final CompletableFuture<Integer> f = new CompletableFuture<>();
4915 +        final ExceptionalCompletableFutureFunction r =
4916 +            new ExceptionalCompletableFutureFunction(ExecutionMode.SYNC);
4917 +        final DelegatedCompletionStage<Integer> d =
4918 +            new DelegatedCompletionStage<Integer>(f);
4919 +        if (!createIncomplete) assertTrue(f.complete(v1));
4920 +        final CompletionStage<Integer> g = d.exceptionallyCompose(r);
4921 +        if (createIncomplete) assertTrue(f.complete(v1));
4922 +
4923 +        checkCompletedNormally(f, v1);
4924 +        checkCompletedNormally(g.toCompletableFuture(), v1);
4925 +        r.assertNotInvoked();
4926 +    }}
4927 +
4928 +    /**
4929 +     * default-implemented exceptionallyCompose result completes
4930 +     * normally after exceptional completion of source
4931 +     */
4932 +    public void testDefaultExceptionallyCompose_exceptionalCompletion() {
4933 +        for (boolean createIncomplete : new boolean[] { true, false })
4934 +    {
4935 +        final CFException ex = new CFException();
4936 +        final ExceptionalCompletableFutureFunction r =
4937 +            new ExceptionalCompletableFutureFunction(ExecutionMode.SYNC);
4938 +        final CompletableFuture<Integer> f = new CompletableFuture<>();
4939 +        final DelegatedCompletionStage<Integer> d =
4940 +            new DelegatedCompletionStage<Integer>(f);
4941 +        if (!createIncomplete) f.completeExceptionally(ex);
4942 +        final CompletionStage<Integer> g = d.exceptionallyCompose(r);
4943 +        if (createIncomplete) f.completeExceptionally(ex);
4944 +
4945 +        checkCompletedExceptionally(f, ex);
4946 +        checkCompletedNormally(g.toCompletableFuture(), r.value);
4947 +        r.assertInvoked();
4948 +    }}
4949 +
4950 +    /**
4951 +     * default-implemented exceptionallyCompose completes
4952 +     * exceptionally on exception if action does
4953 +     */
4954 +    public void testDefaultExceptionallyCompose_actionFailed() {
4955 +        for (boolean createIncomplete : new boolean[] { true, false })
4956 +    {
4957 +        final CFException ex = new CFException();
4958 +        final CompletableFuture<Integer> f = new CompletableFuture<>();
4959 +        final FailingExceptionalCompletableFutureFunction r
4960 +            = new FailingExceptionalCompletableFutureFunction(ExecutionMode.SYNC);
4961 +        final DelegatedCompletionStage<Integer> d =
4962 +            new DelegatedCompletionStage<Integer>(f);
4963 +        if (!createIncomplete) f.completeExceptionally(ex);
4964 +        final CompletionStage<Integer> g = d.exceptionallyCompose(r);
4965 +        if (createIncomplete) f.completeExceptionally(ex);
4966 +
4967 +        checkCompletedExceptionally(f, ex);
4968 +        checkCompletedWithWrappedException(g.toCompletableFuture(), r.ex);
4969 +        r.assertInvoked();
4970 +    }}
4971 +
4972 +    /**
4973 +     * default-implemented exceptionallyComposeAsync result completes
4974 +     * normally after normal completion of source
4975 +     */
4976 +    public void testDefaultExceptionallyComposeAsync_normalCompletion() {
4977 +        for (boolean createIncomplete : new boolean[] { true, false })
4978 +        for (Integer v1 : new Integer[] { 1, null })
4979 +    {
4980 +        final CompletableFuture<Integer> f = new CompletableFuture<>();
4981 +        final ExceptionalCompletableFutureFunction r =
4982 +            new ExceptionalCompletableFutureFunction(ExecutionMode.ASYNC);
4983 +        final DelegatedCompletionStage<Integer> d =
4984 +            new DelegatedCompletionStage<Integer>(f);
4985 +        if (!createIncomplete) assertTrue(f.complete(v1));
4986 +        final CompletionStage<Integer> g = d.exceptionallyComposeAsync(r);
4987 +        if (createIncomplete) assertTrue(f.complete(v1));
4988 +
4989 +        checkCompletedNormally(f, v1);
4990 +        checkCompletedNormally(g.toCompletableFuture(), v1);
4991 +        r.assertNotInvoked();
4992 +    }}
4993 +
4994 +    /**
4995 +     * default-implemented exceptionallyComposeAsync result completes
4996 +     * normally after exceptional completion of source
4997 +     */
4998 +    public void testDefaultExceptionallyComposeAsync_exceptionalCompletion() {
4999 +        for (boolean createIncomplete : new boolean[] { true, false })
5000 +    {
5001 +        final CFException ex = new CFException();
5002 +        final ExceptionalCompletableFutureFunction r =
5003 +            new ExceptionalCompletableFutureFunction(ExecutionMode.ASYNC);
5004 +        final CompletableFuture<Integer> f = new CompletableFuture<>();
5005 +        final DelegatedCompletionStage<Integer> d =
5006 +            new DelegatedCompletionStage<Integer>(f);
5007 +        if (!createIncomplete) f.completeExceptionally(ex);
5008 +        final CompletionStage<Integer> g = d.exceptionallyComposeAsync(r);
5009 +        if (createIncomplete) f.completeExceptionally(ex);
5010 +
5011 +        checkCompletedExceptionally(f, ex);
5012 +        checkCompletedNormally(g.toCompletableFuture(), r.value);
5013 +        r.assertInvoked();
5014 +    }}
5015 +
5016 +    /**
5017 +     * default-implemented exceptionallyComposeAsync completes
5018 +     * exceptionally on exception if action does
5019 +     */
5020 +    public void testDefaultExceptionallyComposeAsync_actionFailed() {
5021 +        for (boolean createIncomplete : new boolean[] { true, false })
5022 +    {
5023 +        final CFException ex = new CFException();
5024 +        final CompletableFuture<Integer> f = new CompletableFuture<>();
5025 +        final FailingExceptionalCompletableFutureFunction r
5026 +            = new FailingExceptionalCompletableFutureFunction(ExecutionMode.ASYNC);
5027 +        final DelegatedCompletionStage<Integer> d =
5028 +            new DelegatedCompletionStage<Integer>(f);
5029 +        if (!createIncomplete) f.completeExceptionally(ex);
5030 +        final CompletionStage<Integer> g = d.exceptionallyComposeAsync(r);
5031 +        if (createIncomplete) f.completeExceptionally(ex);
5032 +
5033 +        checkCompletedExceptionally(f, ex);
5034 +        checkCompletedWithWrappedException(g.toCompletableFuture(), r.ex);
5035 +        r.assertInvoked();
5036 +    }}
5037 +
5038 +    /**
5039 +     * default-implemented exceptionallyComposeAsync result completes
5040 +     * normally after normal completion of source
5041 +     */
5042 +    public void testDefaultExceptionallyComposeAsyncExecutor_normalCompletion() {
5043 +        for (boolean createIncomplete : new boolean[] { true, false })
5044 +        for (Integer v1 : new Integer[] { 1, null })
5045 +    {
5046 +        final CompletableFuture<Integer> f = new CompletableFuture<>();
5047 +        final ExceptionalCompletableFutureFunction r =
5048 +            new ExceptionalCompletableFutureFunction(ExecutionMode.EXECUTOR);
5049 +        final DelegatedCompletionStage<Integer> d =
5050 +            new DelegatedCompletionStage<Integer>(f);
5051 +        if (!createIncomplete) assertTrue(f.complete(v1));
5052 +        final CompletionStage<Integer> g = d.exceptionallyComposeAsync(r, new ThreadExecutor());
5053 +        if (createIncomplete) assertTrue(f.complete(v1));
5054 +
5055 +        checkCompletedNormally(f, v1);
5056 +        checkCompletedNormally(g.toCompletableFuture(), v1);
5057 +        r.assertNotInvoked();
5058 +    }}
5059 +
5060 +    /**
5061 +     * default-implemented exceptionallyComposeAsync result completes
5062 +     * normally after exceptional completion of source
5063 +     */
5064 +    public void testDefaultExceptionallyComposeAsyncExecutor_exceptionalCompletion() {
5065 +        for (boolean createIncomplete : new boolean[] { true, false })
5066 +    {
5067 +        final CFException ex = new CFException();
5068 +        final ExceptionalCompletableFutureFunction r =
5069 +            new ExceptionalCompletableFutureFunction(ExecutionMode.EXECUTOR);
5070 +        final CompletableFuture<Integer> f = new CompletableFuture<>();
5071 +        final DelegatedCompletionStage<Integer> d =
5072 +            new DelegatedCompletionStage<Integer>(f);
5073 +        if (!createIncomplete) f.completeExceptionally(ex);
5074 +        final CompletionStage<Integer> g = d.exceptionallyComposeAsync(r, new ThreadExecutor());
5075 +        if (createIncomplete) f.completeExceptionally(ex);
5076 +
5077 +        checkCompletedExceptionally(f, ex);
5078 +        checkCompletedNormally(g.toCompletableFuture(), r.value);
5079 +        r.assertInvoked();
5080 +    }}
5081 +
5082 +    /**
5083 +     * default-implemented exceptionallyComposeAsync completes
5084 +     * exceptionally on exception if action does
5085 +     */
5086 +    public void testDefaultExceptionallyComposeAsyncExecutor_actionFailed() {
5087 +        for (boolean createIncomplete : new boolean[] { true, false })
5088 +    {
5089 +        final CFException ex = new CFException();
5090 +        final CompletableFuture<Integer> f = new CompletableFuture<>();
5091 +        final FailingExceptionalCompletableFutureFunction r
5092 +            = new FailingExceptionalCompletableFutureFunction(ExecutionMode.EXECUTOR);
5093 +        final DelegatedCompletionStage<Integer> d =
5094 +            new DelegatedCompletionStage<Integer>(f);
5095 +        if (!createIncomplete) f.completeExceptionally(ex);
5096 +        final CompletionStage<Integer> g = d.exceptionallyComposeAsync(r, new ThreadExecutor());
5097 +        if (createIncomplete) f.completeExceptionally(ex);
5098 +
5099 +        checkCompletedExceptionally(f, ex);
5100 +        checkCompletedWithWrappedException(g.toCompletableFuture(), r.ex);
5101 +        r.assertInvoked();
5102 +    }}
5103 +
5104   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines