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