@Nonnull @Override public Next<M, Object> update(M model, E event) { return Next.next(update.apply(model, event)); } },
@Nonnull @Override public Next<String, Boolean> update(String model, Integer event) { return Next.next(model + event.toString()); } },
@Nonnull @Override public Next<String, Boolean> update(String model, Integer event) { return Next.next(model + "-", effects(event % 2 == 0)); } },
@SuppressWarnings("unused") private Next<?, Number> canInferFromVarargAndEffectsSingle() { return Next.next("m", effects((short) 1)); } }
@Test public void testHasModelSpecific() throws Exception { next = next("a"); matcher = hasModel(equalTo("a")); assertTrue(matcher.matches(next)); matcher.describeMismatch(next, desc); assertEquals("has a model: was \"a\"", desc.toString()); }
@Test public void testHasModelSpecificButWrong() throws Exception { next = next("b"); matcher = hasModel(equalTo("a")); assertFalse(matcher.matches(next)); matcher.describeMismatch(next, desc); assertEquals("bad model: was \"b\"", desc.toString()); }
@Test public void canMergeInnerEffectsAndModel() throws Exception { Set<String> effects = setOf("f1", "f2"); Next<Integer, String> innerNext = Next.next(1, effects("f2", "f3")); Next<String, String> merged = Next.next("m" + innerNext.modelOrElse(0), unionSets(effects, innerNext.effects())); assertEquals(Next.next("m1", effects("f1", "f2", "f3")), merged); }
@Test public void testHasNothing() throws Exception { matcher = hasNothing(); assertFalse(matcher.matches(null)); assertFalse(matcher.matches(next("1234"))); assertFalse(matcher.matches(dispatch(effects("f1")))); assertFalse(matcher.matches(next("123", effects("f1")))); assertTrue(matcher.matches(noChange())); }
@Test public void testHasModelWithValue() throws Exception { next = next("a"); matcher = hasModel("a"); assertTrue(matcher.matches(next)); matcher.describeMismatch(next, desc); assertEquals("has a model: was \"a\"", desc.toString()); }
@Test public void testHasModel() throws Exception { next = next("a"); matcher = hasModel(); assertTrue(matcher.matches(next)); matcher.describeMismatch(next, desc); assertEquals("has a model", desc.toString()); }
@Test public void testHasNoModelMismatch() throws Exception { next = next("a"); matcher = hasNoModel(); assertFalse(matcher.matches(next)); matcher.describeMismatch(next, desc); assertEquals("has a model", desc.toString()); }
@Test public void canMergeInnerEffects() throws Exception { Next<String, String> outerNext = Next.next("m", effects("f1", "f2")); Next<?, String> innerNext = dispatch(effects("f2", "f3")); Next<String, String> merged = Next.next( outerNext.modelOrElse("fail"), unionSets(innerNext.effects(), outerNext.effects())); assertEquals(Next.next("m", effects("f1", "f2", "f3")), merged); }
@Test public void shouldLogAfterUpdate() throws Exception { loggingUpdate.update("mah model", 1); assertThat( logger.afterUpdate, contains( CapturingLogger.AfterUpdateArgs.create( "mah model", 1, Next.next("mah model-", effects(false))))); }
@Test public void nextNoEffectsOnlyHasModel() throws Exception { Next<String, String> next = Next.next("foo"); assertTrue(next.hasModel()); assertFalse(next.hasEffects()); }
@Test public void delegatesAfterUpdateToAllLoggers() { AfterUpdate<String, Integer, String> testCase = AfterUpdate.create("Hello", 5, next("World", singleton("test"))); underTest.afterUpdate(testCase.model(), testCase.event(), testCase.next()); assertTestCaseLogged(testCase); }
@Test public void callsInnerUpdate() throws Exception { InnerUpdate<String, String, String, String, String, String> innerUpdate = InnerUpdate.<String, String, String, String, String, String>builder() .modelExtractor(m -> m) .eventExtractor(e -> e) .innerUpdate((model, event) -> Next.next("inner_update")) .modelUpdater((m, mi) -> mi) .innerEffectHandler(ignoreEffects()) .build(); Next<String, String> next = innerUpdate.update("model", "event"); assertThat(next, NextMatchers.<String, String>hasModel("inner_update")); }
@Test public void canExtractInnerEvent() throws Exception { InnerUpdate<String, String, String, String, String, String> innerUpdate = InnerUpdate.<String, String, String, String, String, String>builder() .modelExtractor(m -> m) .eventExtractor(e -> "extracted_event") .innerUpdate((model, event) -> Next.next(event)) .modelUpdater((m, mi) -> mi) .innerEffectHandler(ignoreEffects()) .build(); Next<String, String> next = innerUpdate.update("model", "event"); assertThat(next, NextMatchers.<String, String>hasModel("extracted_event")); }
@Test public void updatedModelCallsModelUpdater() throws Exception { InnerUpdate<String, String, String, String, String, String> innerUpdate = InnerUpdate.<String, String, String, String, String, String>builder() .modelExtractor(m -> m) .eventExtractor(e -> e) .innerUpdate((model, event) -> Next.next("inner_update")) .modelUpdater((m, mi) -> "model_updater") .innerEffectHandler(ignoreEffects()) .build(); Next<String, String> next = innerUpdate.update("model", "event"); assertThat(next, NextMatchers.<String, String>hasModel("model_updater")); }