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