1package org.robolectric.shadows; 2 3import static org.assertj.core.api.Assertions.assertThat; 4 5import android.widget.Filter; 6import java.util.concurrent.atomic.AtomicBoolean; 7import org.junit.Test; 8import org.junit.runner.RunWith; 9import org.robolectric.RobolectricTestRunner; 10 11@RunWith(RobolectricTestRunner.class) 12public class ShadowFilterTest { 13 14 @Test 15 public void testFilterShouldCallPerformFilteringAndPublishResults() throws InterruptedException { 16 final AtomicBoolean performFilteringCalled = new AtomicBoolean(false); 17 final AtomicBoolean publishResultsCalled = new AtomicBoolean(false); 18 Filter filter = new Filter() { 19 @Override 20 protected FilterResults performFiltering(CharSequence charSequence) { 21 performFilteringCalled.set(true); 22 return null; 23 } 24 25 @Override 26 protected void publishResults(CharSequence charSequence, FilterResults filterResults) { 27 assertThat(filterResults).isNull(); 28 publishResultsCalled.set(true); 29 } 30 }; 31 filter.filter(""); 32 assertThat(performFilteringCalled.get()).isTrue(); 33 assertThat(publishResultsCalled.get()).isTrue(); 34 } 35 36 @Test 37 public void testFilterShouldCallListenerWithCorrectCount() throws InterruptedException { 38 final AtomicBoolean listenerCalled = new AtomicBoolean(false); 39 Filter filter = new Filter() { 40 @Override 41 protected FilterResults performFiltering(CharSequence charSequence) { 42 FilterResults results = new FilterResults(); 43 results.values = null; 44 results.count = 4; 45 return results; 46 } 47 48 @Override 49 protected void publishResults(CharSequence charSequence, FilterResults filterResults) { 50 assertThat(filterResults.values).isNull(); 51 assertThat(filterResults.count).isEqualTo(4); 52 } 53 }; 54 filter.filter("", new Filter.FilterListener() { 55 @Override 56 public void onFilterComplete(int i) { 57 assertThat(i).isEqualTo(4); 58 listenerCalled.set(true); 59 } 60 }); 61 assertThat(listenerCalled.get()).isTrue(); 62 } 63 64 @Test 65 public void testFilter_whenNullResults_ShouldCallListenerWithMinusOne() throws InterruptedException { 66 final AtomicBoolean listenerCalled = new AtomicBoolean(false); 67 Filter filter = new Filter() { 68 @Override 69 protected FilterResults performFiltering(CharSequence charSequence) { 70 return null; 71 } 72 73 @Override 74 protected void publishResults(CharSequence charSequence, FilterResults filterResults) {} 75 }; 76 filter.filter("", new Filter.FilterListener() { 77 @Override 78 public void onFilterComplete(int i) { 79 assertThat(i).isEqualTo(-1); 80 listenerCalled.set(true); 81 } 82 }); 83 assertThat(listenerCalled.get()).isTrue(); 84 } 85 86 @Test 87 public void testFilter_whenExceptionThrown_ShouldReturn() throws InterruptedException { 88 final AtomicBoolean listenerCalled = new AtomicBoolean(false); 89 Filter filter = new Filter() { 90 @Override 91 protected FilterResults performFiltering(CharSequence charSequence) { 92 throw new RuntimeException("unchecked exception during filtering"); 93 } 94 95 @Override 96 protected void publishResults(CharSequence charSequence, FilterResults filterResults) {} 97 }; 98 filter.filter("", new Filter.FilterListener() { 99 @Override 100 public void onFilterComplete(int resultCount) { 101 assertThat(resultCount).isEqualTo(0); 102 listenerCalled.set(true); 103 } 104 }); 105 assertThat(listenerCalled.get()).isTrue(); 106 } 107} 108