1 /* 2 * Copyright (C) 2007 The Guava Authors 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.google.common.collect.testing; 18 19 import com.google.common.annotations.GwtCompatible; 20 21 import java.util.AbstractCollection; 22 import java.util.Arrays; 23 import java.util.Collection; 24 import java.util.Iterator; 25 26 /** 27 * A simplistic collection which implements only the bare minimum allowed by the 28 * spec, and throws exceptions whenever it can. 29 * 30 * @author Kevin Bourrillion 31 */ 32 @GwtCompatible 33 public class MinimalCollection<E> extends AbstractCollection<E> { 34 // TODO: expose allow nulls parameter? 35 36 public static <E> MinimalCollection<E> of(E... contents) { 37 return new MinimalCollection<E>(Object.class, true, contents); 38 } 39 40 // TODO: use this 41 public static <E> MinimalCollection<E> ofClassAndContents( 42 Class<? super E> type, E... contents) { 43 return new MinimalCollection<E>(type, true, contents); 44 } 45 46 private final E[] contents; 47 private final Class<? super E> type; 48 private final boolean allowNulls; 49 50 // Package-private so that it can be extended. 51 MinimalCollection(Class<? super E> type, boolean allowNulls, E... contents) { 52 // TODO: consider making it shuffle the contents to test iteration order. 53 this.contents = Platform.clone(contents); 54 this.type = type; 55 this.allowNulls = allowNulls; 56 57 if (!allowNulls) { 58 for (Object element : contents) { 59 if (element == null) { 60 throw new NullPointerException(); 61 } 62 } 63 } 64 } 65 66 @Override public int size() { 67 return contents.length; 68 } 69 70 @Override public boolean contains(Object object) { 71 if (!allowNulls) { 72 // behave badly 73 if (object == null) { 74 throw new NullPointerException(); 75 } 76 } 77 Platform.checkCast(type, object); // behave badly 78 return Arrays.asList(contents).contains(object); 79 } 80 81 @Override public boolean containsAll(Collection<?> collection) { 82 if (!allowNulls) { 83 for (Object object : collection) { 84 // behave badly 85 if (object == null) { 86 throw new NullPointerException(); 87 } 88 } 89 } 90 return super.containsAll(collection); 91 } 92 93 @Override public Iterator<E> iterator() { 94 return Arrays.asList(contents).iterator(); 95 } 96 97 @Override public Object[] toArray() { 98 Object[] result = new Object[contents.length]; 99 System.arraycopy(contents, 0, result, 0, contents.length); 100 return result; 101 } 102 103 /* 104 * a "type A" unmodifiable collection freaks out proactively, even if there 105 * wasn't going to be any actual work to do anyway 106 */ 107 108 @Override public boolean addAll(Collection<? extends E> elementsToAdd) { 109 throw up(); 110 } 111 @Override public boolean removeAll(Collection<?> elementsToRemove) { 112 throw up(); 113 } 114 @Override public boolean retainAll(Collection<?> elementsToRetain) { 115 throw up(); 116 } 117 @Override public void clear() { 118 throw up(); 119 } 120 private static UnsupportedOperationException up() { 121 throw new UnsupportedOperationException(); 122 } 123 } 124