1b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu/* 2b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu * Copyright (C) 2016 The Android Open Source Project 3b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu * 4b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu * Licensed under the Apache License, Version 2.0 (the "License"); 5b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu * you may not use this file except in compliance with the License. 6b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu * You may obtain a copy of the License at 7b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu * 8b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu * http://www.apache.org/licenses/LICENSE-2.0 9b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu * 10b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu * Unless required by applicable law or agreed to in writing, software 11b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu * distributed under the License is distributed on an "AS IS" BASIS, 12b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu * See the License for the specific language governing permissions and 14b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu * limitations under the License. 15b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu */ 16b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gupackage android.support.v17.leanback.app; 17b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu 183103f63e99d47573823957f7aa34308555873221Aurimas Liutikasimport static org.mockito.Mockito.mock; 193103f63e99d47573823957f7aa34308555873221Aurimas Liutikasimport static org.mockito.Mockito.timeout; 203103f63e99d47573823957f7aa34308555873221Aurimas Liutikasimport static org.mockito.Mockito.verify; 213103f63e99d47573823957f7aa34308555873221Aurimas Liutikasimport static org.mockito.Mockito.when; 223103f63e99d47573823957f7aa34308555873221Aurimas Liutikas 23b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Guimport android.content.Intent; 243103f63e99d47573823957f7aa34308555873221Aurimas Liutikasimport android.support.test.InstrumentationRegistry; 25b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Guimport android.support.test.rule.ActivityTestRule; 26b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Guimport android.support.v17.leanback.R; 273103f63e99d47573823957f7aa34308555873221Aurimas Liutikasimport android.support.v17.leanback.testutils.PollingCheck; 283103f63e99d47573823957f7aa34308555873221Aurimas Liutikasimport android.view.View; 29b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu 30b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Guimport org.junit.Before; 31b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Guimport org.junit.Rule; 32b50e46706ac654b071942bd7f6ba059c14c9c29aDake Guimport org.junit.rules.TestName; 33b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu 34b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu/** 35b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu * @hide from javadoc 36b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu */ 37b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gupublic class GuidedStepFragmentTestBase { 38b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu 39734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu private static final long TIMEOUT = 5000; 40b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu 41b50e46706ac654b071942bd7f6ba059c14c9c29aDake Gu @Rule public TestName mUnitTestName = new TestName(); 42b50e46706ac654b071942bd7f6ba059c14c9c29aDake Gu 43b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu @Rule 443103f63e99d47573823957f7aa34308555873221Aurimas Liutikas public ActivityTestRule<GuidedStepFragmentTestActivity> activityTestRule = 453103f63e99d47573823957f7aa34308555873221Aurimas Liutikas new ActivityTestRule<>(GuidedStepFragmentTestActivity.class, false, false); 46b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu 47b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu @Before 48b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu public void clearTests() { 49b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu GuidedStepTestFragment.clearTests(); 50b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu } 51b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu 52734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu public static class ExpandTransitionFinish extends PollingCheck.PollingCheckCondition { 53734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu GuidedStepTestFragment.Provider mProvider; 54734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu 55734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu public ExpandTransitionFinish(GuidedStepTestFragment.Provider provider) { 56734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu mProvider = provider; 57734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu } 58734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu 59734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu @Override 60734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu public boolean canPreProceed() { 61734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu return false; 62734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu } 63734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu 64734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu @Override 65734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu public boolean canProceed() { 66734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu GuidedStepTestFragment fragment = mProvider.getFragment(); 67b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu if (fragment != null && fragment.getView() != null) { 68734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu if (!fragment.getGuidedActionsStylist().isInExpandTransition()) { 69734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu // expand transition finishes 70734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu return true; 71b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu } 72b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu } 73734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu return false; 74b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu } 75b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu } 76b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu 77734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu public static void waitOnDestroy(GuidedStepTestFragment.Provider provider, 78734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu int times) { 79734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu verify(provider, timeout((int)TIMEOUT).times(times)).onDestroy(); 80734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu } 81734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu 82734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu public static class EnterTransitionFinish extends PollingCheck.PollingCheckCondition { 83734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu PollingCheck.ViewScreenPositionDetector mDector = 84734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu new PollingCheck.ViewScreenPositionDetector(); 85734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu 86734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu GuidedStepTestFragment.Provider mProvider; 87734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu 88734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu public EnterTransitionFinish(GuidedStepTestFragment.Provider provider) { 89734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu mProvider = provider; 90734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu } 91734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu @Override 92734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu public boolean canProceed() { 93734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu GuidedStepTestFragment fragment = mProvider.getFragment(); 94734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu if (fragment != null && fragment.getView() != null) { 95734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu View view = fragment.getView().findViewById(R.id.guidance_title); 96734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu if (view != null) { 97734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu if (mDector.isViewStableOnScreen(view)) { 98734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu return true; 99734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu } 100734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu } 101b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu } 102734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu return false; 103b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu } 104b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu } 105b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu 106b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu public static void sendKey(int keyCode) { 107b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu InstrumentationRegistry.getInstrumentation().sendKeyDownUpSync(keyCode); 108b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu } 109b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu 110b50e46706ac654b071942bd7f6ba059c14c9c29aDake Gu public String generateMethodTestName(String testName) { 111b50e46706ac654b071942bd7f6ba059c14c9c29aDake Gu return mUnitTestName.getMethodName() + "_" + testName; 112b50e46706ac654b071942bd7f6ba059c14c9c29aDake Gu } 113b50e46706ac654b071942bd7f6ba059c14c9c29aDake Gu 114b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu public GuidedStepFragmentTestActivity launchTestActivity(String firstTestName) { 115b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu Intent intent = new Intent(); 116b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu intent.putExtra(GuidedStepFragmentTestActivity.EXTRA_TEST_NAME, firstTestName); 117b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu return activityTestRule.launchActivity(intent); 118b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu } 119b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu 120734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu public GuidedStepFragmentTestActivity launchTestActivity(String firstTestName, 121734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu boolean addAsRoot) { 122734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu Intent intent = new Intent(); 123734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu intent.putExtra(GuidedStepFragmentTestActivity.EXTRA_TEST_NAME, firstTestName); 124734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu intent.putExtra(GuidedStepFragmentTestActivity.EXTRA_ADD_AS_ROOT, addAsRoot); 125734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu return activityTestRule.launchActivity(intent); 126734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu } 127734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu 12826d09ce0e088ef4c69538ead9e7ee79905a047feDake Gu public GuidedStepFragmentTestActivity launchTestActivity(String firstTestName, 12926d09ce0e088ef4c69538ead9e7ee79905a047feDake Gu boolean addAsRoot, int layoutDirection) { 13026d09ce0e088ef4c69538ead9e7ee79905a047feDake Gu Intent intent = new Intent(); 13126d09ce0e088ef4c69538ead9e7ee79905a047feDake Gu intent.putExtra(GuidedStepFragmentTestActivity.EXTRA_TEST_NAME, firstTestName); 13226d09ce0e088ef4c69538ead9e7ee79905a047feDake Gu intent.putExtra(GuidedStepFragmentTestActivity.EXTRA_ADD_AS_ROOT, addAsRoot); 13326d09ce0e088ef4c69538ead9e7ee79905a047feDake Gu intent.putExtra(GuidedStepFragmentTestActivity.EXTRA_LAYOUT_DIRECTION, layoutDirection); 13426d09ce0e088ef4c69538ead9e7ee79905a047feDake Gu return activityTestRule.launchActivity(intent); 13526d09ce0e088ef4c69538ead9e7ee79905a047feDake Gu } 13626d09ce0e088ef4c69538ead9e7ee79905a047feDake Gu 137b50e46706ac654b071942bd7f6ba059c14c9c29aDake Gu public GuidedStepTestFragment.Provider mockProvider(String testName) { 138b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu GuidedStepTestFragment.Provider test = mock(GuidedStepTestFragment.Provider.class); 139b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu when(test.getActivity()).thenCallRealMethod(); 140b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu when(test.getFragmentManager()).thenCallRealMethod(); 141b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu when(test.getFragment()).thenCallRealMethod(); 142b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu GuidedStepTestFragment.setupTest(testName, test); 143b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu return test; 144b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu } 145b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu} 146b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu 147