package org.oddjob.structural;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import junit.framework.TestCase;
import org.apache.log4j.Logger;
import org.oddjob.MockStructural;
public class ChildMatchTest extends TestCase {
private static final Logger logger = Logger.getLogger(
ChildMatchTest.class);
@Override
protected void setUp() throws Exception {
super.setUp();
logger.debug("------------------- " + getName() + " -----------------");
}
private class OurListener implements StructuralListener {
List<String> events = new ArrayList<String>();
private boolean started;
@Override
public void childAdded(StructuralEvent event) {
if (!started) {
return;
}
String text = "Added " + event.getChild() + " at " + event.getIndex();
events.add(text);
logger.debug(text);
}
@Override
public void childRemoved(StructuralEvent event) {
if (!started) {
return;
}
String text = "Removed " + event.getChild() + " from " + event.getIndex();
events.add(text);
logger.debug(text);
}
public void start() {
started = true;
}
}
private class OurChildMatch extends ChildMatch<String>{
private final ChildHelper<String> childHelper;
public OurChildMatch(ChildHelper<String> childHelper) {
super(new ArrayList<String>(Arrays.asList(childHelper.getChildren(new String[0]))));
this.childHelper = childHelper;
}
@Override
protected void insertChild(int index, String child) {
childHelper.insertChild(index, child);
}
@Override
protected void removeChildAt(int index) {
childHelper.removeChildAt(index);
}
}
public void testExactMatch() {
ChildHelper<String> childHelper =
new ChildHelper<String>(new MockStructural());
childHelper.insertChild(0, "red");
childHelper.insertChild(1, "green");
childHelper.insertChild(2, "blue");
OurListener listener = new OurListener();
childHelper.addStructuralListener(listener);
listener.start();
ChildMatch<String> test = new OurChildMatch(childHelper);
String[] desired = { "red", "green", "blue" };
test.match(desired);
assertEquals(0, listener.events.size());
childHelper.removeStructuralListener(listener);
assertMatches(childHelper, desired);
}
public void testReversed() {
ChildHelper<String> childHelper =
new ChildHelper<String>(new MockStructural());
childHelper.insertChild(0, "red");
childHelper.insertChild(1, "green");
childHelper.insertChild(2, "blue");
OurListener listener = new OurListener();
childHelper.addStructuralListener(listener);
listener.start();
ChildMatch<String> test = new OurChildMatch(childHelper);
String[] desired = { "blue", "green", "red" };
test.match(desired);
assertEquals("Removed red from 0", listener.events.get(0));
assertEquals("Removed green from 0", listener.events.get(1));
assertEquals("Added green at 1", listener.events.get(2));
assertEquals("Added red at 2", listener.events.get(3));
assertEquals(4, listener.events.size());
childHelper.removeStructuralListener(listener);
assertMatches(childHelper, desired);
}
public void testInsertedAtBeginning() {
ChildHelper<String> childHelper =
new ChildHelper<String>(new MockStructural());
childHelper.insertChild(0, "red");
childHelper.insertChild(1, "green");
childHelper.insertChild(2, "blue");
OurListener listener = new OurListener();
childHelper.addStructuralListener(listener);
listener.start();
ChildMatch<String> test = new OurChildMatch(childHelper);
String[] desired = { "pink", "red", "green", "blue" };
test.match(desired);
assertEquals("Added pink at 0", listener.events.get(0));
assertEquals(1, listener.events.size());
childHelper.removeStructuralListener(listener);
assertMatches(childHelper, desired);
}
public void testInsertedInMiddle() {
ChildHelper<String> childHelper =
new ChildHelper<String>(new MockStructural());
childHelper.insertChild(0, "red");
childHelper.insertChild(1, "green");
childHelper.insertChild(2, "blue");
OurListener listener = new OurListener();
childHelper.addStructuralListener(listener);
listener.start();
ChildMatch<String> test = new OurChildMatch(childHelper);
String[] desired = { "red", "green", "pink", "blue" };
test.match(desired);
assertEquals("Added pink at 2", listener.events.get(0));
assertEquals(1, listener.events.size());
childHelper.removeStructuralListener(listener);
assertMatches(childHelper, desired);
}
public void testInsertedAtEnd() {
ChildHelper<String> childHelper =
new ChildHelper<String>(new MockStructural());
childHelper.insertChild(0, "red");
childHelper.insertChild(1, "green");
childHelper.insertChild(2, "blue");
OurListener listener = new OurListener();
childHelper.addStructuralListener(listener);
listener.start();
ChildMatch<String> test = new OurChildMatch(childHelper);
String[] desired = { "red", "green", "blue", "pink" };
test.match(desired);
assertEquals("Added pink at 3", listener.events.get(0));
assertEquals(1, listener.events.size());
childHelper.removeStructuralListener(listener);
assertMatches(childHelper, desired);
}
public void testRemoveFromBeginning() {
ChildHelper<String> childHelper =
new ChildHelper<String>(new MockStructural());
childHelper.insertChild(0, "red");
childHelper.insertChild(1, "green");
childHelper.insertChild(2, "blue");
OurListener listener = new OurListener();
childHelper.addStructuralListener(listener);
listener.start();
ChildMatch<String> test = new OurChildMatch(childHelper);
String[] desired = { "green", "blue" };
test.match(desired);
assertEquals("Removed red from 0", listener.events.get(0));
assertEquals(1, listener.events.size());
childHelper.removeStructuralListener(listener);
assertMatches(childHelper, desired);
}
public void testRemoveFromMiddle() {
ChildHelper<String> childHelper =
new ChildHelper<String>(new MockStructural());
childHelper.insertChild(0, "red");
childHelper.insertChild(1, "green");
childHelper.insertChild(2, "blue");
OurListener listener = new OurListener();
childHelper.addStructuralListener(listener);
listener.start();
ChildMatch<String> test = new OurChildMatch(childHelper);
String[] desired = { "red", "blue" };
test.match(desired);
assertEquals("Removed green from 1", listener.events.get(0));
assertEquals(1, listener.events.size());
childHelper.removeStructuralListener(listener);
assertMatches(childHelper, desired);
}
public void testRemoveFromEnd() {
ChildHelper<String> childHelper =
new ChildHelper<String>(new MockStructural());
childHelper.insertChild(0, "red");
childHelper.insertChild(1, "green");
childHelper.insertChild(2, "blue");
OurListener listener = new OurListener();
childHelper.addStructuralListener(listener);
listener.start();
ChildMatch<String> test = new OurChildMatch(childHelper);
String[] desired = new String[] { "red", "green"};
test.match(desired);
assertEquals("Removed blue from 2", listener.events.get(0));
assertEquals(1, listener.events.size());
childHelper.removeStructuralListener(listener);
assertMatches(childHelper, desired);
}
public void testCompletelyDifferent() {
ChildHelper<String> childHelper =
new ChildHelper<String>(new MockStructural());
childHelper.insertChild(0, "red");
childHelper.insertChild(1, "green");
childHelper.insertChild(2, "blue");
OurListener listener = new OurListener();
childHelper.addStructuralListener(listener);
listener.start();
ChildMatch<String> test = new OurChildMatch(childHelper);
String[] desired = { "pink", "orange" };
test.match(desired);
assertEquals("Added pink at 0", listener.events.get(0));
assertEquals("Added orange at 1", listener.events.get(1));
assertEquals("Removed red from 2", listener.events.get(2));
assertEquals("Removed green from 2", listener.events.get(3));
assertEquals("Removed blue from 2", listener.events.get(4));
assertEquals(5, listener.events.size());
childHelper.removeStructuralListener(listener);
assertMatches(childHelper, desired);
}
public void testNothingToStartWith() {
ChildHelper<String> childHelper =
new ChildHelper<String>(new MockStructural());
OurListener listener = new OurListener();
childHelper.addStructuralListener(listener);
listener.start();
ChildMatch<String> test = new OurChildMatch(childHelper);
String[] desired = { "pink", "orange" };
test.match(desired);
assertEquals("Added pink at 0", listener.events.get(0));
assertEquals("Added orange at 1", listener.events.get(1));
assertEquals(2, listener.events.size());
childHelper.removeStructuralListener(listener);
assertMatches(childHelper, desired);
}
public void testNothingToEndWith() {
ChildHelper<String> childHelper =
new ChildHelper<String>(new MockStructural());
childHelper.insertChild(0, "red");
childHelper.insertChild(1, "green");
childHelper.insertChild(2, "blue");
OurListener listener = new OurListener();
childHelper.addStructuralListener(listener);
listener.start();
ChildMatch<String> test = new OurChildMatch(childHelper);
String[] desired = { };
test.match(desired);
assertEquals("Removed red from 0", listener.events.get(0));
assertEquals("Removed green from 0", listener.events.get(1));
assertEquals("Removed blue from 0", listener.events.get(2));
assertEquals(3, listener.events.size());
childHelper.removeStructuralListener(listener);
assertMatches(childHelper, desired);
}
public void testNothingAndNothing() {
ChildHelper<String> childHelper =
new ChildHelper<String>(new MockStructural());
OurListener listener = new OurListener();
childHelper.addStructuralListener(listener);
listener.start();
ChildMatch<String> test = new OurChildMatch(childHelper);
String[] desired = { };
test.match(desired);
assertEquals(0, listener.events.size());
childHelper.removeStructuralListener(listener);
assertMatches(childHelper, desired);
}
private void assertMatches(ChildHelper<String> childHelper, String[] match) {
List<String> children = new ArrayList<String>(
Arrays.asList(childHelper.getChildren(new String[0])));
class CheckMatch extends ChildMatch<String> {
boolean failed;
public CheckMatch(List<String> children) {
super(children);
}
@Override
protected void insertChild(int index, String child) {
failed = true;
}
@Override
protected void removeChildAt(int index) {
failed = true;
}
}
CheckMatch check = new CheckMatch(children);
check.match(match);
assertFalse("Match failed.", check.failed);
}
}