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