/* * Copyright 2000-2013 Vaadin Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.vaadin.v7.tests.server.component.grid; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.util.Collection; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import com.vaadin.v7.data.util.IndexedContainer; import com.vaadin.v7.event.SelectionEvent; import com.vaadin.v7.event.SelectionEvent.SelectionListener; import com.vaadin.v7.ui.Grid; import com.vaadin.v7.ui.Grid.SelectionMode; import com.vaadin.v7.ui.Grid.SelectionModel; public class GridSelectionTest { private static class MockSelectionChangeListener implements SelectionListener { private SelectionEvent event; @Override public void select(final SelectionEvent event) { this.event = event; } public Collection<?> getAdded() { return event.getAdded(); } public Collection<?> getRemoved() { return event.getRemoved(); } public void clearEvent() { /* * This method is not strictly needed as the event will simply be * overridden, but it's good practice, and makes the code more * obvious. */ event = null; } public boolean eventHasHappened() { return event != null; } } private Grid grid; private MockSelectionChangeListener mockListener; private final Object itemId1Present = "itemId1Present"; private final Object itemId2Present = "itemId2Present"; private final Object itemId1NotPresent = "itemId1NotPresent"; private final Object itemId2NotPresent = "itemId2NotPresent"; @Before public void setup() { final IndexedContainer container = new IndexedContainer(); container.addItem(itemId1Present); container.addItem(itemId2Present); for (int i = 2; i < 10; i++) { container.addItem(new Object()); } assertEquals("init size", 10, container.size()); assertTrue("itemId1Present", container.containsId(itemId1Present)); assertTrue("itemId2Present", container.containsId(itemId2Present)); assertFalse("itemId1NotPresent", container.containsId(itemId1NotPresent)); assertFalse("itemId2NotPresent", container.containsId(itemId2NotPresent)); grid = new Grid(container); mockListener = new MockSelectionChangeListener(); grid.addSelectionListener(mockListener); assertFalse("eventHasHappened", mockListener.eventHasHappened()); } @Test public void defaultSelectionModeIsSingle() { assertTrue(grid.getSelectionModel() instanceof SelectionModel.Single); } @Test(expected = IllegalStateException.class) public void getSelectedRowThrowsExceptionMulti() { grid.setSelectionMode(SelectionMode.MULTI); grid.getSelectedRow(); } @Test(expected = IllegalStateException.class) public void getSelectedRowThrowsExceptionNone() { grid.setSelectionMode(SelectionMode.NONE); grid.getSelectedRow(); } @Test(expected = IllegalStateException.class) public void selectThrowsExceptionNone() { grid.setSelectionMode(SelectionMode.NONE); grid.select(itemId1Present); } @Test(expected = IllegalStateException.class) public void deselectRowThrowsExceptionNone() { grid.setSelectionMode(SelectionMode.NONE); grid.deselect(itemId1Present); } @Test public void selectionModeMapsToMulti() { assertTrue(grid.setSelectionMode( SelectionMode.MULTI) instanceof SelectionModel.Multi); } @Test public void selectionModeMapsToSingle() { assertTrue(grid.setSelectionMode( SelectionMode.SINGLE) instanceof SelectionModel.Single); } @Test public void selectionModeMapsToNone() { assertTrue(grid.setSelectionMode( SelectionMode.NONE) instanceof SelectionModel.None); } @Test(expected = IllegalArgumentException.class) public void selectionModeNullThrowsException() { grid.setSelectionMode(null); } @Test public void noSelectModel_isSelected() { grid.setSelectionMode(SelectionMode.NONE); assertFalse("itemId1Present", grid.isSelected(itemId1Present)); assertFalse("itemId1NotPresent", grid.isSelected(itemId1NotPresent)); } @Test(expected = IllegalStateException.class) public void noSelectModel_getSelectedRow() { grid.setSelectionMode(SelectionMode.NONE); grid.getSelectedRow(); } @Test public void noSelectModel_getSelectedRows() { grid.setSelectionMode(SelectionMode.NONE); assertTrue(grid.getSelectedRows().isEmpty()); } @Test public void selectionCallsListenerMulti() { grid.setSelectionMode(SelectionMode.MULTI); selectionCallsListener(); } @Test public void selectionCallsListenerSingle() { grid.setSelectionMode(SelectionMode.SINGLE); selectionCallsListener(); } private void selectionCallsListener() { grid.select(itemId1Present); assertEquals("added size", 1, mockListener.getAdded().size()); assertEquals("added item", itemId1Present, mockListener.getAdded().iterator().next()); assertEquals("removed size", 0, mockListener.getRemoved().size()); } @Test public void deselectionCallsListenerMulti() { grid.setSelectionMode(SelectionMode.MULTI); deselectionCallsListener(); } @Test public void deselectionCallsListenerSingle() { grid.setSelectionMode(SelectionMode.SINGLE); deselectionCallsListener(); } private void deselectionCallsListener() { grid.select(itemId1Present); mockListener.clearEvent(); grid.deselect(itemId1Present); assertEquals("removed size", 1, mockListener.getRemoved().size()); assertEquals("removed item", itemId1Present, mockListener.getRemoved().iterator().next()); assertEquals("removed size", 0, mockListener.getAdded().size()); } @Test public void deselectPresentButNotSelectedItemIdShouldntFireListenerMulti() { grid.setSelectionMode(SelectionMode.MULTI); deselectPresentButNotSelectedItemIdShouldntFireListener(); } @Test public void deselectPresentButNotSelectedItemIdShouldntFireListenerSingle() { grid.setSelectionMode(SelectionMode.SINGLE); deselectPresentButNotSelectedItemIdShouldntFireListener(); } private void deselectPresentButNotSelectedItemIdShouldntFireListener() { grid.deselect(itemId1Present); assertFalse(mockListener.eventHasHappened()); } @Test public void deselectNotPresentItemIdShouldNotThrowExceptionMulti() { grid.setSelectionMode(SelectionMode.MULTI); grid.deselect(itemId1NotPresent); } @Test public void deselectNotPresentItemIdShouldNotThrowExceptionSingle() { grid.setSelectionMode(SelectionMode.SINGLE); grid.deselect(itemId1NotPresent); } @Test(expected = IllegalArgumentException.class) public void selectNotPresentItemIdShouldThrowExceptionMulti() { grid.setSelectionMode(SelectionMode.MULTI); grid.select(itemId1NotPresent); } @Test(expected = IllegalArgumentException.class) public void selectNotPresentItemIdShouldThrowExceptionSingle() { grid.setSelectionMode(SelectionMode.SINGLE); grid.select(itemId1NotPresent); } @Test public void selectAllMulti() { grid.setSelectionMode(SelectionMode.MULTI); final SelectionModel.Multi select = (SelectionModel.Multi) grid .getSelectionModel(); select.selectAll(); assertEquals("added size", 10, mockListener.getAdded().size()); assertEquals("removed size", 0, mockListener.getRemoved().size()); assertTrue("itemId1Present", mockListener.getAdded().contains(itemId1Present)); assertTrue("itemId2Present", mockListener.getAdded().contains(itemId2Present)); } @Test public void deselectAllMulti() { grid.setSelectionMode(SelectionMode.MULTI); final SelectionModel.Multi select = (SelectionModel.Multi) grid .getSelectionModel(); select.selectAll(); mockListener.clearEvent(); select.deselectAll(); assertEquals("removed size", 10, mockListener.getRemoved().size()); assertEquals("added size", 0, mockListener.getAdded().size()); assertTrue("itemId1Present", mockListener.getRemoved().contains(itemId1Present)); assertTrue("itemId2Present", mockListener.getRemoved().contains(itemId2Present)); assertTrue("selectedRows is empty", grid.getSelectedRows().isEmpty()); } @Test public void gridDeselectAllMultiAllSelected() { grid.setSelectionMode(SelectionMode.MULTI); final SelectionModel.Multi select = (SelectionModel.Multi) grid .getSelectionModel(); select.selectAll(); mockListener.clearEvent(); assertTrue(grid.deselectAll()); assertEquals("removed size", 10, mockListener.getRemoved().size()); assertEquals("added size", 0, mockListener.getAdded().size()); assertTrue("itemId1Present", mockListener.getRemoved().contains(itemId1Present)); assertTrue("itemId2Present", mockListener.getRemoved().contains(itemId2Present)); assertTrue("selectedRows is empty", grid.getSelectedRows().isEmpty()); } @Test public void gridDeselectAllMultiOneSelected() { grid.setSelectionMode(SelectionMode.MULTI); final SelectionModel.Multi select = (SelectionModel.Multi) grid .getSelectionModel(); select.select(itemId2Present); mockListener.clearEvent(); assertTrue(grid.deselectAll()); assertEquals("removed size", 1, mockListener.getRemoved().size()); assertEquals("added size", 0, mockListener.getAdded().size()); assertFalse("itemId1Present", mockListener.getRemoved().contains(itemId1Present)); assertTrue("itemId2Present", mockListener.getRemoved().contains(itemId2Present)); assertTrue("selectedRows is empty", grid.getSelectedRows().isEmpty()); } @Test public void gridDeselectAllSingleNoneSelected() { grid.setSelectionMode(SelectionMode.SINGLE); assertFalse(grid.deselectAll()); assertTrue("selectedRows is empty", grid.getSelectedRows().isEmpty()); } @Test public void gridDeselectAllSingleOneSelected() { grid.setSelectionMode(SelectionMode.SINGLE); final SelectionModel.Single select = (SelectionModel.Single) grid .getSelectionModel(); select.select(itemId2Present); mockListener.clearEvent(); assertTrue(grid.deselectAll()); assertEquals("removed size", 1, mockListener.getRemoved().size()); assertEquals("added size", 0, mockListener.getAdded().size()); assertFalse("itemId1Present", mockListener.getRemoved().contains(itemId1Present)); assertTrue("itemId2Present", mockListener.getRemoved().contains(itemId2Present)); assertTrue("selectedRows is empty", grid.getSelectedRows().isEmpty()); } @Test public void gridDeselectAllMultiNoneSelected() { grid.setSelectionMode(SelectionMode.MULTI); assertFalse(grid.deselectAll()); assertTrue("selectedRows is empty", grid.getSelectedRows().isEmpty()); } @Test public void reselectionDeselectsPreviousSingle() { grid.setSelectionMode(SelectionMode.SINGLE); grid.select(itemId1Present); mockListener.clearEvent(); grid.select(itemId2Present); assertEquals("added size", 1, mockListener.getAdded().size()); assertEquals("removed size", 1, mockListener.getRemoved().size()); assertEquals("added item", itemId2Present, mockListener.getAdded().iterator().next()); assertEquals("removed item", itemId1Present, mockListener.getRemoved().iterator().next()); assertEquals("selectedRows is correct", itemId2Present, grid.getSelectedRow()); } @Test public void selectionChangeEventWhenChangingSelectionModeSingleToNone() { grid.select(itemId1Present); Assert.assertEquals(itemId1Present, grid.getSelectedRow()); mockListener.clearEvent(); grid.setSelectionMode(SelectionMode.NONE); assertTrue(mockListener.eventHasHappened()); assertTrue(mockListener.getRemoved().contains(itemId1Present)); } @Test public void selectionChangeEventWhenChangingSelectionModeMultiToNone() { grid.setSelectionMode(SelectionMode.MULTI); grid.select(itemId1Present); grid.select(itemId2Present); mockListener.clearEvent(); grid.setSelectionMode(SelectionMode.NONE); assertTrue(mockListener.eventHasHappened()); assertTrue(mockListener.getRemoved().contains(itemId1Present)); assertTrue(mockListener.getRemoved().contains(itemId2Present)); } @Test public void noSelectionChangeEventWhenChanginModeWithNoneSelected() { mockListener.clearEvent(); grid.setSelectionMode(SelectionMode.SINGLE); assertFalse(mockListener.eventHasHappened()); grid.setSelectionMode(SelectionMode.NONE); assertFalse(mockListener.eventHasHappened()); grid.setSelectionMode(SelectionMode.MULTI); assertFalse(mockListener.eventHasHappened()); } }