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