package com.vaadin.data; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertSame; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.junit.Before; import org.junit.Test; import com.vaadin.tests.data.bean.Person; import com.vaadin.tests.data.bean.Sex; import com.vaadin.ui.Grid; import com.vaadin.ui.Grid.SelectionMode; import com.vaadin.ui.SingleSelect; import com.vaadin.ui.components.grid.SingleSelectionModelImpl; public class GridAsSingleSelectInBinderTest extends BinderTestBase<Binder<Person>, Person> { private class GridWithCustomSingleSelectionModel extends Grid<Sex> { @Override public void setSelectionModel( com.vaadin.ui.components.grid.GridSelectionModel<Sex> model) { super.setSelectionModel(model); } } private class CustomSingleSelectModel extends SingleSelectionModelImpl<Sex> { public void setSelectedFromClient(Sex item) { setSelectedFromClient(itemToKey(item)); } } private Grid<Sex> grid; private SingleSelect<Sex> select; @Before public void setup() { binder = new Binder<>(); item = new Person(); grid = new Grid<>(); grid.setItems(Sex.values()); select = grid.asSingleSelect(); } @Test(expected = IllegalStateException.class) public void boundGridInBinder_selectionModelChanged_throws() { grid.setSelectionMode(SelectionMode.MULTI); select.setValue(Sex.MALE); } @Test public void personBound_bindSelectByShortcut_selectionUpdated() { item.setSex(Sex.FEMALE); binder.setBean(item); binder.bind(select, Person::getSex, Person::setSex); assertSame(Sex.FEMALE, select.getValue()); } @Test public void personBound_bindSelect_selectionUpdated() { item.setSex(Sex.MALE); binder.setBean(item); binder.forField(select).bind(Person::getSex, Person::setSex); assertSame(Sex.MALE, select.getValue()); } @Test public void selectBound_bindPersonWithNullSex_selectedItemNotPresent() { bindSex(); assertFalse(select.getValue() != null); } @Test public void selectBound_bindPerson_selectionUpdated() { item.setSex(Sex.FEMALE); bindSex(); assertSame(Sex.FEMALE, select.getValue()); } @Test public void bound_setSelection_beanValueUpdated() { bindSex(); select.setValue(Sex.MALE); assertSame(Sex.MALE, item.getSex()); } @Test public void bound_deselect_beanValueUpdatedToNull() { item.setSex(Sex.MALE); bindSex(); select.setValue(null); assertNull(item.getSex()); } @Test public void unbound_changeSelection_beanValueNotUpdated() { item.setSex(Sex.UNKNOWN); bindSex(); binder.removeBean(); select.setValue(Sex.FEMALE); assertSame(Sex.UNKNOWN, item.getSex()); } @Test public void addValueChangeListener_selectionUpdated_eventTriggeredForSelect() { GridWithCustomSingleSelectionModel grid = new GridWithCustomSingleSelectionModel(); CustomSingleSelectModel model = new CustomSingleSelectModel(); grid.setSelectionModel(model); grid.setItems(Sex.values()); select = grid.asSingleSelect(); List<Sex> selected = new ArrayList<>(); List<Sex> oldSelected = new ArrayList<>(); List<Boolean> userOriginated = new ArrayList<>(); select.addValueChangeListener(event -> { selected.add(event.getValue()); oldSelected.add(event.getOldValue()); userOriginated.add(event.isUserOriginated()); assertSame(grid, event.getComponent()); // cannot compare that the event source is the select since a new // SingleSelect wrapper object has been created for the event assertSame(select.getValue(), event.getValue()); }); grid.getSelectionModel().select(Sex.UNKNOWN); model.setSelectedFromClient(Sex.MALE); // simulates client side // selection grid.getSelectionModel().select(Sex.MALE); // NOOP grid.getSelectionModel().deselect(Sex.UNKNOWN); // NOOP model.setSelectedFromClient(null); // simulates deselect from client // side grid.getSelectionModel().select(Sex.FEMALE); assertEquals(Arrays.asList(Sex.UNKNOWN, Sex.MALE, null, Sex.FEMALE), selected); assertEquals(Arrays.asList(null, Sex.UNKNOWN, Sex.MALE, null), oldSelected); assertEquals(Arrays.asList(false, true, true, false), userOriginated); } protected void bindSex() { binder.forField(select).bind(Person::getSex, Person::setSex); binder.setBean(item); } }