package com.vaadin.tests.components.grid;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import com.vaadin.server.SerializableComparator;
import com.vaadin.server.VaadinSession;
import com.vaadin.shared.data.sort.SortDirection;
import com.vaadin.ui.Grid;
import com.vaadin.ui.renderers.AbstractRenderer;
import com.vaadin.ui.renderers.NumberRenderer;
public class GridNullValueSort {
private static AbstractRenderer<Integer, Boolean> booleanRenderer() {
return new AbstractRenderer<Integer, Boolean>(Boolean.class) {
};
}
private static class TestGrid extends Grid<Integer> {
@Override
public SerializableComparator<Integer> createSortingComparator() {
return super.createSortingComparator();
}
}
private TestGrid grid;
@Before
public void setup() {
VaadinSession.setCurrent(null);
grid = new TestGrid();
grid.addColumn(i -> i, new NumberRenderer()).setId("int")
.setSortable(true);
grid.addColumn(i -> i == null ? null : String.valueOf(i))
.setId("String").setSortable(true);
grid.addColumn(i -> i == null ? null : i != 1, booleanRenderer())
.setId("Boolean").setSortable(true);
}
@Test
public void testNumbersNotNulls() {
grid.sort(grid.getColumn("int"), SortDirection.ASCENDING);
performSort(Arrays.asList(2, 1, 3), Arrays.asList(1, 2, 3));
}
@Test
public void testSortByColumnId() {
grid.sort("int");
performSort(Arrays.asList(2, 1, 3), Arrays.asList(1, 2, 3));
}
@Test
public void testSortByColumnIdAndDirection() {
grid.sort("int", SortDirection.DESCENDING);
performSort(Arrays.asList(2, 1, 3), Arrays.asList(3, 2, 1));
}
@Test(expected = IllegalStateException.class)
public void testSortByMissingColumnId() {
grid.sort("notHere");
}
@Test(expected = IllegalStateException.class)
public void testSortByMissingColumnIdAndDirection() {
grid.sort("notHere", SortDirection.DESCENDING);
}
@Test
public void testNumbers() {
grid.sort(grid.getColumn("int"), SortDirection.ASCENDING);
performSort(Arrays.asList(1, 2, null, 3, null, null),
Arrays.asList(1, 2, 3, null, null, null));
}
@Test
public void testNumbersNotNullsDescending() {
grid.sort(grid.getColumn("int"), SortDirection.DESCENDING);
performSort(Arrays.asList(1, 2, 3), Arrays.asList(3, 2, 1));
}
@Test
public void testNumbersDescending() {
grid.sort(grid.getColumn("int"), SortDirection.DESCENDING);
performSort(Arrays.asList(1, 3, null, null, null, 2),
Arrays.asList(null, null, null, 3, 2, 1));
}
@Test
public void testStringsNotNulls() {
grid.sort(grid.getColumn("String"), SortDirection.ASCENDING);
performSort(Arrays.asList(2, 1, 3), Arrays.asList(1, 2, 3));
}
@Test
public void testStrings() {
grid.sort(grid.getColumn("String"), SortDirection.ASCENDING);
performSort(Arrays.asList(1, 2, null, 3, null, null),
Arrays.asList(1, 2, 3, null, null, null));
}
@Test
public void testStringsNotNullsDescending() {
grid.sort(grid.getColumn("String"), SortDirection.DESCENDING);
performSort(Arrays.asList(1, 2, 3), Arrays.asList(3, 2, 1));
}
@Test
public void testStringsDescending() {
grid.sort(grid.getColumn("String"), SortDirection.DESCENDING);
performSort(Arrays.asList(1, 3, null, null, null, 2),
Arrays.asList(null, null, null, 3, 2, 1));
}
@Test
public void testBooleansNotNulls() {
grid.sort(grid.getColumn("Boolean"), SortDirection.ASCENDING);
performSort(Arrays.asList(2, 1), Arrays.asList(1, 2));
}
@Test
public void testBooleans() {
grid.sort(grid.getColumn("Boolean"), SortDirection.ASCENDING);
performSort(Arrays.asList(1, null, 2, null, null),
Arrays.asList(1, 2, null, null, null));
}
@Test
public void testBooleansNotNullsDescending() {
grid.sort(grid.getColumn("Boolean"), SortDirection.DESCENDING);
performSort(Arrays.asList(1, 2), Arrays.asList(2, 1));
}
@Test
public void testBooleansDescending() {
grid.sort(grid.getColumn("Boolean"), SortDirection.DESCENDING);
performSort(Arrays.asList(1, null, null, null, 2),
Arrays.asList(null, null, null, 2, 1));
}
private void performSort(List<Integer> source, List<Integer> expected) {
SerializableComparator<Integer> sortingComparator = grid
.createSortingComparator();
List<Integer> data = new ArrayList<>(source);
data.sort(sortingComparator);
Assert.assertEquals(expected, data);
}
}