blob: 2ce2cce7d2c1fe0c07fbe61579f9c4be2f2646ce [file] [log] [blame]
/*
* 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;
}
}
}