package org.marketcetera.core.position.impl;
import java.util.LinkedList;
import java.util.List;
import org.junit.Test;
import org.marketcetera.core.position.impl.GroupingList.GroupMatcher;
import org.marketcetera.core.position.impl.GroupingList.GroupMatcherFactory;
import ca.odell.glazedlists.EventList;
import ca.odell.glazedlists.GlazedLists;
import ca.odell.glazedlists.TransactionList;
import ca.odell.glazedlists.event.ListEvent;
/* $License$ */
/**
* Test {@link GroupingList}.
*
* @author <a href="mailto:will@marketcetera.com">Will Horn</a>
* @version $Id: GroupingListTest.java 16154 2012-07-14 16:34:05Z colin $
* @since 1.5.0
*/
public class GroupingListTest {
GroupMatcherFactory<String, GroupMatcher<String>> factory = new GroupMatcherFactory<String, GroupMatcher<String>>() {
@Override
public GroupMatcher<String> createGroupMatcher(final String element) {
class MyMatcher implements GroupMatcher<String> {
String key;
MyMatcher(String key) {
this.key = key;
}
@Override
public boolean matches(String item) {
return key.equals(item);
}
@Override
public int compareTo(GroupMatcher<String> o) {
MyMatcher my = (MyMatcher) o;
return key.compareTo(my.key);
}
}
;
return new MyMatcher(element);
}
};
abstract class TestTemplate implements Runnable {
@Override
public void run() {
EventList<String> base = GlazedLists.eventListOf();
TransactionList<String> trans = new TransactionList<String>(base);
initList(trans);
GroupingList<String> groupingList = new GroupingList<String>(trans, factory);
List<ExpectedListChanges<?>> listeners = new LinkedList<ExpectedListChanges<?>>();
for (int i = 0; i < groupingList.size(); i++) {
ExpectedListChanges<String> listChangeListener = new ExpectedListChanges<String>(
"Group " + Integer.toString(i), getGroupsExpected(i));
listeners.add(listChangeListener);
groupingList.get(i).addListEventListener(listChangeListener);
}
ExpectedListChanges<EventList<String>> listChangeListener = new ExpectedListChanges<EventList<String>>(
"Root List", getExpected());
listeners.add(listChangeListener);
groupingList.addListEventListener(listChangeListener);
modifyBaseList(base);
trans.beginEvent();
modifyInTransaction(trans);
trans.commitEvent();
for (ExpectedListChanges<?> i : listeners) {
i.exhausted();
}
}
protected void modifyBaseList(EventList<String> base) {
}
protected void modifyInTransaction(EventList<String> list) {
}
protected abstract void initList(EventList<String> list);
protected int[] getExpected() {
return new int[] {};
}
protected int[] getGroupsExpected(int i) {
return new int[] {};
}
}
@Test
public void AB_iAAB() {
new TestTemplate() {
@Override
protected void initList(EventList<String> list) {
list.add("A");
list.add("B");
}
@Override
protected void modifyInTransaction(EventList<String> list) {
list.add(0, "A");
}
@Override
protected int[] getExpected() {
return new int[] { ListEvent.UPDATE, 0 };
}
@Override
protected int[] getGroupsExpected(int i) {
if (i == 0) {
return new int[] { ListEvent.INSERT, 0 };
}
return super.getGroupsExpected(i);
}
}.run();
}
@Test
public void AB_AiAB() {
new TestTemplate() {
@Override
protected void initList(EventList<String> list) {
list.add("A");
list.add("B");
}
@Override
protected void modifyInTransaction(EventList<String> list) {
list.add(1, "A");
}
@Override
protected int[] getExpected() {
return new int[] { ListEvent.UPDATE, 0 };
}
@Override
protected int[] getGroupsExpected(int i) {
if (i == 0) {
return new int[] { ListEvent.INSERT, 1 };
}
return super.getGroupsExpected(i);
}
}.run();
}
@Test
public void BA_ABA() {
new TestTemplate() {
@Override
protected void initList(EventList<String> list) {
list.add("B");
list.add("A");
}
@Override
protected void modifyInTransaction(EventList<String> list) {
list.add(0, "A");
}
@Override
protected int[] getExpected() {
return new int[] { ListEvent.UPDATE, 0 };
}
@Override
protected int[] getGroupsExpected(int i) {
if (i == 0) {
return new int[] { ListEvent.INSERT, 0 };
}
return super.getGroupsExpected(i);
}
}.run();
}
@Test
public void AB_ABiB() {
new TestTemplate() {
@Override
protected void initList(EventList<String> list) {
list.add("A");
list.add("B");
}
@Override
protected void modifyInTransaction(EventList<String> list) {
list.add(2, "B");
}
@Override
protected int[] getExpected() {
return new int[] { ListEvent.UPDATE, 1 };
}
@Override
protected int[] getGroupsExpected(int i) {
if (i == 1) {
return new int[] { ListEvent.INSERT, 1 };
}
return super.getGroupsExpected(i);
}
}.run();
}
@Test
public void ABC_AiBBC() {
new TestTemplate() {
@Override
protected void initList(EventList<String> list) {
list.add("A");
list.add("B");
list.add("C");
}
@Override
protected void modifyInTransaction(EventList<String> list) {
list.add(1, "B");
}
@Override
protected int[] getExpected() {
return new int[] { ListEvent.UPDATE, 1 };
}
@Override
protected int[] getGroupsExpected(int i) {
if (i == 1) {
return new int[] { ListEvent.INSERT, 0 };
}
return super.getGroupsExpected(i);
}
}.run();
}
@Test
public void ABC_ABiBC() {
new TestTemplate() {
@Override
protected void initList(EventList<String> list) {
list.add("A");
list.add("B");
list.add("C");
}
@Override
protected void modifyInTransaction(EventList<String> list) {
list.add(2, "B");
}
@Override
protected int[] getExpected() {
return new int[] { ListEvent.UPDATE, 1 };
}
@Override
protected int[] getGroupsExpected(int i) {
if (i == 1) {
return new int[] { ListEvent.INSERT, 1 };
}
return super.getGroupsExpected(i);
}
}.run();
}
@Test
public void B_AB() {
new TestTemplate() {
@Override
protected void initList(EventList<String> list) {
list.add("B");
}
@Override
protected void modifyInTransaction(EventList<String> list) {
list.add(0, "A");
}
@Override
protected int[] getExpected() {
return new int[] { ListEvent.INSERT, 0 };
}
}.run();
}
@Test
public void AC_ABC() {
new TestTemplate() {
@Override
protected void initList(EventList<String> list) {
list.add("A");
list.add("C");
}
@Override
protected void modifyInTransaction(EventList<String> list) {
list.add(1, "B");
}
@Override
protected int[] getExpected() {
return new int[] { ListEvent.INSERT, 1 };
}
}.run();
}
@Test
public void AC_EBAC() {
new TestTemplate() {
@Override
protected void initList(EventList<String> list) {
list.add("A");
list.add("C");
}
@Override
protected void modifyInTransaction(EventList<String> list) {
list.add(0, "B");
list.add(0, "E");
}
@Override
protected int[] getExpected() {
return new int[] { ListEvent.INSERT, 1, ListEvent.INSERT, 3 };
}
}.run();
}
@Test
public void AC_CEBABC() {
new TestTemplate() {
@Override
protected void initList(EventList<String> list) {
list.add("A");
list.add("C");
}
@Override
protected void modifyInTransaction(EventList<String> list) {
list.add(0, "B");
list.add(0, "C");
list.add(3, "B");
list.add(1, "E");
}
@Override
protected int[] getExpected() {
return new int[] { ListEvent.INSERT, 1, ListEvent.UPDATE, 2, ListEvent.INSERT, 3 };
}
@Override
protected int[] getGroupsExpected(int i) {
if (i == 1) {
return new int[] { ListEvent.INSERT, 0 };
}
return super.getGroupsExpected(i);
}
}.run();
}
@Test
public void AC_CEBABC_no_transaction() {
new TestTemplate() {
@Override
protected void initList(EventList<String> list) {
list.add("A");
list.add("C");
}
@Override
protected void modifyBaseList(EventList<String> list) {
list.add(0, "B");
list.add(0, "C");
list.add(3, "B");
list.add(1, "E");
}
@Override
protected int[] getExpected() {
return new int[] { ListEvent.INSERT, 1, ListEvent.UPDATE, 2, ListEvent.UPDATE, 1,
ListEvent.INSERT, 3 };
}
@Override
protected int[] getGroupsExpected(int i) {
if (i == 1) {
return new int[] { ListEvent.INSERT, 0 };
}
return super.getGroupsExpected(i);
}
}.run();
}
@Test
public void AC_AuC() {
new TestTemplate() {
@Override
protected void initList(EventList<String> list) {
list.add("A");
list.add("C");
}
@Override
protected void modifyInTransaction(EventList<String> list) {
list.set(1, "C");
}
@Override
protected int[] getExpected() {
return new int[] { ListEvent.UPDATE, 1 };
}
@Override
protected int[] getGroupsExpected(int i) {
if (i == 1) {
return new int[] { ListEvent.UPDATE, 0 };
}
return super.getGroupsExpected(i);
}
}.run();
}
@Test
public void AC_AuB() {
new TestTemplate() {
@Override
protected void initList(EventList<String> list) {
list.add("A");
list.add("C");
}
@Override
protected void modifyInTransaction(EventList<String> list) {
list.set(1, "B");
}
@Override
protected int[] getExpected() {
return new int[] { ListEvent.INSERT, 1, ListEvent.DELETE, 2 };
}
@Override
protected int[] getGroupsExpected(int i) {
if (i == 1) {
return new int[] { ListEvent.DELETE, 0 };
}
return super.getGroupsExpected(i);
}
}.run();
}
@Test
public void ABC_ABuB() {
new TestTemplate() {
@Override
protected void initList(EventList<String> list) {
list.add("A");
list.add("B");
list.add("C");
}
@Override
protected void modifyInTransaction(EventList<String> list) {
list.set(2, "B");
}
@Override
protected int[] getExpected() {
return new int[] { ListEvent.UPDATE, 1, ListEvent.DELETE, 2 };
}
@Override
protected int[] getGroupsExpected(int i) {
if (i == 1) {
return new int[] { ListEvent.INSERT, 1 };
}
if (i == 2) {
return new int[] { ListEvent.DELETE, 0 };
}
return super.getGroupsExpected(i);
}
}.run();
}
@Test
public void A_dAiA() {
new TestTemplate() {
@Override
protected void initList(EventList<String> list) {
list.add("A");
}
@Override
protected void modifyInTransaction(EventList<String> list) {
list.remove(0);
list.add(0, "A");
}
@Override
protected int[] getExpected() {
return new int[] { ListEvent.UPDATE, 0 };
}
@Override
protected int[] getGroupsExpected(int i) {
if (i == 0) {
return new int[] { ListEvent.DELETE, 0, ListEvent.INSERT, 0 };
}
return super.getGroupsExpected(i);
}
}.run();
}
@Test
public void ABC_AdBiBiCC() {
new TestTemplate() {
@Override
protected void initList(EventList<String> list) {
list.add("A");
list.add("B");
list.add("C");
}
@Override
protected void modifyInTransaction(EventList<String> list) {
list.remove(1);
list.add(1, "C");
list.add(1, "B");
}
@Override
protected int[] getExpected() {
return new int[] { ListEvent.UPDATE, 1, ListEvent.UPDATE, 2 };
}
@Override
protected int[] getGroupsExpected(int i) {
if (i == 1) {
return new int[] { ListEvent.INSERT, 0, ListEvent.DELETE, 1 };
}
if (i == 2) {
return new int[] { ListEvent.INSERT, 0 };
}
return super.getGroupsExpected(i);
}
}.run();
}
@Test
public void clear() {
new TestTemplate() {
@Override
protected void initList(EventList<String> list) {
list.add("A");
list.add("B");
list.add("C");
}
@Override
protected void modifyInTransaction(EventList<String> list) {
list.add("D");
list.add("E");
list.clear();
}
@Override
protected int[] getExpected() {
return new int[] { ListEvent.DELETE, 0, ListEvent.DELETE, 0, ListEvent.DELETE, 0 };
}
@Override
protected int[] getGroupsExpected(int i) {
if (i == 0) {
return new int[] { ListEvent.DELETE, 0 };
}
if (i == 1) {
return new int[] { ListEvent.DELETE, 0 };
}
if (i == 2) {
return new int[] { ListEvent.DELETE, 0 };
}
return super.getGroupsExpected(i);
}
}.run();
}
@Test
public void clear_no_transaction() {
new TestTemplate() {
@Override
protected void initList(EventList<String> list) {
list.add("A");
list.add("B");
list.add("C");
}
@Override
protected void modifyBaseList(EventList<String> list) {
list.add("D");
list.add("E");
list.clear();
}
@Override
protected int[] getExpected() {
return new int[] { ListEvent.INSERT, 3, ListEvent.INSERT, 4, ListEvent.DELETE, 0,
ListEvent.DELETE, 0, ListEvent.DELETE, 0, ListEvent.DELETE, 0,
ListEvent.DELETE, 0 };
}
@Override
protected int[] getGroupsExpected(int i) {
if (i == 0) {
return new int[] { ListEvent.DELETE, 0 };
}
if (i == 1) {
return new int[] { ListEvent.DELETE, 0 };
}
if (i == 2) {
return new int[] { ListEvent.DELETE, 0 };
}
return super.getGroupsExpected(i);
}
}.run();
}
}