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