package org.tessell.tests.presenter; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; import static org.junit.Assert.fail; import org.junit.Test; import org.tessell.gwt.user.client.ui.IsWidget; import org.tessell.presenter.BasicPresenter; import org.tessell.presenter.Presenter; import org.tessell.presenter.Slot; public class SlotTest { @Test public void doubleDisplayDoesNotUnbind() { final ChildPresenter child = new ChildPresenter(); final ParentPresenter p = new ParentPresenter(child); assertThat(child.wasBound, is(false)); // Just binding does not set current p.bind(); assertThat(child.wasBound, is(true)); assertThat(p.getCurrent(), is((Presenter) null)); // child.revealDisplay(); p.set(child); assertThat(child.wasBound, is(true)); assertThat(child.wasUnbound, is(false)); assertThat(p.getCurrent(), is((Presenter) child)); // 2nd time we're still current // child.revealDisplay(); p.set(child); assertThat(child.wasBound, is(true)); assertThat(child.wasUnbound, is(false)); assertThat(p.getCurrent(), is((Presenter) child)); } @Test public void twoChildren() { final ChildPresenter c1 = new ChildPresenter(); final ChildPresenter c2 = new ChildPresenter(); final ChildPresenter c1b = new ChildPresenter(); final ParentPresenter p = new ParentPresenter(c1, c2); p.bind(); assertThat(p.getCurrent(), is((Presenter) null)); // c1.revealDisplay(); p.set(c1); assertThat(p.getCurrent(), is((Presenter) c1)); // c2.revealDisplay(); p.set(c2); assertThat(p.getCurrent(), is((Presenter) c2)); // cannot reuse c1 try { p.set(c1); fail(); } catch (final IllegalStateException ise) { assertThat(ise.getMessage().startsWith("This instance has already been unbound"), is(true)); } // c1.revealDisplay(); p.set(c1b); assertThat(p.getCurrent(), is((Presenter) c1b)); } public class ParentPresenter extends BasicPresenter<IsWidget> { private final Slot<Presenter> current = new Slot<Presenter>(this); public ParentPresenter(final Presenter... children) { super(null); for (final Presenter child : children) { addPresenter(child); } } public void set(final Presenter presenter) { current.set(presenter); } public Presenter getCurrent() { return current.get(); } } public class ChildPresenter extends BasicPresenter<IsWidget> { public boolean wasBound = false; public boolean wasUnbound = false; public ChildPresenter() { super(null); } @Override public void onBind() { super.onBind(); wasBound = true; } @Override public void onUnbind() { super.onUnbind(); wasUnbound = true; } } }