13984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath/* 23984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath * Copyright (C) 2016 The Android Open Source Project 33984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath * 43984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath * Licensed under the Apache License, Version 2.0 (the "License"); 53984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath * you may not use this file except in compliance with the License. 63984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath * You may obtain a copy of the License at 73984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath * 83984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath * http://www.apache.org/licenses/LICENSE-2.0 93984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath * 103984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath * Unless required by applicable law or agreed to in writing, software 113984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath * distributed under the License is distributed on an "AS IS" BASIS, 123984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath * See the License for the specific language governing permissions and 143984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath * limitations under the License 153984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath */ 163984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath 173984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamathpackage libcore.java.util; 183984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath 193984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamathimport java.util.ArrayList; 203984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamathimport java.util.Arrays; 213984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamathimport java.util.Collection; 223984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamathimport java.util.ConcurrentModificationException; 233984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamathimport java.util.Iterator; 243984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamathimport java.util.List; 253984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamathimport java.util.ListIterator; 263984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath 273984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamathimport static junit.framework.Assert.*; 283984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath 293984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath/** 303984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath * This class contains general purpose test cases for the {@code forEachRemaining} method inherited 313984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath * from {@code Iterator}. 323984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath */ 333984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamathpublic class ForEachRemainingTester { 343984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath 353984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath @SuppressWarnings("unchecked") 363984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath public static <T> void runTests(Class<?> collectionClazz, T[] initialData) 373984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath throws Exception { 383984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath test_forEachRemaining((Collection<T>) collectionClazz.newInstance(), initialData); 393984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath test_forEachRemaining_NPE((Collection<T>) collectionClazz.newInstance(), initialData); 403984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath test_forEachRemaining_CME((Collection<T>) collectionClazz.newInstance(), initialData); 413984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath 423984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath if (List.class.isAssignableFrom(collectionClazz)) { 433984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath List<T> asList = (List<T>) collectionClazz.newInstance(); 443984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath test_forEachRemaining_list(asList, initialData); 453984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath test_forEachRemaining_NPE_list(asList, initialData); 463984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath test_forEachRemaining_CME_list(asList, initialData); 473984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath } 483984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath } 493984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath 503984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath public static <T> void test_forEachRemaining_list(List<T> collection, T[] initialData) 513984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath throws Exception { 523984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath test_forEachRemaining(collection, initialData); 533984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath 543984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath ArrayList<T> recorder = new ArrayList<>(); 553984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath ListIterator<T> lit = collection.listIterator(1); 563984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath 573984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath lit.forEachRemaining((T i) -> recorder.add(i)); 583984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath if (initialData.length > 0) { 593984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath assertEquals(initialData.length - 1, recorder.size()); 603984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath for (int i = 1; i < initialData.length; i++){ 613984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath assertEquals(initialData[i], recorder.get(i - 1)); 623984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath } 633984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath } 643984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath } 653984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath 663984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath public static <T> void test_forEachRemaining(Collection<T> collection, T[] initialData) 673984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath throws Exception { 683984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath collection.addAll(Arrays.asList(initialData)); 693984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath 703984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath ArrayList<T> recorder = new ArrayList<>(); 713984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath collection.iterator().forEachRemaining((T i) -> recorder.add(i)); 72a71c780559190439211e731ea8ecf1e0291685d9Narayan Kamath // Note that the collection may not override equals and hashCode. 73a71c780559190439211e731ea8ecf1e0291685d9Narayan Kamath assertEquals(new ArrayList<T>(collection), recorder); 743984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath 753984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath recorder.clear(); 763984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath Iterator<T> it = collection.iterator(); 773984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath it.next(); 783984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath 793984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath it.forEachRemaining((T i) -> recorder.add(i)); 803984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath if (initialData.length > 0) { 813984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath assertEquals(initialData.length - 1, recorder.size()); 823984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath for (int i = 1; i < initialData.length; i++){ 833984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath assertEquals(initialData[i], recorder.get(i - 1)); 843984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath } 853984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath } 863984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath } 873984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath 883984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath public static <T> void test_forEachRemaining_NPE(Collection<T> collection, T[] initialData) 893984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath throws Exception { 903984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath try { 913984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath collection.iterator().forEachRemaining(null); 923984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath fail(); 933984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath } catch (NullPointerException expected) { 943984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath } 953984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath } 963984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath 973984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath public static <T> void test_forEachRemaining_CME(Collection<T> collection, T[] initialData) 983984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath throws Exception { 993984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath collection.add(initialData[0]); 1003984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath try { 1013984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath collection.iterator().forEachRemaining(i -> collection.add(i)); 1023984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath fail(); 1033984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath } catch (ConcurrentModificationException expected) { 1043984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath } 1053984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath } 1063984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath 1073984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath public static <T> void test_forEachRemaining_NPE_list(Collection<T> collection, T[] initialData) 1083984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath throws Exception { 1093984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath try { 1103984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath collection.iterator().forEachRemaining(null); 1113984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath fail(); 1123984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath } catch (NullPointerException expected) { 1133984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath } 1143984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath } 1153984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath 1163984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath public static <T> void test_forEachRemaining_CME_list(Collection<T> collection, T[] initialData) 1173984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath throws Exception { 1183984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath collection.add(initialData[0]); 1193984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath try { 1203984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath collection.iterator().forEachRemaining(i -> collection.add(i)); 1213984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath fail(); 1223984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath } catch (ConcurrentModificationException expected) { 1233984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath } 1243984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath } 1253984cdba314a0f7b0587000dec99ff26fd9bcbb5Narayan Kamath} 126