/* * Copyright (C) 2015 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.tv.menu; import static androidx.test.InstrumentationRegistry.getTargetContext; import static com.google.common.truth.Truth.assertWithMessage; import static org.mockito.Mockito.any; import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.eq; import static org.mockito.Mockito.isNull; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; import com.android.tv.menu.Menu.OnMenuVisibilityChangeListener; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mockito; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; /** Tests for {@link Menu}. */ @SmallTest @RunWith(AndroidJUnit4.class) public class MenuTest { private Menu mMenu; private IMenuView mMenuView; private OnMenuVisibilityChangeListener mVisibilityChangeListener; @Before public void setUp() { mMenuView = Mockito.mock(IMenuView.class); MenuRowFactory factory = Mockito.mock(MenuRowFactory.class); when(factory.createMenuRow( any(Menu.class), any(Class.class))) .thenReturn(null); mVisibilityChangeListener = Mockito.mock(OnMenuVisibilityChangeListener.class); mMenu = new Menu(getTargetContext(), mMenuView, factory, mVisibilityChangeListener); mMenu.disableAnimationForTest(); } @Ignore("b/73727914") @Test public void testScheduleHide() { mMenu.show(Menu.REASON_NONE); setMenuVisible(true); assertWithMessage("Hide is not scheduled").that(mMenu.isHideScheduled()).isTrue(); mMenu.hide(false); setMenuVisible(false); assertWithMessage("Hide is scheduled").that(mMenu.isHideScheduled()).isFalse(); mMenu.setKeepVisible(true); mMenu.show(Menu.REASON_NONE); setMenuVisible(true); assertWithMessage("Hide is scheduled").that(mMenu.isHideScheduled()).isFalse(); mMenu.setKeepVisible(false); assertWithMessage("Hide is not scheduled").that(mMenu.isHideScheduled()).isTrue(); mMenu.setKeepVisible(true); assertWithMessage("Hide is scheduled").that(mMenu.isHideScheduled()).isFalse(); mMenu.hide(false); setMenuVisible(false); assertWithMessage("Hide is scheduled").that(mMenu.isHideScheduled()).isFalse(); } @Test public void testShowHide_ReasonNone() { // Show with REASON_NONE mMenu.show(Menu.REASON_NONE); setMenuVisible(true); // Listener should be called with "true" argument. verify(mVisibilityChangeListener, atLeastOnce()) .onMenuVisibilityChange(eq(true)); verify(mVisibilityChangeListener, never()) .onMenuVisibilityChange(eq(false)); // IMenuView.show should be called with the same parameter. verify(mMenuView) .onShow( eq(Menu.REASON_NONE), isNull(), isNull()); mMenu.hide(true); setMenuVisible(false); // Listener should be called with "false" argument. verify(mVisibilityChangeListener, atLeastOnce()) .onMenuVisibilityChange(eq(false)); verify(mMenuView).onHide(); } @Test public void testShowHide_ReasonGuide() { // Show with REASON_GUIDE mMenu.show(Menu.REASON_GUIDE); setMenuVisible(true); // Listener should be called with "true" argument. verify(mVisibilityChangeListener, atLeastOnce()) .onMenuVisibilityChange(eq(true)); verify(mVisibilityChangeListener, never()) .onMenuVisibilityChange(eq(false)); // IMenuView.show should be called with the same parameter. verify(mMenuView) .onShow( eq(Menu.REASON_GUIDE), eq(ChannelsRow.ID), isNull()); mMenu.hide(false); setMenuVisible(false); // Listener should be called with "false" argument. verify(mVisibilityChangeListener, atLeastOnce()) .onMenuVisibilityChange(eq(false)); verify(mMenuView).onHide(); } @Test public void testShowHide_ReasonPlayControlsFastForward() { // Show with REASON_PLAY_CONTROLS_FAST_FORWARD mMenu.show(Menu.REASON_PLAY_CONTROLS_FAST_FORWARD); setMenuVisible(true); // Listener should be called with "true" argument. verify(mVisibilityChangeListener, atLeastOnce()) .onMenuVisibilityChange(eq(true)); verify(mVisibilityChangeListener, never()) .onMenuVisibilityChange(eq(false)); // IMenuView.show should be called with the same parameter. verify(mMenuView) .onShow( eq(Menu.REASON_PLAY_CONTROLS_FAST_FORWARD), eq(PlayControlsRow.ID), isNull()); mMenu.hide(false); setMenuVisible(false); // Listener should be called with "false" argument. verify(mVisibilityChangeListener, atLeastOnce()) .onMenuVisibilityChange(eq(false)); verify(mMenuView).onHide(); } private void setMenuVisible(final boolean visible) { when(mMenuView.isVisible()) .thenAnswer( new Answer() { @Override public Boolean answer(InvocationOnMock invocation) throws Throwable { return visible; } }); } }