/** * The MIT License (MIT) * Copyright (c) 2012 David Carver * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS * OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ package us.nineworlds.serenity.ui.browser.movie; import static org.fest.assertions.api.Assertions.assertThat; import static org.junit.Assume.assumeFalse; import static org.junit.Assume.assumeTrue; import static org.mockito.Matchers.anyBoolean; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.verify; import java.util.ArrayList; import java.util.List; import javax.inject.Singleton; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import org.robolectric.Robolectric; import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; import us.nineworlds.serenity.R; import us.nineworlds.serenity.core.menus.MenuDrawerItem; import us.nineworlds.serenity.injection.modules.AndroidModule; import us.nineworlds.serenity.injection.modules.SerenityModule; import us.nineworlds.serenity.test.InjectingTest; import us.nineworlds.serenity.widgets.DrawerLayout; import android.content.SharedPreferences; import android.view.Gravity; import android.view.KeyEvent; import android.widget.LinearLayout; import android.widget.ListAdapter; import android.widget.ListView; import dagger.Module; import dagger.Provides; @RunWith(RobolectricTestRunner.class) @Config(emulateSdk = 18) public class MovieBrowserActivityTest extends InjectingTest { @Mock SharedPreferences mockSharedPreferences; MovieBrowserActivity movieBrowserActivity; @Override @Before public void setUp() throws Exception { Robolectric.getBackgroundScheduler().pause(); Robolectric.getUiThreadScheduler().pause(); MockitoAnnotations.initMocks(this); super.setUp(); } @Test public void menuOptionsHasGridView() { movieBrowserActivity = Robolectric .buildActivity(MovieBrowserActivity.class).create().get(); ListView drawerList = (ListView) movieBrowserActivity .findViewById(R.id.left_drawer_list); assertThat(drawerList).isNotNull(); ListAdapter adapter = drawerList.getAdapter(); MenuDrawerItem item = (MenuDrawerItem) adapter.getItem(0); assertThat(item.getText()).isEqualTo("Grid View"); } @Test public void menuOptionsHasDetailView() { movieBrowserActivity = Robolectric .buildActivity(MovieBrowserActivity.class).create().get(); ListView drawerList = (ListView) movieBrowserActivity .findViewById(R.id.left_drawer_list); assertThat(drawerList).isNotNull(); ListAdapter adapter = drawerList.getAdapter(); MenuDrawerItem item = (MenuDrawerItem) adapter.getItem(1); assertThat(item.getText()).isEqualTo("Detail View"); } @Test public void menuOptionsHasPlayAllFromQueue() { movieBrowserActivity = Robolectric .buildActivity(MovieBrowserActivity.class).create().get(); ListView drawerList = (ListView) movieBrowserActivity .findViewById(R.id.left_drawer_list); assertThat(drawerList).isNotNull(); ListAdapter adapter = drawerList.getAdapter(); MenuDrawerItem item = (MenuDrawerItem) adapter.getItem(2); assertThat(item.getText()).isEqualTo("Play All from Queue"); } @Test public void restartCallsPopulateMenuDrawer() { doReturn(true).when(mockSharedPreferences).getBoolean(anyString(), anyBoolean()); movieBrowserActivity = Robolectric .buildActivity(MovieBrowserActivity.class).create().get(); MovieBrowserActivity spyActivity = Mockito.spy(movieBrowserActivity); doNothing().when(spyActivity).populateMenuDrawer(); spyActivity.onRestart(); verify(spyActivity).populateMenuDrawer(); } @Test public void onKeyDownClosesMenuDrawerWhenMenuKeyIsPressed() { doReturn(true).when(mockSharedPreferences).getBoolean( "remote_control_menu", true); movieBrowserActivity = Robolectric .buildActivity(MovieBrowserActivity.class).create().get(); DrawerLayout drawerLayout = (DrawerLayout) movieBrowserActivity .findViewById(R.id.drawer_layout); LinearLayout linearLayout = (LinearLayout) movieBrowserActivity .findViewById(R.id.left_drawer); drawerLayout.openDrawer(linearLayout); movieBrowserActivity.onKeyDown(KeyEvent.KEYCODE_MENU, null); assumeFalse(drawerLayout.isDrawerOpen(linearLayout)); } @Test public void onKeyDownOpensMenuDrawerWhenMenuKeyIsPressed() { doReturn(true).when(mockSharedPreferences).getBoolean( "remote_control_menu", true); movieBrowserActivity = Robolectric .buildActivity(MovieBrowserActivity.class).create().get(); DrawerLayout drawerLayout = (DrawerLayout) movieBrowserActivity .findViewById(R.id.drawer_layout); LinearLayout linearLayout = (LinearLayout) movieBrowserActivity .findViewById(R.id.left_drawer); drawerLayout.openDrawer(linearLayout); movieBrowserActivity.onKeyDown(KeyEvent.KEYCODE_BACK, null); assertThat(drawerLayout.isDrawerOpen(linearLayout)).isTrue(); } @Test public void onKeyDownBackClosesDrawerWhenDrawerIsOpen() { doReturn(false).when(mockSharedPreferences).getBoolean( "remote_control_menu", true); movieBrowserActivity = Robolectric .buildActivity(MovieBrowserActivity.class).create().get(); movieBrowserActivity.onKeyDown(KeyEvent.KEYCODE_MENU, null); DrawerLayout drawerLayout = (DrawerLayout) movieBrowserActivity .findViewById(R.id.drawer_layout); assumeTrue(drawerLayout.isDrawerOpen(Gravity.LEFT)); } @Override public List<Object> getModules() { List<Object> modules = new ArrayList<Object>(); modules.add(new AndroidModule(Robolectric.application)); modules.add(new TestModule()); return modules; } @Module(includes = SerenityModule.class, addsTo = AndroidModule.class, overrides = true, injects = { MovieBrowserActivity.class, MovieBrowserActivityTest.class }) public class TestModule { @Provides @Singleton SharedPreferences providesSharedPreferences() { return mockSharedPreferences; } } }