@Test public void createsTwoStepsWithoutFlow() { UseCasePart useCasePart = modelBuilder.useCase(USE_CASE); useCasePart .on(EntersText.class).system(displaysEnteredText()) .on(EntersNumber.class).system(displaysEnteredNumber()) .build(); Collection<Step> steps = useCasePart.getUseCase().getSteps(); assertEquals(2, steps.size()); Iterator<Step> stepIt = steps.iterator(); Step step = stepIt.next(); assertEquals("S1", step.getName()); assertEquals(USE_CASE, step.getUseCase().getName()); step = stepIt.next(); assertEquals("S2", step.getName()); assertEquals(USE_CASE, step.getUseCase().getName()); }
@Test public void extractsFlowlessModel() throws Exception { Model model = Model.builder() .on(entersName()).system(greetsUser()) .on(Exception.class).system(logsException()) .build(); String templateFileName = "testextract_flowless.ftl"; Writer outputWriter = new StringWriter(); engine.extract(model, templateFileName, outputWriter); String output = outputWriter.toString(); assertEquals( "Use case: Handles events." + " Step: S1. On EntersName: System greets user." + " Step: S2. On Exception: System logs exception.", output); }
@Test public void twoFlowlessStepsReactWhenConditionIsTrueInFirstStepWithoutEventButWithModelRunnerArgument() { Model model = modelBuilder.useCase(USE_CASE) .condition(() -> !modelRunner.getLatestStep().isPresent()).system(modelRunner -> 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 continueRecordingAfterRestart() { Model model = modelBuilder.useCase(USE_CASE) .on(EntersText.class).system(displaysEnteredText()) .on(EntersNumber.class).system(displaysEnteredNumber()) .build(); modelRunner.run(model).startRecording(); modelRunner.reactTo(entersText()); modelRunner.restart(); modelRunner.reactTo(entersNumber()); assertEquals(2, modelRunner.getRecordedEvents().length); assertEquals(EntersText.class, modelRunner.getRecordedEvents()[0].getClass()); assertEquals(EntersNumber.class, modelRunner.getRecordedEvents()[1].getClass()); assertEquals(2, modelRunner.getRecordedStepNames().length); assertEquals("S1", modelRunner.getRecordedStepNames()[0]); assertEquals("S2", modelRunner.getRecordedStepNames()[1]); } }
@Test public void noMoreRecordingAfterRecordingIsStopped() { Model model = modelBuilder.useCase(USE_CASE) .on(EntersText.class).system(displaysEnteredText()) .on(EntersNumber.class).system(displaysEnteredNumber()) .build(); modelRunner.run(model).startRecording(); modelRunner.reactTo(entersText()); modelRunner.stopRecording(); modelRunner.reactTo(entersNumber()); assertEquals(1, modelRunner.getRecordedEvents().length); assertEquals(EntersText.class, modelRunner.getRecordedEvents()[0].getClass()); assertEquals(1, modelRunner.getRecordedStepNames().length); assertEquals("S1", modelRunner.getRecordedStepNames()[0]); }
@Test public void recordMultipleEvents_startRecordingBeforeRunning() { Model model = modelBuilder.useCase(USE_CASE) .on(EntersText.class).system(displaysEnteredText()) .on(EntersNumber.class).system(displaysEnteredNumber()) .build(); modelRunner.startRecording().run(model); modelRunner.reactTo(entersText(), entersNumber()); assertEquals(2, modelRunner.getRecordedEvents().length); assertEquals(EntersText.class, modelRunner.getRecordedEvents()[0].getClass()); assertEquals(EntersNumber.class, modelRunner.getRecordedEvents()[1].getClass()); assertEquals(2, modelRunner.getRecordedStepNames().length); assertEquals("S1", modelRunner.getRecordedStepNames()[0]); assertEquals("S2", modelRunner.getRecordedStepNames()[1]); }
@Test public void recordMultipleEvents_startRecordingAfterRunning() { Model model = modelBuilder.useCase(USE_CASE) .on(EntersText.class).system(displaysEnteredText()) .on(EntersNumber.class).system(displaysEnteredNumber()) .build(); modelRunner.run(model).startRecording(); modelRunner.reactTo(entersText(), entersNumber()); assertEquals(2, modelRunner.getRecordedEvents().length); assertEquals(EntersText.class, modelRunner.getRecordedEvents()[0].getClass()); assertEquals(EntersNumber.class, modelRunner.getRecordedEvents()[1].getClass()); assertEquals(2, modelRunner.getRecordedStepNames().length); assertEquals("S1", modelRunner.getRecordedStepNames()[0]); assertEquals("S2", modelRunner.getRecordedStepNames()[1]); }
@Test public void twoFlowlessStepsReactToEventsOfDifferentTypeInWrongOrderWithoutUseCase() { Model model = modelBuilder .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(EntersText.class, latestStepRun.get().getEventClass()); }
@Test public void twoFlowlessStepsReactToEventsOfDifferentTypeInRightOrderWithoutUseCase() { Model model = modelBuilder .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 twoFlowlessStepsReactToEventsOfDifferentTypeInRightOrder() { Model model = modelBuilder.useCase(USE_CASE) .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 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 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 twoFlowlessStepsReactToEventsOfDifferentTypeInWrongOrder() { Model model = modelBuilder.useCase(USE_CASE) .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(EntersText.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 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 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()); }