15031b30272a0178845f88d06adddb204dd833779Yigit Boyar/*
25031b30272a0178845f88d06adddb204dd833779Yigit Boyar * Copyright (C) 2015 The Android Open Source Project
35031b30272a0178845f88d06adddb204dd833779Yigit Boyar *
45031b30272a0178845f88d06adddb204dd833779Yigit Boyar * Licensed under the Apache License, Version 2.0 (the "License");
55031b30272a0178845f88d06adddb204dd833779Yigit Boyar * you may not use this file except in compliance with the License.
65031b30272a0178845f88d06adddb204dd833779Yigit Boyar * You may obtain a copy of the License at
75031b30272a0178845f88d06adddb204dd833779Yigit Boyar *
85031b30272a0178845f88d06adddb204dd833779Yigit Boyar *      http://www.apache.org/licenses/LICENSE-2.0
95031b30272a0178845f88d06adddb204dd833779Yigit Boyar *
105031b30272a0178845f88d06adddb204dd833779Yigit Boyar * Unless required by applicable law or agreed to in writing, software
115031b30272a0178845f88d06adddb204dd833779Yigit Boyar * distributed under the License is distributed on an "AS IS" BASIS,
125031b30272a0178845f88d06adddb204dd833779Yigit Boyar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135031b30272a0178845f88d06adddb204dd833779Yigit Boyar * See the License for the specific language governing permissions and
145031b30272a0178845f88d06adddb204dd833779Yigit Boyar * limitations under the License.
155031b30272a0178845f88d06adddb204dd833779Yigit Boyar */
165031b30272a0178845f88d06adddb204dd833779Yigit Boyar
175031b30272a0178845f88d06adddb204dd833779Yigit Boyarpackage android.support.v7.widget;
185031b30272a0178845f88d06adddb204dd833779Yigit Boyar
198052423a9ffce385de32ae76fa962e6316f03677Aurimas Liutikasimport static org.junit.Assert.assertEquals;
208052423a9ffce385de32ae76fa962e6316f03677Aurimas Liutikasimport static org.junit.Assert.assertFalse;
218052423a9ffce385de32ae76fa962e6316f03677Aurimas Liutikasimport static org.junit.Assert.assertNull;
228052423a9ffce385de32ae76fa962e6316f03677Aurimas Liutikasimport static org.junit.Assert.assertSame;
238052423a9ffce385de32ae76fa962e6316f03677Aurimas Liutikasimport static org.junit.Assert.assertTrue;
245031b30272a0178845f88d06adddb204dd833779Yigit Boyar
258052423a9ffce385de32ae76fa962e6316f03677Aurimas Liutikasimport android.content.Context;
265031b30272a0178845f88d06adddb204dd833779Yigit Boyarimport android.support.test.InstrumentationRegistry;
27754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport android.support.test.filters.SmallTest;
285031b30272a0178845f88d06adddb204dd833779Yigit Boyarimport android.support.test.runner.AndroidJUnit4;
295031b30272a0178845f88d06adddb204dd833779Yigit Boyarimport android.view.View;
305031b30272a0178845f88d06adddb204dd833779Yigit Boyarimport android.view.ViewGroup;
315031b30272a0178845f88d06adddb204dd833779Yigit Boyar
328052423a9ffce385de32ae76fa962e6316f03677Aurimas Liutikasimport org.junit.Before;
338052423a9ffce385de32ae76fa962e6316f03677Aurimas Liutikasimport org.junit.Test;
348052423a9ffce385de32ae76fa962e6316f03677Aurimas Liutikasimport org.junit.runner.RunWith;
358052423a9ffce385de32ae76fa962e6316f03677Aurimas Liutikas
365031b30272a0178845f88d06adddb204dd833779Yigit Boyarimport java.util.ArrayList;
375031b30272a0178845f88d06adddb204dd833779Yigit Boyarimport java.util.List;
385031b30272a0178845f88d06adddb204dd833779Yigit Boyar
395031b30272a0178845f88d06adddb204dd833779Yigit Boyar@RunWith(AndroidJUnit4.class)
40f1b288ec2104488f4a92e911b0ab80c8f0f3e9d1Yigit Boyar@SmallTest
418052423a9ffce385de32ae76fa962e6316f03677Aurimas Liutikaspublic class ChildHelperTest {
425031b30272a0178845f88d06adddb204dd833779Yigit Boyar    LoggingCallback  mLoggingCallback;
435031b30272a0178845f88d06adddb204dd833779Yigit Boyar    ChildHelper mChildHelper;
448052423a9ffce385de32ae76fa962e6316f03677Aurimas Liutikas    Context mContext;
455031b30272a0178845f88d06adddb204dd833779Yigit Boyar
465031b30272a0178845f88d06adddb204dd833779Yigit Boyar    @Before
478052423a9ffce385de32ae76fa962e6316f03677Aurimas Liutikas    public void setup() throws Exception {
488052423a9ffce385de32ae76fa962e6316f03677Aurimas Liutikas        mContext = InstrumentationRegistry.getContext();
495031b30272a0178845f88d06adddb204dd833779Yigit Boyar        mLoggingCallback = new LoggingCallback();
505031b30272a0178845f88d06adddb204dd833779Yigit Boyar        mChildHelper = new ChildHelper(mLoggingCallback);
515031b30272a0178845f88d06adddb204dd833779Yigit Boyar    }
525031b30272a0178845f88d06adddb204dd833779Yigit Boyar
535031b30272a0178845f88d06adddb204dd833779Yigit Boyar    private RecyclerView.ViewHolder vh() {
545031b30272a0178845f88d06adddb204dd833779Yigit Boyar        View view = new View(mContext);
555031b30272a0178845f88d06adddb204dd833779Yigit Boyar        RecyclerViewBasicTest.MockViewHolder mockViewHolder
565031b30272a0178845f88d06adddb204dd833779Yigit Boyar                = new RecyclerViewBasicTest.MockViewHolder(view);
575031b30272a0178845f88d06adddb204dd833779Yigit Boyar        RecyclerView.LayoutParams lp = new RecyclerView.LayoutParams(0 , 0);
585031b30272a0178845f88d06adddb204dd833779Yigit Boyar        lp.mViewHolder = mockViewHolder;
595031b30272a0178845f88d06adddb204dd833779Yigit Boyar        view.setLayoutParams(lp);
605031b30272a0178845f88d06adddb204dd833779Yigit Boyar        return mockViewHolder;
615031b30272a0178845f88d06adddb204dd833779Yigit Boyar    }
625031b30272a0178845f88d06adddb204dd833779Yigit Boyar
635031b30272a0178845f88d06adddb204dd833779Yigit Boyar    @Test
640a017072206f93474ccd2706e7983c2ff778b904Yigit Boyar    public void addChild() {
655031b30272a0178845f88d06adddb204dd833779Yigit Boyar        RecyclerView.ViewHolder vh = vh();
665031b30272a0178845f88d06adddb204dd833779Yigit Boyar        mChildHelper.addView(vh.itemView, false);
675031b30272a0178845f88d06adddb204dd833779Yigit Boyar        assertEquals(1, mLoggingCallback.getChildCount());
685031b30272a0178845f88d06adddb204dd833779Yigit Boyar        assertFalse(mChildHelper.isHidden(vh.itemView));
695031b30272a0178845f88d06adddb204dd833779Yigit Boyar        assertEquals(0, mLoggingCallback.mOnEnteredHiddenState.size());
705031b30272a0178845f88d06adddb204dd833779Yigit Boyar    }
715031b30272a0178845f88d06adddb204dd833779Yigit Boyar
725031b30272a0178845f88d06adddb204dd833779Yigit Boyar    @Test
730a017072206f93474ccd2706e7983c2ff778b904Yigit Boyar    public void addChildHidden() {
745031b30272a0178845f88d06adddb204dd833779Yigit Boyar        RecyclerView.ViewHolder vh = vh();
755031b30272a0178845f88d06adddb204dd833779Yigit Boyar        mChildHelper.addView(vh.itemView, true);
765031b30272a0178845f88d06adddb204dd833779Yigit Boyar        assertEquals(1, mLoggingCallback.getChildCount());
775031b30272a0178845f88d06adddb204dd833779Yigit Boyar        assertTrue(mChildHelper.isHidden(vh.itemView));
785031b30272a0178845f88d06adddb204dd833779Yigit Boyar        assertTrue(mLoggingCallback.mOnEnteredHiddenState.contains(vh.itemView));
795031b30272a0178845f88d06adddb204dd833779Yigit Boyar    }
805031b30272a0178845f88d06adddb204dd833779Yigit Boyar
815031b30272a0178845f88d06adddb204dd833779Yigit Boyar    @Test
820a017072206f93474ccd2706e7983c2ff778b904Yigit Boyar    public void addChildAndHide() {
835031b30272a0178845f88d06adddb204dd833779Yigit Boyar        RecyclerView.ViewHolder vh = vh();
845031b30272a0178845f88d06adddb204dd833779Yigit Boyar        mChildHelper.addView(vh.itemView, false);
855031b30272a0178845f88d06adddb204dd833779Yigit Boyar        mChildHelper.hide(vh.itemView);
865031b30272a0178845f88d06adddb204dd833779Yigit Boyar        assertTrue(mChildHelper.isHidden(vh.itemView));
875031b30272a0178845f88d06adddb204dd833779Yigit Boyar        mChildHelper.unhide(vh.itemView);
885031b30272a0178845f88d06adddb204dd833779Yigit Boyar        assertFalse(mChildHelper.isHidden(vh.itemView));
895031b30272a0178845f88d06adddb204dd833779Yigit Boyar    }
905031b30272a0178845f88d06adddb204dd833779Yigit Boyar
915031b30272a0178845f88d06adddb204dd833779Yigit Boyar    @Test
920a017072206f93474ccd2706e7983c2ff778b904Yigit Boyar    public void findHiddenNonRemoved() {
935031b30272a0178845f88d06adddb204dd833779Yigit Boyar        RecyclerView.ViewHolder vh = vh();
945031b30272a0178845f88d06adddb204dd833779Yigit Boyar        vh.mPosition = 12;
955031b30272a0178845f88d06adddb204dd833779Yigit Boyar        mChildHelper.addView(vh.itemView, true);
96a491891f854a05f1ffb979c73e245f0adc58af58Chris Craik        assertSame(vh.itemView, mChildHelper.findHiddenNonRemovedView(12));
975031b30272a0178845f88d06adddb204dd833779Yigit Boyar    }
985031b30272a0178845f88d06adddb204dd833779Yigit Boyar
995031b30272a0178845f88d06adddb204dd833779Yigit Boyar    @Test
1000a017072206f93474ccd2706e7983c2ff778b904Yigit Boyar    public void findHiddenRemoved() {
1015031b30272a0178845f88d06adddb204dd833779Yigit Boyar        RecyclerView.ViewHolder vh = vh();
1025031b30272a0178845f88d06adddb204dd833779Yigit Boyar        vh.mPosition = 12;
1035031b30272a0178845f88d06adddb204dd833779Yigit Boyar        vh.addFlags(RecyclerView.ViewHolder.FLAG_REMOVED);
1045031b30272a0178845f88d06adddb204dd833779Yigit Boyar        mChildHelper.addView(vh.itemView, true);
105a491891f854a05f1ffb979c73e245f0adc58af58Chris Craik        assertNull(mChildHelper.findHiddenNonRemovedView(12));
1065031b30272a0178845f88d06adddb204dd833779Yigit Boyar    }
1075031b30272a0178845f88d06adddb204dd833779Yigit Boyar
1085031b30272a0178845f88d06adddb204dd833779Yigit Boyar    private static class LoggingCallback implements ChildHelper.Callback {
1095031b30272a0178845f88d06adddb204dd833779Yigit Boyar        List<View> mViews = new ArrayList<>();
1105031b30272a0178845f88d06adddb204dd833779Yigit Boyar        List<View> mDetached = new ArrayList<>();
1115031b30272a0178845f88d06adddb204dd833779Yigit Boyar        List<View> mOnEnteredHiddenState = new ArrayList<>();
1125031b30272a0178845f88d06adddb204dd833779Yigit Boyar        List<View> mOnExitedHiddenState = new ArrayList<>();
1135031b30272a0178845f88d06adddb204dd833779Yigit Boyar        @Override
1145031b30272a0178845f88d06adddb204dd833779Yigit Boyar        public int getChildCount() {
1155031b30272a0178845f88d06adddb204dd833779Yigit Boyar            return mViews.size();
1165031b30272a0178845f88d06adddb204dd833779Yigit Boyar        }
1175031b30272a0178845f88d06adddb204dd833779Yigit Boyar
1185031b30272a0178845f88d06adddb204dd833779Yigit Boyar        @Override
1195031b30272a0178845f88d06adddb204dd833779Yigit Boyar        public void addView(View child, int index) {
1205031b30272a0178845f88d06adddb204dd833779Yigit Boyar            mViews.add(index, child);
1215031b30272a0178845f88d06adddb204dd833779Yigit Boyar        }
1225031b30272a0178845f88d06adddb204dd833779Yigit Boyar
1235031b30272a0178845f88d06adddb204dd833779Yigit Boyar        @Override
1245031b30272a0178845f88d06adddb204dd833779Yigit Boyar        public int indexOfChild(View view) {
1255031b30272a0178845f88d06adddb204dd833779Yigit Boyar            return mViews.indexOf(view);
1265031b30272a0178845f88d06adddb204dd833779Yigit Boyar        }
1275031b30272a0178845f88d06adddb204dd833779Yigit Boyar
1285031b30272a0178845f88d06adddb204dd833779Yigit Boyar        private boolean validateIndex(int index) {
1295031b30272a0178845f88d06adddb204dd833779Yigit Boyar            return index < getChildCount() && index >= 0;
1305031b30272a0178845f88d06adddb204dd833779Yigit Boyar        }
1315031b30272a0178845f88d06adddb204dd833779Yigit Boyar
1325031b30272a0178845f88d06adddb204dd833779Yigit Boyar        @Override
1335031b30272a0178845f88d06adddb204dd833779Yigit Boyar        public void removeViewAt(int index) {
1345031b30272a0178845f88d06adddb204dd833779Yigit Boyar            if (validateIndex(index)) {
1355031b30272a0178845f88d06adddb204dd833779Yigit Boyar                mViews.remove(index);
1365031b30272a0178845f88d06adddb204dd833779Yigit Boyar            }
1375031b30272a0178845f88d06adddb204dd833779Yigit Boyar        }
1385031b30272a0178845f88d06adddb204dd833779Yigit Boyar
1395031b30272a0178845f88d06adddb204dd833779Yigit Boyar        @Override
1405031b30272a0178845f88d06adddb204dd833779Yigit Boyar        public View getChildAt(int offset) {
1415031b30272a0178845f88d06adddb204dd833779Yigit Boyar            if (validateIndex(offset)) {
1425031b30272a0178845f88d06adddb204dd833779Yigit Boyar                return mViews.remove(offset);
1435031b30272a0178845f88d06adddb204dd833779Yigit Boyar            }
1445031b30272a0178845f88d06adddb204dd833779Yigit Boyar            return null;
1455031b30272a0178845f88d06adddb204dd833779Yigit Boyar        }
1465031b30272a0178845f88d06adddb204dd833779Yigit Boyar
1475031b30272a0178845f88d06adddb204dd833779Yigit Boyar        @Override
1485031b30272a0178845f88d06adddb204dd833779Yigit Boyar        public void removeAllViews() {
1495031b30272a0178845f88d06adddb204dd833779Yigit Boyar            mViews.clear();
1505031b30272a0178845f88d06adddb204dd833779Yigit Boyar        }
1515031b30272a0178845f88d06adddb204dd833779Yigit Boyar
1525031b30272a0178845f88d06adddb204dd833779Yigit Boyar        @Override
1535031b30272a0178845f88d06adddb204dd833779Yigit Boyar        public RecyclerView.ViewHolder getChildViewHolder(View view) {
1545031b30272a0178845f88d06adddb204dd833779Yigit Boyar            return RecyclerView.getChildViewHolderInt(view);
1555031b30272a0178845f88d06adddb204dd833779Yigit Boyar        }
1565031b30272a0178845f88d06adddb204dd833779Yigit Boyar
1575031b30272a0178845f88d06adddb204dd833779Yigit Boyar        @Override
1585031b30272a0178845f88d06adddb204dd833779Yigit Boyar        public void attachViewToParent(View child, int index, ViewGroup.LayoutParams layoutParams) {
1595031b30272a0178845f88d06adddb204dd833779Yigit Boyar            assertTrue(mDetached.remove(child));
1605031b30272a0178845f88d06adddb204dd833779Yigit Boyar            addView(child, index);
1615031b30272a0178845f88d06adddb204dd833779Yigit Boyar        }
1625031b30272a0178845f88d06adddb204dd833779Yigit Boyar
1635031b30272a0178845f88d06adddb204dd833779Yigit Boyar        @Override
1645031b30272a0178845f88d06adddb204dd833779Yigit Boyar        public void detachViewFromParent(int offset) {
1655031b30272a0178845f88d06adddb204dd833779Yigit Boyar            mDetached.add(getChildAt(offset));
1665031b30272a0178845f88d06adddb204dd833779Yigit Boyar        }
1675031b30272a0178845f88d06adddb204dd833779Yigit Boyar
1685031b30272a0178845f88d06adddb204dd833779Yigit Boyar        @Override
1695031b30272a0178845f88d06adddb204dd833779Yigit Boyar        public void onEnteredHiddenState(View child) {
1705031b30272a0178845f88d06adddb204dd833779Yigit Boyar            mOnEnteredHiddenState.add(child);
1715031b30272a0178845f88d06adddb204dd833779Yigit Boyar        }
1725031b30272a0178845f88d06adddb204dd833779Yigit Boyar
1735031b30272a0178845f88d06adddb204dd833779Yigit Boyar        @Override
1745031b30272a0178845f88d06adddb204dd833779Yigit Boyar        public void onLeftHiddenState(View child) {
1755031b30272a0178845f88d06adddb204dd833779Yigit Boyar            mOnExitedHiddenState.add(child);
1765031b30272a0178845f88d06adddb204dd833779Yigit Boyar        }
1775031b30272a0178845f88d06adddb204dd833779Yigit Boyar    }
1785031b30272a0178845f88d06adddb204dd833779Yigit Boyar}
179