/*
* Copyright 2000-2016 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 java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import com.vaadin.ui.ComponentTest;
import com.vaadin.v7.data.Container;
import com.vaadin.v7.data.util.IndexedContainer;
import com.vaadin.v7.event.SelectionEvent;
import com.vaadin.v7.event.SelectionEvent.SelectionListener;
import com.vaadin.v7.shared.ui.grid.selection.MultiSelectionModelServerRpc;
import com.vaadin.v7.shared.ui.grid.selection.MultiSelectionModelState;
import com.vaadin.v7.ui.Grid;
import com.vaadin.v7.ui.Grid.SelectionModel.HasUserSelectionAllowed;
public class MultiSelectionModelTest {
private static class MultiSelectionModel
extends com.vaadin.v7.ui.Grid.MultiSelectionModel {
@Override
protected MultiSelectionModelState getState() {
// Overridden to be accessible from test
return super.getState();
}
}
private Object itemId1Present = "itemId1Present";
private Object itemId2Present = "itemId2Present";
private Object itemId3Present = "itemId3Present";
private Object itemIdNotPresent = "itemIdNotPresent";
private Container.Indexed dataSource;
private MultiSelectionModel model;
private Grid grid;
private boolean expectingEvent = false;
private boolean expectingDeselectEvent;
private List<Object> select = new ArrayList<Object>();
private List<Object> deselect = new ArrayList<Object>();
@Before
public void setUp() {
dataSource = createDataSource();
grid = new Grid(dataSource);
model = new MultiSelectionModel();
grid.setSelectionModel(model);
}
@After
public void tearDown() {
Assert.assertFalse("Some expected select event did not happen.",
expectingEvent);
Assert.assertFalse("Some expected deselect event did not happen.",
expectingDeselectEvent);
}
private IndexedContainer createDataSource() {
final IndexedContainer container = new IndexedContainer();
container.addItem(itemId1Present);
container.addItem(itemId2Present);
container.addItem(itemId3Present);
for (int i = 3; i < 10; i++) {
container.addItem(new Object());
}
return container;
}
@Test
public void testSelectAndDeselectRow() throws Throwable {
try {
expectSelectEvent(itemId1Present);
model.select(itemId1Present);
expectDeselectEvent(itemId1Present);
model.deselect(itemId1Present);
} catch (Exception e) {
throw e.getCause();
}
verifyCurrentSelection();
}
@Test
public void testAddSelection() throws Throwable {
try {
expectSelectEvent(itemId1Present);
model.select(itemId1Present);
expectSelectEvent(itemId2Present);
model.select(itemId2Present);
} catch (Exception e) {
throw e.getCause();
}
verifyCurrentSelection(itemId1Present, itemId2Present);
}
@Test
public void testSelectAllWithoutItems() throws Throwable {
Assert.assertFalse(model.getState().allSelected);
dataSource.removeAllItems();
Assert.assertFalse(model.getState().allSelected);
model.select();
Assert.assertFalse(model.getState().allSelected);
model.deselect();
Assert.assertFalse(model.getState().allSelected);
}
@Test
public void testSettingSelection() throws Throwable {
try {
expectSelectEvent(itemId2Present, itemId1Present);
model.setSelected(Arrays
.asList(new Object[] { itemId1Present, itemId2Present }));
verifyCurrentSelection(itemId1Present, itemId2Present);
expectDeselectEvent(itemId1Present);
expectSelectEvent(itemId3Present);
model.setSelected(Arrays
.asList(new Object[] { itemId3Present, itemId2Present }));
verifyCurrentSelection(itemId3Present, itemId2Present);
} catch (Exception e) {
throw e.getCause();
}
}
private void expectSelectEvent(Object... selectArray) {
select = Arrays.asList(selectArray);
addListener();
}
private void expectDeselectEvent(Object... deselectArray) {
deselect = Arrays.asList(deselectArray);
addListener();
}
private void addListener() {
if (expectingEvent) {
return;
}
expectingEvent = true;
grid.addSelectionListener(new SelectionListener() {
@Override
public void select(SelectionEvent event) {
Assert.assertTrue("Selection did not contain expected items",
event.getAdded().containsAll(select));
Assert.assertTrue("Selection contained unexpected items",
select.containsAll(event.getAdded()));
select = new ArrayList<Object>();
Assert.assertTrue("Deselection did not contain expected items",
event.getRemoved().containsAll(deselect));
Assert.assertTrue("Deselection contained unexpected items",
deselect.containsAll(event.getRemoved()));
deselect = new ArrayList<Object>();
grid.removeSelectionListener(this);
expectingEvent = false;
}
});
}
private void verifyCurrentSelection(Object... selection) {
final List<Object> selected = Arrays.asList(selection);
if (model.getSelectedRows().containsAll(selected)
&& selected.containsAll(model.getSelectedRows())) {
return;
}
Assert.fail("Not all items were correctly selected");
}
@Test(expected = IllegalStateException.class)
public void refuseSelectWhenUserSelectionDisallowed() {
((HasUserSelectionAllowed) grid.getSelectionModel())
.setUserSelectionAllowed(false);
MultiSelectionModelServerRpc serverRpc = ComponentTest.getRpcProxy(
grid.getSelectionModel(), MultiSelectionModelServerRpc.class);
serverRpc.select(Collections.singletonList("a"));
}
@Test(expected = IllegalStateException.class)
public void refuseDeselectWhenUserSelectionDisallowed() {
((HasUserSelectionAllowed) grid.getSelectionModel())
.setUserSelectionAllowed(false);
MultiSelectionModelServerRpc serverRpc = ComponentTest.getRpcProxy(
grid.getSelectionModel(), MultiSelectionModelServerRpc.class);
serverRpc.deselect(Collections.singletonList("a"));
}
@Test(expected = IllegalStateException.class)
public void refuseSelectAllWhenUserSelectionDisallowed() {
((HasUserSelectionAllowed) grid.getSelectionModel())
.setUserSelectionAllowed(false);
MultiSelectionModelServerRpc serverRpc = ComponentTest.getRpcProxy(
grid.getSelectionModel(), MultiSelectionModelServerRpc.class);
serverRpc.selectAll();
}
@Test(expected = IllegalStateException.class)
public void refuseDeselectAllWhenUserSelectionDisallowed() {
((HasUserSelectionAllowed) grid.getSelectionModel())
.setUserSelectionAllowed(false);
MultiSelectionModelServerRpc serverRpc = ComponentTest.getRpcProxy(
grid.getSelectionModel(), MultiSelectionModelServerRpc.class);
serverRpc.deselectAll();
}
}