package com.vaadin.v7.data.util; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; import org.junit.Assert; import org.junit.Test; public class BeanItemContainerSortTest { public class Person { private String name; public int getAge() { return age; } public void setAge(int age) { this.age = age; } private int age; public void setName(String name) { this.name = name; } public String getName() { return name; } } public class Parent extends Person { private Set<Person> children = new HashSet<Person>(); public void setChildren(Set<Person> children) { this.children = children; } public Set<Person> getChildren() { return children; } } String[] names = new String[] { "Antti", "Ville", "Sirkka", "Jaakko", "Pekka", "John" }; int[] ages = new int[] { 10, 20, 50, 12, 64, 67 }; String[] sortedByAge = new String[] { names[0], names[3], names[1], names[2], names[4], names[5] }; public BeanItemContainer<Person> getContainer() { BeanItemContainer<Person> bc = new BeanItemContainer<Person>( Person.class); for (int i = 0; i < names.length; i++) { Person p = new Person(); p.setName(names[i]); p.setAge(ages[i]); bc.addBean(p); } return bc; } public BeanItemContainer<Parent> getParentContainer() { BeanItemContainer<Parent> bc = new BeanItemContainer<Parent>( Parent.class); for (int i = 0; i < names.length; i++) { Parent p = new Parent(); p.setName(names[i]); p.setAge(ages[i]); bc.addBean(p); } return bc; } @Test public void testSort() { testSort(true); } public void testSort(boolean b) { BeanItemContainer<Person> container = getContainer(); container.sort(new Object[] { "name" }, new boolean[] { b }); List<String> asList = Arrays.asList(names); Collections.sort(asList); if (!b) { Collections.reverse(asList); } int i = 0; for (String string : asList) { Person idByIndex = container.getIdByIndex(i++); Assert.assertTrue(container.containsId(idByIndex)); Assert.assertEquals(string, idByIndex.getName()); } } @Test public void testReverseSort() { testSort(false); } @Test public void primitiveSorting() { BeanItemContainer<Person> container = getContainer(); container.sort(new Object[] { "age" }, new boolean[] { true }); int i = 0; for (String string : sortedByAge) { Person idByIndex = container.getIdByIndex(i++); Assert.assertTrue(container.containsId(idByIndex)); Assert.assertEquals(string, idByIndex.getName()); } } @Test public void customSorting() { BeanItemContainer<Person> container = getContainer(); // custom sorter using the reverse order container.setItemSorter(new DefaultItemSorter() { @Override public int compare(Object o1, Object o2) { return -super.compare(o1, o2); } }); container.sort(new Object[] { "age" }, new boolean[] { true }); int i = container.size() - 1; for (String string : sortedByAge) { Person idByIndex = container.getIdByIndex(i--); Assert.assertTrue(container.containsId(idByIndex)); Assert.assertEquals(string, idByIndex.getName()); } } @Test public void testGetSortableProperties() { BeanItemContainer<Person> container = getContainer(); Collection<?> sortablePropertyIds = container .getSortableContainerPropertyIds(); Assert.assertEquals(2, sortablePropertyIds.size()); Assert.assertTrue(sortablePropertyIds.contains("name")); Assert.assertTrue(sortablePropertyIds.contains("age")); } @Test public void testGetNonSortableProperties() { BeanItemContainer<Parent> container = getParentContainer(); Assert.assertEquals(3, container.getContainerPropertyIds().size()); Collection<?> sortablePropertyIds = container .getSortableContainerPropertyIds(); Assert.assertEquals(2, sortablePropertyIds.size()); Assert.assertTrue(sortablePropertyIds.contains("name")); Assert.assertTrue(sortablePropertyIds.contains("age")); } }