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