@Override public void onDispatchEvent(E event) { loop.dispatchEvent(event); }
@Override public void onStop() { loop.dispose(); M mostRecentModel = loop.getMostRecentModel(); actions.goToStateCreated(renderer, mostRecentModel); }
@Test public void shouldInstantiateWithMinimumParams() throws Exception { loop = Mobius.loop(UPDATE, HANDLER).startFrom(MY_MODEL); loop.dispatchEvent(8); await().atMost(Duration.ONE_SECOND).until(() -> loop.getMostRecentModel(), is("start83")); }
@Test public void shouldSupportUnregisteringObserver() throws Exception { observer = new RecordingModelObserver<>(); mobiusLoop = MobiusLoop.create( mobiusStore, effectHandler, eventSource, immediateRunner, immediateRunner); Disposable unregister = mobiusLoop.observe(observer); mobiusLoop.dispatchEvent(new TestEvent("active observer")); unregister.dispose(); mobiusLoop.dispatchEvent(new TestEvent("shouldn't be seen")); observer.assertStates("init", "init->active observer"); }
@Test public void shouldSupportCreatingMultipleLoops() throws Exception { MobiusLoop.Factory<String, Integer, Boolean> factory = Mobius.loop(UPDATE, HANDLER); // one loop = factory.startFrom("first"); loop.dispatchEvent(97); await().atMost(Duration.ONE_SECOND).until(() -> loop.getMostRecentModel(), is("first97")); loop.dispose(); // then another one loop = factory.startFrom("second"); loop.dispatchEvent(97); await().atMost(Duration.ONE_SECOND).until(() -> loop.getMostRecentModel(), is("second97")); }
@Test public void shouldThrowForEventSourceEventsAfterDispose() throws Exception { FakeEventSource<TestEvent> eventSource = new FakeEventSource<>(); mobiusLoop = MobiusLoop.create( mobiusStore, effectHandler, eventSource, immediateRunner, immediateRunner); observer = new RecordingModelObserver<>(); // to clear out the init from the previous setup mobiusLoop.observe(observer); eventSource.emit(new EventWithSafeEffect("one")); mobiusLoop.dispose(); assertThatThrownBy(() -> eventSource.emit(new EventWithSafeEffect("two"))) .isInstanceOf(IllegalStateException.class); observer.assertStates("init", "init->one"); }
void start() { loop.observe( new Consumer<M>() { @Override public void accept(M model) { actions.postUpdateView(model); } }); }
@Test(expected = IllegalStateException.class) public void dispatchingEventsAfterDisposalThrowsException() throws Exception { mobiusLoop.dispose(); mobiusLoop.dispatchEvent(new TestEvent("2")); }
@Nonnull @Override public M onGetModel() { M model = loop.getMostRecentModel(); return model != null ? model : startModel; } }
@Override @Nonnull public MobiusLoop<M, E, F> startFrom(M startModel) { LoggingInit<M, F> loggingInit = new LoggingInit<>(init, logger); LoggingUpdate<M, E, F> loggingUpdate = new LoggingUpdate<>(update, logger); return MobiusLoop.create( MobiusStore.create(loggingInit, loggingUpdate, checkNotNull(startModel)), effectHandler, eventSource, checkNotNull(eventRunner.get()), checkNotNull(effectRunner.get())); }
@Test public void shouldThrowForEffectHandlerEventsAfterDispose() throws Exception { final FakeEffectHandler effectHandler = new FakeEffectHandler(); setupWithEffects(effectHandler, immediateRunner); effectHandler.emitEvent(new EventWithSafeEffect("good one")); mobiusLoop.dispose(); assertThatThrownBy(() -> effectHandler.emitEvent(new EventWithSafeEffect("bad one"))) .isInstanceOf(IllegalStateException.class); observer.assertStates("init", "init->good one"); }
static <M, E, F> MobiusLoop<M, E, F> create( MobiusStore<M, E, F> store, Connectable<F, E> effectHandler, EventSource<E> eventSource, WorkRunner eventRunner, WorkRunner effectRunner) { return new MobiusLoop<>( new EventProcessor.Factory<>(checkNotNull(store)), checkNotNull(effectHandler), checkNotNull(eventSource), checkNotNull(eventRunner), checkNotNull(effectRunner)); }
@Test public void shouldInstantiateBeginnerWithMinimumParams() throws Exception { MobiusLoop<String, Integer, ?> loop = MobiusExtras.beginnerLoop(BEGINNER_UPDATE).startFrom(MY_MODEL); loop.dispatchEvent(8); await().atMost(Duration.ONE_SECOND).until(() -> loop.getMostRecentModel(), is("start8")); } }
void start() { loop.observe( new Consumer<M>() { @Override public void accept(M model) { actions.postUpdateView(model); } }); }
@Nonnull @Override public M onGetModel() { M model = loop.getMostRecentModel(); return model != null ? model : startModel; } }
@Override @Nonnull public MobiusLoop<M, E, F> startFrom(M startModel) { LoggingInit<M, F> loggingInit = new LoggingInit<>(init, logger); LoggingUpdate<M, E, F> loggingUpdate = new LoggingUpdate<>(update, logger); return MobiusLoop.create( MobiusStore.create(loggingInit, loggingUpdate, checkNotNull(startModel)), effectHandler, eventSource, checkNotNull(eventRunner.get()), checkNotNull(effectRunner.get())); }
static <M, E, F> MobiusLoop<M, E, F> create( MobiusStore<M, E, F> store, Connectable<F, E> effectHandler, EventSource<E> eventSource, WorkRunner eventRunner, WorkRunner effectRunner) { return new MobiusLoop<>( new EventProcessor.Factory<>(checkNotNull(store)), checkNotNull(effectHandler), checkNotNull(eventSource), checkNotNull(eventRunner), checkNotNull(effectRunner)); }
@Test public void shouldSupportCreatingFactory() throws Exception { MobiusLoop.Factory<String, Integer, Boolean> factory = Mobius.loop(UPDATE, HANDLER); loop = factory.startFrom("resume"); loop.dispatchEvent(97); await().atMost(Duration.ONE_SECOND).until(() -> loop.getMostRecentModel(), is("resume97")); }
@Override public void accept(E event) { dispatchEvent(event); } };