// Path: src/main/java/org/simondean/vertx/async/Async.java
// public final class Async {
//   private Async() {}
// 
//   public static <T> Series<T> series() {
//     return new SeriesImpl<>();
//   }
// 
//   public static WaterfallBuilder waterfall() {
//     return new WaterfallBuilderImpl();
//   }
// 
//   public static <T> IterableBuilder<T> iterable(Iterable<T> iterable) {
//     return new IterableBuilderImpl(iterable);
//   }
// 
//   public static RetryBuilder retry() {
//     return new RetryBuilderImpl();
//   }
// 
//   public static ForeverBuilder forever() {
//     return new ForeverBuilderImpl();
//   }
// }
// 
// Path: src/main/java/org/simondean/vertx/async/ObjectWrapper.java
// public class ObjectWrapper<T> {
//   private T object;
// 
//   public ObjectWrapper() {
//   }
// 
//   public ObjectWrapper(T object) {
//     this.object = object;
//   }
// 
//   public void setObject(T object) {
//     this.object = object;
//   }
// 
//   public T getObject() {
//     return object;
//   }
// }
// 
// Path: src/test/java/org/simondean/vertx/async/unit/fakes/FakeFailingAsyncFunction.java
// public class FakeFailingAsyncFunction<T, R> extends FakeAsyncFunction<T, R> {
//   private final int successCount;
//   private final R result;
//   private final Throwable cause;
// 
//   public FakeFailingAsyncFunction(Throwable cause) {
//     this(0, null, cause);
//   }
// 
//   public FakeFailingAsyncFunction(int successCount, R result, Throwable cause) {
//     this.successCount = successCount;
//     this.result = result;
//     this.cause = cause;
//   }
// 
//   @Override
//   public void accept(T value, AsyncResultHandler<R> handler) {
//     addConsumedValue(value);
//     incrementRunCount();
// 
//     if (runCount() > successCount) {
//       handler.handle(DefaultAsyncResult.fail(cause));
//     }
//     else {
//       handler.handle(DefaultAsyncResult.succeed(result));
//     }
//   }
// 
//   public Throwable cause() {
//     return cause;
//   }
// }
// 
// Path: src/test/java/org/simondean/vertx/async/unit/fakes/FakeFailingAsyncSupplier.java
// public class FakeFailingAsyncSupplier<T> extends FakeAsyncSupplier<T> {
//   private final int successCount;
//   private final T result;
//   private final Throwable cause;
// 
//   public FakeFailingAsyncSupplier(Throwable cause) {
//     this(0, null, cause);
//   }
// 
//   public FakeFailingAsyncSupplier(int successCount, T result, Throwable cause) {
//     this.successCount = successCount;
//     this.result = result;
//     this.cause = cause;
//   }
// 
//   @Override
//   public void accept(AsyncResultHandler<T> handler) {
//     incrementRunCount();
// 
//     if (runCount() > successCount) {
//       handler.handle(DefaultAsyncResult.fail(cause));
//     }
//     else {
//       handler.handle(DefaultAsyncResult.succeed(result));
//     }
//   }
// 
//   public Throwable cause() {
//     return cause;
//   }
// }
// 
// Path: src/test/java/org/simondean/vertx/async/unit/fakes/FakeSuccessfulAsyncFunction.java
// public class FakeSuccessfulAsyncFunction<T, R> extends FakeAsyncFunction<T, R> {
//   private final int failureCount;
//   private final R result;
//   private final Throwable cause;
// 
//   public FakeSuccessfulAsyncFunction(R result) {
//     this(0, null, result);
//   }
// 
//   public FakeSuccessfulAsyncFunction(int failureCount, Throwable cause, R result) {
//     this.failureCount = failureCount;
//     this.result = result;
//     this.cause = cause;
//   }
// 
//   @Override
//   public void accept(T value, AsyncResultHandler<R> handler) {
//     addConsumedValue(value);
//     incrementRunCount();
// 
//     if (runCount() > failureCount) {
//       handler.handle(DefaultAsyncResult.succeed(result));
//     }
//     else {
//       handler.handle(DefaultAsyncResult.fail(cause));
//     }
//   }
// 
//   public R result() {
//     return result;
//   }
// }
// 
// Path: src/test/java/org/simondean/vertx/async/unit/fakes/FakeSuccessfulAsyncSupplier.java
// public class FakeSuccessfulAsyncSupplier<T> extends FakeAsyncSupplier<T> {
//   private final int failureCount;
//   private final T result;
//   private final Throwable cause;
// 
//   public FakeSuccessfulAsyncSupplier(T result) {
//     this(0, null, result);
//   }
// 
//   public FakeSuccessfulAsyncSupplier(int failureCount, Throwable cause, T result) {
//     this.failureCount = failureCount;
//     this.result = result;
//     this.cause = cause;
//   }
// 
//   @Override
//   public void accept(AsyncResultHandler<T> handler) {
//     incrementRunCount();
// 
//     if (runCount() > failureCount) {
//       handler.handle(DefaultAsyncResult.succeed(result));
//     }
//     else {
//       handler.handle(DefaultAsyncResult.fail(cause));
//     }
//   }
// 
//   public T result() {
//     return result;
//   }
// }


import org.junit.Test;
import org.simondean.vertx.async.Async;
import org.simondean.vertx.async.ObjectWrapper;
import org.simondean.vertx.async.unit.fakes.FakeFailingAsyncFunction;
import org.simondean.vertx.async.unit.fakes.FakeFailingAsyncSupplier;
import org.simondean.vertx.async.unit.fakes.FakeSuccessfulAsyncFunction;
import org.simondean.vertx.async.unit.fakes.FakeSuccessfulAsyncSupplier;
import static org.assertj.core.api.Assertions.assertThat;
package org.simondean.vertx.async.unit;



public class WaterfallTest {
  @Test
  public void itExecutesOneTask() {
    FakeSuccessfulAsyncSupplier<String> task1 = new FakeSuccessfulAsyncSupplier<>("Task 1");

// Path: src/main/java/org/simondean/vertx/async/Async.java
// public final class Async {
//   private Async() {}
// 
//   public static <T> Series<T> series() {
//     return new SeriesImpl<>();
//   }
// 
//   public static WaterfallBuilder waterfall() {
//     return new WaterfallBuilderImpl();
//   }
// 
//   public static <T> IterableBuilder<T> iterable(Iterable<T> iterable) {
//     return new IterableBuilderImpl(iterable);
//   }
// 
//   public static RetryBuilder retry() {
//     return new RetryBuilderImpl();
//   }
// 
//   public static ForeverBuilder forever() {
//     return new ForeverBuilderImpl();
//   }
// }
// 
// Path: src/main/java/org/simondean/vertx/async/ObjectWrapper.java
// public class ObjectWrapper<T> {
//   private T object;
// 
//   public ObjectWrapper() {
//   }
// 
//   public ObjectWrapper(T object) {
//     this.object = object;
//   }
// 
//   public void setObject(T object) {
//     this.object = object;
//   }
// 
//   public T getObject() {
//     return object;
//   }
// }
// 
// Path: src/test/java/org/simondean/vertx/async/unit/fakes/FakeFailingAsyncFunction.java
// public class FakeFailingAsyncFunction<T, R> extends FakeAsyncFunction<T, R> {
//   private final int successCount;
//   private final R result;
//   private final Throwable cause;
// 
//   public FakeFailingAsyncFunction(Throwable cause) {
//     this(0, null, cause);
//   }
// 
//   public FakeFailingAsyncFunction(int successCount, R result, Throwable cause) {
//     this.successCount = successCount;
//     this.result = result;
//     this.cause = cause;
//   }
// 
//   @Override
//   public void accept(T value, AsyncResultHandler<R> handler) {
//     addConsumedValue(value);
//     incrementRunCount();
// 
//     if (runCount() > successCount) {
//       handler.handle(DefaultAsyncResult.fail(cause));
//     }
//     else {
//       handler.handle(DefaultAsyncResult.succeed(result));
//     }
//   }
// 
//   public Throwable cause() {
//     return cause;
//   }
// }
// 
// Path: src/test/java/org/simondean/vertx/async/unit/fakes/FakeFailingAsyncSupplier.java
// public class FakeFailingAsyncSupplier<T> extends FakeAsyncSupplier<T> {
//   private final int successCount;
//   private final T result;
//   private final Throwable cause;
// 
//   public FakeFailingAsyncSupplier(Throwable cause) {
//     this(0, null, cause);
//   }
// 
//   public FakeFailingAsyncSupplier(int successCount, T result, Throwable cause) {
//     this.successCount = successCount;
//     this.result = result;
//     this.cause = cause;
//   }
// 
//   @Override
//   public void accept(AsyncResultHandler<T> handler) {
//     incrementRunCount();
// 
//     if (runCount() > successCount) {
//       handler.handle(DefaultAsyncResult.fail(cause));
//     }
//     else {
//       handler.handle(DefaultAsyncResult.succeed(result));
//     }
//   }
// 
//   public Throwable cause() {
//     return cause;
//   }
// }
// 
// Path: src/test/java/org/simondean/vertx/async/unit/fakes/FakeSuccessfulAsyncFunction.java
// public class FakeSuccessfulAsyncFunction<T, R> extends FakeAsyncFunction<T, R> {
//   private final int failureCount;
//   private final R result;
//   private final Throwable cause;
// 
//   public FakeSuccessfulAsyncFunction(R result) {
//     this(0, null, result);
//   }
// 
//   public FakeSuccessfulAsyncFunction(int failureCount, Throwable cause, R result) {
//     this.failureCount = failureCount;
//     this.result = result;
//     this.cause = cause;
//   }
// 
//   @Override
//   public void accept(T value, AsyncResultHandler<R> handler) {
//     addConsumedValue(value);
//     incrementRunCount();
// 
//     if (runCount() > failureCount) {
//       handler.handle(DefaultAsyncResult.succeed(result));
//     }
//     else {
//       handler.handle(DefaultAsyncResult.fail(cause));
//     }
//   }
// 
//   public R result() {
//     return result;
//   }
// }
// 
// Path: src/test/java/org/simondean/vertx/async/unit/fakes/FakeSuccessfulAsyncSupplier.java
// public class FakeSuccessfulAsyncSupplier<T> extends FakeAsyncSupplier<T> {
//   private final int failureCount;
//   private final T result;
//   private final Throwable cause;
// 
//   public FakeSuccessfulAsyncSupplier(T result) {
//     this(0, null, result);
//   }
// 
//   public FakeSuccessfulAsyncSupplier(int failureCount, Throwable cause, T result) {
//     this.failureCount = failureCount;
//     this.result = result;
//     this.cause = cause;
//   }
// 
//   @Override
//   public void accept(AsyncResultHandler<T> handler) {
//     incrementRunCount();
// 
//     if (runCount() > failureCount) {
//       handler.handle(DefaultAsyncResult.succeed(result));
//     }
//     else {
//       handler.handle(DefaultAsyncResult.fail(cause));
//     }
//   }
// 
//   public T result() {
//     return result;
//   }
// }


// Path: src/test/java/org/simondean/vertx/async/unit/WaterfallTest.java
import org.junit.Test;
import org.simondean.vertx.async.Async;
import org.simondean.vertx.async.ObjectWrapper;
import org.simondean.vertx.async.unit.fakes.FakeFailingAsyncFunction;
import org.simondean.vertx.async.unit.fakes.FakeFailingAsyncSupplier;
import org.simondean.vertx.async.unit.fakes.FakeSuccessfulAsyncFunction;
import org.simondean.vertx.async.unit.fakes.FakeSuccessfulAsyncSupplier;
import static org.assertj.core.api.Assertions.assertThat;

package org.simondean.vertx.async.unit;



public class WaterfallTest {
  @Test
  public void itExecutesOneTask() {
    FakeSuccessfulAsyncSupplier<String> task1 = new FakeSuccessfulAsyncSupplier<>("Task 1");

    ObjectWrapper<Integer> handlerCallCount = new ObjectWrapper<>(0);