/* * Copyright 2010 Google Inc. * * 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.google.gwt.view.client; import com.google.gwt.cell.client.Cell.Context; import com.google.gwt.dom.client.Document; import com.google.gwt.dom.client.NativeEvent; import com.google.gwt.junit.client.GWTTestCase; import com.google.gwt.view.client.DefaultSelectionEventManager.BlacklistEventTranslator; import com.google.gwt.view.client.DefaultSelectionEventManager.SelectAction; import com.google.gwt.view.client.DefaultSelectionEventManager.WhitelistEventTranslator; import java.util.ArrayList; import java.util.List; /** * Tests for {@link DefaultSelectionEventManager}. */ public class DefaultSelectionEventManagerTest extends GWTTestCase { /** * The mock display used in most tests. */ MockHasData<String> display; /** * The {@link DefaultSelectionEventManager} used in most tests. */ DefaultSelectionEventManager<String> manager; @Override public String getModuleName() { return "com.google.gwt.view.View"; } public void testBlacklistEventTranslator() { BlacklistEventTranslator<String> translator = new BlacklistEventTranslator<String>( 1, 3); assertTrue(translator.isColumnBlacklisted(1)); assertFalse(translator.isColumnBlacklisted(2)); assertTrue(translator.isColumnBlacklisted(3)); translator.setColumnBlacklisted(2, true); assertTrue(translator.isColumnBlacklisted(1)); assertTrue(translator.isColumnBlacklisted(2)); assertTrue(translator.isColumnBlacklisted(3)); translator.setColumnBlacklisted(2, false); assertTrue(translator.isColumnBlacklisted(1)); assertFalse(translator.isColumnBlacklisted(2)); assertTrue(translator.isColumnBlacklisted(3)); translator.clearBlacklist(); assertFalse(translator.isColumnBlacklisted(1)); assertFalse(translator.isColumnBlacklisted(2)); assertFalse(translator.isColumnBlacklisted(3)); } public void testClearSelection() { MultiSelectionModel<String> model = new MultiSelectionModel<String>(); model.setSelected("foo", true); model.setSelected("bar", true); model.setSelected("baz", true); assertEquals(3, model.getSelectedSet().size()); manager.clearSelection(model); assertSelected(model); } public void testDoMultiSelection() { MultiSelectionModel<String> model = new MultiSelectionModel<String>(); display.setSelectionModel(model); // Select one value. manager.doMultiSelection(model, display, 0, "test 0", null, false, false); assertSelected(model, "test 0"); // Select another value without clearing. manager.doMultiSelection(model, display, 2, "test 2", null, false, false); assertSelected(model, "test 0", "test 2"); // Select a selected value and clear. manager.doMultiSelection(model, display, 2, "test 2", null, false, true); assertSelected(model, "test 2"); // Select a different value and clear. manager.doMultiSelection(model, display, 3, "test 3", null, false, true); assertSelected(model, "test 3"); } /** * Test that the user can change the selected range based at an anchor point. */ public void testDoMultiSelectionChangeRange() { MultiSelectionModel<String> model = new MultiSelectionModel<String>(); display.setSelectionModel(model); // Select the anchor. manager.doMultiSelection(model, display, 5, "test 5", null, false, false); assertSelected(model, "test 5"); // Select a range in the positive direction. manager.doMultiSelection(model, display, 9, "test 9", null, true, false); assertSelected(model, "test 5", "test 6", "test 7", "test 8", "test 9"); // Reduce the length of the range. manager.doMultiSelection(model, display, 7, "test 7", null, true, false); assertSelected(model, "test 5", "test 6", "test 7"); // Increase the length of the range. manager.doMultiSelection(model, display, 9, "test 9", null, true, false); assertSelected(model, "test 5", "test 6", "test 7", "test 8", "test 9"); // Change the range to the negative direction. manager.doMultiSelection(model, display, 1, "test 1", null, true, false); assertSelected(model, "test 1", "test 2", "test 3", "test 4", "test 5"); // Reduce the length of the range. manager.doMultiSelection(model, display, 3, "test 3", null, true, false); assertSelected(model, "test 3", "test 4", "test 5"); // Increase the length of the range. manager.doMultiSelection(model, display, 1, "test 1", null, true, false); assertSelected(model, "test 1", "test 2", "test 3", "test 4", "test 5"); } public void testDoMultiSelectionDeselect() { MultiSelectionModel<String> model = new MultiSelectionModel<String>(); display.setSelectionModel(model); // Select one value. manager.doMultiSelection(model, display, 0, "test 0", SelectAction.SELECT, false, false); assertSelected(model, "test 0"); // Deselect another value. manager.doMultiSelection(model, display, 3, "test 3", SelectAction.DESELECT, false, false); assertSelected(model, "test 0"); // Deselect the value. manager.doMultiSelection(model, display, 0, "test 0", SelectAction.DESELECT, false, false); assertSelected(model); } public void testDoMultiSelectionIgnore() { MultiSelectionModel<String> model = new MultiSelectionModel<String>(); display.setSelectionModel(model); // Select one value. manager.doMultiSelection(model, display, 0, "test 0", SelectAction.IGNORE, false, false); assertSelected(model); } public void testDoMultiSelectionRange() { MultiSelectionModel<String> model = new MultiSelectionModel<String>(); display.setSelectionModel(model); // Select range, but really only one value because nothing is selected. manager.doMultiSelection(model, display, 3, "test 3", null, true, false); assertSelected(model, "test 3"); // Select a range. manager.doMultiSelection(model, display, 5, "test 5", null, true, false); assertSelected(model, "test 3", "test 4", "test 5"); // Select a different value and do not clear. manager.doMultiSelection(model, display, 7, "test 7", null, false, false); assertSelected(model, "test 3", "test 4", "test 5", "test 7"); // Select a second range and do not clear. manager.doMultiSelection(model, display, 9, "test 9", null, true, false); assertSelected(model, "test 3", "test 4", "test 5", "test 7", "test 8", "test 9"); // Select a different value and do not clear. manager.doMultiSelection(model, display, 0, "test 0", null, false, false); assertSelected(model, "test 0", "test 3", "test 4", "test 5", "test 7", "test 8", "test 9"); // Select an overlapping range and clear. manager.doMultiSelection(model, display, 4, "test 4", null, true, true); assertSelected(model, "test 0", "test 1", "test 2", "test 3", "test 4"); // Select a value and clear. manager.doMultiSelection(model, display, 3, "test 3", null, false, true); assertSelected(model, "test 3"); } /** * Test that selecting a range works when the visible range doesn't start at index 0. */ public void testDoMultiSelectionRangeWithPaging() { MultiSelectionModel<String> model = new MultiSelectionModel<String>(); display.setVisibleRange(10, 10); display.setRowData(10, createData(10, 10)); display.setSelectionModel(model); // Select range, but really only one value because nothing is selected. manager.doMultiSelection(model, display, 13, "test 13", null, true, false); assertSelected(model, "test 13"); // Select a range. manager.doMultiSelection(model, display, 15, "test 15", null, true, false); assertSelected(model, "test 13", "test 14", "test 15"); } public void testDoMultiSelectionSelect() { MultiSelectionModel<String> model = new MultiSelectionModel<String>(); display.setSelectionModel(model); // Select one value. manager.doMultiSelection(model, display, 0, "test 0", SelectAction.SELECT, false, false); assertSelected(model, "test 0"); // Add another value. manager.doMultiSelection(model, display, 3, "test 3", SelectAction.SELECT, false, false); assertSelected(model, "test 0", "test 3"); } public void testDoMultiSelectionToggle() { MultiSelectionModel<String> model = new MultiSelectionModel<String>(); display.setSelectionModel(model); // Toggle a deselected value. manager.doMultiSelection(model, display, 0, "test 0", SelectAction.TOGGLE, false, false); assertSelected(model, "test 0"); // Toggle a selected value. manager.doMultiSelection(model, display, 0, "test 0", SelectAction.TOGGLE, false, false); assertSelected(model); } public void testHandleSelectionEvent() { SingleSelectionModel<String> model = new SingleSelectionModel<String>(); display.setSelectionModel(model); model.setSelected("test 0", true); // Select a different value. NativeEvent nativeEvent = Document.get().createClickEvent(0, 0, 0, 0, 0, false, false, false, false); CellPreviewEvent<String> event = new CellPreviewEvent<String>(nativeEvent, display, new Context(1, 0, null), "test 1", false, false); manager.handleSelectionEvent(event, null, model); assertEquals("test 1", model.getSelectedObject()); // Select the same value. manager.handleSelectionEvent(event, null, model); assertEquals("test 1", model.getSelectedObject()); // Ctrl+Select the same value. nativeEvent = Document.get().createClickEvent(0, 0, 0, 0, 0, true, false, false, true); event = new CellPreviewEvent<String>(nativeEvent, display, new Context(1, 0, null), "test 1", false, false); manager.handleSelectionEvent(event, null, model); assertNull(model.getSelectedObject()); // Spacebar a different value. nativeEvent = Document.get().createKeyUpEvent(false, false, false, false, 32); event = new CellPreviewEvent<String>(nativeEvent, display, new Context(2, 0, null), "test 2", false, false); manager.handleSelectionEvent(event, null, model); assertEquals("test 2", model.getSelectedObject()); // Spacebar the same value. manager.handleSelectionEvent(event, null, model); assertNull(model.getSelectedObject()); } public void testHandleSelectionEventDeselect() { SingleSelectionModel<String> model = new SingleSelectionModel<String>(); display.setSelectionModel(model); model.setSelected("test 0", true); // Deselect a different value. NativeEvent nativeEvent = Document.get().createClickEvent(0, 0, 0, 0, 0, false, false, false, false); CellPreviewEvent<String> event = new CellPreviewEvent<String>(nativeEvent, display, new Context(1, 0, null), "test 1", false, false); manager.handleSelectionEvent(event, SelectAction.DESELECT, model); assertEquals("test 0", model.getSelectedObject()); // Deselect the same value. event = new CellPreviewEvent<String>(nativeEvent, display, new Context(0, 0, null), "test 0", false, false); manager.handleSelectionEvent(event, SelectAction.DESELECT, model); assertNull(model.getSelectedObject()); } public void testHandleSelectionEventIgnore() { SingleSelectionModel<String> model = new SingleSelectionModel<String>(); display.setSelectionModel(model); model.setSelected("test 0", true); NativeEvent nativeEvent = Document.get().createClickEvent(0, 0, 0, 0, 0, false, false, false, false); CellPreviewEvent<String> event = new CellPreviewEvent<String>(nativeEvent, display, new Context(3, 0, null), "test 3", false, false); manager.handleSelectionEvent(event, SelectAction.IGNORE, model); assertEquals("test 0", model.getSelectedObject()); } public void testHandleSelectionEventSelect() { SingleSelectionModel<String> model = new SingleSelectionModel<String>(); display.setSelectionModel(model); model.setSelected("test 0", true); // Select the same value. NativeEvent nativeEvent = Document.get().createClickEvent(0, 0, 0, 0, 0, false, false, false, false); CellPreviewEvent<String> event = new CellPreviewEvent<String>(nativeEvent, display, new Context(0, 0, null), "test 0", false, false); manager.handleSelectionEvent(event, SelectAction.SELECT, model); assertEquals("test 0", model.getSelectedObject()); // Select a different value. event = new CellPreviewEvent<String>(nativeEvent, display, new Context(1, 0, null), "test 1", false, false); manager.handleSelectionEvent(event, SelectAction.SELECT, model); assertEquals("test 1", model.getSelectedObject()); } public void testHandleSelectionEventToggle() { SingleSelectionModel<String> model = new SingleSelectionModel<String>(); display.setSelectionModel(model); model.setSelected("test 0", true); // Toggle a different value. NativeEvent nativeEvent = Document.get().createClickEvent(0, 0, 0, 0, 0, false, false, false, false); CellPreviewEvent<String> event = new CellPreviewEvent<String>(nativeEvent, display, new Context(1, 0, null), "test 1", false, false); manager.handleSelectionEvent(event, SelectAction.TOGGLE, model); assertEquals("test 1", model.getSelectedObject()); // Toggle the same value. manager.handleSelectionEvent(event, SelectAction.TOGGLE, model); assertNull(model.getSelectedObject()); } public void testSelectOne() { MultiSelectionModel<String> model = new MultiSelectionModel<String>(); model.setSelected("foo", true); model.setSelected("bar", true); model.setSelected("baz", true); assertSelected(model, "foo", "bar", "baz"); manager.selectOne(model, "biz", true, true); assertSelected(model, "biz"); } public void testSelectOneAlreadySelected() { MultiSelectionModel<String> model = new MultiSelectionModel<String>(); model.setSelected("foo", true); model.setSelected("bar", true); model.setSelected("baz", true); assertSelected(model, "foo", "bar", "baz"); manager.selectOne(model, "bar", true, true); assertSelected(model, "bar"); } public void testSelectOneWithoutClearing() { MultiSelectionModel<String> model = new MultiSelectionModel<String>(); model.setSelected("foo", true); model.setSelected("bar", true); model.setSelected("baz", true); assertSelected(model, "foo", "bar", "baz"); manager.selectOne(model, "biz", true, false); assertSelected(model, "foo", "bar", "baz", "biz"); } public void testSetRangeSelection() { MultiSelectionModel<String> model = new MultiSelectionModel<String>(); display.setSelectionModel(model); model.setSelected("test 1", true); model.setSelected("test 2", true); model.setSelected("test 4", true); assertSelected(model, "test 1", "test 2", "test 4"); // Select a new range 6-7. manager.setRangeSelection(model, display, new Range(6, 2), true, false); assertSelected(model, "test 1", "test 2", "test 4", "test 6", "test 7"); // Select an overlap range 1-3. manager.setRangeSelection(model, display, new Range(1, 3), true, false); assertSelected(model, "test 1", "test 2", "test 3", "test 4", "test 6", "test 7"); // Select an overlap range 2-5 and clear. manager.setRangeSelection(model, display, new Range(2, 4), true, true); assertSelected(model, "test 2", "test 3", "test 4", "test 5"); } public void testSetRangeSelectionDeselect() { MultiSelectionModel<String> model = new MultiSelectionModel<String>(); display.setSelectionModel(model); model.setSelected("test 1", true); model.setSelected("test 2", true); model.setSelected("test 4", true); assertSelected(model, "test 1", "test 2", "test 4"); // Deselect an overlapping range 2-5. manager.setRangeSelection(model, display, new Range(2, 4), false, false); assertSelected(model, "test 1"); } public void testWhitelistEventTranslator() { WhitelistEventTranslator<String> translator = new WhitelistEventTranslator<String>( 1, 3); assertTrue(translator.isColumnWhitelisted(1)); assertFalse(translator.isColumnWhitelisted(2)); assertTrue(translator.isColumnWhitelisted(3)); translator.setColumnWhitelisted(2, true); assertTrue(translator.isColumnWhitelisted(1)); assertTrue(translator.isColumnWhitelisted(2)); assertTrue(translator.isColumnWhitelisted(3)); translator.setColumnWhitelisted(2, false); assertTrue(translator.isColumnWhitelisted(1)); assertFalse(translator.isColumnWhitelisted(2)); assertTrue(translator.isColumnWhitelisted(3)); translator.clearWhitelist(); assertFalse(translator.isColumnWhitelisted(1)); assertFalse(translator.isColumnWhitelisted(2)); assertFalse(translator.isColumnWhitelisted(3)); } /** * Assert that the expected values are selected in the specified * {@link MultiSelectionModel}. * * @param <T> the data type * @param model the {@link MultiSelectionModel} to check * @param expected the expected values */ protected <T> void assertSelected(MultiSelectionModel<T> model, T... expected) { assertEquals(expected.length, model.getSelectedSet().size()); for (T value : expected) { assertTrue(model.isSelected(value)); } } /** * Create a list of data for testing. * * @param start the start index * @param length the length * @return a list of data */ protected List<String> createData(int start, int length) { List<String> toRet = new ArrayList<String>(); for (int i = 0; i < length; i++) { toRet.add("test " + (i + start)); } return toRet; } @Override protected void gwtSetUp() { display = new MockHasData<String>(); display.setRowData(0, createData(0, 10)); manager = DefaultSelectionEventManager.<String> createDefaultManager(); } @Override protected void gwtTearDown() { display = null; } }