| /* |
| * Copyright 2018 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package androidx.recyclerview.widget; |
| |
| import static org.hamcrest.Matchers.equalTo; |
| import static org.hamcrest.Matchers.is; |
| import static org.junit.Assert.assertEquals; |
| import static org.junit.Assert.assertNotEquals; |
| import static org.junit.Assert.assertNotNull; |
| import static org.junit.Assert.assertThat; |
| |
| import android.content.Context; |
| import android.support.test.InstrumentationRegistry; |
| import android.support.test.filters.SmallTest; |
| import android.support.test.runner.AndroidJUnit4; |
| import android.view.View; |
| import android.view.ViewGroup; |
| |
| import androidx.annotation.NonNull; |
| |
| import org.junit.Test; |
| import org.junit.runner.RunWith; |
| |
| @SmallTest |
| @RunWith(AndroidJUnit4.class) |
| public class RecycledViewPoolTest { |
| |
| @Test |
| public void construct() { |
| RecyclerView.RecycledViewPool pool = new RecyclerView.RecycledViewPool(); |
| assertEquals(0, pool.getRecycledViewCount(0)); |
| assertEquals(0, pool.size()); |
| } |
| |
| private RecyclerView.ViewHolder makeHolder(int viewType) { |
| RecyclerView.ViewHolder holder = new MockViewHolder(InstrumentationRegistry.getContext()); |
| holder.mItemViewType = viewType; |
| return holder; |
| } |
| |
| @Test |
| public void put() { |
| RecyclerView.RecycledViewPool pool = new RecyclerView.RecycledViewPool(); |
| pool.putRecycledView(makeHolder(0)); |
| pool.putRecycledView(makeHolder(1)); |
| pool.putRecycledView(makeHolder(2)); |
| pool.putRecycledView(makeHolder(2)); |
| |
| assertEquals(1, pool.getRecycledViewCount(0)); |
| assertEquals(1, pool.getRecycledViewCount(1)); |
| assertEquals(2, pool.getRecycledViewCount(2)); |
| assertEquals(0, pool.getRecycledViewCount(3)); |
| assertEquals(4, pool.size()); |
| } |
| |
| @Test |
| public void putAndGet() { |
| RecyclerView.RecycledViewPool pool = new RecyclerView.RecycledViewPool(); |
| pool.putRecycledView(makeHolder(3)); |
| pool.putRecycledView(makeHolder(3)); |
| |
| assertEquals(2, pool.size()); |
| assertEquals(2, pool.getRecycledViewCount(3)); |
| |
| RecyclerView.ViewHolder a = pool.getRecycledView(3); |
| |
| assertNotNull(a); |
| assertEquals(1, pool.size()); |
| assertEquals(1, pool.getRecycledViewCount(3)); |
| |
| RecyclerView.ViewHolder b = pool.getRecycledView(3); |
| |
| assertNotNull(b); |
| assertNotEquals(a, b); |
| assertEquals(0, pool.size()); |
| assertEquals(0, pool.getRecycledViewCount(3)); |
| } |
| |
| @Test |
| public void onAdapterChanged_attachedToOneOldAdapterNotNullNotCompatWithPrev_clears() { |
| onAdapterChanged(1, true, true, true); |
| } |
| |
| @Test |
| public void onAdapterChanged_attachedToNone_doesntClear() { |
| onAdapterChanged(0, true, true, false); |
| } |
| |
| @Test |
| public void onAdapterChanged_attachedToTwo_doesntClear() { |
| onAdapterChanged(2, true, true, false); |
| } |
| |
| @Test |
| public void onAdapterChanged_oldAdapterNull_doesntClear() { |
| onAdapterChanged(1, false, true, false); |
| } |
| |
| @Test |
| public void onAdapterChanged_compatWithPrev_doesntClear() { |
| onAdapterChanged(1, true, false, false); |
| } |
| |
| private void onAdapterChanged( |
| int attachCount, |
| boolean oldAdapterNotNull, |
| boolean notCompatibleWithPrevious, |
| boolean clears) { |
| RecyclerView.RecycledViewPool pool = new RecyclerView.RecycledViewPool(); |
| pool.putRecycledView(makeHolder(1)); |
| |
| for (int i = 0; i < attachCount; i++) { |
| pool.attach(); |
| } |
| |
| TestAdapter oldAdapter = null; |
| if (oldAdapterNotNull) { |
| oldAdapter = new TestAdapter(); |
| } |
| |
| pool.onAdapterChanged(oldAdapter, null, !notCompatibleWithPrevious); |
| |
| assertThat(pool.getRecycledViewCount(1), is(equalTo(clears ? 0 : 1))); |
| } |
| |
| private static class MockViewHolder extends RecyclerView.ViewHolder { |
| MockViewHolder(Context context) { |
| super(new View(context)); |
| } |
| } |
| |
| private class TestAdapter extends RecyclerView.Adapter { |
| |
| @NonNull |
| @Override |
| public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { |
| //noinspection ConstantConditions |
| return null; |
| } |
| |
| @Override |
| public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { |
| |
| } |
| |
| @Override |
| public int getItemCount() { |
| return 0; |
| } |
| } |
| } |