1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.commons.functor.core.collection;
18  
19  import static org.junit.Assert.assertEquals;
20  import static org.junit.Assert.assertNull;
21  import static org.junit.Assert.assertSame;
22  import static org.junit.Assert.assertTrue;
23  import static org.junit.Assert.fail;
24  
25  import java.util.ArrayList;
26  import java.util.Collections;
27  import java.util.Iterator;
28  import java.util.List;
29  import java.util.NoSuchElementException;
30  
31  import org.apache.commons.functor.BaseFunctorTest;
32  import org.apache.commons.functor.UnaryPredicate;
33  import org.apache.commons.functor.core.Constant;
34  import org.junit.After;
35  import org.junit.Before;
36  import org.junit.Test;
37  
38  /**
39   * @version $Revision: 1171255 $ $Date: 2011-09-15 22:27:39 +0200 (Thu, 15 Sep 2011) $
40   * @author Rodney Waldhoff
41   */
42  @SuppressWarnings("unchecked")
43  public class TestFilteredIterator extends BaseFunctorTest {
44  
45      public Object makeFunctor() {
46          List list = new ArrayList();
47          list.add("xyzzy");
48          return FilteredIterator.filter(list.iterator(),Constant.truePredicate());
49      }
50  
51      @Before
52      public void setUp() throws Exception {
53          list = new ArrayList();
54          evens = new ArrayList();
55          for (int i=0;i<10;i++) {
56              list.add(new Integer(i));
57              if (i%2 == 0) {
58                  evens.add(new Integer(i));
59              }
60          }
61      }
62  
63      @After
64      public void tearDown() throws Exception {
65          list = null;
66          evens = null;
67      }
68  
69      // Tests
70      // ------------------------------------------------------------------------
71  
72      @Test
73      public void testSomePass() {
74          Iterator expected = evens.iterator();
75          Iterator testing = new FilteredIterator(list.iterator(),isEven);
76          while(expected.hasNext()) {
77              assertTrue(testing.hasNext());
78              assertEquals(expected.next(),testing.next());
79          }
80          assertTrue(!testing.hasNext());
81      }
82  
83      @Test
84      public void testAllPass() {
85          Iterator expected = evens.iterator();
86          Iterator testing = new FilteredIterator(evens.iterator(),isEven);
87          while(expected.hasNext()) {
88              assertTrue(testing.hasNext());
89              assertEquals(expected.next(),testing.next());
90          }
91          assertTrue(!testing.hasNext());
92      }
93  
94      @Test
95      public void testAllPass2() {
96          Iterator expected = list.iterator();
97          Iterator testing = new FilteredIterator(list.iterator(),Constant.truePredicate());
98          while(expected.hasNext()) {
99              assertTrue(testing.hasNext());
100             assertEquals(expected.next(),testing.next());
101         }
102         assertTrue(!testing.hasNext());
103     }
104 
105     @Test
106     public void testEmptyList() {
107         Iterator testing = new FilteredIterator(Collections.EMPTY_LIST.iterator(),isEven);
108         assertTrue(!testing.hasNext());
109     }
110 
111     @Test
112     public void testNonePass() {
113         Iterator testing = new FilteredIterator(Collections.EMPTY_LIST.iterator(),Constant.falsePredicate());
114         assertTrue(!testing.hasNext());
115     }
116 
117     @Test
118     public void testNextWithoutHasNext() {
119         Iterator testing = new FilteredIterator(list.iterator(),isEven);
120         Iterator expected = evens.iterator();
121         while(expected.hasNext()) {
122             assertEquals(expected.next(),testing.next());
123         }
124         assertTrue(!(testing.hasNext()));
125     }
126 
127     @Test
128     public void testNextAfterEndOfList() {
129         Iterator testing = new FilteredIterator(list.iterator(),isEven);
130         Iterator expected = evens.iterator();
131         while(expected.hasNext()) {
132             assertEquals(expected.next(),testing.next());
133         }
134         try {
135             testing.next();
136             fail("ExpectedNoSuchElementException");
137         } catch(NoSuchElementException e) {
138             // expected
139         }
140     }
141 
142     @Test
143     public void testNextOnEmptyList() {
144         Iterator testing = new FilteredIterator(Collections.EMPTY_LIST.iterator(),isEven);
145         try {
146             testing.next();
147             fail("ExpectedNoSuchElementException");
148         } catch(NoSuchElementException e) {
149             // expected
150         }
151     }
152 
153     @Test
154     public void testRemoveBeforeNext() {
155         Iterator testing = new FilteredIterator(list.iterator(),isEven);
156         try {
157             testing.remove();
158             fail("IllegalStateException");
159         } catch(IllegalStateException e) {
160             // expected
161         }
162     }
163 
164     @Test
165     public void testRemoveAfterNext() {
166         Iterator testing = new FilteredIterator(list.iterator(),isEven);
167         testing.next();
168         testing.remove();
169         try {
170             testing.remove();
171             fail("IllegalStateException");
172         } catch(IllegalStateException e) {
173             // expected
174         }
175     }
176 
177     @Test
178     public void testRemoveSome() {
179         Iterator testing = new FilteredIterator(list.iterator(),isEven);
180         while(testing.hasNext()) {
181             testing.next();
182             testing.remove();
183         }
184         for (Iterator iter = list.iterator(); iter.hasNext();) {
185             assertTrue(! isEven.test(iter.next()) );
186         }
187     }
188 
189     @Test
190     public void testRemoveAll() {
191         Iterator testing = new FilteredIterator(list.iterator(),Constant.truePredicate());
192         while(testing.hasNext()) {
193             testing.next();
194             testing.remove();
195         }
196         assertTrue(list.isEmpty());
197     }
198 
199     @Test
200     public void testRemoveWithoutHasNext() {
201         Iterator testing = new FilteredIterator(list.iterator(),Constant.truePredicate());
202         for (int i=0,m = list.size();i<m;i++) {
203             testing.next();
204             testing.remove();
205         }
206         assertTrue(list.isEmpty());
207     }
208 
209     @Test
210     public void testFilterWithNullIteratorReturnsNull() {
211         assertNull(FilteredIterator.filter(null,Constant.truePredicate()));
212     }
213 
214     @Test
215     public void testFilterWithNullPredicateReturnsIdentity() {
216         Iterator iter = list.iterator();
217         assertSame(iter,FilteredIterator.filter(iter,null));
218     }
219 
220     @Test
221     public void testConstructorProhibitsNull() {
222         try {
223             new FilteredIterator(null,null);
224             fail("ExpectedNullPointerException");
225         } catch(IllegalArgumentException e) {
226             // expected
227         }
228         try {
229             new FilteredIterator(null,Constant.truePredicate());
230             fail("ExpectedNullPointerException");
231         } catch(IllegalArgumentException e) {
232             // expected
233         }
234         try {
235             new FilteredIterator(list.iterator(),null);
236             fail("ExpectedNullPointerException");
237         } catch(IllegalArgumentException e) {
238             // expected
239         }
240     }
241 
242 
243     // Attributes
244     // ------------------------------------------------------------------------
245     private List list = null;
246     private List evens = null;
247     private UnaryPredicate isEven = new UnaryPredicate() {
248         public boolean test(Object obj) {
249             return ((Number) obj).intValue() % 2 == 0;
250         }
251     };
252 
253 }