package com.artemzin.qualitymatters.ui.adapters;
import android.annotation.SuppressLint;
import android.database.DataSetObserver;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.artemzin.qualitymatters.QualityMattersRobolectricUnitTestRunner;
import com.artemzin.qualitymatters.R;
import com.artemzin.qualitymatters.ui.adapters.DeveloperSettingsSpinnerAdapter.SelectionOption;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.util.ArrayList;
import java.util.List;
import static java.util.Arrays.asList;
import static java.util.Collections.emptyList;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;
@RunWith(QualityMattersRobolectricUnitTestRunner.class)
public class DeveloperSettingsSpinnerAdapterTest {
private LayoutInflater layoutInflater;
private DeveloperSettingsSpinnerAdapter<SelectionOption> adapter;
@Before
public void beforeEachTest() {
layoutInflater = mock(LayoutInflater.class);
adapter = new DeveloperSettingsSpinnerAdapter<>(layoutInflater);
}
@Test
public void setSelectableOptions_shouldReturnSameAdapter() {
assertThat(adapter.setSelectionOptions(emptyList())).isSameAs(adapter);
}
@Test
public void setSelectableOptions_shouldNotifyObservers() {
DataSetObserver dataSetObserver = mock(DataSetObserver.class);
adapter.registerDataSetObserver(dataSetObserver);
verifyZeroInteractions(dataSetObserver);
adapter.setSelectionOptions(emptyList());
verify(dataSetObserver).onChanged();
}
@Test
public void getCount_shouldReturn0ByDefault() {
assertThat(adapter.getCount()).isEqualTo(0);
}
@Test
public void getCount_shouldReturn0FromEmptyList() {
adapter.setSelectionOptions(emptyList());
assertThat(adapter.getCount()).isEqualTo(0);
}
@Test
public void getCount_shouldReturnCountFromList() {
List<SelectionOption> selectionOptions = new ArrayList<>();
selectionOptions.add(mock(SelectionOption.class));
selectionOptions.add(mock(SelectionOption.class));
selectionOptions.add(mock(SelectionOption.class));
adapter.setSelectionOptions(selectionOptions);
assertThat(adapter.getCount()).isEqualTo(3);
}
@Test
public void getItem_shouldReturnItemsFromList() {
List<SelectionOption> selectionOptions = new ArrayList<>();
selectionOptions.add(mock(SelectionOption.class));
selectionOptions.add(mock(SelectionOption.class));
selectionOptions.add(mock(SelectionOption.class));
adapter.setSelectionOptions(selectionOptions);
assertThat(adapter.getItem(0)).isEqualTo(selectionOptions.get(0));
assertThat(adapter.getItem(1)).isEqualTo(selectionOptions.get(1));
assertThat(adapter.getItem(2)).isEqualTo(selectionOptions.get(2));
}
@Test
public void getItemId_shouldReturnPositions() {
List<SelectionOption> selectionOptions = asList(
mock(SelectionOption.class),
mock(SelectionOption.class),
mock(SelectionOption.class)
);
adapter.setSelectionOptions(selectionOptions);
assertThat(adapter.getItemId(0)).isEqualTo(0);
assertThat(adapter.getItemId(1)).isEqualTo(1);
assertThat(adapter.getItemId(2)).isEqualTo(2);
}
@SuppressLint("SetTextI18n")
@Test
public void getView_shouldBindDataAndReturnViewWithoutConvertView() {
List<SelectionOption> selectionOptions = asList(
mock(SelectionOption.class),
mock(SelectionOption.class),
mock(SelectionOption.class)
);
adapter.setSelectionOptions(selectionOptions);
ViewGroup container = mock(ViewGroup.class);
for (int position = 0; position < selectionOptions.size(); position++) {
when(selectionOptions.get(position).title()).thenReturn("Title " + position);
View view = mock(View.class);
when(layoutInflater.inflate(R.layout.list_developer_settings_spinner_item, container, false)).thenReturn(view);
TextView titleTextView = mock(TextView.class);
when(view.findViewById(R.id.list_developer_settings_spinner_item_title_text_view)).thenReturn(titleTextView);
// Notice: there is NO convertView, that what we want to check.
assertThat(adapter.getView(position, null, container)).isSameAs(view);
verify(titleTextView).setText("Title " + position);
}
}
@Test
public void getView_shouldBindDataAndReturnViewWithConvertView() {
List<SelectionOption> selectionOptions = asList(
mock(SelectionOption.class),
mock(SelectionOption.class),
mock(SelectionOption.class)
);
adapter.setSelectionOptions(selectionOptions);
ViewGroup container = mock(ViewGroup.class);
for (int position = 0; position < selectionOptions.size(); position++) {
View view = mock(View.class);
when(layoutInflater.inflate(R.layout.list_developer_settings_spinner_item, container, false)).thenReturn(view);
DeveloperSettingsSpinnerAdapter.ViewHolder viewHolder = mock(DeveloperSettingsSpinnerAdapter.ViewHolder.class);
when(view.getTag()).thenReturn(viewHolder);
// Notice: there IS convertView, that what we want to check.
assertThat(adapter.getView(position, view, container)).isSameAs(view);
verify(viewHolder).bindItem(selectionOptions.get(position));
}
}
@SuppressLint("SetTextI18n")
@Test
public void getDropDownView_shouldBindDataAndReturnViewWithoutConvertView() {
List<SelectionOption> selectionOptions = asList(
mock(SelectionOption.class),
mock(SelectionOption.class),
mock(SelectionOption.class)
);
adapter.setSelectionOptions(selectionOptions);
ViewGroup container = mock(ViewGroup.class);
for (int position = 0; position < selectionOptions.size(); position++) {
when(selectionOptions.get(position).title()).thenReturn("Title " + position);
View view = mock(View.class);
when(layoutInflater.inflate(R.layout.list_developer_settings_spinner_drop_down_item, container, false)).thenReturn(view);
TextView titleTextView = mock(TextView.class);
when(view.findViewById(R.id.list_developer_settings_spinner_item_title_text_view)).thenReturn(titleTextView);
// Notice: there is NO convertView, that what we want to check.
assertThat(adapter.getDropDownView(position, null, container)).isSameAs(view);
verify(titleTextView).setText("Title " + position);
}
}
@Test
public void getDropDownView_shouldBindDataAndReturnViewWithConvertView() {
List<SelectionOption> selectionOptions = asList(
mock(SelectionOption.class),
mock(SelectionOption.class),
mock(SelectionOption.class)
);
adapter.setSelectionOptions(selectionOptions);
ViewGroup container = mock(ViewGroup.class);
for (int position = 0; position < selectionOptions.size(); position++) {
View view = mock(View.class);
when(layoutInflater.inflate(R.layout.list_developer_settings_spinner_item, container, false)).thenReturn(view);
DeveloperSettingsSpinnerAdapter.ViewHolder viewHolder = mock(DeveloperSettingsSpinnerAdapter.ViewHolder.class);
when(view.getTag()).thenReturn(viewHolder);
// Notice: there IS convertView, that what we want to check.
assertThat(adapter.getDropDownView(position, view, container)).isSameAs(view);
verify(viewHolder).bindItem(selectionOptions.get(position));
}
}
}