123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673 |
- package com.vaadin.tests.server.component.grid;
-
- import static org.junit.Assert.assertEquals;
- import static org.junit.Assert.assertFalse;
- import static org.junit.Assert.assertNotNull;
-
- import java.lang.reflect.InvocationTargetException;
- import java.lang.reflect.Method;
- import java.text.DecimalFormat;
- import java.text.DecimalFormatSymbols;
- import java.util.ArrayList;
- import java.util.Arrays;
- import java.util.Collections;
- import java.util.Date;
- import java.util.HashSet;
- import java.util.List;
- import java.util.Locale;
- import java.util.Optional;
- import java.util.Random;
- import java.util.Set;
- import java.util.concurrent.atomic.AtomicInteger;
- import java.util.concurrent.atomic.AtomicReference;
- import java.util.stream.Collectors;
- import java.util.stream.Stream;
-
- import com.vaadin.data.provider.DataCommunicator;
- import org.easymock.Capture;
- import org.junit.Assert;
- import org.junit.Before;
- import org.junit.Test;
-
- import com.vaadin.data.Binder.Binding;
- import com.vaadin.data.ValidationException;
- import com.vaadin.data.ValueProvider;
- import com.vaadin.data.provider.DataGenerator;
- import com.vaadin.data.provider.GridSortOrder;
- import com.vaadin.data.provider.QuerySortOrder;
- import com.vaadin.data.provider.bov.Person;
- import com.vaadin.event.selection.SelectionEvent;
- import com.vaadin.server.SerializableComparator;
- import com.vaadin.shared.data.sort.SortDirection;
- import com.vaadin.shared.ui.grid.HeightMode;
- import com.vaadin.tests.util.MockUI;
- import com.vaadin.ui.Grid;
- import com.vaadin.ui.Grid.Column;
- import com.vaadin.ui.Grid.SelectionMode;
- import com.vaadin.ui.TextField;
- import com.vaadin.ui.renderers.NumberRenderer;
-
- import elemental.json.Json;
- import elemental.json.JsonObject;
- import junit.framework.AssertionFailedError;
-
- public class GridTest {
-
- private Grid<String> grid;
- private Column<String, String> fooColumn;
- private Column<String, Integer> lengthColumn;
- private Column<String, Object> objectColumn;
- private Column<String, String> randomColumn;
-
- @Before
- public void setUp() {
- grid = new Grid<>();
-
- fooColumn = grid.addColumn(ValueProvider.identity()).setId("foo");
- lengthColumn = grid.addColumn(String::length, new NumberRenderer())
- .setId("length");
- objectColumn = grid.addColumn(string -> new Object());
- randomColumn = grid.addColumn(ValueProvider.identity())
- .setId("randomColumnId");
- }
-
- @Test
- public void testCreateGridWithDataCommunicator() {
- DataCommunicator specificDataCommunicator = new DataCommunicator<>();
-
- TestGrid<String> grid = new TestGrid(String.class, specificDataCommunicator);
-
- assertEquals(specificDataCommunicator, grid.getDataCommunicator());
- }
-
- @Test
- public void testGridHeightModeChange() {
- assertEquals("Initial height mode was not CSS", HeightMode.CSS,
- grid.getHeightMode());
- grid.setHeightByRows(13.24);
- assertEquals("Setting height by rows did not change height mode",
- HeightMode.ROW, grid.getHeightMode());
- grid.setHeight("100px");
- assertEquals("Setting height did not change height mode.",
- HeightMode.CSS, grid.getHeightMode());
- }
-
- @Test(expected = IllegalArgumentException.class)
- public void testFrozenColumnCountTooBig() {
- grid.setFrozenColumnCount(5);
- }
-
- @Test(expected = IllegalArgumentException.class)
- public void testFrozenColumnCountTooSmall() {
- grid.setFrozenColumnCount(-2);
- }
-
- @Test()
- public void testSetFrozenColumnCount() {
- for (int i = -1; i < 2; ++i) {
- grid.setFrozenColumnCount(i);
- assertEquals("Frozen column count not updated", i,
- grid.getFrozenColumnCount());
- }
- }
-
- @Test
- public void testGridColumnIdentifier() {
- grid.getColumn("foo").setCaption("Bar");
- assertEquals("Column header not updated correctly", "Bar",
- grid.getHeaderRow(0).getCell("foo").getText());
- }
-
- @Test(expected = IllegalArgumentException.class)
- public void testGridMultipleColumnsWithSameIdentifier() {
- grid.addColumn(t -> t).setId("foo");
- }
-
- @Test
- public void testAddSelectionListener_singleSelectMode() {
- grid.setItems("foo", "bar", "baz");
-
- Capture<SelectionEvent<String>> eventCapture = new Capture<>();
-
- grid.addSelectionListener(event -> eventCapture.setValue(event));
-
- grid.getSelectionModel().select("foo");
-
- SelectionEvent<String> event = eventCapture.getValue();
- assertNotNull(event);
- assertFalse(event.isUserOriginated());
- assertEquals("foo", event.getFirstSelectedItem().get());
- assertEquals("foo",
- event.getAllSelectedItems().stream().findFirst().get());
-
- grid.getSelectionModel().select("bar");
-
- event = eventCapture.getValue();
- assertNotNull(event);
- assertFalse(event.isUserOriginated());
- assertEquals("bar", event.getFirstSelectedItem().get());
- assertEquals("bar",
- event.getAllSelectedItems().stream().findFirst().get());
-
- grid.getSelectionModel().deselect("bar");
-
- event = eventCapture.getValue();
- assertNotNull(event);
- assertFalse(event.isUserOriginated());
- assertEquals(Optional.empty(), event.getFirstSelectedItem());
- assertEquals(0, event.getAllSelectedItems().size());
- }
-
- @Test
- public void testAddSelectionListener_multiSelectMode() {
- grid.setItems("foo", "bar", "baz");
- grid.setSelectionMode(SelectionMode.MULTI);
-
- Capture<SelectionEvent<String>> eventCapture = new Capture<>();
-
- grid.addSelectionListener(event -> eventCapture.setValue(event));
-
- grid.getSelectionModel().select("foo");
-
- SelectionEvent<String> event = eventCapture.getValue();
- assertNotNull(event);
- assertFalse(event.isUserOriginated());
- assertEquals("foo", event.getFirstSelectedItem().get());
- assertEquals("foo",
- event.getAllSelectedItems().stream().findFirst().get());
-
- grid.getSelectionModel().select("bar");
-
- event = eventCapture.getValue();
- assertNotNull(event);
- assertFalse(event.isUserOriginated());
- assertEquals("foo", event.getFirstSelectedItem().get());
- assertEquals("foo",
- event.getAllSelectedItems().stream().findFirst().get());
- Assert.assertArrayEquals(new String[] { "foo", "bar" },
- event.getAllSelectedItems().toArray(new String[2]));
-
- grid.getSelectionModel().deselect("foo");
-
- event = eventCapture.getValue();
- assertNotNull(event);
- assertFalse(event.isUserOriginated());
- assertEquals("bar", event.getFirstSelectedItem().get());
- assertEquals("bar",
- event.getAllSelectedItems().stream().findFirst().get());
- Assert.assertArrayEquals(new String[] { "bar" },
- event.getAllSelectedItems().toArray(new String[1]));
-
- grid.getSelectionModel().deselectAll();
-
- event = eventCapture.getValue();
- assertNotNull(event);
- assertFalse(event.isUserOriginated());
- assertEquals(Optional.empty(), event.getFirstSelectedItem());
- assertEquals(0, event.getAllSelectedItems().size());
- }
-
- @Test(expected = UnsupportedOperationException.class)
- public void testAddSelectionListener_noSelectionMode() {
- grid.setSelectionMode(SelectionMode.NONE);
-
- grid.addSelectionListener(
- event -> Assert.fail("never ever happens (tm)"));
- }
-
- @Test
- public void sortByColumn_sortOrderIsAscendingOneColumn() {
- Column<String, ?> column = grid.getColumns().get(1);
- grid.sort(column);
-
- GridSortOrder<String> sortOrder = grid.getSortOrder().get(0);
- Assert.assertEquals(column, sortOrder.getSorted());
- Assert.assertEquals(SortDirection.ASCENDING, sortOrder.getDirection());
- }
-
- @Test
- public void sortByColumnDesc_sortOrderIsDescendingOneColumn() {
- Column<String, ?> column = grid.getColumns().get(1);
- grid.sort(column, SortDirection.DESCENDING);
-
- GridSortOrder<String> sortOrder = grid.getSortOrder().get(0);
- Assert.assertEquals(column, sortOrder.getSorted());
- Assert.assertEquals(SortDirection.DESCENDING, sortOrder.getDirection());
- }
-
- @Test
- public void setSortOrder() {
- Column<String, ?> column1 = grid.getColumns().get(1);
- Column<String, ?> column2 = grid.getColumns().get(2);
- List<GridSortOrder<String>> order = Arrays.asList(
- new GridSortOrder<>(column2, SortDirection.DESCENDING),
- new GridSortOrder<>(column1, SortDirection.ASCENDING));
- grid.setSortOrder(order);
-
- List<GridSortOrder<String>> sortOrder = grid.getSortOrder();
- Assert.assertEquals(column2, sortOrder.get(0).getSorted());
- Assert.assertEquals(SortDirection.DESCENDING,
- sortOrder.get(0).getDirection());
-
- Assert.assertEquals(column1, sortOrder.get(1).getSorted());
- Assert.assertEquals(SortDirection.ASCENDING,
- sortOrder.get(1).getDirection());
- }
-
- @Test
- public void clearSortOrder() {
- Column<String, ?> column = grid.getColumns().get(1);
- grid.sort(column);
-
- grid.clearSortOrder();
-
- assertEquals(0, grid.getSortOrder().size());
- }
-
- @Test
- public void sortListener_eventIsFired() {
- Column<String, ?> column1 = grid.getColumns().get(1);
- Column<String, ?> column2 = grid.getColumns().get(2);
-
- List<GridSortOrder<String>> list = new ArrayList<>();
- AtomicReference<Boolean> fired = new AtomicReference<>();
- grid.addSortListener(event -> {
- Assert.assertTrue(list.isEmpty());
- fired.set(true);
- list.addAll(event.getSortOrder());
- });
- grid.sort(column1, SortDirection.DESCENDING);
-
- Assert.assertEquals(column1, list.get(0).getSorted());
- Assert.assertEquals(SortDirection.DESCENDING,
- list.get(0).getDirection());
-
- List<GridSortOrder<String>> order = Arrays.asList(
- new GridSortOrder<>(column2, SortDirection.DESCENDING),
- new GridSortOrder<>(column1, SortDirection.ASCENDING));
- list.clear();
-
- grid.setSortOrder(order);
-
- Assert.assertEquals(column2, list.get(0).getSorted());
- Assert.assertEquals(SortDirection.DESCENDING,
- list.get(0).getDirection());
-
- Assert.assertEquals(column1, list.get(1).getSorted());
- Assert.assertEquals(SortDirection.ASCENDING,
- list.get(1).getDirection());
-
- list.clear();
- fired.set(false);
- grid.clearSortOrder();
- Assert.assertEquals(0, list.size());
- Assert.assertTrue(fired.get());
- }
-
- @Test
- public void beanGrid() {
- Grid<Person> grid = new Grid<>(Person.class);
-
- Column<Person, ?> nameColumn = grid.getColumn("name");
- Column<Person, ?> bornColumn = grid.getColumn("born");
-
- Assert.assertNotNull(nameColumn);
- Assert.assertNotNull(bornColumn);
-
- Assert.assertEquals("Name", nameColumn.getCaption());
- Assert.assertEquals("Born", bornColumn.getCaption());
-
- JsonObject json = getRowData(grid, new Person("Lorem", 2000));
-
- Set<String> values = Stream.of(json.keys()).map(json::getString)
- .collect(Collectors.toSet());
-
- Assert.assertEquals(new HashSet<>(Arrays.asList("Lorem", "2000")),
- values);
-
- assertSingleSortProperty(nameColumn, "name");
- assertSingleSortProperty(bornColumn, "born");
- }
-
- @Test
- public void beanGrid_editor() throws ValidationException {
- Grid<Person> grid = new Grid<>(Person.class);
-
- Column<Person, ?> nameColumn = grid.getColumn("name");
-
- TextField nameField = new TextField();
- nameColumn.setEditorComponent(nameField);
-
- Optional<Binding<Person, ?>> maybeBinding = grid.getEditor().getBinder()
- .getBinding("name");
- Assert.assertTrue(maybeBinding.isPresent());
-
- Binding<Person, ?> binding = maybeBinding.get();
- Assert.assertSame(nameField, binding.getField());
-
- Person person = new Person("Lorem", 2000);
- grid.getEditor().getBinder().setBean(person);
-
- Assert.assertEquals("Lorem", nameField.getValue());
-
- nameField.setValue("Ipsum");
- Assert.assertEquals("Ipsum", person.getName());
- }
-
- @Test(expected = IllegalStateException.class)
- public void oneArgSetEditor_nonBeanGrid() {
- Grid<Person> grid = new Grid<>();
- Column<Person, String> nameCol = grid.addColumn(Person::getName)
- .setId("name");
-
- nameCol.setEditorComponent(new TextField());
- }
-
- @Test(expected = IllegalStateException.class)
- public void addExistingColumnById_throws() {
- Grid<Person> grid = new Grid<>(Person.class);
- grid.addColumn("name");
- }
-
- @Test
- public void removeByColumn_readdById() {
- Grid<Person> grid = new Grid<>(Person.class);
- grid.removeColumn(grid.getColumn("name"));
-
- grid.addColumn("name");
-
- List<Column<Person, ?>> columns = grid.getColumns();
- Assert.assertEquals(2, columns.size());
- Assert.assertEquals("born", columns.get(0).getId());
- Assert.assertEquals("name", columns.get(1).getId());
- }
-
- @Test
- public void removeColumnByColumn() {
- grid.removeColumn(fooColumn);
-
- Assert.assertEquals(
- Arrays.asList(lengthColumn, objectColumn, randomColumn),
- grid.getColumns());
- }
-
- @Test
- public void removeColumnByColumn_alreadyRemoved() {
- grid.removeColumn(fooColumn);
- // Questionable that this doesn't throw, but that's a separate ticket...
- grid.removeColumn(fooColumn);
-
- Assert.assertEquals(
- Arrays.asList(lengthColumn, objectColumn, randomColumn),
- grid.getColumns());
- }
-
- @Test(expected = IllegalStateException.class)
- public void removeColumnById_alreadyRemoved() {
- grid.removeColumn("foo");
- grid.removeColumn("foo");
- }
-
- @Test
- public void removeColumnById() {
- grid.removeColumn("foo");
-
- Assert.assertEquals(
- Arrays.asList(lengthColumn, objectColumn, randomColumn),
- grid.getColumns());
- }
-
- @Test
- public void removeAllColumns() {
- grid.removeAllColumns();
-
- Assert.assertEquals(Collections.emptyList(), grid.getColumns());
- }
-
- @Test
- public void removeAllColumnsInGridWithoutColumns() {
- grid.removeAllColumns();
- grid.removeAllColumns();
- Assert.assertEquals(Collections.emptyList(), grid.getColumns());
- }
-
- @Test
- public void removeFrozenColumn() {
- grid.setFrozenColumnCount(3);
- grid.removeColumn(fooColumn);
- assertEquals(2, grid.getFrozenColumnCount());
- }
-
- @Test
- public void removeHiddenFrozenColumn() {
- lengthColumn.setHidden(true);
- grid.setFrozenColumnCount(3);
- grid.removeColumn(lengthColumn);
- assertEquals(2, grid.getFrozenColumnCount());
- }
-
- @Test
- public void removeNonFrozenColumn() {
- grid.setFrozenColumnCount(3);
- grid.removeColumn(randomColumn);
- assertEquals(3, grid.getFrozenColumnCount());
- }
-
- @Test
- public void testFrozenColumnRemoveColumn() {
- assertEquals("Grid should not start with a frozen column", 0,
- grid.getFrozenColumnCount());
-
- int columnCount = grid.getColumns().size();
- grid.setFrozenColumnCount(columnCount);
-
- grid.removeColumn(grid.getColumns().get(0));
- assertEquals(
- "Frozen column count should be updated when removing a frozen column",
- columnCount - 1, grid.getFrozenColumnCount());
- }
-
- @Test
- public void setColumns_reorder() {
- // Will remove other columns
- grid.setColumns("length", "foo");
-
- List<Column<String, ?>> columns = grid.getColumns();
-
- Assert.assertEquals(2, columns.size());
- Assert.assertEquals("length", columns.get(0).getId());
- Assert.assertEquals("foo", columns.get(1).getId());
- }
-
- @Test(expected = IllegalStateException.class)
- public void setColumns_addColumn_notBeangrid() {
- // Not possible to add a column in a grid that cannot add columns based
- // on a string
- grid.setColumns("notHere");
- }
-
- @Test
- public void setColumns_addColumns_beangrid() {
- Grid<Person> grid = new Grid<>(Person.class);
-
- // Remove so we can add it back
- grid.removeColumn("name");
-
- grid.setColumns("born", "name");
-
- List<Column<Person, ?>> columns = grid.getColumns();
- Assert.assertEquals(2, columns.size());
- Assert.assertEquals("born", columns.get(0).getId());
- Assert.assertEquals("name", columns.get(1).getId());
- }
-
- @Test
- public void setColumnOrder_byColumn() {
- grid.setColumnOrder(randomColumn, lengthColumn);
-
- Assert.assertEquals(Arrays.asList(randomColumn, lengthColumn, fooColumn,
- objectColumn), grid.getColumns());
- }
-
- @Test(expected = IllegalStateException.class)
- public void setColumnOrder_byColumn_removedColumn() {
- grid.removeColumn(randomColumn);
- grid.setColumnOrder(randomColumn, lengthColumn);
- }
-
- @Test
- public void setColumnOrder_byString() {
- grid.setColumnOrder("randomColumnId", "length");
-
- Assert.assertEquals(Arrays.asList(randomColumn, lengthColumn, fooColumn,
- objectColumn), grid.getColumns());
- }
-
- @Test(expected = IllegalStateException.class)
- public void setColumnOrder_byString_removedColumn() {
- grid.removeColumn("randomColumnId");
- grid.setColumnOrder("randomColumnId", "length");
- }
-
- @Test
- public void defaultSorting_comparableTypes() {
- testValueProviderSorting(1, 2, 3);
- }
-
- @Test
- public void defaultSorting_strings() {
- testValueProviderSorting("a", "b", "c");
- }
-
- @Test
- public void defaultSorting_notComparable() {
- assert !Comparable.class.isAssignableFrom(AtomicInteger.class);
-
- testValueProviderSorting(new AtomicInteger(10), new AtomicInteger(8),
- new AtomicInteger(9));
- }
-
- @Test
- public void defaultSorting_differentComparables() {
- testValueProviderSorting(10.1, 200, 3000.1, 4000);
- }
-
- @Test
- public void defaultSorting_mutuallyComparableTypes() {
- testValueProviderSorting(new Date(10), new java.sql.Date(1000000),
- new Date(100000000));
- }
-
- private static void testValueProviderSorting(Object... expectedOrder) {
- SerializableComparator<Object> comparator = new Grid<>()
- .addColumn(ValueProvider.identity())
- .getComparator(SortDirection.ASCENDING);
-
- Assert.assertNotNull(comparator);
-
- List<Object> values = new ArrayList<>(Arrays.asList(expectedOrder));
- Collections.shuffle(values, new Random(42));
-
- Assert.assertArrayEquals(expectedOrder,
- values.stream().sorted(comparator).toArray());
- }
-
- @Test
- public void addBeanColumn_validRenderer() {
- Grid<Person> grid = new Grid<>(Person.class);
-
- grid.removeColumn("born");
- grid.addColumn("born", new NumberRenderer(new DecimalFormat("#,###",
- DecimalFormatSymbols.getInstance(Locale.US))));
-
- Person person = new Person("Name", 2017);
-
- JsonObject rowData = getRowData(grid, person);
-
- String formattedValue = Stream.of(rowData.keys())
- .map(rowData::getString).filter(value -> !value.equals("Name"))
- .findFirst().orElse(null);
- Assert.assertEquals(formattedValue, "2,017");
- }
-
- @Test(expected = IllegalArgumentException.class)
- public void addBeanColumn_invalidRenderer() {
- Grid<Person> grid = new Grid<>(Person.class);
-
- grid.removeColumn("name");
- grid.addColumn("name", new NumberRenderer());
- }
-
- @Test
- public void columnId_sortProperty() {
- assertSingleSortProperty(lengthColumn, "length");
- }
-
- @Test
- public void columnId_sortProperty_noId() {
- Assert.assertEquals(0,
- objectColumn.getSortOrder(SortDirection.ASCENDING).count());
- }
-
- @Test
- public void sortProperty_setId_doesntOverride() {
- objectColumn.setSortProperty("foo");
- objectColumn.setId("bar");
-
- assertSingleSortProperty(objectColumn, "foo");
- }
-
- private static void assertSingleSortProperty(Column<?, ?> column,
- String expectedProperty) {
- QuerySortOrder[] sortOrders = column
- .getSortOrder(SortDirection.ASCENDING)
- .toArray(QuerySortOrder[]::new);
-
- Assert.assertEquals(1, sortOrders.length);
- Assert.assertEquals(SortDirection.ASCENDING,
- sortOrders[0].getDirection());
- Assert.assertEquals(expectedProperty, sortOrders[0].getSorted());
- }
-
- private static <T> JsonObject getRowData(Grid<T> grid, T row) {
- JsonObject json = Json.createObject();
- if (grid.getColumns().isEmpty()) {
- return json;
- }
-
- // generateData only works if Grid is attached
- new MockUI().setContent(grid);
-
- Method getter = findDataGeneratorGetterMethod();
- grid.getColumns().forEach(column -> {
- DataGenerator<T> dataGenerator;
- try {
- dataGenerator = (DataGenerator<T>) getter.invoke(column,
- new Object[] {});
- dataGenerator.generateData(row, json);
- } catch (IllegalAccessException | IllegalArgumentException
- | InvocationTargetException e) {
- throw new AssertionFailedError(
- "Cannot get DataGenerator from Column");
- }
- });
-
- // Detach again
- grid.getUI().setContent(null);
-
- return json.getObject("d");
- }
-
- private static Method findDataGeneratorGetterMethod() {
- Method getter;
- try {
- getter = Column.class.getDeclaredMethod("getDataGenerator",
- new Class<?>[] {});
- getter.setAccessible(true);
- return getter;
- } catch (NoSuchMethodException | SecurityException e) {
- throw new AssertionFailedError(
- "Cannot get DataGenerator from Column");
- }
- }
- }
|