| /* | |
| * 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; | |
| } | |
| } |