1 package org.robolectric.shadows; 2 3 import static com.google.common.truth.Truth.assertThat; 4 import static org.robolectric.Shadows.shadowOf; 5 import static org.robolectric.shadows.ShadowLooper.shadowMainLooper; 6 7 import android.view.View; 8 import android.widget.AdapterView; 9 import android.widget.TextView; 10 import androidx.test.ext.junit.runners.AndroidJUnit4; 11 import java.util.ArrayList; 12 import java.util.List; 13 import org.junit.Before; 14 import org.junit.Test; 15 import org.junit.runner.RunWith; 16 17 @RunWith(AndroidJUnit4.class) 18 public abstract class AdapterViewBehavior { 19 private AdapterView<ShadowCountingAdapter> adapterView; 20 21 @Before setUp()22 public void setUp() throws Exception { 23 shadowMainLooper().pause(); 24 adapterView = createAdapterView(); 25 } 26 createAdapterView()27 public abstract AdapterView<ShadowCountingAdapter> createAdapterView(); 28 29 @Test shouldIgnoreSetSelectionCallsWithInvalidPosition()30 public void shouldIgnoreSetSelectionCallsWithInvalidPosition() { 31 final List<String> transcript = new ArrayList<>(); 32 33 adapterView.setOnItemSelectedListener( 34 new AdapterView.OnItemSelectedListener() { 35 @Override 36 public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 37 transcript.add("onItemSelected fired"); 38 } 39 40 @Override 41 public void onNothingSelected(AdapterView<?> parent) {} 42 }); 43 44 shadowMainLooper().idle(); 45 assertThat(transcript).isEmpty(); 46 adapterView.setSelection(AdapterView.INVALID_POSITION); 47 shadowMainLooper().idle(); 48 assertThat(transcript).isEmpty(); 49 } 50 51 @Test testSetAdapter_shouldCauseViewsToBeRenderedAsynchronously()52 public void testSetAdapter_shouldCauseViewsToBeRenderedAsynchronously() throws Exception { 53 adapterView.setAdapter(new ShadowCountingAdapter(2)); 54 55 assertThat(adapterView.getCount()).isEqualTo(2); 56 assertThat(adapterView.getChildCount()).isEqualTo(0); 57 58 shadowOf(adapterView).populateItems(); 59 assertThat(adapterView.getChildCount()).isEqualTo(2); 60 assertThat(((TextView) adapterView.getChildAt(0)).getText().toString()).isEqualTo("Item 0"); 61 assertThat(((TextView) adapterView.getChildAt(1)).getText().toString()).isEqualTo("Item 1"); 62 } 63 64 @Test testSetEmptyView_shouldHideAdapterViewIfAdapterIsNull()65 public void testSetEmptyView_shouldHideAdapterViewIfAdapterIsNull() throws Exception { 66 adapterView.setAdapter(null); 67 68 View emptyView = new View(adapterView.getContext()); 69 adapterView.setEmptyView(emptyView); 70 71 assertThat(adapterView.getVisibility()).isEqualTo(View.GONE); 72 assertThat(emptyView.getVisibility()).isEqualTo(View.VISIBLE); 73 } 74 75 @Test testSetEmptyView_shouldHideAdapterViewIfAdapterViewIsEmpty()76 public void testSetEmptyView_shouldHideAdapterViewIfAdapterViewIsEmpty() throws Exception { 77 adapterView.setAdapter(new ShadowCountingAdapter(0)); 78 79 View emptyView = new View(adapterView.getContext()); 80 adapterView.setEmptyView(emptyView); 81 82 assertThat(adapterView.getVisibility()).isEqualTo(View.GONE); 83 assertThat(emptyView.getVisibility()).isEqualTo(View.VISIBLE); 84 } 85 86 @Test testSetEmptyView_shouldHideEmptyViewIfAdapterViewIsNotEmpty()87 public void testSetEmptyView_shouldHideEmptyViewIfAdapterViewIsNotEmpty() throws Exception { 88 adapterView.setAdapter(new ShadowCountingAdapter(1)); 89 90 View emptyView = new View(adapterView.getContext()); 91 adapterView.setEmptyView(emptyView); 92 93 assertThat(adapterView.getVisibility()).isEqualTo(View.VISIBLE); 94 assertThat(emptyView.getVisibility()).isEqualTo(View.GONE); 95 } 96 97 @Test testSetEmptyView_shouldHideEmptyViewWhenAdapterGetsNewItem()98 public void testSetEmptyView_shouldHideEmptyViewWhenAdapterGetsNewItem() throws Exception { 99 ShadowCountingAdapter adapter = new ShadowCountingAdapter(0); 100 adapterView.setAdapter(adapter); 101 102 View emptyView = new View(adapterView.getContext()); 103 adapterView.setEmptyView(emptyView); 104 105 assertThat(adapterView.getVisibility()).isEqualTo(View.GONE); 106 assertThat(emptyView.getVisibility()).isEqualTo(View.VISIBLE); 107 108 adapter.setCount(1); 109 110 shadowMainLooper().idle(); 111 112 assertThat(adapterView.getVisibility()).isEqualTo(View.VISIBLE); 113 assertThat(emptyView.getVisibility()).isEqualTo(View.GONE); 114 } 115 116 @Test testSetEmptyView_shouldHideAdapterViewWhenAdapterBecomesEmpty()117 public void testSetEmptyView_shouldHideAdapterViewWhenAdapterBecomesEmpty() throws Exception { 118 ShadowCountingAdapter adapter = new ShadowCountingAdapter(1); 119 adapterView.setAdapter(adapter); 120 121 View emptyView = new View(adapterView.getContext()); 122 adapterView.setEmptyView(emptyView); 123 124 assertThat(adapterView.getVisibility()).isEqualTo(View.VISIBLE); 125 assertThat(emptyView.getVisibility()).isEqualTo(View.GONE); 126 127 adapter.setCount(0); 128 129 shadowMainLooper().idle(); 130 131 assertThat(adapterView.getVisibility()).isEqualTo(View.GONE); 132 assertThat(emptyView.getVisibility()).isEqualTo(View.VISIBLE); 133 } 134 } 135