View Javadoc
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.collections4.set;
18  
19  import static org.junit.jupiter.api.Assertions.assertEquals;
20  import static org.junit.jupiter.api.Assertions.assertSame;
21  import static org.junit.jupiter.api.Assertions.assertThrows;
22  import static org.junit.jupiter.api.Assertions.assertTrue;
23  
24  import java.util.ArrayList;
25  import java.util.Collection;
26  import java.util.HashSet;
27  import java.util.Iterator;
28  import java.util.List;
29  import java.util.Set;
30  
31  import org.apache.commons.collections4.IteratorUtils;
32  import org.junit.jupiter.api.Test;
33  
34  /**
35   * Extension of {@link AbstractSetTest} for exercising the
36   * {@link ListOrderedSet} implementation.
37   */
38  public class ListOrderedSetTest<E>
39      extends AbstractSetTest<E> {
40  
41      static class A {
42  
43          @Override
44          public boolean equals(final Object obj) {
45              return obj instanceof A || obj instanceof B;
46          }
47  
48          @Override
49          public int hashCode() {
50              return 1;
51          }
52      }
53  
54      static class B {
55  
56          @Override
57          public boolean equals(final Object obj) {
58              return obj instanceof A || obj instanceof B;
59          }
60  
61          @Override
62          public int hashCode() {
63              return 1;
64          }
65      }
66  
67      private static final Integer ZERO = Integer.valueOf(0);
68  
69      private static final Integer ONE = Integer.valueOf(1);
70  
71      private static final Integer TWO = Integer.valueOf(2);
72  
73      private static final Integer THREE = Integer.valueOf(3);
74  
75      @Override
76      public String getCompatibilityVersion() {
77          return "4";
78      }
79  
80      @Override
81      public ListOrderedSet<E> makeObject() {
82          return ListOrderedSet.listOrderedSet(new HashSet<>());
83      }
84  
85      @SuppressWarnings("unchecked")
86      protected ListOrderedSet<E> setupSet() {
87          final ListOrderedSet<E> set = makeObject();
88  
89          for (int i = 0; i < 10; i++) {
90              set.add((E) Integer.toString(i));
91          }
92          return set;
93      }
94  
95      @Test
96      public void testDecorator() {
97          assertThrows(NullPointerException.class, () -> ListOrderedSet.listOrderedSet((List<E>) null));
98          assertThrows(NullPointerException.class, () -> ListOrderedSet.listOrderedSet((Set<E>) null));
99          assertThrows(NullPointerException.class, () -> ListOrderedSet.listOrderedSet(null, null));
100         assertThrows(NullPointerException.class, () -> ListOrderedSet.listOrderedSet(new HashSet<>(), null));
101         assertThrows(NullPointerException.class, () -> ListOrderedSet.listOrderedSet(null, new ArrayList<>()));
102     }
103 
104     @Test
105     @SuppressWarnings("unchecked")
106     public void testDuplicates() {
107         final List<E> list = new ArrayList<>(10);
108         list.add((E) Integer.valueOf(1));
109         list.add((E) Integer.valueOf(2));
110         list.add((E) Integer.valueOf(3));
111         list.add((E) Integer.valueOf(1));
112 
113         final ListOrderedSet<E> orderedSet = ListOrderedSet.listOrderedSet(list);
114 
115         assertEquals(3, orderedSet.size());
116         assertEquals(3, IteratorUtils.toArray(orderedSet.iterator()).length);
117 
118         // insertion order preserved?
119         assertEquals(Integer.valueOf(1), orderedSet.get(0));
120         assertEquals(Integer.valueOf(2), orderedSet.get(1));
121         assertEquals(Integer.valueOf(3), orderedSet.get(2));
122     }
123 
124     @Test
125     @SuppressWarnings("unchecked")
126     public void testListAddIndexed() {
127         final ListOrderedSet<E> set = makeObject();
128         set.add((E) ZERO);
129         set.add((E) TWO);
130 
131         set.add(1, (E) ONE);
132         assertEquals(3, set.size());
133         assertSame(ZERO, set.get(0));
134         assertSame(ONE, set.get(1));
135         assertSame(TWO, set.get(2));
136 
137         set.add(0, (E) ONE);
138         assertEquals(3, set.size());
139         assertSame(ZERO, set.get(0));
140         assertSame(ONE, set.get(1));
141         assertSame(TWO, set.get(2));
142 
143         final List<E> list = new ArrayList<>();
144         list.add((E) ZERO);
145         list.add((E) TWO);
146 
147         set.addAll(0, list);
148         assertEquals(3, set.size());
149         assertSame(ZERO, set.get(0));
150         assertSame(ONE, set.get(1));
151         assertSame(TWO, set.get(2));
152 
153         list.add(0, (E) THREE); // list = [3,0,2]
154         set.remove(TWO); //  set = [0,1]
155         set.addAll(1, list);
156         assertEquals(4, set.size());
157         assertSame(ZERO, set.get(0));
158         assertSame(THREE, set.get(1));
159         assertSame(TWO, set.get(2));
160         assertSame(ONE, set.get(3));
161     }
162 
163     @Test
164     @SuppressWarnings("unchecked")
165     public void testListAddRemove() {
166         final ListOrderedSet<E> set = makeObject();
167         final List<E> view = set.asList();
168         set.add((E) ZERO);
169         set.add((E) ONE);
170         set.add((E) TWO);
171 
172         assertEquals(3, set.size());
173         assertSame(ZERO, set.get(0));
174         assertSame(ONE, set.get(1));
175         assertSame(TWO, set.get(2));
176         assertEquals(3, view.size());
177         assertSame(ZERO, view.get(0));
178         assertSame(ONE, view.get(1));
179         assertSame(TWO, view.get(2));
180 
181         assertEquals(0, set.indexOf(ZERO));
182         assertEquals(1, set.indexOf(ONE));
183         assertEquals(2, set.indexOf(TWO));
184 
185         set.remove(1);
186         assertEquals(2, set.size());
187         assertSame(ZERO, set.get(0));
188         assertSame(TWO, set.get(1));
189         assertEquals(2, view.size());
190         assertSame(ZERO, view.get(0));
191         assertSame(TWO, view.get(1));
192     }
193 
194     @Test
195     @SuppressWarnings("unchecked")
196     public void testListAddReplacing() {
197         final ListOrderedSet<E> set = makeObject();
198         final A a = new A();
199         final B b = new B();
200         set.add((E) a);
201         assertEquals(1, set.size());
202         set.add((E) b); // will match but not replace A as equal
203         assertEquals(1, set.size());
204         assertSame(a, set.decorated().iterator().next());
205         assertSame(a, set.iterator().next());
206         assertSame(a, set.get(0));
207         assertSame(a, set.asList().get(0));
208     }
209 
210     @Test
211     @SuppressWarnings("unchecked")
212     public void testOrdering() {
213         final ListOrderedSet<E> set = setupSet();
214         Iterator<E> it = set.iterator();
215 
216         for (int i = 0; i < 10; i++) {
217             assertEquals(Integer.toString(i), it.next(), "Sequence is wrong");
218         }
219 
220         for (int i = 0; i < 10; i += 2) {
221             assertTrue(set.remove(Integer.toString(i)),
222                        "Must be able to remove int");
223         }
224 
225         it = set.iterator();
226         for (int i = 1; i < 10; i += 2) {
227             assertEquals(Integer.toString(i), it.next(),
228                          "Sequence is wrong after remove ");
229         }
230 
231         for (int i = 0; i < 10; i++) {
232             set.add((E) Integer.toString(i));
233         }
234 
235         assertEquals(10, set.size(), "Size of set is wrong!");
236 
237         it = set.iterator();
238         for (int i = 1; i < 10; i += 2) {
239             assertEquals(Integer.toString(i), it.next(), "Sequence is wrong");
240         }
241         for (int i = 0; i < 10; i += 2) {
242             assertEquals(Integer.toString(i), it.next(), "Sequence is wrong");
243         }
244     }
245 
246     @Test
247     @SuppressWarnings("unchecked")
248     public void testRetainAll() {
249         final List<E> list = new ArrayList<>(10);
250         final Set<E> set = new HashSet<>(10);
251         final ListOrderedSet<E> orderedSet = ListOrderedSet.listOrderedSet(set, list);
252         for (int i = 0; i < 10; ++i) {
253             orderedSet.add((E) Integer.valueOf(10 - i - 1));
254         }
255 
256         final Collection<E> retained = new ArrayList<>(5);
257         for (int i = 0; i < 5; ++i) {
258             retained.add((E) Integer.valueOf(i * 2));
259         }
260 
261         assertTrue(orderedSet.retainAll(retained));
262         assertEquals(5, orderedSet.size());
263         // insertion order preserved?
264         assertEquals(Integer.valueOf(8), orderedSet.get(0));
265         assertEquals(Integer.valueOf(6), orderedSet.get(1));
266         assertEquals(Integer.valueOf(4), orderedSet.get(2));
267         assertEquals(Integer.valueOf(2), orderedSet.get(3));
268         assertEquals(Integer.valueOf(0), orderedSet.get(4));
269     }
270 
271 //    public void testCreate() throws Exception {
272 //        resetEmpty();
273 //        writeExternalFormToDisk((java.io.Serializable) getCollection(), "src/test/resources/data/test/ListOrderedSet.emptyCollection.version4.obj");
274 //        resetFull();
275 //        writeExternalFormToDisk((java.io.Serializable) getCollection(), "src/test/resources/data/test/ListOrderedSet.fullCollection.version4.obj");
276 //    }
277 
278 }