/* * Copyright 2008 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.emultest.java.util; import java.util.AbstractList; import java.util.ArrayList; import java.util.List; import java.util.ListIterator; /** * Tests ArrayList class (and by extension, AbstractList). */ @SuppressWarnings("unchecked") public class ArrayListTest extends ListTestBase { private static final class ArrayListWithRemoveRange extends ArrayList { @Override public void removeRange(int fromIndex, int toIndex) { super.removeRange(fromIndex, toIndex); } } public void testAbstractListUnmodifiableFailedIteratorAddIndexCorruption() { ListIterator<String> i = new AbstractList<String>() { @Override public int size() { return 0; } @Override public String get(int index) { throw new IndexOutOfBoundsException(); } }.listIterator(); try { i.add("bar"); fail(); } catch (UnsupportedOperationException expected) { // add() is expected to fail but shouldn't put us in a inconsistent state. // See: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6533203 } assertFalse(i.hasPrevious()); } public void testRemoveRange() { ArrayListWithRemoveRange l = new ArrayListWithRemoveRange(); for (int i = 0; i < 10; i++) { l.add(new Integer(i)); } try { l.removeRange(-1, 1); fail(); } catch (IndexOutOfBoundsException expected) { } try { l.removeRange(2, 1); fail(); } catch (IndexOutOfBoundsException expected) { // JRE } catch (IllegalArgumentException expected) { // GWT emulation } try { l.removeRange(2, 11); fail(); } catch (IndexOutOfBoundsException expected) { } l.removeRange(3, 5); assertEquals(8, l.size()); for (int i = 0; i < 3; i++) { Integer elem = (Integer) l.get(i); assertEquals(i, elem.intValue()); } for (int i = 3; i < 8; i++) { Integer elem = (Integer) l.get(i); assertEquals(i + 2, elem.intValue()); } l.removeRange(0, 8); // Tests on empty ArrayList assertEquals(0, l.size()); // removeRange(0, 0) is a special case in Java; it is always a no-op l.removeRange(0, 0); try { // (1, 1) is not a special case and undergoes bounds checking l.removeRange(1, 1); fail(); } catch (IndexOutOfBoundsException expected) { } try { l.removeRange(0, 1); fail(); } catch (IndexOutOfBoundsException expected) { } // Tests on 1-element ArrayList l.add(new Integer(1)); assertEquals(1, l.size()); l.removeRange(0, 0); // in-bounds no-op l.removeRange(1, 1); // in-bounds no-op try { l.removeRange(2, 2); // out-of-bounds no-op fail(); } catch (IndexOutOfBoundsException expected) { } l.removeRange(0, 1); assertEquals(0, l.size()); } @Override protected List makeEmptyList() { return new ArrayList(); } }