ObjectAdapterTest.java revision 08a38559a3751252fc8a1f36db0a431508a8f7d5
18f2085a2ea231e3d81232b54a44be78eacbdbd61Dake Gu/*
28f2085a2ea231e3d81232b54a44be78eacbdbd61Dake Gu * Copyright (C) 2017 The Android Open Source Project
38f2085a2ea231e3d81232b54a44be78eacbdbd61Dake Gu *
48f2085a2ea231e3d81232b54a44be78eacbdbd61Dake Gu * Licensed under the Apache License, Version 2.0 (the "License");
58f2085a2ea231e3d81232b54a44be78eacbdbd61Dake Gu * you may not use this file except in compliance with the License.
68f2085a2ea231e3d81232b54a44be78eacbdbd61Dake Gu * You may obtain a copy of the License at
78f2085a2ea231e3d81232b54a44be78eacbdbd61Dake Gu *
88f2085a2ea231e3d81232b54a44be78eacbdbd61Dake Gu *      http://www.apache.org/licenses/LICENSE-2.0
98f2085a2ea231e3d81232b54a44be78eacbdbd61Dake Gu *
108f2085a2ea231e3d81232b54a44be78eacbdbd61Dake Gu * Unless required by applicable law or agreed to in writing, software
118f2085a2ea231e3d81232b54a44be78eacbdbd61Dake Gu * distributed under the License is distributed on an "AS IS" BASIS,
128f2085a2ea231e3d81232b54a44be78eacbdbd61Dake Gu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138f2085a2ea231e3d81232b54a44be78eacbdbd61Dake Gu * See the License for the specific language governing permissions and
148f2085a2ea231e3d81232b54a44be78eacbdbd61Dake Gu * limitations under the License.
158f2085a2ea231e3d81232b54a44be78eacbdbd61Dake Gu */
168f2085a2ea231e3d81232b54a44be78eacbdbd61Dake Gu
178f2085a2ea231e3d81232b54a44be78eacbdbd61Dake Gupackage android.support.v17.leanback.widget;
188f2085a2ea231e3d81232b54a44be78eacbdbd61Dake Gu
198f2085a2ea231e3d81232b54a44be78eacbdbd61Dake Guimport static org.junit.Assert.assertEquals;
2057ac90cf3fc528ac56b6b83718541624173b1368jingjiangliimport static org.junit.Assert.assertTrue;
2157ac90cf3fc528ac56b6b83718541624173b1368jingjiangliimport static org.mockito.ArgumentMatchers.any;
2257ac90cf3fc528ac56b6b83718541624173b1368jingjiangliimport static org.mockito.ArgumentMatchers.anyInt;
2308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangliimport static org.mockito.ArgumentMatchers.eq;
2408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangliimport static org.mockito.Mockito.atLeast;
2557ac90cf3fc528ac56b6b83718541624173b1368jingjiangliimport static org.mockito.Mockito.never;
268f2085a2ea231e3d81232b54a44be78eacbdbd61Dake Gu
2708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangliimport android.content.Context;
2808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangliimport android.os.Bundle;
2908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangliimport android.support.annotation.Nullable;
3008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangliimport android.support.test.InstrumentationRegistry;
318f2085a2ea231e3d81232b54a44be78eacbdbd61Dake Guimport android.support.test.filters.SmallTest;
3208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangliimport android.support.v17.leanback.R;
338f2085a2ea231e3d81232b54a44be78eacbdbd61Dake Guimport android.support.v7.widget.RecyclerView;
3408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangliimport android.view.View;
3508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangliimport android.view.ViewGroup;
3608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangliimport android.widget.FrameLayout;
378f2085a2ea231e3d81232b54a44be78eacbdbd61Dake Gu
3808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangliimport org.junit.Before;
398f2085a2ea231e3d81232b54a44be78eacbdbd61Dake Guimport org.junit.Test;
408f2085a2ea231e3d81232b54a44be78eacbdbd61Dake Guimport org.junit.runner.RunWith;
418f2085a2ea231e3d81232b54a44be78eacbdbd61Dake Guimport org.junit.runners.JUnit4;
428f2085a2ea231e3d81232b54a44be78eacbdbd61Dake Guimport org.mockito.Mockito;
438f2085a2ea231e3d81232b54a44be78eacbdbd61Dake Gu
448f2085a2ea231e3d81232b54a44be78eacbdbd61Dake Guimport java.util.ArrayList;
4508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangliimport java.util.List;
468f2085a2ea231e3d81232b54a44be78eacbdbd61Dake Gu
478f2085a2ea231e3d81232b54a44be78eacbdbd61Dake Gu@SmallTest
488f2085a2ea231e3d81232b54a44be78eacbdbd61Dake Gu@RunWith(JUnit4.class)
498f2085a2ea231e3d81232b54a44be78eacbdbd61Dake Gupublic class ObjectAdapterTest {
508f2085a2ea231e3d81232b54a44be78eacbdbd61Dake Gu
5108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    private static final String ID = "id";
5208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    private static final String STRING_MEMBER_ONE = "stringMemberOne";
5308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    private static final String STRING_MEMBER_TWO = "stringMemberTwo";
5408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    private static final String NOT_RELATED_STRING_MEMBER = "notRelatedStringMember";
5508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
568f2085a2ea231e3d81232b54a44be78eacbdbd61Dake Gu    protected ItemBridgeAdapter mBridgeAdapter;
5708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    protected ArrayObjectAdapter mAdapter;
588f2085a2ea231e3d81232b54a44be78eacbdbd61Dake Gu
5908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    private ArrayList mItems;
6008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    private DiffCallback<AdapterItem> mMockedCallback;
6108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    private DiffCallback<AdapterItem> mCallbackWithoutPayload;
6208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    private RecyclerView.AdapterDataObserver mObserver;
6308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
6408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    private Context mContext;
6508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    private ListRowPresenter mListRowPresenter;
6608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    private ListRowPresenter.ViewHolder mListVh;
6708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    private ArrayObjectAdapter mRowsAdapter;
6808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    private AdapterItemPresenter mAdapterItemPresenter;
6908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
7008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    private ListRow mRow;
718f2085a2ea231e3d81232b54a44be78eacbdbd61Dake Gu
7208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    /**
7308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     * This type is used to test setItems() API.
7408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     */
7508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    private static class AdapterItem {
7657ac90cf3fc528ac56b6b83718541624173b1368jingjiangli        private int mId;
7708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        private String mStringMemberOne;
7857ac90cf3fc528ac56b6b83718541624173b1368jingjiangli
7908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // mStringMemberTwo is only used to test if correct payload can be generated.
8008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        private String mStringMemberTwo;
8108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
8208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // not related string will not impact the result of our equals function.
8308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // Used to verify if payload computing process still honor the rule set by
8408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // areContentsTheSame() method
8508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        private String mNotRelatedStringMember;
8608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
8708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        AdapterItem(int id, String stringMemberOne) {
8808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli            mId = id;
8908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli            mStringMemberOne = stringMemberOne;
9008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli            mStringMemberTwo = "";
9108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli            mNotRelatedStringMember = "";
9208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        }
9308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
9408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        AdapterItem(int id, String stringMemberOne, String stringMemberTwo) {
9508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli            mId = id;
9608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli            mStringMemberOne = stringMemberOne;
9708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli            mStringMemberTwo = stringMemberTwo;
9808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli            mNotRelatedStringMember = "";
9908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        }
10008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
10108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        AdapterItem(int id, String stringMemberOne, String stringMemberTwo,
10208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli                String notRelatedStringMember) {
10308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli            mId = id;
10408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli            mStringMemberOne = stringMemberOne;
10508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli            mStringMemberTwo = stringMemberTwo;
10608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli            mNotRelatedStringMember = notRelatedStringMember;
10757ac90cf3fc528ac56b6b83718541624173b1368jingjiangli        }
10857ac90cf3fc528ac56b6b83718541624173b1368jingjiangli
10957ac90cf3fc528ac56b6b83718541624173b1368jingjiangli        public int getId() {
11057ac90cf3fc528ac56b6b83718541624173b1368jingjiangli            return mId;
11157ac90cf3fc528ac56b6b83718541624173b1368jingjiangli        }
11257ac90cf3fc528ac56b6b83718541624173b1368jingjiangli
11308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        public String getStringMemberOne() {
11408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli            return mStringMemberOne;
11508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        }
11608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
11708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        public String getStringMemberTwo() {
11808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli            return mStringMemberTwo;
11908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        }
12008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
12108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        public String getNotRelatedStringMember() {
12208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli            return mNotRelatedStringMember;
12308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        }
12408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
12557ac90cf3fc528ac56b6b83718541624173b1368jingjiangli        @Override
12657ac90cf3fc528ac56b6b83718541624173b1368jingjiangli        public boolean equals(Object o) {
12757ac90cf3fc528ac56b6b83718541624173b1368jingjiangli            if (this == o) return true;
12857ac90cf3fc528ac56b6b83718541624173b1368jingjiangli            if (o == null || getClass() != o.getClass()) return false;
12957ac90cf3fc528ac56b6b83718541624173b1368jingjiangli
13008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli            AdapterItem that = (AdapterItem) o;
13157ac90cf3fc528ac56b6b83718541624173b1368jingjiangli
13208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli            if (mId != that.mId) return false;
13308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli            if (mStringMemberOne != null ? !mStringMemberOne.equals(that.mStringMemberOne)
13408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli                    : that.mStringMemberOne != null) {
13508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli                return false;
13608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli            }
13708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli            return mStringMemberTwo != null ? mStringMemberTwo.equals(that.mStringMemberTwo)
13808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli                    : that.mStringMemberTwo == null;
13957ac90cf3fc528ac56b6b83718541624173b1368jingjiangli        }
14057ac90cf3fc528ac56b6b83718541624173b1368jingjiangli
14157ac90cf3fc528ac56b6b83718541624173b1368jingjiangli        @Override
14257ac90cf3fc528ac56b6b83718541624173b1368jingjiangli        public int hashCode() {
14357ac90cf3fc528ac56b6b83718541624173b1368jingjiangli            int result = mId;
14408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli            result = 31 * result + (mStringMemberOne != null ? mStringMemberOne.hashCode() : 0);
14508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli            result = 31 * result + (mStringMemberTwo != null ? mStringMemberTwo.hashCode() : 0);
14657ac90cf3fc528ac56b6b83718541624173b1368jingjiangli            return result;
14757ac90cf3fc528ac56b6b83718541624173b1368jingjiangli        }
14857ac90cf3fc528ac56b6b83718541624173b1368jingjiangli    }
14957ac90cf3fc528ac56b6b83718541624173b1368jingjiangli
15008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    /**
15108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     * Extend from DiffCallback extended class to define the rule to compare if two items are the
15208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     * same/ have the same content and how to calculate the payload.
15308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     *
15408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     * The payload will only be calculated when the two items are the same but with different
15508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     * contents. So we make this class as a public class which can be mocked by mockito to verify
15608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     * if the calculation process satisfies our requirement.
15708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     */
15808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    public static class DiffCallbackPayloadTesting extends DiffCallback<AdapterItem> {
15908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // Using item's mId as the standard to judge if two items is the same
16008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        @Override
16108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        public boolean areItemsTheSame(AdapterItem oldItem, AdapterItem newItem) {
16208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli            return oldItem.getId() == newItem.getId();
16308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        }
16408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
16508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // Using equals method to judge if two items have the same content.
16608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        @Override
16708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        public boolean areContentsTheSame(AdapterItem oldItem, AdapterItem newItem) {
16808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli            return oldItem.equals(newItem);
16908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        }
17008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
17108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        @Nullable
17208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        @Override
17308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        public Object getChangePayload(AdapterItem oldItem,
17408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli                AdapterItem newItem) {
17508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli            Bundle diff = new Bundle();
17608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli            if (oldItem.getId() != newItem.getId()) {
17708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli                diff.putInt(ID, newItem.getId());
17808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli            }
17908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
18008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli            if (!oldItem.getStringMemberOne().equals(newItem.getStringMemberOne())) {
18108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli                diff.putString(STRING_MEMBER_ONE, newItem.getStringMemberOne());
18208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli            }
18308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
18408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli            if (!oldItem.getStringMemberTwo().equals(newItem.getStringMemberTwo())) {
18508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli                diff.putString(STRING_MEMBER_TWO, newItem.getStringMemberTwo());
18608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli            }
18708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
18808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli            if (!oldItem.getNotRelatedStringMember().equals(newItem.getNotRelatedStringMember())) {
18908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli                diff.putString(NOT_RELATED_STRING_MEMBER, newItem.getNotRelatedStringMember());
19008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli            }
19108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
19208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli            if (diff.size() == 0) {
19308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli                return null;
19408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli            }
19508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli            return diff;
19608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        }
19708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    }
19808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
19908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    /**
20008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     * The presenter designed for adapter item.
20108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     *
20208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     * The reason to set this class as a public class is for Mockito to mock it. So we can observe
20308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     * method's dispatching easily
20408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     */
20508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    public static class AdapterItemPresenter extends Presenter {
20608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        int mWidth;
20708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        int mHeight;
20808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
20908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        AdapterItemPresenter() {
21008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli            this(100, 100);
21108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        }
21208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
21308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        AdapterItemPresenter(int width, int height) {
21408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli            mWidth = width;
21508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli            mHeight = height;
21608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        }
21708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
21808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        @Override
21908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        public ViewHolder onCreateViewHolder(ViewGroup parent) {
22008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli            View view = new View(parent.getContext());
22108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli            view.setFocusable(true);
22208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli            view.setId(R.id.lb_action_button);
22308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli            view.setLayoutParams(new ViewGroup.LayoutParams(mWidth, mHeight));
22408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli            return new Presenter.ViewHolder(view);
22508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        }
22608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
22708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        @Override
22808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        public void onBindViewHolder(ViewHolder viewHolder, Object item) {
22908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli            // no - op
23008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        }
23108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
23208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        @Override
23308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        public void onUnbindViewHolder(ViewHolder viewHolder) {
23408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli            // no - op
23508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        }
23608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
23708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        @Override
23808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        public void onBindViewHolder(ViewHolder viewHolder, Object item,
23908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli                List<Object> payloads) {
24008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli            // no - op
24108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        }
24208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    }
24308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
24408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
24508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    /**
24608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     * Initialize test-related members.
24708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     */
24808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    @Before
24908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    public void setup() {
25008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mAdapter = new ArrayObjectAdapter();
2518f2085a2ea231e3d81232b54a44be78eacbdbd61Dake Gu        mBridgeAdapter = new ItemBridgeAdapter(mAdapter);
25208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems = new ArrayList();
25308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mMockedCallback = Mockito.spy(DiffCallbackPayloadTesting.class);
2548f2085a2ea231e3d81232b54a44be78eacbdbd61Dake Gu
25508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // the diff callback without calculating the payload
25608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mCallbackWithoutPayload = new DiffCallback<AdapterItem>() {
25708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
25808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli            // Using item's mId as the standard to judge if two items is the same
25908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli            @Override
26008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli            public boolean areItemsTheSame(AdapterItem oldItem, AdapterItem newItem) {
26108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli                return oldItem.getId() == newItem.getId();
26208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli            }
26308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
26408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli            // Using equals method to judge if two items have the same content.
26508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli            @Override
26608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli            public boolean areContentsTheSame(AdapterItem oldItem, AdapterItem newItem) {
26708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli                return oldItem.equals(newItem);
26808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli            }
26908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        };
27008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
27108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // Spy the RecyclerView.AdapterObserver
27208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mObserver = Mockito.spy(RecyclerView.AdapterDataObserver.class);
27308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
27408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // register observer so we can observe the events
27508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mBridgeAdapter.registerAdapterDataObserver(mObserver);
27608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
27708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // obtain context through instrumentation registry
27808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
27908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
28008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        //
28108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        ListRowPresenter listRowPresenter = new ListRowPresenter();
28208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mListRowPresenter = Mockito.spy(listRowPresenter);
28308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
28408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // mock item presenter
28508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        AdapterItemPresenter adapterItemPresenter = new AdapterItemPresenter();
28608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mAdapterItemPresenter = Mockito.spy(adapterItemPresenter);
28708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mRow = new ListRow(new ArrayObjectAdapter(mAdapterItemPresenter));
28808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    }
28908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
29008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    /**
29108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     * The following test case is mainly focused on the basic functionality provided by
29208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     * Object Adapter.
29308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     *
29408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     * The key purpose for this test is to make sure when adapter send out a signal through
29508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     * notify function, it will finally be intercepted by recycler view's observer
29608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     */
29708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    @Test
29808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    public void testBasicFunctionality() {
29908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add("a");
30008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add("b");
30108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add("c");
30208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mAdapter.addAll(0, mItems);
3038f2085a2ea231e3d81232b54a44be78eacbdbd61Dake Gu
30457ac90cf3fc528ac56b6b83718541624173b1368jingjiangli        // size
30508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        assertEquals(mAdapter.size(), 3);
30657ac90cf3fc528ac56b6b83718541624173b1368jingjiangli
30757ac90cf3fc528ac56b6b83718541624173b1368jingjiangli        // get
30808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        assertEquals(mAdapter.get(0), "a");
30908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        assertEquals(mAdapter.get(1), "b");
31008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        assertEquals(mAdapter.get(2), "c");
31157ac90cf3fc528ac56b6b83718541624173b1368jingjiangli
31257ac90cf3fc528ac56b6b83718541624173b1368jingjiangli        // indexOf
31308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        assertEquals(mAdapter.indexOf("a"), 0);
31408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        assertEquals(mAdapter.indexOf("b"), 1);
31508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        assertEquals(mAdapter.indexOf("c"), 2);
31657ac90cf3fc528ac56b6b83718541624173b1368jingjiangli
3178f2085a2ea231e3d81232b54a44be78eacbdbd61Dake Gu        // insert
31808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mAdapter.add(1, "a1");
31908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mObserver).onItemRangeInserted(1, 1);
32008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        assertAdapterContent(mAdapter, new Object[]{"a", "a1", "b", "c"});
32108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.reset(mObserver);
3228f2085a2ea231e3d81232b54a44be78eacbdbd61Dake Gu
3238f2085a2ea231e3d81232b54a44be78eacbdbd61Dake Gu        // insert multiple
3248f2085a2ea231e3d81232b54a44be78eacbdbd61Dake Gu        ArrayList newItems1 = new ArrayList();
3258f2085a2ea231e3d81232b54a44be78eacbdbd61Dake Gu        newItems1.add("a2");
3268f2085a2ea231e3d81232b54a44be78eacbdbd61Dake Gu        newItems1.add("a3");
32708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mAdapter.addAll(1, newItems1);
32808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mObserver).onItemRangeInserted(1, 2);
32908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        assertAdapterContent(mAdapter, new Object[]{"a", "a2", "a3", "a1", "b", "c"});
33008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.reset(mObserver);
3318f2085a2ea231e3d81232b54a44be78eacbdbd61Dake Gu
3328f2085a2ea231e3d81232b54a44be78eacbdbd61Dake Gu        // update
33308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mAdapter.notifyArrayItemRangeChanged(2, 3);
33408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mObserver).onItemRangeChanged(2, 3);
33508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        assertAdapterContent(mAdapter, new Object[]{"a", "a2", "a3", "a1", "b", "c"});
33608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.reset(mObserver);
3378f2085a2ea231e3d81232b54a44be78eacbdbd61Dake Gu
3388f2085a2ea231e3d81232b54a44be78eacbdbd61Dake Gu        // remove
33908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mAdapter.removeItems(1, 4);
34008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mObserver).onItemRangeRemoved(1, 4);
34108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        assertAdapterContent(mAdapter, new Object[]{"a", "c"});
34208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.reset(mObserver);
3438f2085a2ea231e3d81232b54a44be78eacbdbd61Dake Gu
3448f2085a2ea231e3d81232b54a44be78eacbdbd61Dake Gu        // move
34508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mAdapter.move(0, 1);
34608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mObserver).onItemRangeMoved(0, 1, 1);
34708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        assertAdapterContent(mAdapter, new Object[]{"c", "a"});
34808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.reset(mObserver);
34957ac90cf3fc528ac56b6b83718541624173b1368jingjiangli
35057ac90cf3fc528ac56b6b83718541624173b1368jingjiangli        // replace
35108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mAdapter.replace(0, "a");
35208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mObserver).onItemRangeChanged(0, 1);
35308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        assertAdapterContent(mAdapter, new Object[]{"a", "a"});
35408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.reset(mObserver);
35508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mAdapter.replace(1, "b");
35608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mObserver).onItemRangeChanged(1, 1);
35708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        assertAdapterContent(mAdapter, new Object[]{"a", "b"});
35808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.reset(mObserver);
35957ac90cf3fc528ac56b6b83718541624173b1368jingjiangli
36057ac90cf3fc528ac56b6b83718541624173b1368jingjiangli        // remove multiple
36108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.clear();
36208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add("a");
36308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add("b");
36408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mAdapter.addAll(0, mItems);
36508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mAdapter.removeItems(0, 2);
36608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mObserver).onItemRangeRemoved(0, 2);
36708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        assertAdapterContent(mAdapter, new Object[]{"a", "b"});
36808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.reset(mObserver);
36957ac90cf3fc528ac56b6b83718541624173b1368jingjiangli
37057ac90cf3fc528ac56b6b83718541624173b1368jingjiangli        // clear
37108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mAdapter.clear();
37208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mObserver).onItemRangeRemoved(0, 2);
37308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        assertAdapterContent(mAdapter, new Object[]{});
37408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.reset(mObserver);
37557ac90cf3fc528ac56b6b83718541624173b1368jingjiangli
37657ac90cf3fc528ac56b6b83718541624173b1368jingjiangli        // isImmediateNotifySupported
37708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        assertTrue(mAdapter.isImmediateNotifySupported());
37808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    }
37957ac90cf3fc528ac56b6b83718541624173b1368jingjiangli
38008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    /**
38108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     * The following test cases are mainly focused on the basic functionality provided by setItems
38208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     * function
38308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     *
38408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     * It can be deemed as an extension to the previous test, and won't consider payload in this
38508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     * test case.
38608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     *
38708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     * Test0 will treat all items as the same item with same content.
38808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     */
38908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    @Test
39008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    public void testSetItemsMethod0() {
39108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add("a");
39208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add("b");
39308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add("c");
39457ac90cf3fc528ac56b6b83718541624173b1368jingjiangli
39508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        DiffCallback<String> callback = new DiffCallback<String>() {
39657ac90cf3fc528ac56b6b83718541624173b1368jingjiangli
39757ac90cf3fc528ac56b6b83718541624173b1368jingjiangli            // Always treat two items are the same.
39857ac90cf3fc528ac56b6b83718541624173b1368jingjiangli            @Override
39957ac90cf3fc528ac56b6b83718541624173b1368jingjiangli            public boolean areItemsTheSame(String oldItem, String newItem) {
40057ac90cf3fc528ac56b6b83718541624173b1368jingjiangli                return true;
40157ac90cf3fc528ac56b6b83718541624173b1368jingjiangli            }
40257ac90cf3fc528ac56b6b83718541624173b1368jingjiangli
40357ac90cf3fc528ac56b6b83718541624173b1368jingjiangli            // Always treat two items have the same content.
40457ac90cf3fc528ac56b6b83718541624173b1368jingjiangli            @Override
40557ac90cf3fc528ac56b6b83718541624173b1368jingjiangli            public boolean areContentsTheSame(String oldItem, String newItem) {
40657ac90cf3fc528ac56b6b83718541624173b1368jingjiangli                return true;
40757ac90cf3fc528ac56b6b83718541624173b1368jingjiangli            }
40857ac90cf3fc528ac56b6b83718541624173b1368jingjiangli        };
40957ac90cf3fc528ac56b6b83718541624173b1368jingjiangli
41008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mAdapter.setItems(mItems, callback);
41108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // verify method dispatching
41208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mObserver).onItemRangeInserted(0, 3);
41357ac90cf3fc528ac56b6b83718541624173b1368jingjiangli
41408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // Clear previous items and set a new list of items.
41508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.clear();
41608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add("a");
41708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add("b");
41808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add("c");
41957ac90cf3fc528ac56b6b83718541624173b1368jingjiangli
42008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // reset mocked object before calling setItems method
42108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.reset(mObserver);
42208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mAdapter.setItems(mItems, callback);
42308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
42408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // verify method dispatching
42508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mObserver, never()).onItemRangeChanged(anyInt(), anyInt(), any());
42608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mObserver, never()).onItemRangeMoved(anyInt(), anyInt(), anyInt());
42708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mObserver, never()).onItemRangeRemoved(anyInt(), anyInt());
42808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mObserver, never()).onItemRangeInserted(anyInt(), anyInt());
42908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        assertAdapterContent(mAdapter, new Object[]{"a", "b", "c"});
43008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    }
43108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
43208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    /**
43308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     * Test1 will treat all items as the same item with same content.
43408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     */
43508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    @Test
43608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    public void testSetItemsMethod1() {
43708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add("a");
43808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add("b");
43908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add("c");
44008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
44108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        DiffCallback<String> callback = new DiffCallback<String>() {
44257ac90cf3fc528ac56b6b83718541624173b1368jingjiangli
44357ac90cf3fc528ac56b6b83718541624173b1368jingjiangli            // Always treat two items are the different.
44457ac90cf3fc528ac56b6b83718541624173b1368jingjiangli            @Override
44557ac90cf3fc528ac56b6b83718541624173b1368jingjiangli            public boolean areItemsTheSame(String oldItem, String newItem) {
44657ac90cf3fc528ac56b6b83718541624173b1368jingjiangli                return false;
44757ac90cf3fc528ac56b6b83718541624173b1368jingjiangli            }
44857ac90cf3fc528ac56b6b83718541624173b1368jingjiangli
44957ac90cf3fc528ac56b6b83718541624173b1368jingjiangli            // Always treat two items have the different content.
45057ac90cf3fc528ac56b6b83718541624173b1368jingjiangli            @Override
45157ac90cf3fc528ac56b6b83718541624173b1368jingjiangli            public boolean areContentsTheSame(String oldItem, String newItem) {
45257ac90cf3fc528ac56b6b83718541624173b1368jingjiangli                return false;
45357ac90cf3fc528ac56b6b83718541624173b1368jingjiangli            }
45457ac90cf3fc528ac56b6b83718541624173b1368jingjiangli        };
45557ac90cf3fc528ac56b6b83718541624173b1368jingjiangli
45608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mAdapter.setItems(mItems, callback);
45708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // verify method dispatching
45808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mObserver).onItemRangeInserted(0, 3);
45908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
46008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // Clear previous items and set a new list of items.
46108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.clear();
46208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add("a");
46308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add("b");
46408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add("c");
46508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
46608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // reset mocked object before calling setItems method
46708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.reset(mObserver);
46808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mAdapter.setItems(mItems, callback);
46957ac90cf3fc528ac56b6b83718541624173b1368jingjiangli
47057ac90cf3fc528ac56b6b83718541624173b1368jingjiangli        // No change or move event should be fired under current callback.
47108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mObserver, never()).onItemRangeChanged(anyInt(), anyInt(), any());
47208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mObserver, never()).onItemRangeMoved(anyInt(), anyInt(), anyInt());
47308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mObserver).onItemRangeRemoved(0, 3);
47408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mObserver).onItemRangeInserted(0, 3);
47508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        assertAdapterContent(mAdapter, new Object[]{"a", "b", "c"});
47608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    }
47757ac90cf3fc528ac56b6b83718541624173b1368jingjiangli
47808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    /**
47908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     * Test2 will trigger notifyItemRangeChanged event
48008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     */
48108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    @Test
48208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    public void testSetItemsMethod2() {
48308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // initial item list
48408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add(new AdapterItem(1, "a"));
48508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add(new AdapterItem(2, "b"));
48608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add(new AdapterItem(3, "c"));
48708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mAdapter.setItems(mItems, mCallbackWithoutPayload);
48857ac90cf3fc528ac56b6b83718541624173b1368jingjiangli
48908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // Clear previous items and set a new list of items.
49008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.clear();
49108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add(new AdapterItem(1, "a"));
49208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add(new AdapterItem(2, "c"));
49308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add(new AdapterItem(3, "b"));
49457ac90cf3fc528ac56b6b83718541624173b1368jingjiangli
49508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // reset mocked object before calling setItems method
49608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.reset(mObserver);
49708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mAdapter.setItems(mItems, mCallbackWithoutPayload);
49808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
49908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // verify method dispatching
50008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mObserver).onItemRangeChanged(1, 2, null);
50108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    }
50208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
50308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
50408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    /**
50508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     * Test3 will trigger notifyItemMoved event
50608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     */
50708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    @Test
50808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    public void testSetItemsMethod3() {
50908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // initial item list
51008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add(new AdapterItem(1, "a"));
51108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add(new AdapterItem(2, "b"));
51208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add(new AdapterItem(3, "c"));
51308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mAdapter.setItems(mItems, mCallbackWithoutPayload);
51408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
51508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // Clear previous items and set a new list of items.
51608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.clear();
51708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add(new AdapterItem(2, "b"));
51808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add(new AdapterItem(1, "a"));
51908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add(new AdapterItem(3, "c"));
52008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
52108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // reset mocked object before calling setItems method
52208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.reset(mObserver);
52308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mAdapter.setItems(mItems, mCallbackWithoutPayload);
52408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
52508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // verify method dispatching
52608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mObserver).onItemRangeMoved(1, 0, 1);
52708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    }
52808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
52908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    /**
53008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     * Test4 will trigger notifyItemRangeRemoved event
53108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     */
53208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    @Test
53308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    public void testSetItemsMethod4() {
53408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // initial item list
53508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add(new AdapterItem(1, "a"));
53608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add(new AdapterItem(2, "b"));
53708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add(new AdapterItem(3, "c"));
53808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mAdapter.setItems(mItems, mCallbackWithoutPayload);
53908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
54008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // Clear previous items and set a new list of items.
54108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.clear();
54208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add(new AdapterItem(2, "b"));
54308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add(new AdapterItem(3, "c"));
54408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
54508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // reset mocked object before calling setItems method
54608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.reset(mObserver);
54708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mAdapter.setItems(mItems, mCallbackWithoutPayload);
54808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
54908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // verify method dispatching
55008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mObserver).onItemRangeRemoved(0, 1);
55108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    }
55208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
55308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    /**
55408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     * Test5 will trigger notifyItemRangeInserted event
55508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     */
55608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    @Test
55708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    public void testSetItemsMethod5() {
55808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // initial item list
55908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add(new AdapterItem(1, "a"));
56008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add(new AdapterItem(2, "b"));
56108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add(new AdapterItem(3, "c"));
56208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mAdapter.setItems(mItems, mCallbackWithoutPayload);
56308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
56408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // Clear previous items and set a new list of items.
56508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.clear();
56608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add(new AdapterItem(1, "a"));
56708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add(new AdapterItem(2, "b"));
56808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add(new AdapterItem(3, "c"));
56908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add(new AdapterItem(4, "d"));
57008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
57108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // reset mocked object before calling setItems method
57208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.reset(mObserver);
57308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mAdapter.setItems(mItems, mCallbackWithoutPayload);
57408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
57508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // verify method dispatching
57608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mObserver).onItemRangeInserted(3, 1);
57708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    }
57808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
57908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
58008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    /**
58108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     * Test6 will trigger notifyItemRangeInserted event and notifyItemRangeRemoved event
58208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     * simultaneously
58308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     */
58408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    @Test
58508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    public void testSetItemsMethod6() {
58608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // initial item list
58708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add(new AdapterItem(1, "a"));
58808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add(new AdapterItem(2, "b"));
58908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add(new AdapterItem(3, "c"));
59008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mAdapter.setItems(mItems, mCallbackWithoutPayload);
59108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
59208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // Clear previous items and set a new list of items.
59308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.clear();
59408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add(new AdapterItem(2, "a"));
59508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add(new AdapterItem(2, "b"));
59608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add(new AdapterItem(3, "c"));
59708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
59808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // reset mocked object before calling setItems method
59908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.reset(mObserver);
60008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mAdapter.setItems(mItems, mCallbackWithoutPayload);
60108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
60208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // verify method dispatching
60308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mObserver).onItemRangeRemoved(0, 1);
60408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mObserver).onItemRangeInserted(0, 1);
60508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    }
60608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
60708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    /**
60808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     * Test7 will trigger notifyItemRangeMoved and notifyItemRangeChanged event simultaneously
60908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     */
61008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    @Test
61108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    public void testItemsMethod7() {
61208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // initial item list
61308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add(new AdapterItem(1, "a"));
61408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add(new AdapterItem(2, "b"));
61508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add(new AdapterItem(3, "c"));
61608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mAdapter.setItems(mItems, mCallbackWithoutPayload);
61708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
61808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // Clear previous items and set a new list of items.
61908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.clear();
62008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add(new AdapterItem(1, "aa"));
62108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add(new AdapterItem(3, "c"));
62208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add(new AdapterItem(2, "b"));
62308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
62408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // reset mocked object before calling setItems method
62508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.reset(mObserver);
62608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mAdapter.setItems(mItems, mCallbackWithoutPayload);
62708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
62808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // verify method dispatching
62908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mObserver).onItemRangeChanged(0, 1, null);
63008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mObserver).onItemRangeMoved(2, 1, 1);
63108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    }
63208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
63308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    /**
63408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     * Test8 will trigger multiple items insertion event
63508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     */
63608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    @Test
63708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    public void testSetItemsMethod8() {
63808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
63908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // initial item list
64008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mAdapter.clear();
64108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add(new AdapterItem(0, "a"));
64208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add(new AdapterItem(1, "b"));
64308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mAdapter.clear();
64408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mAdapter.setItems(mItems, mCallbackWithoutPayload);
64508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
64608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // Clear previous items and set a new list of items.
64708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.clear();
64808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add(new AdapterItem(0, "a"));
64908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add(new AdapterItem(1, "b"));
65008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add(new AdapterItem(2, "c"));
65108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add(new AdapterItem(3, "d"));
65208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
65308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // reset mocked object before calling setItems method
65408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.reset(mObserver);
65508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mAdapter.setItems(mItems, mCallbackWithoutPayload);
65608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
65708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // verify method dispatching
65808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mObserver).onItemRangeInserted(2, 2);
65908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.reset(mObserver);
66008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    }
66108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
66208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
66308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    /**
66408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     * The following test cases are mainly focused on testing setItems method when we need to
66508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     * calculate payload
66608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     *
66708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     * The payload should only be calculated when two items are same but with different contents.
66808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     * I.e. the calculate payload method should only be executed when the previous condition is
66908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     * satisfied. In this test case we use a mocked callback object to verify it and compare the
67008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     * calculated payload with our expected payload.
67108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     *
67208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     * Test 0 will calculate the difference on string member one.
67308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     */
67408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    @Test
67508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    public void testPayloadCalculation0() {
67608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        AdapterItem oldItem = new AdapterItem(1, "a", "a");
67708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add(oldItem);
67808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mAdapter.setItems(mItems, mMockedCallback);
67908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
68008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // Create a new item list which contain a new AdapterItem object
68108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // test if payload is computed correctly by changing string member 1
68208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.clear();
68308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        AdapterItem newItem = new AdapterItem(1, "aa", "a");
68408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add(newItem);
68508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
68608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
68708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // reset mocked object before calling setItems method
68808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.reset(mObserver);
68908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.reset(mMockedCallback);
69008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mAdapter.setItems(mItems, mMockedCallback);
69108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
69208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // Create expected payload manually for verification
69308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Bundle expectedPayload0 = new Bundle();
69408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        expectedPayload0.putString(STRING_MEMBER_ONE, newItem.getStringMemberOne());
69508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
69608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // make sure no other event will be triggered in current scenario
69708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mObserver, never()).onItemRangeInserted(anyInt(), anyInt());
69808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mObserver, never()).onItemRangeRemoved(anyInt(), anyInt());
69908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mObserver, never()).onItemRangeMoved(anyInt(), anyInt(), anyInt());
70008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
70108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // Check if getChangePayload is executed as we expected
70208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mObserver, never()).onItemRangeChanged(anyInt(), anyInt(), eq(null));
70308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mMockedCallback).getChangePayload(oldItem,
70408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli                newItem);
70508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
70608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // compare the two bundles by iterating each member
70708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Bundle calculatedBundle0 = (Bundle) mMockedCallback.getChangePayload(
70808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli                oldItem, newItem);
70908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        compareTwoBundles(calculatedBundle0, expectedPayload0);
71008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
71108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    }
71208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
71308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    /**
71408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     * Test 1 will calculate the difference on string member two.
71508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     */
71608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    @Test
71708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    public void testPayloadComputation1() {
71808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        AdapterItem oldItem = new AdapterItem(1, "a", "a");
71908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add(oldItem);
72008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mAdapter.setItems(mItems, mMockedCallback);
72108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
72208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // Create a new item list which contain a new AdapterItem object
72308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // test if payload is computed correctly by changing string member 2
72408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.clear();
72508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        AdapterItem newItem = new AdapterItem(1, "a", "aa");
72608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add(newItem);
72708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
72808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // reset mocked object before calling setItems method
72908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.reset(mObserver);
73008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.reset(mMockedCallback);
73108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mAdapter.setItems(mItems, mMockedCallback);
73208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
73308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // Create expected payload manually for verification
73408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Bundle expectedPayload0 = new Bundle();
73508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        expectedPayload0.putString(STRING_MEMBER_TWO, newItem.getStringMemberTwo());
73608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
73708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // make sure no other event will be triggered in current scenario
73808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mObserver, never()).onItemRangeInserted(anyInt(), anyInt());
73908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mObserver, never()).onItemRangeRemoved(anyInt(), anyInt());
74008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mObserver, never()).onItemRangeMoved(anyInt(), anyInt(), anyInt());
74108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
74208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // Check if getChangePayload is executed as we expected
74308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mObserver, never()).onItemRangeChanged(anyInt(), anyInt(), eq(null));
74408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mMockedCallback).getChangePayload(oldItem,
74508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli                newItem);
74608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
74708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // compare the two bundles by iterating each member
74808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Bundle calculatedBundle0 = (Bundle) mMockedCallback.getChangePayload(
74908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli                oldItem, newItem);
75008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        compareTwoBundles(calculatedBundle0, expectedPayload0);
75108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
75208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    }
75308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
75408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    /**
75508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     * Test 1 will calculate the difference on string member one and string member two.
75608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     */
75708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    @Test
75808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    public void testPayloadComputation2() {
75908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        AdapterItem oldItem = new AdapterItem(1, "a", "a");
76008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add(oldItem);
76108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mAdapter.setItems(mItems, mMockedCallback);
76208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
76308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // Create a new item list which contain a new AdapterItem object
76408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // test if payload is computed correctly by changing string member 1 and string member 2
76508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.clear();
76608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        AdapterItem newItem = new AdapterItem(1, "aa", "aa");
76708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add(newItem);
76808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
76908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // reset mocked object before calling setItems method
77008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.reset(mObserver);
77108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.reset(mMockedCallback);
77208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mAdapter.setItems(mItems, mMockedCallback);
77308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
77408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // Create expected payload manually for verification
77508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Bundle expectedPayload0 = new Bundle();
77608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        expectedPayload0.putString(STRING_MEMBER_ONE, newItem.getStringMemberOne());
77708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        expectedPayload0.putString(STRING_MEMBER_TWO, newItem.getStringMemberTwo());
77808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
77908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // make sure no other event will be triggered in current scenario
78008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mObserver, never()).onItemRangeInserted(anyInt(), anyInt());
78108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mObserver, never()).onItemRangeRemoved(anyInt(), anyInt());
78208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mObserver, never()).onItemRangeMoved(anyInt(), anyInt(), anyInt());
78308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
78408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // Check if getChangePayload is executed as we expected
78508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mObserver, never()).onItemRangeChanged(anyInt(), anyInt(), eq(null));
78608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mMockedCallback).getChangePayload(oldItem,
78708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli                newItem);
78808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
78908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // compare the two bundles by iterating each member
79008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Bundle calculatedBundle0 = (Bundle) mMockedCallback.getChangePayload(
79108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli                oldItem, newItem);
79208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        compareTwoBundles(calculatedBundle0, expectedPayload0);
79308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
79408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    }
79508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
79608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    /**
79708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     * Test payload computation process under the condition when two items are not the same
79808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     * based on areItemsTheSame function in DiffUtilCallback
79908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     */
80008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    @Test
80108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    public void testPayloadComputationNewItem0() {
80208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        AdapterItem oldItem = new AdapterItem(1, "a", "a");
80308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add(oldItem);
80408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mAdapter.setItems(mItems, mMockedCallback);
80508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
80608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // Create a new item list which contain a new AdapterItem object
80708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // The id of the new item is changed, and will be treated as a new item according to the
80808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // rule we set in the callback. This test case is to verify the getChangePayload
80908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // method still honor the standard we set up to judge new item
81008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.clear();
81108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        AdapterItem newItem = new AdapterItem(2, "a", "a");
81208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add(newItem);
81308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
81408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // reset mocked object before calling setItems method
81508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.reset(mObserver);
81608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.reset(mMockedCallback);
81708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mAdapter.setItems(mItems, mMockedCallback);
81808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
81908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // Make sure only remove/ insert event will be fired under this circumstance
82008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mObserver).onItemRangeRemoved(0, 1);
82108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mObserver).onItemRangeInserted(0, 1);
82208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mObserver, never()).onItemRangeChanged(anyInt(), anyInt(), any());
82308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mMockedCallback, never()).getChangePayload((AdapterItem) any(),
82408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli                (AdapterItem) any());
82508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
82608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    }
82708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
82808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    /**
82908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     * Test payload computation process under the condition when two items are not the same
83008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     * based on areItemsTheSame function in DiffUtilCallback
83108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     *
83208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     * But in test 1 we have changed string member one for sanity check.
83308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     */
83408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    @Test
83508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    public void testPayloadComputationNewItem1() {
83608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        AdapterItem oldItem = new AdapterItem(1, "a", "a");
83708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add(oldItem);
83808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mAdapter.setItems(mItems, mMockedCallback);
83908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
84008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // Create a new item list which contain a new AdapterItem object
84108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // The id of the new item is changed, and will be treated as a new item according to the
84208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // rule we set in the callback. This test case is to verify the getChangePayload
84308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // method still honor the standard we set up to judge new item
84408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.clear();
84508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        AdapterItem newItem = new AdapterItem(2, "aa", "a");
84608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add(newItem);
84708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
84808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // reset mocked object before calling setItems method
84908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.reset(mObserver);
85008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.reset(mMockedCallback);
85108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mAdapter.setItems(mItems, mMockedCallback);
85208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
85308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // Make sure only remove/ insert event will be fired under this circumstance
85408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mObserver).onItemRangeRemoved(0, 1);
85508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mObserver).onItemRangeInserted(0, 1);
85608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mObserver, never()).onItemRangeChanged(anyInt(), anyInt(), any());
85708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mMockedCallback, never()).getChangePayload((AdapterItem) any(),
85808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli                (AdapterItem) any());
85908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
86008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    }
86108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
86208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    /**
86308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     * Test payload computation process under the condition when two items are not the same
86408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     * based on areItemsTheSame function in DiffUtilCallback
86508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     *
86608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     * But in test 2 we have changed string member two for sanity check.
86708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     */
86808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    @Test
86908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    public void testPayloadComputationNewItem2() {
87008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        AdapterItem oldItem = new AdapterItem(1, "a", "a");
87108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add(oldItem);
87208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mAdapter.setItems(mItems, mMockedCallback);
87308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
87408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // Create a new item list which contain a new AdapterItem object
87508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // The id of the new item is changed, and will be treated as a new item according to the
87608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // rule we set in the callback. This test case is to verify the getChangePayload
87708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // method still honor the standard we set up to judge new item
87808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.clear();
87908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        AdapterItem newItem = new AdapterItem(2, "a", "aa");
88008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add(newItem);
88108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
88208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // reset mocked object before calling setItems method
88308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.reset(mObserver);
88408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.reset(mMockedCallback);
88508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mAdapter.setItems(mItems, mMockedCallback);
88608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
88708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // Make sure only remove/ insert event will be fired under this circumstance
88808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mObserver).onItemRangeRemoved(0, 1);
88908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mObserver).onItemRangeInserted(0, 1);
89008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mObserver, never()).onItemRangeChanged(anyInt(), anyInt(), any());
89108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mMockedCallback, never()).getChangePayload((AdapterItem) any(),
89208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli                (AdapterItem) any());
89308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
89408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    }
89508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
89608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    /**
89708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     * Test payload computation process under the condition when two items are not the same
89808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     * based on areItemsTheSame function in DiffUtilCallback
89908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     *
90008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     * But in test 3 we have changed string member one and string member two for sanity check.
90108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     */
90208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    @Test
90308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    public void testPayloadComputationNewItem3() {
90408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        AdapterItem oldItem = new AdapterItem(1, "a", "a");
90508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add(oldItem);
90608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mAdapter.setItems(mItems, mMockedCallback);
90708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
90808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // Create a new item list which contain a new AdapterItem object
90908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // The id of the new item is changed, and will be treated as a new item according to the
91008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // rule we set in the callback. This test case is to verify the getChangePayload
91108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // method still honor the standard we set up to judge new item
91208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.clear();
91308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        AdapterItem newItem = new AdapterItem(2, "aa", "aa");
91408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add(newItem);
91508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
91608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // reset mocked object before calling setItems method
91708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.reset(mObserver);
91808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.reset(mMockedCallback);
91908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mAdapter.setItems(mItems, mMockedCallback);
92008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
92108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // Make sure only remove/ insert event will be fired under this circumstance
92208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mObserver).onItemRangeRemoved(0, 1);
92308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mObserver).onItemRangeInserted(0, 1);
92408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mObserver, never()).onItemRangeChanged(anyInt(), anyInt(), any());
92508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mMockedCallback, never()).getChangePayload((AdapterItem) any(),
92608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli                (AdapterItem) any());
92708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    }
92808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
92908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    /**
93008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     * Test payload computation process under the condition when two items have the same content
93108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     * based on areContentsTheSame function in DiffUtilCallback
93208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     */
93308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    @Test
93408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    public void testPayloadComputationSameContent() {
93508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        AdapterItem oldItem = new AdapterItem(1, "a", "a", "a");
93608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add(oldItem);
93708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mAdapter.setItems(mItems, mMockedCallback);
93808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
93908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // Create a new item list which contain a new AdapterItem object
94008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // The non-related string member of the new item is changed, but the two items are still
94108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // the same as well as the item's content according to the rule we set in the callback.
94208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // This test case is to verify the getChangePayload method still honor the standard
94308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // we set up to determine if a new object is 1. a new item 2. has the same content as the
94408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // previous one
94508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.clear();
94608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        AdapterItem newItem = new AdapterItem(1, "a", "a", "aa");
94708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mItems.add(newItem);
94808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
94908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // reset mocked object before calling setItems method
95008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.reset(mObserver);
95108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.reset(mMockedCallback);
95208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mAdapter.setItems(mItems, mMockedCallback);
95308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
95408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // Make sure no even will be fired up in this circumstance
95508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mObserver, never()).onItemRangeRemoved(anyInt(), anyInt());
95608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mObserver, never()).onItemRangeInserted(anyInt(), anyInt());
95708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mObserver, never()).onItemRangeChanged(anyInt(), anyInt(), any());
95808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        Mockito.verify(mMockedCallback, never()).getChangePayload((AdapterItem) any(),
95908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli                (AdapterItem) any());
96008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    }
96108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
96208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
96308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    /**
96408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     * This test case is targeted at real ui testing. I.e. making sure when the change of adapter's
96508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     * items will trigger the rebinding of view holder with payload. That's item presenter's
96608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     * onBindViewHolder method with payload supporting.
96708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     *
96808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     */
96908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    @Test
97008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    public void testPresenterAndItemBridgeAdapter() {
97108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // data set one
97208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        final List<AdapterItem> dataSetOne = new ArrayList<>();
97308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        AdapterItem dataSetOne0 = new AdapterItem(1, "a");
97408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        AdapterItem dataSetOne1 = new AdapterItem(2, "b");
97508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        AdapterItem dataSetOne2 = new AdapterItem(3, "c");
97608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        AdapterItem dataSetOne3 = new AdapterItem(4, "d");
97708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        AdapterItem dataSetOne4 = new AdapterItem(5, "3");
97808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        dataSetOne.add(dataSetOne0);
97908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        dataSetOne.add(dataSetOne1);
98008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        dataSetOne.add(dataSetOne2);
98108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        dataSetOne.add(dataSetOne3);
98208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        dataSetOne.add(dataSetOne4);
98308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
98408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        // data set two
98508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        final List<AdapterItem> dataSetTwo = new ArrayList<>();
98608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        AdapterItem dataSetTwo0 = new AdapterItem(1, "aa");
98708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        AdapterItem dataSetTwo1 = new AdapterItem(2, "bb");
98808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        AdapterItem dataSetTwo2 = new AdapterItem(3, "cc");
98908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        AdapterItem dataSetTwo3 = new AdapterItem(4, "dd");
99008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        AdapterItem dataSetTwo4 = new AdapterItem(5, "ee");
99108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        dataSetTwo.add(dataSetTwo0);
99208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        dataSetTwo.add(dataSetTwo1);
99308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        dataSetTwo.add(dataSetTwo2);
99408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        dataSetTwo.add(dataSetTwo3);
99508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        dataSetTwo.add(dataSetTwo4);
99608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
99708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        ((ArrayObjectAdapter) mRow.getAdapter()).addAll(0, dataSetOne);
99808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
99957ac90cf3fc528ac56b6b83718541624173b1368jingjiangli            @Override
100008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli            public void run() {
100108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
100208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli                // obtain frame layout through context.
100308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli                final ViewGroup parent = new FrameLayout(mContext);
100408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
100508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli                // create view holder and obtain the view object from view holder
100608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli                // add view object to our layout
100708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli                Presenter.ViewHolder containerVh = mListRowPresenter.onCreateViewHolder(parent);
100808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli                parent.addView(containerVh.view, 1000, 1000);
100908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
101008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli                // set rows adapter and add row to that adapter
101108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli                mRowsAdapter = new ArrayObjectAdapter();
101208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli                mRowsAdapter.add(mRow);
101308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
101408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli                // use the presenter to bind row view holder explicitly. So the itemBridgeAdapter
101508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli                // will be connected to the adapter inside of the listRow successfully.
101608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli                mListVh = (ListRowPresenter.ViewHolder) mListRowPresenter.getRowViewHolder(
101708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli                        containerVh);
101808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli                mListRowPresenter.onBindRowViewHolder(mListVh, mRow);
101908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
102008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli                // layout the list row in recycler view
102108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli                runRecyclerViewLayout();
102208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
102308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli                // reset mocked presenter
102408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli                Mockito.reset(mListRowPresenter);
102508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli                Mockito.reset(mAdapterItemPresenter);
102608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
102708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli                // calling setItem's method to trigger the diff computation
102808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli                ((ArrayObjectAdapter) mRow.getAdapter()).setItems(dataSetTwo,
102908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli                        new DiffCallbackPayloadTesting());
103008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
103108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli                // re-layout the recycler view to trigger getViewForPosition event
103208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli                runRecyclerViewLayout();
103308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli
103408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli                // verify method execution
103508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli                Mockito.verify(mAdapterItemPresenter, never()).onBindViewHolder(
103608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli                        (RowPresenter.ViewHolder) any(), (Object) any());
103708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli                Mockito.verify(mAdapterItemPresenter, atLeast(5)).onBindViewHolder(
103808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli                        (RowPresenter.ViewHolder) any(), (Object) any(), (List<Object>) any());
103957ac90cf3fc528ac56b6b83718541624173b1368jingjiangli            }
104008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        });
104108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    }
104257ac90cf3fc528ac56b6b83718541624173b1368jingjiangli
104308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    /**
104408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     * Helper function to layout recycler view
104508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     * So the recycler view will execute the getView() method then the onBindViewHolder() method
104608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     * from presenter will be executed
104708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     */
104808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    private void runRecyclerViewLayout() {
104908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mListVh.view.measure(View.MeasureSpec.makeMeasureSpec(1000, View.MeasureSpec.EXACTLY),
105008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli                View.MeasureSpec.makeMeasureSpec(1000, View.MeasureSpec.EXACTLY));
105108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        mListVh.view.layout(0, 0, 1000, 1000);
105208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    }
105357ac90cf3fc528ac56b6b83718541624173b1368jingjiangli
105408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    /**
105508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     * Helper function to compare two bundles through iterating the fields.
105608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     *
105708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     * @param bundle1 bundle 1
105808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     * @param bundle2 bundle 2
105908a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     */
106008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    private void compareTwoBundles(Bundle bundle1, Bundle bundle2) {
106108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        assertEquals(bundle1.getInt(ID), bundle2.getInt(ID));
106208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        assertEquals(bundle1.getString(STRING_MEMBER_ONE), bundle2.getString(
106308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli                STRING_MEMBER_ONE));
106408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        assertEquals(bundle1.getString(STRING_MEMBER_TWO), bundle2.getString(
106508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli                STRING_MEMBER_TWO));
106608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        assertEquals(bundle1.getString(NOT_RELATED_STRING_MEMBER),
106708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli                bundle2.getString(NOT_RELATED_STRING_MEMBER));
10688f2085a2ea231e3d81232b54a44be78eacbdbd61Dake Gu    }
10698f2085a2ea231e3d81232b54a44be78eacbdbd61Dake Gu
107008a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    /**
107108a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     * Helper function to test the content in adapter
107208a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli     */
107308a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    private static void assertAdapterContent(ObjectAdapter adapter, Object[] data) {
107408a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        assertEquals(adapter.size(), data.length);
107508a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        for (int i = 0; i < adapter.size(); i++) {
107608a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli            assertEquals(adapter.get(i), data[i]);
107708a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli        }
107808a38559a3751252fc8a1f36db0a431508a8f7d5jingjiangli    }
10798f2085a2ea231e3d81232b54a44be78eacbdbd61Dake Gu}
1080