package edu.umd.cs.findbugs;
import java.util.Iterator;
import java.util.NoSuchElementException;
import junit.framework.Assert;
import junit.framework.TestCase;
public class BugInstanceTest extends TestCase {
static {
// Load detector plugins
DetectorFactoryCollection.instance();
}
BugInstance b;
@Override
protected void setUp() throws Exception {
b = new BugInstance("NP_NULL_DEREF", Detector.NORMAL_PRIORITY);
b.setProperty("A", "a");
b.setProperty("B", "b");
b.setProperty("C", "c");
}
public void testPropertyIterator() {
checkPropertyIterator(b.propertyIterator(), new String[] { "A", "B", "C" }, new String[] { "a", "b", "c" });
}
public void testRemoveThroughIterator1() {
removeThroughIterator(b.propertyIterator(), "A");
checkPropertyIterator(b.propertyIterator(), new String[] { "B", "C" }, new String[] { "b", "c" });
}
public void testRemoveThroughIterator2() {
removeThroughIterator(b.propertyIterator(), "B");
checkPropertyIterator(b.propertyIterator(), new String[] { "A", "C" }, new String[] { "a", "c" });
}
public void testRemoveThroughIterator3() {
removeThroughIterator(b.propertyIterator(), "C");
checkPropertyIterator(b.propertyIterator(), new String[] { "A", "B" }, new String[] { "a", "b" });
}
public void testIterateTooFar() {
Iterator<BugProperty> iter = b.propertyIterator();
get(iter);
get(iter);
get(iter);
noMore(iter);
}
public void testMultipleRemove() {
Iterator<BugProperty> iter = b.propertyIterator();
iter.next();
iter.remove();
try {
iter.remove();
fail();
} catch (IllegalStateException e) {
assert true;
}
}
public void testRemoveBeforeNext() {
Iterator<BugProperty> iter = b.propertyIterator();
try {
iter.remove();
Assert.fail();
} catch (IllegalStateException e) {
assert true;
}
}
public void testRemoveAndAdd() {
removeThroughIterator(b.propertyIterator(), "C");
b.setProperty("D", "d");
checkPropertyIterator(b.propertyIterator(), new String[] { "A", "B", "D" }, new String[] { "a", "b", "d" });
b.setProperty("E", "e");
checkPropertyIterator(b.propertyIterator(), new String[] { "A", "B", "D", "E" }, new String[] { "a", "b", "d", "e" });
}
public void testRemoveAll1() {
removeThroughIterator(b.propertyIterator(), "A");
checkPropertyIterator(b.propertyIterator(), new String[] { "B", "C" }, new String[] { "b", "c" });
removeThroughIterator(b.propertyIterator(), "B");
checkPropertyIterator(b.propertyIterator(), new String[] { "C" }, new String[] { "c" });
removeThroughIterator(b.propertyIterator(), "C");
checkPropertyIterator(b.propertyIterator(), new String[0], new String[0]);
}
private void get(Iterator<BugProperty> iter) {
try {
iter.next();
// Good
} catch (NoSuchElementException e) {
Assert.assertTrue(false);
}
}
private void noMore(Iterator<BugProperty> iter) {
try {
iter.next();
Assert.fail();
} catch (NoSuchElementException e) {
assert true;
}
}
private void checkPropertyIterator(Iterator<BugProperty> iter, String[] names, String[] values) {
if (names.length != values.length)
throw new IllegalArgumentException();
for (int i = 0; i < names.length; ++i) {
Assert.assertTrue(iter.hasNext());
String name = names[i];
String value = values[i];
checkProperty(iter.next(), name, value);
}
Assert.assertFalse(iter.hasNext());
}
private void checkProperty(BugProperty property, String name, String value) {
Assert.assertEquals(property.getName(), name);
Assert.assertEquals(property.getValue(), value);
}
private void removeThroughIterator(Iterator<BugProperty> iter, String name) {
while (iter.hasNext()) {
BugProperty prop = iter.next();
if (prop.getName().equals(name))
iter.remove();
}
}
}