public Model buildWith(ModelBuilder modelBuilder) { Model model = modelBuilder.useCase("Get greeted") .basicFlow() .step("S1").system(this::greetsUser) .step("S2").system(this::printsHooray).reactWhile(this::lessThanThreeHooraysHaveBeenPrinted) .build(); return model; }
@Test public void reactToStepOnce() { Model model = modelBuilder .useCase(USE_CASE) .basicFlow() .step(CUSTOMER_ENTERS_TEXT) .user(EntersText.class).system(displaysEnteredText()) .reactWhile(() -> true) .step(CUSTOMER_ENTERS_NUMBER) .user(EntersNumber.class).system(displaysEnteredNumber()) .build(); modelRunner.run(model); reactToAndAssertEvents(entersText(), entersNumber()); }
@Test public void reactToStepTwice() { Model model = modelBuilder .useCase(USE_CASE) .basicFlow() .step(CUSTOMER_ENTERS_TEXT) .user(EntersText.class).system(displaysEnteredText()) .reactWhile(() -> true) .step(CUSTOMER_ENTERS_NUMBER) .user(EntersNumber.class).system(displaysEnteredNumber()) .build(); modelRunner.run(model); reactToAndAssertEvents(entersText(), entersText(), entersNumber()); }
@Test public void doesNotReactWhileConditionNotFulfilled() { Model model = modelBuilder .useCase(USE_CASE) .basicFlow() .step(CUSTOMER_ENTERS_TEXT) .user(EntersText.class).system(displaysEnteredText()) .reactWhile(() -> false) .step(CUSTOMER_ENTERS_NUMBER) .user(EntersNumber.class).system(displaysEnteredNumber()) .build(); modelRunner.run(model).reactTo(entersText(), entersNumber()); assertRecordedStepNames(new String[0]); }
@Test public void reactToStepThreeTimes() { timesDisplayed = 0; Model model = modelBuilder .useCase(USE_CASE) .basicFlow() .step(CUSTOMER_ENTERS_TEXT) .user(EntersText.class).system(displaysEnteredTextAndIncrementCounter()) .reactWhile(() -> timesDisplayed < 3) .step(CUSTOMER_ENTERS_NUMBER).user(EntersNumber.class).system(displaysEnteredNumber()) .build(); // Create way to many events to see if the repeat stops after three events modelRunner.run(model) .reactTo(entersText(), entersText(), entersText(), entersText(), entersText(), entersText(), entersText(), entersText(), entersText(), entersNumber()); assertRecordedStepNames(CUSTOMER_ENTERS_TEXT, CUSTOMER_ENTERS_TEXT, CUSTOMER_ENTERS_TEXT, CUSTOMER_ENTERS_NUMBER); } private Consumer<EntersText> displaysEnteredTextAndIncrementCounter(){
@Test public void interruptsReactWhileBefore() { Model model = modelBuilder .useCase(USE_CASE) .basicFlow() .step(CUSTOMER_ENTERS_TEXT) .user(EntersText.class).system(displaysEnteredText()) .step(CUSTOMER_ENTERS_TEXT_AGAIN) .user(EntersText.class).system(displaysEnteredText()) .reactWhile(() -> true) .step(CUSTOMER_ENTERS_NUMBER) .user(EntersNumber.class).system(displaysEnteredNumber()) .flow(ALTERNATIVE_FLOW).insteadOf(CUSTOMER_ENTERS_TEXT_AGAIN) .step(CUSTOMER_ENTERS_ALTERNATIVE_TEXT) .user(EntersText.class).system(displaysEnteredText()) .build(); modelRunner.run(model).reactTo(entersText(), entersText(), entersNumber()); assertRecordedStepNames(CUSTOMER_ENTERS_TEXT, CUSTOMER_ENTERS_ALTERNATIVE_TEXT); }
@Test public void interruptsReactWhileAfter() { Model model = modelBuilder .useCase(USE_CASE) .basicFlow() .step(CUSTOMER_ENTERS_TEXT) .user(EntersText.class).system(displaysEnteredText()) .step(CUSTOMER_ENTERS_TEXT_AGAIN) .user(EntersText.class).system(displaysEnteredText()) .reactWhile(() -> true) .step(CUSTOMER_ENTERS_NUMBER) .user(EntersNumber.class).system(displaysEnteredNumber()) .flow(ALTERNATIVE_FLOW).insteadOf(CUSTOMER_ENTERS_NUMBER) .step(CUSTOMER_ENTERS_NUMBER_AGAIN) .user(EntersNumber.class).system(displaysEnteredNumber()) .build(); modelRunner.run(model).reactTo(entersText(), entersText(), entersNumber()); assertRecordedStepNames(CUSTOMER_ENTERS_TEXT, CUSTOMER_ENTERS_TEXT_AGAIN, CUSTOMER_ENTERS_NUMBER_AGAIN); }
.step("S1").system(promptsUserToEnterName()) .step("S2").user(entersName()).system(greetsUser()) .step("S3").as(firstActor).user(entersName()).system(greetsUser()).reactWhile(someConditionIsFulfilled()) .step("S4").as(firstActor, secondActor).user(decidesToQuit()) .step("S5").as(firstActor, secondActor).system(promptsUserToEnterName())