package org.wikipedia.feed.view; import android.content.Context; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView.Adapter; import android.view.View; import android.view.ViewGroup; import org.junit.Before; import org.junit.Test; import org.junit.experimental.theories.Theory; import org.wikipedia.feed.model.Card; import org.wikipedia.test.theories.TestedOnBool; import org.wikipedia.test.view.FontScale; import org.wikipedia.test.view.LayoutDirection; import org.wikipedia.test.view.ViewTest; import org.wikipedia.theme.Theme; import static android.support.v7.widget.RecyclerView.AdapterDataObserver; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.wikipedia.feed.view.FeedAdapter.Callback; public class ListCardViewTest extends ViewTest { private ListCardView<Card> subject; @Before public void setUp() { setUp(WIDTH_DP_S, LayoutDirection.LOCALE, FontScale.DEFAULT, Theme.LIGHT); subject = new Subject(ctx()); } @Theory public void testSetCallback(@TestedOnBool boolean nullHeader, @TestedOnBool boolean nullCallback) { CardHeaderView header = nullHeader ? null : mock(CardHeaderView.class); if (header != null) { subject.header(header); } Callback callback = nullCallback ? null : mock(FeedAdapter.Callback.class); subject.setCallback(callback); assertThat(subject.getCallback(), is(callback)); if (header != null) { verify(header).setCallback(eq(callback)); } } @Theory public void testSet(@TestedOnBool boolean nul) { Adapter<?> adapter = nul ? null : mock(Adapter.class); subject.set(adapter); //noinspection rawtypes assertThat(subject.recyclerView.getAdapter(), is((Adapter) adapter)); } @Theory public void testUpdate(@TestedOnBool boolean nul) { Adapter<?> adapter = nul ? null : new NullAdapter(); subject.set(adapter); AdapterDataObserver observer = mock(AdapterDataObserver.class); if (adapter != null) { adapter.registerAdapterDataObserver(observer); } subject.update(); if (adapter != null) { adapter.unregisterAdapterDataObserver(observer); verify(observer).onChanged(); } } @Test public void testHeader() { View header = mock(View.class); subject.header(header); assertThat(subject.headerView, is(header)); } @Test public void testLargeHeader() { View header = mock(View.class); subject.largeHeader(header); assertThat(subject.largeHeaderView, is(header)); } public static class NullAdapter extends Adapter<RecyclerView.ViewHolder> { @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return null; } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { } @Override public int getItemCount() { return 0; } } private static class Subject extends ListCardView<Card> { Subject(Context context) { super(context); } } }