You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

GridAsSingleSelectInBinderTest.java 5.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. package com.vaadin.data;
  2. import static org.junit.Assert.assertEquals;
  3. import static org.junit.Assert.assertFalse;
  4. import static org.junit.Assert.assertNull;
  5. import static org.junit.Assert.assertSame;
  6. import java.util.ArrayList;
  7. import java.util.Arrays;
  8. import java.util.List;
  9. import org.junit.Before;
  10. import org.junit.Test;
  11. import com.vaadin.tests.data.bean.Person;
  12. import com.vaadin.tests.data.bean.Sex;
  13. import com.vaadin.ui.Grid;
  14. import com.vaadin.ui.Grid.SelectionMode;
  15. import com.vaadin.ui.SingleSelect;
  16. import com.vaadin.ui.components.grid.SingleSelectionModelImpl;
  17. public class GridAsSingleSelectInBinderTest
  18. extends BinderTestBase<Binder<Person>, Person> {
  19. private class GridWithCustomSingleSelectionModel extends Grid<Sex> {
  20. @Override
  21. public void setSelectionModel(
  22. com.vaadin.ui.components.grid.GridSelectionModel<Sex> model) {
  23. super.setSelectionModel(model);
  24. }
  25. }
  26. private class CustomSingleSelectModel
  27. extends SingleSelectionModelImpl<Sex> {
  28. public void setSelectedFromClient(Sex item) {
  29. setSelectedFromClient(
  30. getGrid().getDataCommunicator().getKeyMapper().key(item));
  31. }
  32. }
  33. private Grid<Sex> grid;
  34. private SingleSelect<Sex> select;
  35. @Before
  36. public void setup() {
  37. binder = new Binder<>();
  38. item = new Person();
  39. grid = new Grid<>();
  40. grid.setItems(Sex.values());
  41. select = grid.asSingleSelect();
  42. }
  43. @Test(expected = IllegalStateException.class)
  44. public void boundGridInBinder_selectionModelChanged_throws() {
  45. grid.setSelectionMode(SelectionMode.MULTI);
  46. select.setValue(Sex.MALE);
  47. }
  48. @Test
  49. public void personBound_bindSelectByShortcut_selectionUpdated() {
  50. item.setSex(Sex.FEMALE);
  51. binder.setBean(item);
  52. binder.bind(select, Person::getSex, Person::setSex);
  53. assertSame(Sex.FEMALE, select.getValue());
  54. }
  55. @Test
  56. public void personBound_bindSelect_selectionUpdated() {
  57. item.setSex(Sex.MALE);
  58. binder.setBean(item);
  59. binder.forField(select).bind(Person::getSex, Person::setSex);
  60. assertSame(Sex.MALE, select.getValue());
  61. }
  62. @Test
  63. public void selectBound_bindPersonWithNullSex_selectedItemNotPresent() {
  64. bindSex();
  65. assertFalse(select.getValue() != null);
  66. }
  67. @Test
  68. public void selectBound_bindPerson_selectionUpdated() {
  69. item.setSex(Sex.FEMALE);
  70. bindSex();
  71. assertSame(Sex.FEMALE, select.getValue());
  72. }
  73. @Test
  74. public void bound_setSelection_beanValueUpdated() {
  75. bindSex();
  76. select.setValue(Sex.MALE);
  77. assertSame(Sex.MALE, item.getSex());
  78. }
  79. @Test
  80. public void bound_deselect_beanValueUpdatedToNull() {
  81. item.setSex(Sex.MALE);
  82. bindSex();
  83. select.setValue(null);
  84. assertNull(item.getSex());
  85. }
  86. @Test
  87. public void unbound_changeSelection_beanValueNotUpdated() {
  88. item.setSex(Sex.UNKNOWN);
  89. bindSex();
  90. binder.removeBean();
  91. select.setValue(Sex.FEMALE);
  92. assertSame(Sex.UNKNOWN, item.getSex());
  93. }
  94. @Test
  95. public void addValueChangeListener_selectionUpdated_eventTriggeredForSelect() {
  96. GridWithCustomSingleSelectionModel grid = new GridWithCustomSingleSelectionModel();
  97. CustomSingleSelectModel model = new CustomSingleSelectModel();
  98. grid.setSelectionModel(model);
  99. grid.setItems(Sex.values());
  100. select = grid.asSingleSelect();
  101. List<Sex> selected = new ArrayList<>();
  102. List<Sex> oldSelected = new ArrayList<>();
  103. List<Boolean> userOriginated = new ArrayList<>();
  104. select.addValueChangeListener(event -> {
  105. selected.add(event.getValue());
  106. oldSelected.add(event.getOldValue());
  107. userOriginated.add(event.isUserOriginated());
  108. assertSame(grid, event.getComponent());
  109. // cannot compare that the event source is the select since a new
  110. // SingleSelect wrapper object has been created for the event
  111. assertSame(select.getValue(), event.getValue());
  112. });
  113. grid.getSelectionModel().select(Sex.UNKNOWN);
  114. model.setSelectedFromClient(Sex.MALE); // simulates client side
  115. // selection
  116. grid.getSelectionModel().select(Sex.MALE); // NOOP
  117. grid.getSelectionModel().deselect(Sex.UNKNOWN); // NOOP
  118. model.setSelectedFromClient(null); // simulates deselect from client
  119. // side
  120. grid.getSelectionModel().select(Sex.FEMALE);
  121. assertEquals(Arrays.asList(Sex.UNKNOWN, Sex.MALE, null, Sex.FEMALE),
  122. selected);
  123. assertEquals(Arrays.asList(null, Sex.UNKNOWN, Sex.MALE, null),
  124. oldSelected);
  125. assertEquals(Arrays.asList(false, true, true, false), userOriginated);
  126. }
  127. protected void bindSex() {
  128. binder.forField(select).bind(Person::getSex, Person::setSex);
  129. binder.setBean(item);
  130. }
  131. }