11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/*
21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2009 The Guava Authors
31d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
41d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License");
51d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * you may not use this file except in compliance with the License.
61d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * You may obtain a copy of the License at
71d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
81d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * http://www.apache.org/licenses/LICENSE-2.0
91d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unless required by applicable law or agreed to in writing, software
111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * distributed under the License is distributed on an "AS IS" BASIS,
121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * See the License for the specific language governing permissions and
141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * limitations under the License.
151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpackage com.google.common.collect.testing;
181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static junit.framework.Assert.assertEquals;
201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static junit.framework.Assert.assertFalse;
211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static junit.framework.Assert.assertTrue;
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport junit.framework.Assert;
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport junit.framework.AssertionFailedError;
251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.ArrayList;
271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Arrays;
281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collection;
291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collections;
301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Comparator;
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Iterator;
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.LinkedHashSet;
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.List;
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.ListIterator;
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Map;
361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Map.Entry;
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Set;
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert// This class is GWT compatible.
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class Helpers {
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // Clone of Objects.equal
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  static boolean equal(Object a, Object b) {
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return a == b || (a != null && a.equals(b));
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // Clone of Lists.newArrayList
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static <E> List<E> copyToList(Iterable<? extends E> elements) {
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<E> list = new ArrayList<E>();
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    addAll(list, elements);
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return list;
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static <E> List<E> copyToList(E[] elements) {
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return copyToList(Arrays.asList(elements));
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // Clone of Sets.newLinkedHashSet
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static <E> Set<E> copyToSet(Iterable<? extends E> elements) {
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Set<E> set = new LinkedHashSet<E>();
601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    addAll(set, elements);
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return set;
621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static <E> Set<E> copyToSet(E[] elements) {
651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return copyToSet(Arrays.asList(elements));
661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // Would use Maps.immutableEntry
691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  static <K, V> Entry<K, V> mapEntry(K key, V value) {
701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return Collections.singletonMap(key, value).entrySet().iterator().next();
711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static void assertEqualIgnoringOrder(
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Iterable<?> expected, Iterable<?> actual) {
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<?> exp = copyToList(expected);
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<?> act = copyToList(actual);
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String actString = act.toString();
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Of course we could take pains to give the complete description of the
801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // problem on any failure.
811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Yeah it's n^2.
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (Object object : exp) {
841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      if (!act.remove(object)) {
851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Assert.fail("did not contain expected element " + object + ", "
861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            + "expected = " + exp + ", actual = " + actString);
871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue("unexpected elements: " + act, act.isEmpty());
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static void assertContentsAnyOrder(
931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Iterable<?> actual, Object... expected) {
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEqualIgnoringOrder(Arrays.asList(expected), actual);
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static <E> boolean addAll(
981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Collection<E> addTo, Iterable<? extends E> elementsToAdd) {
991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    boolean modified = false;
1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (E e : elementsToAdd) {
1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      modified |= addTo.add(e);
1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return modified;
1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  static <T> Iterable<T> reverse(final List<T> list) {
1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return new Iterable<T>() {
1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      public Iterator<T> iterator() {
1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        final ListIterator<T> listIter = list.listIterator(list.size());
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return new Iterator<T>() {
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          public boolean hasNext() {
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return listIter.hasPrevious();
1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          public T next() {
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return listIter.previous();
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override
1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          public void remove() {
1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            listIter.remove();
1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        };
1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    };
1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  static <T> Iterator<T> cycle(final Iterable<T> iterable) {
1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return new Iterator<T>() {
1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Iterator<T> iterator = Collections.<T>emptySet().iterator();
1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override
1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      public boolean hasNext() {
1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return true;
1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override
1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      public T next() {
1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        if (!iterator.hasNext()) {
1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          iterator = iterable.iterator();
1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return iterator.next();
1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override
1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      public void remove() {
1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        throw new UnsupportedOperationException();
1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    };
1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  static <T> T get(Iterator<T> iterator, int position) {
1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int i = 0; i < position; i++) {
1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      iterator.next();
1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return iterator.next();
1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  static void fail(Throwable cause, Object message) {
1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    AssertionFailedError assertionFailedError =
1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        new AssertionFailedError(String.valueOf(message));
1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertionFailedError.initCause(cause);
1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    throw assertionFailedError;
1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static <K, V> Comparator<Entry<K, V>> entryComparator(
1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      final Comparator<? super K> keyComparator) {
1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return new Comparator<Entry<K, V>>() {
1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override
1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      public int compare(Entry<K, V> a, Entry<K, V> b) {
1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return keyComparator.compare(a.getKey(), b.getKey());
1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    };
1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static <T> void testComparator(
1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Comparator<? super T> comparator, T... valuesInExpectedOrder) {
1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    testComparator(comparator, Arrays.asList(valuesInExpectedOrder));
1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static <T> void testComparator(
1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Comparator<? super T> comparator, List<T> valuesInExpectedOrder) {
1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // This does an O(n^2) test of all pairs of values in both orders
1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int i = 0; i < valuesInExpectedOrder.size(); i++) {
1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      T t = valuesInExpectedOrder.get(i);
1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      for (int j = 0; j < i; j++) {
1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        T lesser = valuesInExpectedOrder.get(j);
1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertTrue(comparator + ".compare(" + lesser + ", " + t + ")",
1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            comparator.compare(lesser, t) < 0);
1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(comparator + ".compare(" + t + ", " + t + ")",
1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          0, comparator.compare(t, t));
1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      for (int j = i + 1; j < valuesInExpectedOrder.size(); j++) {
1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        T greater = valuesInExpectedOrder.get(j);
1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertTrue(comparator + ".compare(" + greater + ", " + t + ")",
1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            comparator.compare(greater, t) > 0);
1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static <T extends Comparable<? super T>> void testCompareToAndEquals(
2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      List<T> valuesInExpectedOrder) {
2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // This does an O(n^2) test of all pairs of values in both orders
2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int i = 0; i < valuesInExpectedOrder.size(); i++) {
2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      T t = valuesInExpectedOrder.get(i);
2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      for (int j = 0; j < i; j++) {
2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        T lesser = valuesInExpectedOrder.get(j);
2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertTrue(lesser + ".compareTo(" + t + ')', lesser.compareTo(t) < 0);
2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertFalse(lesser.equals(t));
2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(t + ".compareTo(" + t + ')', 0, t.compareTo(t));
2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertTrue(t.equals(t));
2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      for (int j = i + 1; j < valuesInExpectedOrder.size(); j++) {
2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        T greater = valuesInExpectedOrder.get(j);
2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertTrue(greater + ".compareTo(" + t + ')', greater.compareTo(t) > 0);
2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertFalse(greater.equals(t));
2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns a collection that simulates concurrent modification by
2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * having its size method return incorrect values.  This is useful
2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * for testing methods that must treat the return value from size()
2291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * as a hint only.
2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @param delta the difference between the true size of the
2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * collection and the values returned by the size method
2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static <T> Collection<T> misleadingSizeCollection(final int delta) {
2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // It would be nice to be able to return a real concurrent
2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // collection like ConcurrentLinkedQueue, so that e.g. concurrent
2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // iteration would work, but that would not be GWT-compatible.
2381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return new ArrayList<T>() {
2391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override public int size() { return Math.max(0, super.size() + delta); }
2401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    };
2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
2441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns a "nefarious" map entry with the specified key and value,
2451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * meaning an entry that is suitable for testing that map entries cannot be
2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * modified via a nefarious implementation of equals. This is used for testing
2471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * unmodifiable collections of map entries; for example, it should not be
2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * possible to access the raw (modifiable) map entry via a nefarious equals
2491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * method.
2501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static <K, V> Map.Entry<K, V> nefariousMapEntry(final K key,
2521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      final V value) {
2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return new Map.Entry<K, V>() {
2541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override public K getKey() {
2551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return key;
2561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
2571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override public V getValue() {
2581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return value;
2591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
2601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override public V setValue(V value) {
2611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        throw new UnsupportedOperationException();
2621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
2631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @SuppressWarnings("unchecked")
2641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override public boolean equals(Object o) {
2651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        if (o instanceof Map.Entry<?, ?>) {
2661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          Map.Entry<K, V> e = (Map.Entry<K, V>) o;
2671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          e.setValue(value); // muhahaha!
2681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          return equal(this.getKey(), e.getKey())
2701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              && equal(this.getValue(), e.getValue());
2711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
2721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return false;
2731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
2741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override public int hashCode() {
2761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        K k = getKey();
2771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        V v = getValue();
2781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return ((k == null) ?
2791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            0 : k.hashCode()) ^ ((v == null) ? 0 : v.hashCode());
2801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
2811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      /**
2831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert       * Returns a string representation of the form <code>{key}={value}</code>.
2841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert       */
2851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override public String toString() {
2861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return getKey() + "=" + getValue();
2871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
2881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    };
2891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
291