package org.robolectric.shadows;
import android.os.Looper;
import android.view.View;
import android.widget.AdapterView;
import android.widget.TextView;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.Shadows;
import org.robolectric.TestRunners;
import java.util.ArrayList;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
import static org.robolectric.Shadows.shadowOf;
@RunWith(TestRunners.MultiApiSelfTest.class)
abstract public class AdapterViewBehavior {
private AdapterView adapterView;
@Before
public void setUp() throws Exception {
Shadows.shadowOf(Looper.getMainLooper()).pause();
adapterView = createAdapterView();
}
abstract public AdapterView createAdapterView();
@Test public void shouldIgnoreSetSelectionCallsWithInvalidPosition() {
final List<String> transcript = new ArrayList<>();
adapterView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
transcript.add("onItemSelected fired");
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
ShadowHandler.idleMainLooper();
assertThat(transcript).isEmpty();
adapterView.setSelection(AdapterView.INVALID_POSITION);
ShadowHandler.idleMainLooper();
assertThat(transcript).isEmpty();
}
@Test public void testSetAdapter_ShouldCauseViewsToBeRenderedAsynchronously() throws Exception {
adapterView.setAdapter(new ShadowCountingAdapter(2));
assertThat(adapterView.getCount()).isEqualTo(2);
assertThat(adapterView.getChildCount()).isEqualTo(0);
shadowOf(adapterView).populateItems();
assertThat(adapterView.getChildCount()).isEqualTo(2);
assertThat(((TextView) adapterView.getChildAt(0)).getText()).isEqualTo("Item 0");
assertThat(((TextView) adapterView.getChildAt(1)).getText()).isEqualTo("Item 1");
}
@Test public void testSetEmptyView_ShouldHideAdapterViewIfAdapterIsNull() throws Exception {
adapterView.setAdapter(null);
View emptyView = new View(adapterView.getContext());
adapterView.setEmptyView(emptyView);
assertThat(adapterView.getVisibility()).isEqualTo(View.GONE);
assertThat(emptyView.getVisibility()).isEqualTo(View.VISIBLE);
}
@Test public void testSetEmptyView_ShouldHideAdapterViewIfAdapterViewIsEmpty() throws Exception {
adapterView.setAdapter(new ShadowCountingAdapter(0));
View emptyView = new View(adapterView.getContext());
adapterView.setEmptyView(emptyView);
assertThat(adapterView.getVisibility()).isEqualTo(View.GONE);
assertThat(emptyView.getVisibility()).isEqualTo(View.VISIBLE);
}
@Test public void testSetEmptyView_ShouldHideEmptyViewIfAdapterViewIsNotEmpty() throws Exception {
adapterView.setAdapter(new ShadowCountingAdapter(1));
View emptyView = new View(adapterView.getContext());
adapterView.setEmptyView(emptyView);
assertThat(adapterView.getVisibility()).isEqualTo(View.VISIBLE);
assertThat(emptyView.getVisibility()).isEqualTo(View.GONE);
}
@Test public void testSetEmptyView_ShouldHideEmptyViewWhenAdapterGetsNewItem() throws Exception {
ShadowCountingAdapter adapter = new ShadowCountingAdapter(0);
adapterView.setAdapter(adapter);
View emptyView = new View(adapterView.getContext());
adapterView.setEmptyView(emptyView);
assertThat(adapterView.getVisibility()).isEqualTo(View.GONE);
assertThat(emptyView.getVisibility()).isEqualTo(View.VISIBLE);
adapter.setCount(1);
ShadowHandler.idleMainLooper();
assertThat(adapterView.getVisibility()).isEqualTo(View.VISIBLE);
assertThat(emptyView.getVisibility()).isEqualTo(View.GONE);
}
@Test public void testSetEmptyView_ShouldHideAdapterViewWhenAdapterBecomesEmpty() throws Exception {
ShadowCountingAdapter adapter = new ShadowCountingAdapter(1);
adapterView.setAdapter(adapter);
View emptyView = new View(adapterView.getContext());
adapterView.setEmptyView(emptyView);
assertThat(adapterView.getVisibility()).isEqualTo(View.VISIBLE);
assertThat(emptyView.getVisibility()).isEqualTo(View.GONE);
adapter.setCount(0);
ShadowHandler.idleMainLooper();
assertThat(adapterView.getVisibility()).isEqualTo(View.GONE);
assertThat(emptyView.getVisibility()).isEqualTo(View.VISIBLE);
}
}