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
17d430cc782689a7f6a256ef6b0ebfc7210b0c31d9Tobias Thiererpackage libcore.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
28d430cc782689a7f6a256ef6b0ebfc7210b0c31d9Tobias Thiererimport libcore.util.CollectionUtils;
29d430cc782689a7f6a256ef6b0ebfc7210b0c31d9Tobias Thierer
30be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilsonpublic final class CollectionUtilsTest extends TestCase {
31be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson
32be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson    public void testDereferenceIterable() {
33be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        List<Reference<String>> refs = new ArrayList<Reference<String>>();
34be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        refs.add(newLiteralReference("a"));
35be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        refs.add(newLiteralReference("b"));
36be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        refs.add(newLiteralReference("c"));
37be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        refs.add(newLiteralReference("d"));
38be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        refs.add(newLiteralReference("e"));
39be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson
40be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        Iterable<String> strings = CollectionUtils.dereferenceIterable(refs, true);
41be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        assertEquals(Arrays.<String>asList("a", "b", "c", "d", "e"), toList(strings));
42be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson
43be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        refs.get(1).clear(); // b
44be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        assertEquals(Arrays.<String>asList("a", "c", "d", "e"), toList(strings));
45be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        assertEquals(4, refs.size());
46be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson
47be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        Iterator<String> i = strings.iterator();
48be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        assertEquals("a", i.next());
49be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        i.remove();
50be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        assertEquals(3, refs.size());
51be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        assertEquals("c", i.next());
52be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        assertEquals("d", i.next());
53be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        assertTrue(i.hasNext());
54be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        try {
55be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson            i.remove();
56be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson            fail("Expected hasNext() to make remove() impossible.");
57be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        } catch (IllegalStateException expected) {
58be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        }
59be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        assertEquals("e", i.next());
60be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        i.remove();
61be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        assertEquals(2, refs.size());
62be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        assertFalse(i.hasNext());
63be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson
64be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        refs.get(0).clear(); // c
65be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        refs.get(1).clear(); // d
66be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        assertEquals(Arrays.<String>asList(), toList(strings));
67be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson    }
68be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson
69be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson    private <T> List<T> toList(Iterable<T> iterable) {
70be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        List<T> result = new ArrayList<T>();
71be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        for (T t : iterable) {
72be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson            result.add(t);
73be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        }
74be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        return result;
75be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson    }
76be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson
77f16edfe125c261e7f4e5cff52c0b9c923d9f7fe6Jesse Wilson    public void testRemoveDuplicatesOnEmptyCollection() {
78f16edfe125c261e7f4e5cff52c0b9c923d9f7fe6Jesse Wilson        List<String> list = new ArrayList<String>();
79f16edfe125c261e7f4e5cff52c0b9c923d9f7fe6Jesse Wilson        CollectionUtils.removeDuplicates(list, String.CASE_INSENSITIVE_ORDER);
80f16edfe125c261e7f4e5cff52c0b9c923d9f7fe6Jesse Wilson        assertTrue(list.isEmpty());
81f16edfe125c261e7f4e5cff52c0b9c923d9f7fe6Jesse Wilson    }
82f16edfe125c261e7f4e5cff52c0b9c923d9f7fe6Jesse Wilson
83f16edfe125c261e7f4e5cff52c0b9c923d9f7fe6Jesse Wilson    public void testRemoveDuplicatesOnSingletonCollection() {
84f16edfe125c261e7f4e5cff52c0b9c923d9f7fe6Jesse Wilson        List<String> list = Arrays.asList("A");
85f16edfe125c261e7f4e5cff52c0b9c923d9f7fe6Jesse Wilson        CollectionUtils.removeDuplicates(list, String.CASE_INSENSITIVE_ORDER);
86f16edfe125c261e7f4e5cff52c0b9c923d9f7fe6Jesse Wilson        assertEquals(Collections.singletonList("A"), list);
87f16edfe125c261e7f4e5cff52c0b9c923d9f7fe6Jesse Wilson    }
88f16edfe125c261e7f4e5cff52c0b9c923d9f7fe6Jesse Wilson
89f16edfe125c261e7f4e5cff52c0b9c923d9f7fe6Jesse Wilson    public void testRemoveDuplicates() {
90f16edfe125c261e7f4e5cff52c0b9c923d9f7fe6Jesse Wilson        List<String> list = new ArrayList<String>();
91f16edfe125c261e7f4e5cff52c0b9c923d9f7fe6Jesse Wilson        list.add("A");
92f16edfe125c261e7f4e5cff52c0b9c923d9f7fe6Jesse Wilson        list.add("A");
93f16edfe125c261e7f4e5cff52c0b9c923d9f7fe6Jesse Wilson        list.add("A");
94f16edfe125c261e7f4e5cff52c0b9c923d9f7fe6Jesse Wilson        list.add("B");
95f16edfe125c261e7f4e5cff52c0b9c923d9f7fe6Jesse Wilson        list.add("C");
96f16edfe125c261e7f4e5cff52c0b9c923d9f7fe6Jesse Wilson        list.add("C");
97f16edfe125c261e7f4e5cff52c0b9c923d9f7fe6Jesse Wilson        list.add("C");
98f16edfe125c261e7f4e5cff52c0b9c923d9f7fe6Jesse Wilson        CollectionUtils.removeDuplicates(list, String.CASE_INSENSITIVE_ORDER);
99f16edfe125c261e7f4e5cff52c0b9c923d9f7fe6Jesse Wilson        assertEquals(Arrays.asList("A", "B", "C"), list);
100f16edfe125c261e7f4e5cff52c0b9c923d9f7fe6Jesse Wilson    }
101f16edfe125c261e7f4e5cff52c0b9c923d9f7fe6Jesse Wilson
102be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson    /**
103be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson     * A reference that must be manually cleared.
104be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson     */
105be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson    public Reference<String> newLiteralReference(String s) {
106be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        return new WeakReference<String>(s);
107be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson    }
108be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson}
109