CollectionUtilsTest.java revision be013ce620f6d3bd24f7f0b631a36f70197ac3e3
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
17be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilsonpackage libcore.base;
18be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson
19be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilsonimport java.lang.ref.Reference;
20be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilsonimport java.lang.ref.WeakReference;
21be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilsonimport java.util.ArrayList;
22be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilsonimport java.util.Arrays;
23be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilsonimport java.util.Iterator;
24be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilsonimport java.util.List;
25be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilsonimport junit.framework.TestCase;
26be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson
27be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilsonpublic final class CollectionUtilsTest extends TestCase {
28be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson
29be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson    public void testDereferenceIterable() {
30be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        List<Reference<String>> refs = new ArrayList<Reference<String>>();
31be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        refs.add(newLiteralReference("a"));
32be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        refs.add(newLiteralReference("b"));
33be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        refs.add(newLiteralReference("c"));
34be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        refs.add(newLiteralReference("d"));
35be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        refs.add(newLiteralReference("e"));
36be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson
37be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        Iterable<String> strings = CollectionUtils.dereferenceIterable(refs, true);
38be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        assertEquals(Arrays.<String>asList("a", "b", "c", "d", "e"), toList(strings));
39be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson
40be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        refs.get(1).clear(); // b
41be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        assertEquals(Arrays.<String>asList("a", "c", "d", "e"), toList(strings));
42be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        assertEquals(4, refs.size());
43be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson
44be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        Iterator<String> i = strings.iterator();
45be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        assertEquals("a", i.next());
46be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        i.remove();
47be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        assertEquals(3, refs.size());
48be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        assertEquals("c", i.next());
49be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        assertEquals("d", i.next());
50be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        assertTrue(i.hasNext());
51be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        try {
52be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson            i.remove();
53be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson            fail("Expected hasNext() to make remove() impossible.");
54be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        } catch (IllegalStateException expected) {
55be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        }
56be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        assertEquals("e", i.next());
57be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        i.remove();
58be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        assertEquals(2, refs.size());
59be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        assertFalse(i.hasNext());
60be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson
61be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        refs.get(0).clear(); // c
62be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        refs.get(1).clear(); // d
63be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        assertEquals(Arrays.<String>asList(), toList(strings));
64be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson    }
65be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson
66be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson    private <T> List<T> toList(Iterable<T> iterable) {
67be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        List<T> result = new ArrayList<T>();
68be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        for (T t : iterable) {
69be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson            result.add(t);
70be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        }
71be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        return result;
72be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson    }
73be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson
74be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson    /**
75be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson     * A reference that must be manually cleared.
76be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson     */
77be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson    public Reference<String> newLiteralReference(String s) {
78be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson        return new WeakReference<String>(s);
79be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson    }
80be013ce620f6d3bd24f7f0b631a36f70197ac3e3Jesse Wilson}
81