private void start() { Model model = buildWith(Model.builder()); new ModelRunner().run(model).reactTo(entersText()); } }
@Test public void twoFlowlessStepsDontReactWhenConditionIsFalseInFirstStepWithoutUseCase() { Model model = modelBuilder .condition(() -> false).on(EntersText.class).system(displaysEnteredText()) .on(EntersNumber.class).system(displaysEnteredNumber()) .build(); modelRunner.run(model); Optional<Step> latestStepRun = modelRunner.reactTo(entersNumber()); assertEquals(EntersNumber.class, latestStepRun.get().getEventClass()); latestStepRun = modelRunner.reactTo(entersText()); assertEquals(EntersNumber.class, latestStepRun.get().getEventClass()); }
@Test public void twoFlowlessStepsReactWhenConditionIsTrueInFirstStepWithoutUseCase() { Model model = modelBuilder .condition(() -> true).on(EntersText.class).system(displaysEnteredText()) .on(EntersNumber.class).system(displaysEnteredNumber()) .build(); modelRunner.run(model); Optional<Step> latestStepRun = modelRunner.reactTo(entersText()); assertEquals(EntersText.class, latestStepRun.get().getEventClass()); latestStepRun = modelRunner.reactTo(entersNumber()); assertEquals(EntersNumber.class, latestStepRun.get().getEventClass()); }
@Test public void testHelloWorld03() { HelloWorld03 example = new HelloWorld03(); model = example.buildWith(modelBuilder); modelRunner.run(model).reactTo(new EntersText("John Q. Public")); assertRecordedStepNames("S1", "S2"); }
@Test public void testBasicFlow() { testRunner.run(model); testRunner.reactTo(new AsksForPoem(), new AsksForPoem(), new AsksForPoem()); assertRecordedStepNames("1", "2", "3"); }
@Test public void twoFlowlessStepsReactWhenConditionIsTrueInFirstStepWithEvent() { Model model = modelBuilder.useCase(USE_CASE) .condition(() -> true).on(EntersText.class).system(displaysEnteredText()) .on(EntersNumber.class).system(displaysEnteredNumber()) .build(); modelRunner.run(model); Optional<Step> latestStepRun = modelRunner.reactTo(entersText()); assertEquals(EntersText.class, latestStepRun.get().getEventClass()); latestStepRun = modelRunner.reactTo(entersNumber()); assertEquals(EntersNumber.class, latestStepRun.get().getEventClass()); }
@Test public void twoFlowlessStepsDontReactWhenConditionIsFalseInFirstStep() { Model model = modelBuilder.useCase(USE_CASE) .condition(() -> false).on(EntersText.class).system(displaysEnteredText()) .on(EntersNumber.class).system(displaysEnteredNumber()) .build(); modelRunner.run(model); Optional<Step> latestStepRun = modelRunner.reactTo(entersNumber()); assertEquals(EntersNumber.class, latestStepRun.get().getEventClass()); latestStepRun = modelRunner.reactTo(entersText()); assertEquals(EntersNumber.class, latestStepRun.get().getEventClass()); }
@Test public void twoFlowlessStepsDontReactWhenConditionIsFalseInSecondStep() { Model model = modelBuilder.useCase(USE_CASE) .on(EntersText.class).system(displaysEnteredText()) .condition(() -> false).on(EntersNumber.class).system(displaysEnteredNumber()) .build(); modelRunner.run(model); Optional<Step> latestStepRun = modelRunner.reactTo(entersText()); assertEquals(EntersText.class, latestStepRun.get().getEventClass()); latestStepRun = modelRunner.reactTo(entersNumber()); assertEquals(EntersText.class, latestStepRun.get().getEventClass()); }
@Test public void twoFlowlessStepsReactWhenConditionIsTrueInSecondStepWithoutEvent() { Model model = modelBuilder.useCase(USE_CASE) .on(EntersText.class).system(displaysEnteredText()) .condition(() -> modelRunner.getLatestStep().isPresent() && modelRunner.getLatestStep().get().getEventClass().equals(EntersText.class)).system(displaysConstantText()) .build(); modelRunner.run(model).reactTo(entersText()); assertEquals(ModelRunner.class, modelRunner.getLatestStep().get().getEventClass()); }
@Test public void oneFlowlessStepReactsWithoutUseCase() { Model model = modelBuilder .on(EntersText.class).system(displaysEnteredText()) .build(); modelRunner.run(model); Optional<Step> latestStepRun = modelRunner.reactTo(entersText()); assertEquals(EntersText.class, latestStepRun.get().getEventClass()); }
@Test public void testHelloWorld04() { HelloWorld04 example = new HelloWorld04(); model = example.buildWith(modelBuilder); modelRunner.run(model).reactTo(new EntersText("John"), new EntersText("39")); assertRecordedStepNames("S1", "S2", "S3", "S4", "S5"); }
@Test public void recordsEventWithUnhandledEventHandler() { Model model = modelBuilder.useCase(USE_CASE).on(EntersText.class).system(displaysEnteredText()).build(); modelRunner.handleUnhandledWith(this::eventRecordingEventHandler); modelRunner.run(model); modelRunner.reactTo(entersNumber()); Object event = optionalEvent.get(); assertTrue(event instanceof EntersNumber); }
@Test public void testHelloWorld05_WithOutOfBoundsAge() { HelloWorld05 example = new HelloWorld05(); model = example.buildWith(modelBuilder); modelRunner.run(model).reactTo(new EntersText("John"), new EntersText("1000")); assertRecordedStepNames("S1", "S2", "S3", "S4", "S5a_1", "S5a_2", "S3"); }
@Test public void twoFlowlessStepsReactWhenConditionIsTrueInFirstStepWithoutEvent() { Model model = modelBuilder.useCase(USE_CASE) .condition(() -> !modelRunner.getLatestStep().isPresent()).system(displaysConstantText()) .on(EntersNumber.class).system(displaysEnteredNumber()) .build(); modelRunner.run(model); Optional<Step> latestStepRun = modelRunner.reactTo(entersNumber()); assertEquals(EntersNumber.class, latestStepRun.get().getEventClass()); }
@Test public void testHelloWorld06_AsAnonymousUserHandleNonNumericalAge() { HelloWorld06 example = new HelloWorld06(); model = example.buildWith(modelBuilder); modelRunner.as(example.anonymousUser()).run(model).reactTo(new EntersText("NotANumber")); assertRecordedStepNames("S1a_1", "S3", "S4", "S5b_1", "S5b_2", "S3"); }
@Test public void testHelloWorld06_AsNormalUser() { HelloWorld06 example = new HelloWorld06(); model = example.buildWith(modelBuilder); modelRunner.as(example.normalUser()).run(model) .reactTo(new EntersText("John"), new EntersText("39")); assertRecordedStepNames("S1", "S2", "S3", "S4", "S5", "S6", "S7"); }
@Test public void stepThasHasTrueConditionReactsEvenIfOtherStepWouldBePerformedBySystem() { Model model = modelBuilder .useCase(USE_CASE) .basicFlow() .step(CUSTOMER_ENTERS_TEXT).user(EntersText.class).system(displaysEnteredText()) .flow("Alternative Flow: Skipped").condition(() -> false) .step(THIS_STEP_SHOULD_BE_SKIPPED).system(() -> System.out.println("You should not see this!")) .build(); modelRunner.run(model).reactTo(entersText(), entersText()); assertRecordedStepNames(CUSTOMER_ENTERS_TEXT); }
@Test public void throwsExceptionIfSystemPartIsNotSpecified() { thrown.expect(MissingUseCaseStepPart.class); thrown.expectMessage(CUSTOMER_ENTERS_TEXT); modelBuilder.useCase(USE_CASE).basicFlow().step(CUSTOMER_ENTERS_TEXT).as(customer) .user(EntersText.class); Model model = modelBuilder.build(); modelRunner.as(customer).run(model); modelRunner.reactTo(entersText()); }
@Test public void onlyStepWithTrueConditionReacts() { Model model = modelBuilder .useCase(USE_CASE) .basicFlow() .step(CUSTOMER_ENTERS_TEXT).user(EntersText.class).system(displaysEnteredText()) .flow("Alternative Flow: Skipped").condition(() -> false) .step(THIS_STEP_SHOULD_BE_SKIPPED).user(EntersText.class).system(throwsRuntimeException()) .build(); modelRunner.run(model).reactTo(entersText(), entersText()); assertRecordedStepNames(CUSTOMER_ENTERS_TEXT); }