14ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar/*
24ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar * Copyright (C) 2014 The Android Open Source Project
34ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar *
44ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar * Licensed under the Apache License, Version 2.0 (the "License");
54ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar * you may not use this file except in compliance with the License.
64ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar * You may obtain a copy of the License at
74ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar *
84ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar *      http://www.apache.org/licenses/LICENSE-2.0
94ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar *
104ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar * Unless required by applicable law or agreed to in writing, software
114ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar * distributed under the License is distributed on an "AS IS" BASIS,
124ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar * See the License for the specific language governing permissions and
144ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar * limitations under the License.
154ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar */
164ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyarpackage android.support.v4.widget;
174ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar
184ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyarimport android.content.Context;
194ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyarimport android.test.AndroidTestCase;
2048e3efd2e7bc8057212d3936a239838ecf6e40a9Yigit Boyarimport android.util.Log;
2148e3efd2e7bc8057212d3936a239838ecf6e40a9Yigit Boyarimport android.view.animation.AnimationUtils;
224ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyarimport android.view.animation.Interpolator;
2348e3efd2e7bc8057212d3936a239838ecf6e40a9Yigit Boyarimport android.view.animation.LinearInterpolator;
244ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar
254ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyarimport java.lang.reflect.Constructor;
2648e3efd2e7bc8057212d3936a239838ecf6e40a9Yigit Boyarimport java.lang.reflect.Field;
2748e3efd2e7bc8057212d3936a239838ecf6e40a9Yigit Boyarimport java.lang.reflect.InvocationTargetException;
284ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar
294ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyarabstract public class ScrollerCompatTestBase extends AndroidTestCase {
304ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar
3148e3efd2e7bc8057212d3936a239838ecf6e40a9Yigit Boyar    private static final boolean DEBUG = false;
3248e3efd2e7bc8057212d3936a239838ecf6e40a9Yigit Boyar
3348e3efd2e7bc8057212d3936a239838ecf6e40a9Yigit Boyar    private final String TAG;
3448e3efd2e7bc8057212d3936a239838ecf6e40a9Yigit Boyar
354ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar    private final int mApiLevel;
364ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar
374ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar    private ScrollerCompat mScroller;
384ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar
394ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar    public ScrollerCompatTestBase(int apiLevel) {
404ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar        mApiLevel = apiLevel;
4148e3efd2e7bc8057212d3936a239838ecf6e40a9Yigit Boyar        TAG = "ScrollerCompatTest api:" + apiLevel;
424ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar    }
434ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar
4448e3efd2e7bc8057212d3936a239838ecf6e40a9Yigit Boyar    protected void createScroller(Interpolator interpolator)
4548e3efd2e7bc8057212d3936a239838ecf6e40a9Yigit Boyar            throws NoSuchMethodException, IllegalAccessException, InvocationTargetException,
4648e3efd2e7bc8057212d3936a239838ecf6e40a9Yigit Boyar            InstantiationException {
474ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar        Constructor<ScrollerCompat> constructor = ScrollerCompat.class
484ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar                .getDeclaredConstructor(int.class, Context.class, Interpolator.class);
494ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar        constructor.setAccessible(true);
5048e3efd2e7bc8057212d3936a239838ecf6e40a9Yigit Boyar        mScroller = constructor.newInstance(mApiLevel, getContext(), interpolator);
514ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar    }
524ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar
5348e3efd2e7bc8057212d3936a239838ecf6e40a9Yigit Boyar    public void testTargetReached() throws Throwable {
5448e3efd2e7bc8057212d3936a239838ecf6e40a9Yigit Boyar        if (DEBUG) {
5548e3efd2e7bc8057212d3936a239838ecf6e40a9Yigit Boyar            Log.d(TAG, "testing if target is reached");
5648e3efd2e7bc8057212d3936a239838ecf6e40a9Yigit Boyar        }
5748e3efd2e7bc8057212d3936a239838ecf6e40a9Yigit Boyar        createScroller(null);
584ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar        mScroller.fling(0, 0, 0, 1000,
594ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar                Integer.MIN_VALUE, Integer.MAX_VALUE, Integer.MIN_VALUE, Integer.MAX_VALUE);
604ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar        int target = mScroller.getFinalY();
614ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar        while (mScroller.computeScrollOffset()) {
624ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar            Thread.sleep(100);
634ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar        }
644ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar        assertEquals("given enough time, scroller should reach target position", target,
654ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar                mScroller.getCurrY());
664ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar    }
674ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar
6848e3efd2e7bc8057212d3936a239838ecf6e40a9Yigit Boyar    public void testAbort() throws Throwable {
6948e3efd2e7bc8057212d3936a239838ecf6e40a9Yigit Boyar        if (DEBUG) {
7048e3efd2e7bc8057212d3936a239838ecf6e40a9Yigit Boyar            Log.d(TAG, "testing abort");
7148e3efd2e7bc8057212d3936a239838ecf6e40a9Yigit Boyar        }
7248e3efd2e7bc8057212d3936a239838ecf6e40a9Yigit Boyar        createScroller(null);
734ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar        mScroller.fling(0, 0, 0, 10000,
744ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar                Integer.MIN_VALUE, Integer.MAX_VALUE, Integer.MIN_VALUE, Integer.MAX_VALUE);
754ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar        assertTrue("Scroller should have some offset", mScroller.computeScrollOffset());
764ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar        mScroller.abortAnimation();
774ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar        assertFalse("Scroller should clear offset after being aborted",
784ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar                mScroller.computeScrollOffset());
794ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar    }
804ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar}
81