1be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson/*
2be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson * Copyright (C) 2010 The Android Open Source Project
3be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson *
4be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson * Licensed under the Apache License, Version 2.0 (the "License");
5be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson * you may not use this file except in compliance with the License.
6be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson * You may obtain a copy of the License at
7be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson *
8be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson *      http://www.apache.org/licenses/LICENSE-2.0
9be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson *
10be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson * Unless required by applicable law or agreed to in writing, software
11be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS,
12be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson * See the License for the specific language governing permissions and
14be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson * limitations under the License.
15be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson */
16be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson
176186821cb13f4ac7ff50950c813394367e021eaeJesse Wilsonpackage libcore.util;
18be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson
19be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilsonimport java.lang.ref.Reference;
20be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilsonimport java.lang.ref.WeakReference;
21be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilsonimport java.util.ArrayList;
22be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilsonimport java.util.Arrays;
23f16edfe125c261e7f4e5cff52c0b9c923d9f7fe6Jesse Wilsonimport java.util.Collections;
24be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilsonimport java.util.Iterator;
25be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilsonimport java.util.List;
26be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilsonimport junit.framework.TestCase;
27be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson
28be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilsonpublic final class CollectionUtilsTest extends TestCase {
29be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson
30be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson    public void testDereferenceIterable() {
31be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        List<Reference<String>> refs = new ArrayList<Reference<String>>();
32be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        refs.add(newLiteralReference("a"));
33be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        refs.add(newLiteralReference("b"));
34be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        refs.add(newLiteralReference("c"));
35be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        refs.add(newLiteralReference("d"));
36be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        refs.add(newLiteralReference("e"));
37be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson
38be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        Iterable<String> strings = CollectionUtils.dereferenceIterable(refs, true);
39be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        assertEquals(Arrays.<String>asList("a", "b", "c", "d", "e"), toList(strings));
40be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson
41be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        refs.get(1).clear(); // b
42be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        assertEquals(Arrays.<String>asList("a", "c", "d", "e"), toList(strings));
43be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        assertEquals(4, refs.size());
44be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson
45be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        Iterator<String> i = strings.iterator();
46be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        assertEquals("a", i.next());
47be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        i.remove();
48be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        assertEquals(3, refs.size());
49be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        assertEquals("c", i.next());
50be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        assertEquals("d", i.next());
51be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        assertTrue(i.hasNext());
52be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        try {
53be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson            i.remove();
54be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson            fail("Expected hasNext() to make remove() impossible.");
55be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        } catch (IllegalStateException expected) {
56be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        }
57be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        assertEquals("e", i.next());
58be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        i.remove();
59be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        assertEquals(2, refs.size());
60be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        assertFalse(i.hasNext());
61be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson
62be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        refs.get(0).clear(); // c
63be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        refs.get(1).clear(); // d
64be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        assertEquals(Arrays.<String>asList(), toList(strings));
65be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson    }
66be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson
67be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson    private <T> List<T> toList(Iterable<T> iterable) {
68be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        List<T> result = new ArrayList<T>();
69be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        for (T t : iterable) {
70be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson            result.add(t);
71be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        }
72be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        return result;
73be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson    }
74be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson
75f16edfe125c261e7f4e5cff52c0b9c923d9f7fe6Jesse Wilson    public void testRemoveDuplicatesOnEmptyCollection() {
76f16edfe125c261e7f4e5cff52c0b9c923d9f7fe6Jesse Wilson        List<String> list = new ArrayList<String>();
77f16edfe125c261e7f4e5cff52c0b9c923d9f7fe6Jesse Wilson        CollectionUtils.removeDuplicates(list, String.CASE_INSENSITIVE_ORDER);
78f16edfe125c261e7f4e5cff52c0b9c923d9f7fe6Jesse Wilson        assertTrue(list.isEmpty());
79f16edfe125c261e7f4e5cff52c0b9c923d9f7fe6Jesse Wilson    }
80f16edfe125c261e7f4e5cff52c0b9c923d9f7fe6Jesse Wilson
81f16edfe125c261e7f4e5cff52c0b9c923d9f7fe6Jesse Wilson    public void testRemoveDuplicatesOnSingletonCollection() {
82f16edfe125c261e7f4e5cff52c0b9c923d9f7fe6Jesse Wilson        List<String> list = Arrays.asList("A");
83f16edfe125c261e7f4e5cff52c0b9c923d9f7fe6Jesse Wilson        CollectionUtils.removeDuplicates(list, String.CASE_INSENSITIVE_ORDER);
84f16edfe125c261e7f4e5cff52c0b9c923d9f7fe6Jesse Wilson        assertEquals(Collections.singletonList("A"), list);
85f16edfe125c261e7f4e5cff52c0b9c923d9f7fe6Jesse Wilson    }
86f16edfe125c261e7f4e5cff52c0b9c923d9f7fe6Jesse Wilson
87f16edfe125c261e7f4e5cff52c0b9c923d9f7fe6Jesse Wilson    public void testRemoveDuplicates() {
88f16edfe125c261e7f4e5cff52c0b9c923d9f7fe6Jesse Wilson        List<String> list = new ArrayList<String>();
89f16edfe125c261e7f4e5cff52c0b9c923d9f7fe6Jesse Wilson        list.add("A");
90f16edfe125c261e7f4e5cff52c0b9c923d9f7fe6Jesse Wilson        list.add("A");
91f16edfe125c261e7f4e5cff52c0b9c923d9f7fe6Jesse Wilson        list.add("A");
92f16edfe125c261e7f4e5cff52c0b9c923d9f7fe6Jesse Wilson        list.add("B");
93f16edfe125c261e7f4e5cff52c0b9c923d9f7fe6Jesse Wilson        list.add("C");
94f16edfe125c261e7f4e5cff52c0b9c923d9f7fe6Jesse Wilson        list.add("C");
95f16edfe125c261e7f4e5cff52c0b9c923d9f7fe6Jesse Wilson        list.add("C");
96f16edfe125c261e7f4e5cff52c0b9c923d9f7fe6Jesse Wilson        CollectionUtils.removeDuplicates(list, String.CASE_INSENSITIVE_ORDER);
97f16edfe125c261e7f4e5cff52c0b9c923d9f7fe6Jesse Wilson        assertEquals(Arrays.asList("A", "B", "C"), list);
98f16edfe125c261e7f4e5cff52c0b9c923d9f7fe6Jesse Wilson    }
99f16edfe125c261e7f4e5cff52c0b9c923d9f7fe6Jesse Wilson
100be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson    /**
101be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson     * A reference that must be manually cleared.
102be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson     */
103be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson    public Reference<String> newLiteralReference(String s) {
104be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        return new WeakReference<String>(s);
105be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson    }
106be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson}
107