/* * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions.
*/
/* * This file is available under and governed by the GNU General Public * License version 2 only, as published by the Free Software Foundation. * However, the following notice accompanied the original version of this * file: * * Written by Doug Lea with assistance from members of JCP JSR-166 * Expert Group and released to the public domain, as explained at * http://creativecommons.org/publicdomain/zero/1.0/
*/
/** * Returns a new set of given size containing consecutive * Items 0 ... n - 1.
*/ privatestatic TreeSet<Item> populatedSet(int n) {
TreeSet<Item> q = new TreeSet<>();
assertTrue(q.isEmpty()); for (int i = n - 1; i >= 0; i -= 2)
mustAdd(q, i); for (int i = (n & 1); i < n; i += 2)
mustAdd(q, i);
assertFalse(q.isEmpty());
mustEqual(n, q.size()); return q;
}
/** * Returns a new set of first 5 ints.
*/ privatestatic TreeSet<Item> set5() {
TreeSet<Item> q = new TreeSet<>();
assertTrue(q.isEmpty());
q.add(one);
q.add(two);
q.add(three);
q.add(four);
q.add(five);
mustEqual(5, q.size()); return q;
}
/** * A new set has unbounded capacity
*/ publicvoid testConstructor1() {
mustEqual(0, new TreeSet<Item>().size());
}
/** * Initializing from Collection of null elements throws NPE
*/ publicvoid testConstructor4() { try { new TreeSet<Item>(Arrays.asList(new Item[SIZE]));
shouldThrow();
} catch (NullPointerException success) {}
}
/** * Initializing from Collection with some null elements throws NPE
*/ publicvoid testConstructor5() {
Item[] items = new Item[2];
items[1] = zero; try { new TreeSet<Item>(Arrays.asList(items));
shouldThrow();
} catch (NullPointerException success) {}
}
/** * Set contains all elements of collection used to initialize
*/ publicvoid testConstructor6() {
Item[] items = defaultItems;
TreeSet<Item> q = new TreeSet<>(Arrays.asList(items)); for (int i = 0; i < SIZE; ++i)
mustEqual(items[i], q.pollFirst());
}
/** * The comparator used in constructor is used
*/ publicvoid testConstructor7() {
MyReverseComparator cmp = new MyReverseComparator();
@SuppressWarnings("unchecked")
TreeSet<Item> q = new TreeSet<>(cmp);
mustEqual(cmp, q.comparator());
Item[] items = defaultItems;
q.addAll(Arrays.asList(items)); for (int i = SIZE - 1; i >= 0; --i)
mustEqual(items[i], q.pollFirst());
}
/** * isEmpty is true before add, false after
*/ publicvoid testEmpty() {
TreeSet<Item> q = new TreeSet<>();
assertTrue(q.isEmpty());
q.add(one);
assertFalse(q.isEmpty());
q.add(two);
q.pollFirst();
q.pollFirst();
assertTrue(q.isEmpty());
}
/** * size changes when elements added and removed
*/ publicvoid testSize() {
TreeSet<Item> q = populatedSet(SIZE); for (int i = 0; i < SIZE; ++i) {
mustEqual(SIZE - i, q.size());
q.pollFirst();
} for (int i = 0; i < SIZE; ++i) {
mustEqual(i, q.size());
mustAdd(q, i);
}
}
/** * addAll of a collection with null elements throws NPE
*/ publicvoid testAddAll2() {
TreeSet<Item> q = new TreeSet<>();
Item[] items = new Item[2]; try {
q.addAll(Arrays.asList(items));
shouldThrow();
} catch (NullPointerException success) {}
}
/** * addAll of a collection with any null elements throws NPE after * possibly adding some elements
*/ publicvoid testAddAll3() {
TreeSet<Item> q = new TreeSet<>();
Item[] items = new Item[2];
items[0] = zero; try {
q.addAll(Arrays.asList(items));
shouldThrow();
} catch (NullPointerException success) {}
}
/** * Set contains all elements of successful addAll
*/ publicvoid testAddAll5() {
Item[] empty = new Item[0];
Item[] items = defaultItems;
TreeSet<Item> q = new TreeSet<>();
assertFalse(q.addAll(Arrays.asList(empty)));
assertTrue(q.addAll(Arrays.asList(items))); for (int i = 0; i < SIZE; ++i)
mustEqual(i, q.pollFirst());
}
/** * pollFirst succeeds unless empty
*/ publicvoid testPollFirst() {
TreeSet<Item> q = populatedSet(SIZE); for (int i = 0; i < SIZE; ++i) {
mustEqual(i, q.pollFirst());
}
assertNull(q.pollFirst());
}
/** * remove(x) removes x and returns true if present
*/ publicvoid testRemoveElement() {
TreeSet<Item> q = populatedSet(SIZE); for (int i = 1; i < SIZE; i += 2) {
mustContain(q, i);
mustRemove(q, i);
mustNotContain(q, i);
mustContain(q, i - 1);
} for (int i = 0; i < SIZE; i += 2) {
mustContain(q, i);
mustRemove(q, i);
mustNotContain(q, i);
mustNotRemove(q, i + 1);
mustNotContain(q, i + 1);
}
assertTrue(q.isEmpty());
}
/** * contains(x) reports true when elements added but not yet removed
*/ publicvoid testContains() {
TreeSet<Item> q = populatedSet(SIZE); for (int i = 0; i < SIZE; ++i) {
mustContain(q, i);
q.pollFirst();
mustNotContain(q, i);
}
}
/** * containsAll(c) is true when c contains a subset of elements
*/ publicvoid testContainsAll() {
TreeSet<Item> q = populatedSet(SIZE);
TreeSet<Item> p = new TreeSet<>(); for (int i = 0; i < SIZE; ++i) {
assertTrue(q.containsAll(p));
assertFalse(p.containsAll(q));
mustAdd(p, i);
}
assertTrue(p.containsAll(q));
}
/** * retainAll(c) retains only those elements of c and reports true if changed
*/ publicvoid testRetainAll() {
TreeSet<Item> q = populatedSet(SIZE);
TreeSet<Item> p = populatedSet(SIZE); for (int i = 0; i < SIZE; ++i) { boolean changed = q.retainAll(p); if (i == 0)
assertFalse(changed); else
assertTrue(changed);
assertTrue(q.containsAll(p));
mustEqual(SIZE - i, q.size());
p.pollFirst();
}
}
/** * removeAll(c) removes only those elements of c and reports true if changed
*/ publicvoid testRemoveAll() { for (int i = 1; i < SIZE; ++i) {
TreeSet<Item> q = populatedSet(SIZE);
TreeSet<Item> p = populatedSet(i);
assertTrue(q.removeAll(p));
mustEqual(SIZE - i, q.size()); for (int j = 0; j < i; ++j) {
mustNotContain(q, p.pollFirst());
}
}
}
/** * ceiling returns next element
*/ publicvoid testCeiling() {
TreeSet<Item> q = set5();
Object e1 = q.ceiling(three);
mustEqual(three, e1);
Object e2 = q.ceiling(zero);
mustEqual(one, e2);
Object e3 = q.ceiling(five);
mustEqual(five, e3);
Object e4 = q.ceiling(six);
assertNull(e4);
}
/** * toArray contains all elements in sorted order
*/ publicvoid testToArray() {
TreeSet<Item> q = populatedSet(SIZE);
Object[] a = q.toArray();
assertSame(Object[].class, a.getClass()); for (Object o : a)
assertSame(o, q.pollFirst());
assertTrue(q.isEmpty());
}
/** * toArray(a) contains all elements in sorted order
*/ publicvoid testToArray2() {
TreeSet<Item> q = populatedSet(SIZE);
Item[] items = new Item[SIZE];
Item[] array = q.toArray(items);
assertSame(items, array); for (Item o : items)
assertSame(o, q.pollFirst());
assertTrue(q.isEmpty());
}
/** * iterator iterates through all elements
*/ publicvoid testIterator() {
TreeSet<Item> q = populatedSet(SIZE);
Iterator<? extends Item> it = q.iterator(); int i; for (i = 0; it.hasNext(); i++)
assertTrue(q.contains(it.next()));
mustEqual(i, SIZE);
assertIteratorExhausted(it);
}
/** * iterator of empty set has no elements
*/ publicvoid testEmptyIterator() {
assertIteratorExhausted(new TreeSet<Item>().iterator());
}
/** * iterator.remove removes current element
*/ publicvoid testIteratorRemove() { final TreeSet<Item> q = new TreeSet<>();
q.add(two);
q.add(one);
q.add(three);
Iterator<? extends Item> it = q.iterator();
it.next();
it.remove();
it = q.iterator();
mustEqual(it.next(), two);
mustEqual(it.next(), three);
assertFalse(it.hasNext());
}
/** * toString contains toStrings of elements
*/ publicvoid testToString() {
TreeSet<Item> q = populatedSet(SIZE);
String s = q.toString(); for (int i = 0; i < SIZE; ++i) {
assertTrue(s.contains(String.valueOf(i)));
}
}
/** * A deserialized/reserialized set equals original
*/ publicvoid testSerialization() throws Exception {
NavigableSet<Item> x = populatedSet(SIZE);
NavigableSet<Item> y = serialClone(x);
void populate(NavigableSet<Item> set, int limit) { for (int i = 0, n = 2 * limit / 3; i < n; i++) { int element = rnd.nextInt(limit);
put(set, element);
}
}
void mutateSet(NavigableSet<Item> set, int min, int max) { int size = set.size(); int rangeSize = max - min + 1;
// Remove a bunch of entries directly for (int i = 0, n = rangeSize / 2; i < n; i++) {
remove(set, min - 5 + rnd.nextInt(rangeSize + 10));
}
// Remove a bunch of entries with iterator for (Iterator<Item> it = set.iterator(); it.hasNext(); ) { if (rnd.nextBoolean()) {
bs.clear(it.next().value);
it.remove();
}
}
// Add entries till we're back to original size while (set.size() < size) { int element = min + rnd.nextInt(rangeSize);
assertTrue(element >= min && element <= max);
put(set, element);
}
}
void mutateSubSet(NavigableSet<Item> set, int min, int max) { int size = set.size(); int rangeSize = max - min + 1;
// Remove a bunch of entries directly for (int i = 0, n = rangeSize / 2; i < n; i++) {
remove(set, min - 5 + rnd.nextInt(rangeSize + 10));
}
// Remove a bunch of entries with iterator for (Iterator<Item> it = set.iterator(); it.hasNext(); ) { if (rnd.nextBoolean()) {
bs.clear(it.next().value);
it.remove();
}
}
// Add entries till we're back to original size while (set.size() < size) { int element = min - 5 + rnd.nextInt(rangeSize + 10); if (element >= min && element <= max) {
put(set, element);
} else { try {
set.add(itemFor(element));
shouldThrow();
} catch (IllegalArgumentException success) {}
}
}
}
void put(NavigableSet<Item> set, int element) { if (set.add(itemFor(element)))
bs.set(element);
}
void remove(NavigableSet<Item> set, int element) { if (set.remove(itemFor(element)))
bs.clear(element);
}
void bashSubSet(NavigableSet<Item> set, int min, int max, boolean ascending) {
check(set, min, max, ascending);
check(set.descendingSet(), min, max, !ascending);
/** * min and max are both inclusive. If max < min, interval is empty.
*/ void check(NavigableSet<Item> set, finalint min, finalint max, finalboolean ascending) { class ReferenceSet { int lower(int element) { return ascending ?
lowerAscending(element) : higherAscending(element);
} int floor(int element) { return ascending ?
floorAscending(element) : ceilingAscending(element);
} int ceiling(int element) { return ascending ?
ceilingAscending(element) : floorAscending(element);
} int higher(int element) { return ascending ?
higherAscending(element) : lowerAscending(element);
} int first() { return ascending ? firstAscending() : lastAscending();
} int last() { return ascending ? lastAscending() : firstAscending();
} int lowerAscending(int element) { return floorAscending(element - 1);
} int floorAscending(int element) { if (element < min) return -1; elseif (element > max)
element = max;
// BitSet should support this! Test would run much faster while (element >= min) { if (bs.get(element)) return element;
element--;
} return -1;
} int ceilingAscending(int element) { if (element < min)
element = min; elseif (element > max) return -1; int result = bs.nextSetBit(element); return (result > max) ? -1 : result;
} int higherAscending(int element) { return ceilingAscending(element + 1);
} privateint firstAscending() { int result = ceilingAscending(min); return (result > max) ? -1 : result;
} privateint lastAscending() { int result = floorAscending(max); return (result < min) ? -1 : result;
}
}
ReferenceSet rs = new ReferenceSet();
// Test contents using containsElement int size = 0; for (int i = min; i <= max; i++) { boolean bsContainsI = bs.get(i);
mustEqual(bsContainsI, set.contains(itemFor(i))); if (bsContainsI)
size++;
}
mustEqual(size, set.size());
// Test contents using contains elementSet iterator int size2 = 0; int previousElement = -1; for (Item element : set) {
assertTrue(bs.get(element.value));
size2++;
assertTrue(previousElement < 0 || (ascending ?
element.value - previousElement > 0 : element.value - previousElement < 0));
previousElement = element.value;
}
mustEqual(size2, size);
// Test navigation ops for (int element = min - 1; element <= max + 1; element++) {
Item e = itemFor(element);
assertEq(set.lower(e), rs.lower(element));
assertEq(set.floor(e), rs.floor(element));
assertEq(set.higher(e), rs.higher(element));
assertEq(set.ceiling(e), rs.ceiling(element));
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.