package com.lyft.scoop; import java.util.Collections; import java.util.List; import org.junit.Test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; public class RouterTest { private TestRouter router; @Test public void defaultRouter() { TestRouter defaultRouter = new TestRouter(); Screen screenA = new ScreenA(); Screen screenB = new ScreenB(); defaultRouter.goTo(screenA); defaultRouter.goTo(screenB); assertTrue(defaultRouter.goBack()); assertEquals(screenA, defaultRouter.fromPath.get(0)); assertEquals(screenB, defaultRouter.fromPath.get(1)); assertEquals(screenA, defaultRouter.toPath.get(0)); assertEquals(TransitionDirection.EXIT, defaultRouter.direction); } @Test public void goTo() { router = new TestRouter(false); Screen screenA = new ScreenA(); router.goTo(screenA); assertTrue(router.fromPath.isEmpty()); assertEquals(screenA, router.toPath.get(0)); assertEquals(TransitionDirection.ENTER, router.direction); assertEquals(1, router.routeChangeCount); } @Test public void goToSameScreen() { router = new TestRouter(false); Screen screenA = new ScreenA(); Screen screenB = new ScreenA(); router.goTo(screenA); assertEquals(screenA, router.toPath.get(0)); router.goTo(screenB); assertEquals(screenA, router.toPath.get(0)); assertEquals(1, router.routeChangeCount); } @Test public void goBack() { router = new TestRouter(false); Screen screenA = new ScreenA(); Screen screenB = new ScreenB(); router.goTo(screenA); router.goTo(screenB); assertTrue(router.goBack()); assertEquals(screenA, router.fromPath.get(0)); assertEquals(screenB, router.fromPath.get(1)); assertEquals(screenA, router.toPath.get(0)); assertEquals(TransitionDirection.EXIT, router.direction); assertEquals(3, router.routeChangeCount); } @Test public void goBackAllowEmptyStack() { router = new TestRouter(true); Screen screenA = new ScreenA(); router.goTo(screenA); assertTrue(router.goBack()); assertEquals(screenA, router.fromPath.get(0)); assertTrue(router.toPath.isEmpty()); assertEquals(TransitionDirection.EXIT, router.direction); assertEquals(2, router.routeChangeCount); } @Test public void goBackNoScreens() { router = new TestRouter(true); assertFalse(router.goBack()); assertEquals(0, router.routeChangeCount); } @Test public void resetToExisting() { router = new TestRouter(false); Screen screenA = new ScreenA(); Screen screenB = new ScreenB(); router.goTo(screenA); router.goTo(screenB); router.resetTo(screenA); assertEquals(screenA, router.fromPath.get(0)); assertEquals(screenB, router.fromPath.get(1)); assertEquals(screenA, router.toPath.get(0)); assertEquals(TransitionDirection.EXIT, router.direction); checkIfRouterBackstackIsEmpty(); assertEquals(4, router.routeChangeCount); } @Test public void resetToNew() { router = new TestRouter(false); Screen screenA = new ScreenA(); Screen screenB = new ScreenB(); router.goTo(screenB); router.resetTo(screenA); assertEquals(screenB, router.fromPath.get(0)); assertEquals(screenA, router.toPath.get(0)); assertEquals(TransitionDirection.EXIT, router.direction); checkIfRouterBackstackIsEmpty(); assertEquals(3, router.routeChangeCount); } @Test public void replaceWith() { router = new TestRouter(false); Screen screenA = new ScreenA(); Screen screenB = new ScreenB(); router.goTo(screenA); router.replaceWith(screenB); assertEquals(screenA, router.fromPath.get(0)); assertEquals(screenB, router.toPath.get(0)); assertEquals(TransitionDirection.ENTER, router.direction); checkIfRouterBackstackIsEmpty(); assertEquals(3, router.routeChangeCount); } @Test public void replaceAllWith() { router = new TestRouter(false); Screen screenA = new ScreenA(); Screen screenB = new ScreenB(); router.goTo(screenA); router.replaceAllWith(screenA, screenB); assertEquals(screenA, router.fromPath.get(0)); assertEquals(screenA, router.toPath.get(0)); assertEquals(screenB, router.toPath.get(1)); assertEquals(2, router.routeChangeCount); } @Test public void emptyBackstackGoTo() { router = new TestRouter(false); Screen screenA = new ScreenA(); router.goTo(screenA); assertTrue(router.fromPath.isEmpty()); assertEquals(screenA, router.toPath.get(0)); assertEquals(1, router.routeChangeCount); } @Test public void emptyBackstackReplaceWith() { router = new TestRouter(false); Screen screenA = new ScreenA(); router.replaceWith(screenA); assertTrue(router.fromPath.isEmpty()); assertEquals(screenA, router.toPath.get(0)); assertEquals(1, router.routeChangeCount); } @Test public void emptyBackstackResetTo() { router = new TestRouter(false); Screen screenA = new ScreenA(); router.resetTo(screenA); assertTrue(router.fromPath.isEmpty()); assertEquals(screenA, router.toPath.get(0)); assertEquals(1, router.routeChangeCount); } @Test public void replaceToSameScreen() { router = new TestRouter(false); Screen screenA = new ScreenA(); Screen screenB = new ScreenA(); router.replaceWith(screenA); router.replaceWith(screenB); assertTrue(router.fromPath.isEmpty()); assertEquals(screenA, router.toPath.get(0)); assertEquals(1, router.routeChangeCount); } @Test public void hasActiveScreen() { router = new TestRouter(false); Screen screenA = new ScreenA(); router.goTo(screenA); assertTrue(router.hasActiveScreen()); router.goBack(); assertFalse(router.hasActiveScreen()); } @Test public void replaceAllWithEmptyListOnDisallowedEmptyStack() { router = new TestRouter(true); router.replaceAllWith(Collections.<Screen>emptyList()); assertFalse(router.hasActiveScreen()); assertEquals(1, router.routeChangeCount); } private void checkIfRouterBackstackIsEmpty() { assertEquals(false, router.goBack()); } static class ScreenA extends Screen { } static class ScreenB extends Screen { } static class TestRouter extends Router { List<Screen> fromPath; List<Screen> toPath; TransitionDirection direction; int routeChangeCount; public TestRouter(boolean allowEmptyStack) { super(allowEmptyStack); } public TestRouter() { super(); } @Override protected void onRouteChanged(RouteChange routeChange) { routeChangeCount++; fromPath = routeChange.fromPath; toPath = routeChange.toPath; direction = routeChange.direction; } } }