package com.vaadin.v7.data.util;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.junit.Test;
import com.vaadin.tests.util.TestUtil;
import com.vaadin.v7.data.Container;
import com.vaadin.v7.data.Item;
public class ContainerSortingTest {
private static final String ITEM_DATA_MINUS2_NULL = "Data -2 null";
private static final String ITEM_DATA_MINUS2 = "Data -2";
private static final String ITEM_DATA_MINUS1 = "Data -1";
private static final String ITEM_DATA_MINUS1_NULL = "Data -1 null";
private static final String ITEM_ANOTHER_NULL = "Another null";
private static final String ITEM_STRING_2 = "String 2";
private static final String ITEM_STRING_NULL2 = "String null";
private static final String ITEM_STRING_1 = "String 1";
private static final String PROPERTY_INTEGER_NULL2 = "integer-null";
private static final String PROPERTY_INTEGER_NOT_NULL = "integer-not-null";
private static final String PROPERTY_STRING_NULL = "string-null";
private static final String PROPERTY_STRING_ID = "string-not-null";
@Test
public void testEmptyFilteredIndexedContainer() {
IndexedContainer ic = new IndexedContainer();
addProperties(ic);
populate(ic);
ic.addContainerFilter(PROPERTY_STRING_ID, "aasdfasdfasdf", true, false);
ic.sort(new Object[] { PROPERTY_STRING_ID }, new boolean[] { true });
}
@Test
public void testFilteredIndexedContainer() {
IndexedContainer ic = new IndexedContainer();
addProperties(ic);
populate(ic);
ic.addContainerFilter(PROPERTY_STRING_ID, "a", true, false);
ic.sort(new Object[] { PROPERTY_STRING_ID }, new boolean[] { true });
verifyOrder(ic,
new String[] { ITEM_ANOTHER_NULL, ITEM_DATA_MINUS1,
ITEM_DATA_MINUS1_NULL, ITEM_DATA_MINUS2,
ITEM_DATA_MINUS2_NULL, });
}
@Test
public void testIndexedContainer() {
IndexedContainer ic = new IndexedContainer();
addProperties(ic);
populate(ic);
ic.sort(new Object[] { PROPERTY_STRING_ID }, new boolean[] { true });
verifyOrder(ic, new String[] { ITEM_ANOTHER_NULL, ITEM_DATA_MINUS1,
ITEM_DATA_MINUS1_NULL, ITEM_DATA_MINUS2, ITEM_DATA_MINUS2_NULL,
ITEM_STRING_1, ITEM_STRING_2, ITEM_STRING_NULL2 });
ic.sort(new Object[] { PROPERTY_INTEGER_NOT_NULL,
PROPERTY_INTEGER_NULL2, PROPERTY_STRING_ID },
new boolean[] { true, false, true });
verifyOrder(ic, new String[] { ITEM_DATA_MINUS2, ITEM_DATA_MINUS2_NULL,
ITEM_DATA_MINUS1, ITEM_DATA_MINUS1_NULL, ITEM_ANOTHER_NULL,
ITEM_STRING_NULL2, ITEM_STRING_1, ITEM_STRING_2 });
ic.sort(new Object[] { PROPERTY_INTEGER_NOT_NULL,
PROPERTY_INTEGER_NULL2, PROPERTY_STRING_ID },
new boolean[] { true, true, true });
verifyOrder(ic, new String[] { ITEM_DATA_MINUS2_NULL, ITEM_DATA_MINUS2,
ITEM_DATA_MINUS1_NULL, ITEM_DATA_MINUS1, ITEM_ANOTHER_NULL,
ITEM_STRING_NULL2, ITEM_STRING_1, ITEM_STRING_2 });
}
@Test
public void testHierarchicalContainer() {
HierarchicalContainer hc = new HierarchicalContainer();
populateContainer(hc);
hc.sort(new Object[] { "name" }, new boolean[] { true });
verifyOrder(hc,
new String[] { "Audi", "C++", "Call of Duty", "Cars", "English",
"Fallout", "Finnish", "Ford", "Games", "Java",
"Might and Magic", "Natural languages", "PHP",
"Programming languages", "Python", "Red Alert",
"Swedish", "Toyota", "Volvo" });
TestUtil.assertArrays(hc.rootItemIds().toArray(),
new Integer[] { nameToId.get("Cars"), nameToId.get("Games"),
nameToId.get("Natural languages"),
nameToId.get("Programming languages") });
TestUtil.assertArrays(hc.getChildren(nameToId.get("Games")).toArray(),
new Integer[] { nameToId.get("Call of Duty"),
nameToId.get("Fallout"),
nameToId.get("Might and Magic"),
nameToId.get("Red Alert") });
}
private static void populateContainer(HierarchicalContainer container) {
container.addContainerProperty("name", String.class, null);
addItem(container, "Games", null);
addItem(container, "Call of Duty", "Games");
addItem(container, "Might and Magic", "Games");
addItem(container, "Fallout", "Games");
addItem(container, "Red Alert", "Games");
addItem(container, "Cars", null);
addItem(container, "Toyota", "Cars");
addItem(container, "Volvo", "Cars");
addItem(container, "Audi", "Cars");
addItem(container, "Ford", "Cars");
addItem(container, "Natural languages", null);
addItem(container, "Swedish", "Natural languages");
addItem(container, "English", "Natural languages");
addItem(container, "Finnish", "Natural languages");
addItem(container, "Programming languages", null);
addItem(container, "C++", "Programming languages");
addItem(container, "PHP", "Programming languages");
addItem(container, "Java", "Programming languages");
addItem(container, "Python", "Programming languages");
}
private static int index = 0;
private static Map<String, Integer> nameToId = new HashMap<String, Integer>();
private static Map<Integer, String> idToName = new HashMap<Integer, String>();
public static void addItem(IndexedContainer container, String string,
String parent) {
nameToId.put(string, index);
idToName.put(index, string);
Item item = container.addItem(index);
item.getItemProperty("name").setValue(string);
if (parent != null && container instanceof HierarchicalContainer) {
((HierarchicalContainer) container).setParent(index,
nameToId.get(parent));
}
index++;
}
private void verifyOrder(Container.Sortable ic, Object[] idOrder) {
int size = ic.size();
Object[] actual = new Object[size];
Iterator<?> i = ic.getItemIds().iterator();
int index = 0;
while (i.hasNext()) {
Object o = i.next();
if (o.getClass() == Integer.class
&& idOrder[index].getClass() == String.class) {
o = idToName.get(o);
}
actual[index++] = o;
}
TestUtil.assertArrays(actual, idOrder);
}
private void populate(IndexedContainer ic) {
addItem(ic, ITEM_STRING_1, ITEM_STRING_1, 1, 1);
addItem(ic, ITEM_STRING_NULL2, null, 0, null);
addItem(ic, ITEM_STRING_2, ITEM_STRING_2, 2, 2);
addItem(ic, ITEM_ANOTHER_NULL, null, 0, null);
addItem(ic, ITEM_DATA_MINUS1, ITEM_DATA_MINUS1, -1, -1);
addItem(ic, ITEM_DATA_MINUS1_NULL, null, -1, null);
addItem(ic, ITEM_DATA_MINUS2, ITEM_DATA_MINUS2, -2, -2);
addItem(ic, ITEM_DATA_MINUS2_NULL, null, -2, null);
}
private Item addItem(Container ic, String id, String string_null,
int integer, Integer integer_null) {
Item i = ic.addItem(id);
i.getItemProperty(PROPERTY_STRING_ID).setValue(id);
i.getItemProperty(PROPERTY_STRING_NULL).setValue(string_null);
i.getItemProperty(PROPERTY_INTEGER_NOT_NULL).setValue(integer);
i.getItemProperty(PROPERTY_INTEGER_NULL2).setValue(integer_null);
return i;
}
private void addProperties(IndexedContainer ic) {
ic.addContainerProperty("id", String.class, null);
ic.addContainerProperty(PROPERTY_STRING_ID, String.class, "");
ic.addContainerProperty(PROPERTY_STRING_NULL, String.class, null);
ic.addContainerProperty(PROPERTY_INTEGER_NULL2, Integer.class, null);
ic.addContainerProperty(PROPERTY_INTEGER_NOT_NULL, Integer.class, 0);
ic.addContainerProperty("comparable-null", Integer.class, 0);
}
public class MyObject implements Comparable<MyObject> {
private String data;
@Override
public int compareTo(MyObject o) {
if (o == null) {
return 1;
}
if (o.data == null) {
return data == null ? 0 : 1;
} else if (data == null) {
return -1;
} else {
return data.compareTo(o.data);
}
}
}
}