Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
test.ca.odell.glazedlists.TreeListTest Maven / Gradle / Ivy
Go to download
Event-driven lists for dynamically filtered and sorted tables
package ca.odell.glazedlists;
import ca.odell.glazedlists.impl.testing.GlazedListsTests;
import ca.odell.glazedlists.impl.testing.ListConsistencyListener;
import junit.framework.TestCase;
import java.lang.reflect.Method;
import java.util.*;
/**
* Verifies that TreeList behaves as expected.
*
* @author Jesse Wilson
*/
public class TreeListTest extends TestCase {
public static final TreeList.Format COMPRESSED_CHARACTER_TREE_FORMAT = new CharacterTreeFormat();
public static final TreeList.Format UNCOMPRESSED_CHARACTER_TREE_FORMAT = new CharacterTreeFormat(null);
/**
* Can we build a tree list?
*/
public void testCreateAndDispose() throws Exception {
BasicEventList source = new BasicEventList();
source.add(List.class.getMethod("add", new Class[] {Object.class}));
source.add(List.class.getMethod("add", new Class[] {int.class, Object.class}));
source.add(List.class.getMethod("set", new Class[] {int.class, Object.class}));
source.add(List.class.getMethod("remove", new Class[] {int.class}));
source.add(List.class.getMethod("clear", new Class[] {}));
source.add(String.class.getMethod("toString", new Class[] {}));
source.add(Date.class.getMethod("getTime", new Class[] {}));
source.add(BasicEventList.class.getMethod("add", new Class[] {Object.class}));
source.add(BasicEventList.class.getMethod("add", new Class[] {int.class, Object.class}));
// create a sorted treelist
TreeList treeList = new TreeList(source, new JavaStructureTreeFormat(), TreeList.NODES_START_EXPANDED);
treeList.dispose();
// create an unsorted treelist
treeList = new TreeList(source, new JavaStructureTreeFormat(), TreeList.NODES_START_EXPANDED);
treeList.dispose();
}
/**
* Convert Java methods into paths. For example, {@link Object#toString()}
* is /java/lang/Object/toString
*/
static class JavaStructureTreeFormat implements TreeList.Format {
public boolean allowsChildren(Object element) {
return (!(element instanceof Method));
}
public void getPath(List path, Object element) {
Method javaMethod = (Method)element;
path.addAll(Arrays.asList(javaMethod.getDeclaringClass().getName().split("\\.")));
StringBuffer signature = new StringBuffer();
signature.append(javaMethod.getName());
// print the arguments list
signature.append("(");
Class>[] parameterTypes = javaMethod.getParameterTypes();
for(int c = 0; c < parameterTypes.length; c++) {
if(c > 0) signature.append(", ");
String[] parameterClassNameParts = parameterTypes[c].getName().split("\\.");
signature.append(parameterClassNameParts[parameterClassNameParts.length - 1]);
}
signature.append(")");
path.add(signature.toString());
}
public Comparator getComparator(int depth) {
return (Comparator)GlazedLists.comparableComparator();
}
}
public void testAddsAndRemoves() {
BasicEventList source = new BasicEventList();
source.add("ABC");
source.add("ABD");
source.add("ABEFG");
source.add("ABEFH");
source.add("ACD");
source.add("ACE");
TreeList treeList = new TreeList(source, COMPRESSED_CHARACTER_TREE_FORMAT, TreeList.NODES_START_EXPANDED);
assertTreeStructure(treeList, new String[] {
"A",
"AB",
"ABC",
"ABD",
"ABE",
"ABEF",
"ABEFG",
"ABEFH",
"AC",
"ACD",
"ACE",
});
// observe that we're firing the right events
ListConsistencyListener listConsistencyListener = ListConsistencyListener.install(treeList);
listConsistencyListener.setPreviousElementTracked(false);
// make some modifications, they should be handled in place
source.add("ABF");
assertEquals(GlazedListsTests.stringToList("ABF"), treeList.getTreeNode(8).path());
source.add("ABG");
assertEquals(GlazedListsTests.stringToList("ABG"), treeList.getTreeNode(9).path());
source.add("ACBA");
assertEquals(GlazedListsTests.stringToList("ACB"), treeList.getTreeNode(11).path());
assertEquals(GlazedListsTests.stringToList("ACBA"), treeList.getTreeNode(12).path());
// now some removes
source.remove("ABD");
assertEquals(14, treeList.size());
source.remove("ACD");
assertEquals(13, treeList.size());
source.remove("ABEFH");
assertEquals(12, treeList.size());
}
public void testSubtreeSize() {
// try a simple hierarchy
BasicEventList source = new BasicEventList();
source.add("ABCD");
source.add("ABEFG");
source.add("ACDC");
source.add("ACE");
TreeList treeList = new TreeList(source, COMPRESSED_CHARACTER_TREE_FORMAT, TreeList.NODES_START_EXPANDED);
assertTreeStructure(treeList, new String[] {
"A",
"AB",
"ABC",
"ABCD",
"ABE",
"ABEF",
"ABEFG",
"AC",
"ACD",
"ACDC",
"ACE",
});
assertEquals(11, treeList.subtreeSize(0, true));
assertEquals(6, treeList.subtreeSize(1, true));
assertEquals(2, treeList.subtreeSize(2, true));
assertEquals(1, treeList.subtreeSize(3, true));
assertEquals(3, treeList.subtreeSize(4, true));
assertEquals(2, treeList.subtreeSize(5, true));
assertEquals(1, treeList.subtreeSize(6, true));
assertEquals(4, treeList.subtreeSize(7, true));
assertEquals(2, treeList.subtreeSize(8, true));
assertEquals(1, treeList.subtreeSize(9, true));
assertEquals(1, treeList.subtreeSize(10, true));
}
public void testSetComparator() {
// try a simple hierarchy
BasicEventList source = new BasicEventList();
source.add("ABCd");
source.add("ABCe");
source.add("ABCF");
source.add("ABCG");
SortedList sortedSource = new SortedList(source, null);
TreeList treeList = new TreeList(sortedSource, COMPRESSED_CHARACTER_TREE_FORMAT, TreeList.NODES_START_EXPANDED);
assertTreeStructure(treeList, new String[] {
"A",
"AB",
"ABC",
"ABCd",
"ABCe",
"ABCF",
"ABCG",
});
sortedSource.setComparator(GlazedLists.reverseComparator());
assertTreeStructure(treeList, new String[] {
"A",
"AB",
"ABC",
"ABCe",
"ABCd",
"ABCF",
"ABCG",
});
}
public void testVirtualParentsAreCleanedUp() {
EventList source = new BasicEventList();
TreeList treeList = new TreeList(source, COMPRESSED_CHARACTER_TREE_FORMAT, TreeList.NODES_START_EXPANDED);
ListConsistencyListener listConsistencyListener = ListConsistencyListener.install(treeList);
listConsistencyListener.setPreviousElementTracked(false);
source.add("ABG");
source.add("ACDEF");
source.add("AHI");
assertTreeStructure(treeList, new String[] {
"A",
"AB",
"ABG",
"AC",
"ACD",
"ACDE",
"ACDEF",
"AH",
"AHI",
});
source.remove("ACDEF");
assertTreeStructure(treeList, new String[] {
"A",
"AB",
"ABG",
"AH",
"AHI",
});
source.remove("ABG");
assertTreeStructure(treeList, new String[] {
"A",
"AH",
"AHI",
});
source.remove("AHI");
assertEquals(0, treeList.size());
// but only virtual parents are cleaned up
source.add("ABC");
source.add("ABCDEF");
source.remove("ABCDEF");
assertEquals(3, treeList.size());
}
public void testInsertRealOverVirtualParent() {
EventList source = new BasicEventList();
TreeList treeList = new TreeList(source, COMPRESSED_CHARACTER_TREE_FORMAT, TreeList.NODES_START_EXPANDED);
ListConsistencyListener listConsistencyListener = ListConsistencyListener.install(treeList);
listConsistencyListener.setPreviousElementTracked(false);
source.add("ABCDEF");
source.add("ABC");
assertEquals(6, treeList.size());
}
public void testStructureChangingUpdates() {
EventList source = new BasicEventList();
TreeList treeList = new TreeList(source, COMPRESSED_CHARACTER_TREE_FORMAT, TreeList.NODES_START_EXPANDED);
ListConsistencyListener listConsistencyListener = ListConsistencyListener.install(treeList);
listConsistencyListener.setPreviousElementTracked(false);
source.add("A");
source.add("DEF");
source.add("GJ");
// swap dramatically, moving to a new subtree
source.set(1, "DHI");
assertTreeStructure(treeList, new String[] {
"A",
"D",
"DH",
"DHI",
"G",
"GJ",
});
// now move deeper
source.set(1, "DHIJK");
assertTreeStructure(treeList, new String[] {
"A",
"D",
"DH",
"DHI",
"DHIJ",
"DHIJK",
"G",
"GJ",
});
// now move shallower
source.set(1, "DH");
assertTreeStructure(treeList, new String[] {
"A",
"D",
"DH",
"G",
"GJ",
});
// now move to another subtree after this one
source.set(1, "GAB");
assertTreeStructure(treeList, new String[] {
"A",
"G",
"GA",
"GAB",
"GJ",
});
// now move to another subtree before this one
source.set(1, "ABC");
assertTreeStructure(treeList, new String[] {
"A",
"AB",
"ABC",
"G",
"GJ",
});
}
public void testClear() {
EventList source = new BasicEventList();
TreeList treeList = new TreeList(source, COMPRESSED_CHARACTER_TREE_FORMAT, TreeList.NODES_START_EXPANDED);
ListConsistencyListener listConsistencyListener = ListConsistencyListener.install(treeList);
listConsistencyListener.setPreviousElementTracked(false);
source.add("ABC");
source.add("DEF");
source.add("ABH");
source.add("DZK");
source.clear();
assertEquals(0, treeList.size());
}
public void testSourceChangesOnCollapsedSubtrees() {
EventList source = new BasicEventList();
TreeList treeList = new TreeList(source, COMPRESSED_CHARACTER_TREE_FORMAT, TreeList.NODES_START_EXPANDED);
ListConsistencyListener listConsistencyListener = ListConsistencyListener.install(treeList);
listConsistencyListener.setPreviousElementTracked(false);
source.add("A");
assertEquals(1, treeList.size());
assertEquals(1, treeList.getAllNodesList().size());
assertFullTreeStructure(treeList, new String[] {
"A",
});
treeList.setExpanded(0, false);
assertEquals(1, treeList.size());
assertEquals(1, treeList.getAllNodesList().size());
assertFullTreeStructure(treeList, new String[] {
"A",
});
source.add("ABC");
assertEquals(1, treeList.size());
assertEquals(3, treeList.getAllNodesList().size());
assertFullTreeStructure(treeList, new String[] {
"A",
"AB",
"ABC",
});
treeList.setExpanded(0, true);
assertEquals(3, treeList.size());
assertEquals(3, treeList.getAllNodesList().size());
assertTreeStructure(treeList, new String[] {
"A",
"AB",
"ABC",
});
assertFullTreeStructure(treeList, new String[] {
"A",
"AB",
"ABC",
});
treeList.setExpanded(1, false);
assertEquals(2, treeList.size());
assertEquals(3, treeList.getAllNodesList().size());
source.add("AD");
assertEquals(3, treeList.size());
assertEquals(4, treeList.getAllNodesList().size());
source.addAll(Arrays.asList(new String[] {
"ABD",
"ABE",
"ABF",
"ABG",
}));
assertEquals(3, treeList.size());
assertEquals(8, treeList.getAllNodesList().size());
assertTreeStructure(treeList, new String[] {
"A",
"AB",
"AD",
});
assertFullTreeStructure(treeList, new String[] {
"A",
"AB",
"ABC",
"ABD",
"ABE",
"ABF",
"ABG",
"AD",
});
treeList.setExpanded(0, false);
assertEquals(1, treeList.size());
assertEquals(8, treeList.getAllNodesList().size());
source.addAll(Arrays.asList(new String[] {
"ABH",
"ABI",
}));
assertEquals(1, treeList.size());
assertEquals(10, treeList.getAllNodesList().size());
treeList.setExpanded(0, true);
assertEquals(3, treeList.size());
assertEquals(10, treeList.getAllNodesList().size());
assertTreeStructure(treeList, new String[] {
"A",
"AB",
"AD",
});
assertFullTreeStructure(treeList, new String[] {
"A",
"AB",
"ABC",
"ABD",
"ABE",
"ABF",
"ABG",
"ABH",
"ABI",
"AD",
});
treeList.setExpanded(1, true);
assertEquals(10, treeList.size());
assertEquals(10, treeList.getAllNodesList().size());
assertTreeStructure(treeList, new String[] {
"A",
"AB",
"ABC",
"ABD",
"ABE",
"ABF",
"ABG",
"ABH",
"ABI",
"AD",
});
assertFullTreeStructure(treeList, new String[] {
"A",
"AB",
"ABC",
"ABD",
"ABE",
"ABF",
"ABG",
"ABH",
"ABI",
"AD",
});
treeList.setExpanded(0, false);
assertEquals(1, treeList.size());
assertEquals(10, treeList.getAllNodesList().size());
source.removeAll(Arrays.asList(new String[] {
"ABF",
"ABG",
}));
assertEquals(1, treeList.size());
assertEquals(8, treeList.getAllNodesList().size());
treeList.setExpanded(0, true);
assertEquals(8, treeList.size());
assertEquals(8, treeList.getAllNodesList().size());
assertTreeStructure(treeList, new String[] {
"A",
"AB",
"ABC",
"ABD",
"ABE",
"ABH",
"ABI",
"AD",
});
assertFullTreeStructure(treeList, new String[] {
"A",
"AB",
"ABC",
"ABD",
"ABE",
"ABH",
"ABI",
"AD",
});
}
public void assertTreeStructure(TreeList treeList, String[] structure) {
assertEquals(Arrays.asList(structure), nodeListAsString(treeList.getNodesList()));
}
public void assertFullTreeStructure(TreeList treeList, String[] fullStructure) {
assertEquals(Arrays.asList(fullStructure), nodeListAsString(treeList.getAllNodesList()));
}
private static List nodeListAsString(List> nodeList) {
List nodeListAsStrings = new ArrayList();
for(Iterator> i = nodeList.iterator(); i.hasNext(); ) {
TreeList.Node node = i.next();
StringBuffer asString = new StringBuffer(node.path().size());
for(Iterator n = node.path().iterator(); n.hasNext(); ) {
asString.append(n.next());
}
nodeListAsStrings.add(asString.toString());
}
return nodeListAsStrings;
}
public void testCollapseExpand() {
EventList source = new BasicEventList();
TreeList treeList = new TreeList(source, COMPRESSED_CHARACTER_TREE_FORMAT, TreeList.NODES_START_EXPANDED);
ListConsistencyListener listConsistencyListener = ListConsistencyListener.install(treeList);
listConsistencyListener.setPreviousElementTracked(false);
source.add("ABC");
source.add("ABD");
source.add("ABE");
source.add("ABFG");
source.add("ABFH");
source.add("DEF");
source.add("GJ");
assertTreeStructure(treeList, new String[] {
"A",
"AB",
"ABC",
"ABD",
"ABE",
"ABF",
"ABFG",
"ABFH",
"D",
"DE",
"DEF",
"G",
"GJ",
});
// collapse 'E'
treeList.setExpanded(9, false);
assertTreeStructure(treeList, new String[] {
"A",
"AB",
"ABC",
"ABD",
"ABE",
"ABF",
"ABFG",
"ABFH",
"D",
"DE",
"G",
"GJ",
});
// collapse 'F'
treeList.setExpanded(5, false);
assertTreeStructure(treeList, new String[] {
"A",
"AB",
"ABC",
"ABD",
"ABE",
"ABF",
"D",
"DE",
"G",
"GJ",
});
// collapse 'B'
treeList.setExpanded(1, false);
assertTreeStructure(treeList, new String[] {
"A",
"AB",
"D",
"DE",
"G",
"GJ",
});
// collapse 'D'
treeList.setExpanded(2, false);
assertTreeStructure(treeList, new String[] {
"A",
"AB",
"D",
"G",
"GJ",
});
// expand 'B'
treeList.setExpanded(1, true);
assertTreeStructure(treeList, new String[] {
"A",
"AB",
"ABC",
"ABD",
"ABE",
"ABF",
"D",
"G",
"GJ",
});
// collapse 'A'
treeList.setExpanded(0, false);
assertTreeStructure(treeList, new String[] {
"A",
"D",
"G",
"GJ",
});
// expand 'A', 'F'
treeList.setExpanded(0, true);
treeList.setExpanded(5, true);
assertTreeStructure(treeList, new String[] {
"A",
"AB",
"ABC",
"ABD",
"ABE",
"ABF",
"ABFG",
"ABFH",
"D",
"G",
"GJ",
});
}
public void testSourceUpdateEvents() {
EventList source = new BasicEventList();
TreeList treeList = new TreeList(source, COMPRESSED_CHARACTER_TREE_FORMAT, TreeList.NODES_START_EXPANDED);
ListConsistencyListener listConsistencyListener = ListConsistencyListener.install(treeList);
listConsistencyListener.setPreviousElementTracked(false);
source.add("ABC");
source.add("DEF");
treeList.setExpanded(0, false);
source.set(0, "ABD");
assertTreeStructure(treeList, new String[] {
"A",
"D",
"DE",
"DEF",
});
source.set(1, "ABE");
assertTreeStructure(treeList, new String[] {
"A",
});
}
public void testDeletedRealParentIsReplacedByVirtualParent() {
EventList source = new BasicEventList();
TreeList treeList = new TreeList(source, COMPRESSED_CHARACTER_TREE_FORMAT, TreeList.NODES_START_EXPANDED);
ListConsistencyListener listConsistencyListener = ListConsistencyListener.install(treeList);
listConsistencyListener.setPreviousElementTracked(false);
source.add("A");
source.add("ABC");
source.remove(0);
assertTreeStructure(treeList, new String[] {
"A",
"AB",
"ABC",
});
}
public void testTreeEditing() {
EventList source = new BasicEventList();
TreeList treeList = new TreeList(source, COMPRESSED_CHARACTER_TREE_FORMAT, TreeList.NODES_START_EXPANDED);
ListConsistencyListener listConsistencyListener = ListConsistencyListener.install(treeList);
listConsistencyListener.setPreviousElementTracked(false);
source.add("ABC");
source.add("ABD");
source.add("EFG");
source.add("EFK");
treeList.setExpanded(0, false);
assertTreeStructure(treeList, new String[] {
"A",
"E",
"EF",
"EFG",
"EFK",
});
treeList.set(3, "EFH");
treeList.set(4, "EFL");
treeList.add(4, "EFI");
assertTreeStructure(treeList, new String[] {
"A",
"E",
"EF",
"EFH",
"EFI",
"EFL",
});
}
public void testTreeSortingUnsortedTree() {
EventList source = new BasicEventList();
SortedList sortedSource = SortedList.create(source);
TreeList treeList = new TreeList(sortedSource, UNCOMPRESSED_CHARACTER_TREE_FORMAT, TreeList.NODES_START_EXPANDED);
ListConsistencyListener listConsistencyListener = ListConsistencyListener.install(treeList);
listConsistencyListener.setPreviousElementTracked(false);
source.add("ABC");
source.add("ABD");
source.add("ABE");
source.add("FGH");
source.add("FGI");
sortedSource.setComparator(GlazedLists.reverseComparator());
assertTreeStructure(treeList, new String[] {
"F",
"FG",
"FGI",
"FGH",
"A",
"AB",
"ABE",
"ABD",
"ABC",
});
}
public void testTreeSorting() {
EventList source = new BasicEventList();
SortedList sortedSource = SortedList.create(source);
TreeList treeList = new TreeList(sortedSource, COMPRESSED_CHARACTER_TREE_FORMAT, TreeList.NODES_START_EXPANDED);
ListConsistencyListener listConsistencyListener = ListConsistencyListener.install(treeList);
listConsistencyListener.setPreviousElementTracked(false);
source.add("ABc");
source.add("ABd");
source.add("ABe");
source.add("FGh");
source.add("FGi");
sortedSource.setComparator(GlazedLists.reverseComparator());
assertTreeStructure(treeList, new String[] {
"A",
"AB",
"ABe",
"ABd",
"ABc",
"F",
"FG",
"FGi",
"FGh",
});
}
public void testInsertInReverseOrder() {
EventList source = new BasicEventList();
TreeList treeList = new TreeList(source, COMPRESSED_CHARACTER_TREE_FORMAT, TreeList.NODES_START_EXPANDED);
ListConsistencyListener listConsistencyListener = ListConsistencyListener.install(treeList);
listConsistencyListener.setPreviousElementTracked(false);
source.add("LBAA");
source.add("LAAA");
}
public void testNonSiblingsBecomeSiblings() {
EventList source = new BasicEventList();
TreeList treeList = new TreeList(source, UNCOMPRESSED_CHARACTER_TREE_FORMAT, TreeList.NODES_START_EXPANDED);
ListConsistencyListener listConsistencyListener = ListConsistencyListener.install(treeList);
listConsistencyListener.setPreviousElementTracked(false);
source.add("ABC");
source.add("EFG");
source.add("ABD");
assertTreeStructure(treeList, new String[] {
"A",
"AB",
"ABC",
"E",
"EF",
"EFG",
"A",
"AB",
"ABD",
});
source.remove("EFG");
assertTreeStructure(treeList, new String[] {
"A",
"AB",
"ABC",
"ABD",
});
}
public void testSiblingsBecomeNonSiblings() {
EventList source = new BasicEventList();
TreeList treeList = new TreeList(source, UNCOMPRESSED_CHARACTER_TREE_FORMAT, TreeList.NODES_START_EXPANDED);
ListConsistencyListener listConsistencyListener = ListConsistencyListener.install(treeList);
listConsistencyListener.setPreviousElementTracked(false);
source.add("ABC");
source.add("ABD");
source.add(1, "EFG");
assertTreeStructure(treeList, new String[] {
"A",
"AB",
"ABC",
"E",
"EF",
"EFG",
"A",
"AB",
"ABD",
});
}
public void testSiblingsBecomeNonSiblingsWithCollapsedNodes() {
EventList source = new BasicEventList();
TreeList treeList = new TreeList(source, UNCOMPRESSED_CHARACTER_TREE_FORMAT, TreeList.NODES_START_EXPANDED);
ListConsistencyListener listConsistencyListener = ListConsistencyListener.install(treeList);
listConsistencyListener.setPreviousElementTracked(false);
source.add("ABC");
source.add("ABD");
treeList.setExpanded(1, false); // collapse 'B'
assertTreeStructure(treeList, new String[] {
"A",
"AB",
});
source.add(1, "EFG");
assertTreeStructure(treeList, new String[] {
"A",
"AB",
"E",
"EF",
"EFG",
"A",
"AB",
});
treeList.setExpanded(6, true);
assertTreeStructure(treeList, new String[] {
"A",
"AB",
"E",
"EF",
"EFG",
"A",
"AB",
"ABD",
});
}
/**
* This test validates that when multiple sets of parents are restored, all
* the appropriate virtual nodes are assigned the appropriate new parents.
*/
public void testInsertMultipleParents() {
TransactionList source = new TransactionList(new BasicEventList());
TreeList treeList = new TreeList(source, UNCOMPRESSED_CHARACTER_TREE_FORMAT, TreeList.NODES_START_EXPANDED);
ListConsistencyListener listConsistencyListener = ListConsistencyListener.install(treeList);
listConsistencyListener.setPreviousElementTracked(false);
source.beginEvent(false);
source.add("ABC");
source.add("ABD");
source.add("ABE");
source.commitEvent();
source.beginEvent();
source.addAll(0, Arrays.asList(new String[] { "A", "AB" }));
source.addAll(3, Arrays.asList(new String[] { "A", "AB" }));
source.commitEvent();
assertTreeStructure(treeList, new String[] {
"A",
"AB",
"ABC",
"A",
"AB",
"ABD",
"ABE",
});
}
public void testAttachSiblings() {
EventList source = new BasicEventList();
TreeList treeList = new TreeList(source, UNCOMPRESSED_CHARACTER_TREE_FORMAT, TreeList.NODES_START_EXPANDED);
ListConsistencyListener listConsistencyListener = ListConsistencyListener.install(treeList);
listConsistencyListener.setPreviousElementTracked(false);
source.add("A");
source.add("BCD");
source.add("BCF");
assertTreeStructure(treeList, new String[] {
"A",
"B",
"BC",
"BCD",
"BCF",
});
}
public void testDeleteParentAndOneChild() {
EventList source = new BasicEventList();
TreeList treeList = new TreeList(source, UNCOMPRESSED_CHARACTER_TREE_FORMAT, TreeList.NODES_START_EXPANDED);
ListConsistencyListener listConsistencyListener = ListConsistencyListener.install(treeList);
listConsistencyListener.setPreviousElementTracked(false);
source.add("P");
source.add("PD");
source.add("PU");
source.add("PI");
source.add("PIS");
source.add("PIU");
source.add("PY");
source.removeAll(Arrays.asList(new String[] { "PI", "PIS" }));
assertTreeStructure(treeList, new String[] {
"P",
"PD",
"PU",
"PI",
"PIU",
"PY",
});
}
public void testReplaceVirtualWithRealWithSiblings() {
EventList source = new BasicEventList();
TreeList treeList = new TreeList(source, UNCOMPRESSED_CHARACTER_TREE_FORMAT, TreeList.NODES_START_EXPANDED);
ListConsistencyListener listConsistencyListener = ListConsistencyListener.install(treeList);
listConsistencyListener.setPreviousElementTracked(false);
source.add("ABC");
source.add("DEF");
source.add("GHI");
source.addAll(1, Arrays.asList(new String[] { "D", "DE" }));
assertTreeStructure(treeList, new String[] {
"A",
"AB",
"ABC",
"D",
"DE",
"DEF",
"G",
"GH",
"GHI",
});
}
public void testAddSubtreePlusSiblings() {
EventList source = new BasicEventList();
TreeList treeList = new TreeList(source, UNCOMPRESSED_CHARACTER_TREE_FORMAT, TreeList.NODES_START_EXPANDED);
ListConsistencyListener listConsistencyListener = ListConsistencyListener.install(treeList);
listConsistencyListener.setPreviousElementTracked(false);
source.add("ABC");
source.add("AWX");
source.addAll(1, Arrays.asList(new String[] { "AE", "AEF", "AW" }));
assertTreeStructure(treeList, new String[] {
"A",
"AB",
"ABC",
"AE",
"AEF",
"AW",
"AWX",
});
}
public void testInsertUpdateDeleteOnCollapsed() {
EventList source = new BasicEventList();
TreeList treeList = new TreeList(source, UNCOMPRESSED_CHARACTER_TREE_FORMAT, TreeList.NODES_START_EXPANDED);
ListConsistencyListener listConsistencyListener = ListConsistencyListener.install(treeList);
listConsistencyListener.setPreviousElementTracked(false);
source.add("ABC");
source.add("ABD");
source.add("ABEF");
treeList.setExpanded(1, false);
source.add("ABEG");
source.add(3, "ABH"); // to split siblings ABEF, ABEG
source.remove(1);
source.set(0, "ABI");
assertTreeStructure(treeList, new String[] {
"A",
"AB",
});
treeList.setExpanded(1, true);
assertTreeStructure(treeList, new String[] {
"A",
"AB",
"ABI",
"ABE",
"ABEF",
"ABH",
"ABE",
"ABEG",
});
treeList.setExpanded(1, false);
source.remove(2); // to join siblings ABEF, ABEG
treeList.setExpanded(1, true);
assertTreeStructure(treeList, new String[] {
"A",
"AB",
"ABI",
"ABE",
"ABEF",
"ABEG",
});
}
public void testInsertVirtualParentsOnCollapsed() {
EventList source = new BasicEventList();
TreeList treeList = new TreeList(source, UNCOMPRESSED_CHARACTER_TREE_FORMAT, TreeList.NODES_START_EXPANDED);
ListConsistencyListener listConsistencyListener = ListConsistencyListener.install(treeList);
listConsistencyListener.setPreviousElementTracked(false);
source.add("ABE");
treeList.setExpanded(1, false);
source.add("ABEFGH");
treeList.setExpanded(1, true);
assertTreeStructure(treeList, new String[] {
"A",
"AB",
"ABE",
"ABEF",
"ABEFG",
"ABEFGH",
});
}
public void testReplaceHiddenVirtualParentWithReal() {
EventList source = new BasicEventList();
TreeList treeList = new TreeList(source, UNCOMPRESSED_CHARACTER_TREE_FORMAT, TreeList.NODES_START_EXPANDED);
ListConsistencyListener listConsistencyListener = ListConsistencyListener.install(treeList);
listConsistencyListener.setPreviousElementTracked(false);
source.add("ABC");
treeList.setExpanded(0, false);
source.addAll(0, Arrays.asList(new String[] {
"A",
"AB",
}));
treeList.setExpanded(0, true);
assertTreeStructure(treeList, new String[] {
"A",
"AB",
"ABC",
});
}
public void testSortingSource() {
EventList source = new BasicEventList();
SortedList sortedList = new SortedList(source, null);
TreeList treeList = new TreeList(sortedList, UNCOMPRESSED_CHARACTER_TREE_FORMAT, TreeList.NODES_START_EXPANDED);
ListConsistencyListener listConsistencyListener = ListConsistencyListener.install(treeList);
listConsistencyListener.setPreviousElementTracked(false);
source.add("A");
source.add("DEF");
source.add("ABC");
sortedList.setComparator(GlazedLists.comparableComparator());
assertTreeStructure(treeList, new String[] {
"A",
"AB",
"ABC",
"D",
"DE",
"DEF",
});
}
public void testSortingSourceWithVirtualParentsBetween() {
EventList source = new BasicEventList();
SortedList sortedList = new SortedList(source, null);
TreeList treeList = new TreeList(sortedList, UNCOMPRESSED_CHARACTER_TREE_FORMAT, TreeList.NODES_START_EXPANDED);
ListConsistencyListener listConsistencyListener = ListConsistencyListener.install(treeList);
listConsistencyListener.setPreviousElementTracked(false);
source.addAll(Arrays.asList(new String[] {
"PB",
"PNMA",
"PNM",
"PNMA",
"PDEB"
}));
sortedList.setComparator(new LastCharComparator());
}
public void testObsoleteVirtualParentsWithinMovedNodes() {
EventList source = new BasicEventList();
SortedList sortedList = new SortedList(source, null);
TreeList treeList = new TreeList(sortedList, UNCOMPRESSED_CHARACTER_TREE_FORMAT, TreeList.NODES_START_EXPANDED);
ListConsistencyListener listConsistencyListener = ListConsistencyListener.install(treeList);
listConsistencyListener.setPreviousElementTracked(false);
source.addAll(Arrays.asList(new String[] {
"AD",
"ADCE",
"ADCA"
}));
sortedList.setComparator(new LastCharComparator());
sortedList.setComparator(null);
}
private class LastCharComparator implements Comparator {
public int compare(String a, String b) {
return lastCharOf(a) - lastCharOf(b);
}
private char lastCharOf(String s) {
return s.charAt(s.length() - 1);
}
}
public void testVisibilityOnParentMergeFollowerCollapsed() {
EventList source = new BasicEventList();
TreeList treeList = new TreeList(source, UNCOMPRESSED_CHARACTER_TREE_FORMAT, TreeList.NODES_START_EXPANDED);
ListConsistencyListener listConsistencyListener = ListConsistencyListener.install(treeList);
listConsistencyListener.setPreviousElementTracked(false);
source.add("ABC");
source.add("DEF");
source.add("ABD");
treeList.setExpanded(7, false);
source.remove(1);
assertTreeStructure(treeList, new String[] {
"A",
"AB",
"ABC",
"ABD",
});
}
public void testVisibilityOnParentMergeLeaderCollapsed() {
EventList source = new BasicEventList();
TreeList treeList = new TreeList(source, UNCOMPRESSED_CHARACTER_TREE_FORMAT, TreeList.NODES_START_EXPANDED);
ListConsistencyListener listConsistencyListener = ListConsistencyListener.install(treeList);
listConsistencyListener.setPreviousElementTracked(false);
source.add("ABC");
source.add("DEF");
source.add("ABD");
treeList.setExpanded(1, false);
source.remove(1);
assertTreeStructure(treeList, new String[] {
"A",
"AB",
"ABC",
"ABD",
});
}
public void testSplitChildrenHoldsSiblings() {
EventList source = new BasicEventList();
TreeList treeList = new TreeList(source, UNCOMPRESSED_CHARACTER_TREE_FORMAT, TreeList.NODES_START_EXPANDED);
ListConsistencyListener listConsistencyListener = ListConsistencyListener.install(treeList);
listConsistencyListener.setPreviousElementTracked(false);
source.addAll(Arrays.asList(new String[] {
"PMMP",
"PMMP",
"PSU"
}));
source.add(1, "PDDS");
assertTreeStructure(treeList, new String[] {
"P",
"PM",
"PMM",
"PMMP",
"PD",
"PDD",
"PDDS",
"PM",
"PMM",
"PMMP",
"PS",
"PSU",
});
}
public void testAttachSiblingsToStrippedSiblings() {
EventList source = new BasicEventList();
TreeList treeList = new TreeList(source, UNCOMPRESSED_CHARACTER_TREE_FORMAT, TreeList.NODES_START_EXPANDED);
ListConsistencyListener listConsistencyListener = ListConsistencyListener.install(treeList);
listConsistencyListener.setPreviousElementTracked(false);
source.addAll(Arrays.asList(new String[] {
"PMMP",
"PMMP",
"PSU"
}));
source.add(1, "PP");
assertTreeStructure(treeList, new String[] {
"P",
"PM",
"PMM",
"PMMP",
"PP",
"PM",
"PMM",
"PMMP",
"PS",
"PSU",
});
}
public void testInsertAncestorAfterChild() {
EventList source = new BasicEventList();
TreeList treeList = new TreeList(source, UNCOMPRESSED_CHARACTER_TREE_FORMAT, TreeList.NODES_START_EXPANDED);
ListConsistencyListener listConsistencyListener = ListConsistencyListener.install(treeList);
listConsistencyListener.setPreviousElementTracked(false);
source.addAll(Arrays.asList(new String[] {
"PSU",
"PMMA",
}));
// when we're inserting the 'p' node, we need to be careful about the
// virtual ancestry of the existing 'pmma' node that precedes it, making
// sure not to attach p as a child of a deeper node
source.addAll(1, Arrays.asList(new String[] {
"PDDS",
"P",
}));
assertTreeStructure(treeList, new String[] {
"P",
"PS",
"PSU",
"PD",
"PDD",
"PDDS",
"P",
"PM",
"PMM",
"PMMA",
});
}
public void testSiblingsAttachedToNewParentsFromSplitNodes() {
EventList source = new BasicEventList();
TreeList treeList = new TreeList(source, UNCOMPRESSED_CHARACTER_TREE_FORMAT, TreeList.NODES_START_EXPANDED);
ListConsistencyListener listConsistencyListener = ListConsistencyListener.install(treeList);
listConsistencyListener.setPreviousElementTracked(false);
source.addAll(Arrays.asList(new String[] {
"PMMU",
"PMMP",
"PN",
}));
// this insert causes ancestry to be added for the existing node 'pmmp',
// which needs to be attached as a sibling to the parent node 'pm'.
source.addAll(1, Arrays.asList(new String[] {
"PDDS",
"P",
}));
assertTreeStructure(treeList, new String[] {
"P",
"PM",
"PMM",
"PMMU",
"PD",
"PDD",
"PDDS",
"P",
"PM",
"PMM",
"PMMP",
"PN",
});
}
public void testAddExtraRoot() {
EventList source = new BasicEventList();
TreeList treeList = new TreeList(source, UNCOMPRESSED_CHARACTER_TREE_FORMAT, TreeList.NODES_START_EXPANDED);
ListConsistencyListener listConsistencyListener = ListConsistencyListener.install(treeList);
listConsistencyListener.setPreviousElementTracked(false);
source.addAll(Arrays.asList(new String[] {
"PMMU",
"PMMP",
"PMMP",
"PN",
}));
source.addAll(1, Arrays.asList(new String[] {
"P",
}));
assertTreeStructure(treeList, new String[] {
"P",
"PM",
"PMM",
"PMMU",
"P",
"PM",
"PMM",
"PMMP",
"PMMP",
"PN",
});
}
public void testAddParentAndSibling() {
EventList source = new BasicEventList();
TreeList treeList = new TreeList(source, UNCOMPRESSED_CHARACTER_TREE_FORMAT, TreeList.NODES_START_EXPANDED);
ListConsistencyListener listConsistencyListener = ListConsistencyListener.install(treeList);
listConsistencyListener.setPreviousElementTracked(false);
source.addAll(Arrays.asList(new String[] {
"AC",
"A",
}));
source.addAll(0, Arrays.asList(new String[] {
"A",
"AB",
}));
assertTreeStructure(treeList, new String[] {
"A",
"AB",
"AC",
"A",
});
}
public void testRebuildSiblingsInUnnaturalOrder() {
TransactionList source = new TransactionList(new BasicEventList());
TreeList treeList = new TreeList(source, UNCOMPRESSED_CHARACTER_TREE_FORMAT, TreeList.NODES_START_EXPANDED);
ListConsistencyListener listConsistencyListener = ListConsistencyListener.install(treeList);
listConsistencyListener.setPreviousElementTracked(false);
source.beginEvent();
source.addAll(Arrays.asList(new String[] {
"PMMP",
"PMMS",
}));
source.commitEvent();
source.beginEvent();
source.add(1, "P");
source.add(3, "PDDV");
source.commitEvent();
assertTreeStructure(treeList, new String[] {
"P",
"PM",
"PMM",
"PMMP",
"P",
"PM",
"PMM",
"PMMS",
"PD",
"PDD",
"PDDV",
});
}
public void testReorderIntoInfiniteLoop() {
EventList source = new BasicEventList();
SortedList sortedSource = new SortedList(source, null);
TreeList treeList = new TreeList(sortedSource, new CharacterTreeFormat(new NullCompartor()), TreeList.NODES_START_EXPANDED);
ListConsistencyListener listConsistencyListener = ListConsistencyListener.install(treeList);
listConsistencyListener.setPreviousElementTracked(false);
source.add("AC");
source.add("AB");
source.add("AD");
sortedSource.setComparator(GlazedLists.comparableComparator());
assertTreeStructure(treeList, new String[] {
"A",
"AB",
"AC",
"AD",
});
}
private static final class NullCompartor implements Comparator {
public int compare(E o1, E o2) {
return 0;
}
}
public void testRemoveHiddenCollapsedSubtrees() {
BasicEventList source = new BasicEventList();
TreeList treeList = new TreeList(source, UNCOMPRESSED_CHARACTER_TREE_FORMAT, TreeList.NODES_START_EXPANDED);
ListConsistencyListener listConsistencyListener = ListConsistencyListener.install(treeList);
listConsistencyListener.setPreviousElementTracked(false);
source.addAll(Arrays.asList(new String[] {
"L",
"LL",
"LLG",
"LL",
"LLM",
}));
treeList.setExpanded(1, false);
treeList.setExpanded(0, false);
source.remove(3);
assertTreeStructure(treeList, new String[] {
"L",
});
treeList.setExpanded(0, true);
assertTreeStructure(treeList, new String[] {
"L",
"LL",
"LLG",
"LLM",
});
}
public void testCollapsedByDefaultOnInsert() {
BasicEventList source = new BasicEventList();
TreeList treeList = new TreeList(source, UNCOMPRESSED_CHARACTER_TREE_FORMAT, TreeList.NODES_START_COLLAPSED);
ListConsistencyListener listConsistencyListener = ListConsistencyListener.install(treeList);
listConsistencyListener.setPreviousElementTracked(false);
source.addAll(Arrays.asList(new String[] {
"ABC",
"ABD",
"EFG",
}));
assertTreeStructure(treeList, new String[] {
"A",
"E",
});
treeList.setExpanded(0, true);
treeList.setExpanded(1, true);
assertTreeStructure(treeList, new String[] {
"A",
"AB",
"ABC",
"ABD",
"E",
});
}
public void testCollapsedByDefaultOnCreate() {
BasicEventList source = new BasicEventList();
source.addAll(Arrays.asList(new String[] {
"ABC",
"ABD",
"EFG",
}));
TreeList treeList = new TreeList(source, UNCOMPRESSED_CHARACTER_TREE_FORMAT, TreeList.NODES_START_COLLAPSED);
ListConsistencyListener listConsistencyListener = ListConsistencyListener.install(treeList);
listConsistencyListener.setPreviousElementTracked(false);
assertTreeStructure(treeList, new String[] {
"A",
"E",
});
treeList.setExpanded(0, true);
treeList.setExpanded(1, true);
assertTreeStructure(treeList, new String[] {
"A",
"AB",
"ABC",
"ABD",
"E",
});
}
public void testCollapsedByDefaultForSplits() {
BasicEventList source = new BasicEventList();
TreeList treeList = new TreeList(source, UNCOMPRESSED_CHARACTER_TREE_FORMAT, TreeList.NODES_START_COLLAPSED);
ListConsistencyListener listConsistencyListener = ListConsistencyListener.install(treeList);
listConsistencyListener.setPreviousElementTracked(false);
source.addAll(Arrays.asList(new String[] {
"ABCD",
"ABCE",
}));
treeList.setExpanded(0, true);
source.add(1, "EFGH");
assertTreeStructure(treeList, new String[] {
"A",
"AB",
"E",
"A",
"AB",
});
}
public void testInsertParentWithVisibleChildGetsExpandedState() {
BasicEventList source = new BasicEventList();
DefaultExternalExpansionModel expansionProvider = new DefaultExternalExpansionModel