blob: c8b8d89d6fc0f06db6a28559eac5271e61ca1c38 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012, 2020 Original authors and others.
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Original authors and others - initial API and implementation
* Dirk Fauth <dirk.fauth@googlemail.com> - Bug 455949
******************************************************************************/
package org.eclipse.nebula.widgets.nattable.tickupdate.command;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import java.util.Arrays;
import org.eclipse.nebula.widgets.nattable.config.ConfigRegistry;
import org.eclipse.nebula.widgets.nattable.config.IEditableRule;
import org.eclipse.nebula.widgets.nattable.edit.EditConfigAttributes;
import org.eclipse.nebula.widgets.nattable.edit.editor.ComboBoxCellEditor;
import org.eclipse.nebula.widgets.nattable.edit.editor.TextCellEditor;
import org.eclipse.nebula.widgets.nattable.grid.cell.AlternatingRowConfigLabelAccumulator;
import org.eclipse.nebula.widgets.nattable.layer.DataLayer;
import org.eclipse.nebula.widgets.nattable.layer.ILayerListener;
import org.eclipse.nebula.widgets.nattable.layer.cell.AggregateConfigLabelAccumulator;
import org.eclipse.nebula.widgets.nattable.layer.cell.ColumnOverrideLabelAccumulator;
import org.eclipse.nebula.widgets.nattable.layer.event.CellVisualChangeEvent;
import org.eclipse.nebula.widgets.nattable.layer.event.ILayerEvent;
import org.eclipse.nebula.widgets.nattable.selection.SelectionLayer;
import org.eclipse.nebula.widgets.nattable.style.DisplayMode;
import org.eclipse.nebula.widgets.nattable.test.fixture.TickUpdateHandlerFixture;
import org.eclipse.nebula.widgets.nattable.test.fixture.layer.DataLayerFixture;
import org.eclipse.nebula.widgets.nattable.tickupdate.TickUpdateConfigAttributes;
import org.junit.Before;
import org.junit.Test;
public class TickUpdateCommandHandlerTest {
private SelectionLayer selectionLayer;
private ConfigRegistry testConfigRegistry;
private TickUpdateCommandHandler commandHandler;
private ColumnOverrideLabelAccumulator columnLabelAccumulator;
@Before
public void setup() {
DataLayerFixture bodyDataLayer = new DataLayerFixture();
this.selectionLayer = new SelectionLayer(bodyDataLayer);
this.selectionLayer.setSelectedCell(1, 1);
this.testConfigRegistry = new ConfigRegistry();
this.testConfigRegistry.registerConfigAttribute(
TickUpdateConfigAttributes.UPDATE_HANDLER,
new TickUpdateHandlerFixture());
this.testConfigRegistry.registerConfigAttribute(
EditConfigAttributes.CELL_EDITABLE_RULE,
IEditableRule.ALWAYS_EDITABLE);
registerCellStyleAccumulators(bodyDataLayer);
this.commandHandler = new TickUpdateCommandHandler(this.selectionLayer);
}
private void registerCellStyleAccumulators(DataLayer bodyDataLayer) {
AggregateConfigLabelAccumulator aggregrateConfigLabelAccumulator = new AggregateConfigLabelAccumulator();
this.columnLabelAccumulator = new ColumnOverrideLabelAccumulator(new DataLayerFixture());
aggregrateConfigLabelAccumulator.add(this.columnLabelAccumulator, new AlternatingRowConfigLabelAccumulator());
bodyDataLayer.setConfigLabelAccumulator(aggregrateConfigLabelAccumulator);
}
@Test
public void shouldIncrementCellValue() throws Exception {
assertEquals("[1, 1]", this.selectionLayer.getDataValueByPosition(1, 1));
this.commandHandler.doCommand(new TickUpdateCommand(this.testConfigRegistry, true));
assertEquals("[1, 1]up", this.selectionLayer.getDataValueByPosition(1, 1));
}
@Test
public void shouldDecrementCellValue() throws Exception {
assertEquals("[1, 1]", this.selectionLayer.getDataValueByPosition(1, 1));
this.commandHandler.doCommand(new TickUpdateCommand(this.testConfigRegistry, false));
assertEquals("[1, 1]down", this.selectionLayer.getDataValueByPosition(1, 1));
}
@Test
public void shouldNotUpdateAnUneditableCell() throws Exception {
this.testConfigRegistry.registerConfigAttribute(
EditConfigAttributes.CELL_EDITABLE_RULE,
IEditableRule.NEVER_EDITABLE);
assertEquals("[1, 1]", this.selectionLayer.getDataValueByPosition(1, 1));
// Increment
this.commandHandler.doCommand(new TickUpdateCommand(this.testConfigRegistry, true));
assertEquals("[1, 1]", this.selectionLayer.getDataValueByPosition(1, 1));
// Decrement
this.commandHandler.doCommand(new TickUpdateCommand(this.testConfigRegistry, false));
assertEquals("[1, 1]", this.selectionLayer.getDataValueByPosition(1, 1));
}
@Test
public void shouldUpdateMultipleCellsInSelection() throws Exception {
this.selectionLayer.selectCell(1, 2, false, true);
this.selectionLayer.selectCell(1, 5, false, true);
assertEquals("[1, 1]", this.selectionLayer.getDataValueByPosition(1, 1));
assertEquals("[1, 2]", this.selectionLayer.getDataValueByPosition(1, 2));
assertEquals("[1, 5]", this.selectionLayer.getDataValueByPosition(1, 5));
// Increment
this.commandHandler.doCommand(new TickUpdateCommand(this.testConfigRegistry, true));
assertEquals("[1, 1]up", this.selectionLayer.getDataValueByPosition(1, 1));
assertEquals("[1, 2]up", this.selectionLayer.getDataValueByPosition(1, 2));
assertEquals("[1, 3]", this.selectionLayer.getDataValueByPosition(1, 3));
assertEquals("[1, 5]up", this.selectionLayer.getDataValueByPosition(1, 5));
}
@Test
public void shouldUpdateOnlyIfAllCellsHaveTheSameEditor() throws Exception {
this.columnLabelAccumulator.registerColumnOverrides(1, "COMBO_BOX_EDITOR_LABEL");
this.columnLabelAccumulator.registerColumnOverrides(2, "TEXT_BOX_EDITOR_LABEL");
this.testConfigRegistry.registerConfigAttribute(
EditConfigAttributes.CELL_EDITOR,
new ComboBoxCellEditor(Arrays.asList("")),
DisplayMode.EDIT,
"COMBO_BOX_EDITOR_LABEL");
this.testConfigRegistry.registerConfigAttribute(
EditConfigAttributes.CELL_EDITOR,
new TextCellEditor(),
DisplayMode.EDIT,
"TEXT_BOX_EDITOR_LABEL");
assertEquals("[1, 1]", this.selectionLayer.getDataValueByPosition(1, 1));
assertEquals("[2, 1]", this.selectionLayer.getDataValueByPosition(2, 1));
// Select cells in column 1 and 2
this.selectionLayer.selectCell(1, 1, false, false);
this.selectionLayer.selectCell(2, 1, false, true); // Select with Ctrl
// key
// Increment
this.commandHandler.doCommand(new TickUpdateCommand(this.testConfigRegistry, true));
// Should not increment - editors different
assertEquals("[1, 1]", this.selectionLayer.getDataValueByPosition(1, 1));
assertEquals("[2, 1]", this.selectionLayer.getDataValueByPosition(2, 1));
// Select cells in column 1 Only
this.selectionLayer.selectCell(1, 1, false, false);
this.selectionLayer.selectCell(1, 2, false, true); // Select with Ctrl
// key
// Increment
this.commandHandler.doCommand(new TickUpdateCommand(this.testConfigRegistry, true));
// Should increment - same editor
assertEquals("[1, 1]up", this.selectionLayer.getDataValueByPosition(1, 1));
assertEquals("[1, 2]up", this.selectionLayer.getDataValueByPosition(1, 2));
}
@Test
public void shouldNotThrowExceptionOnNoSelection() {
// if no exception occurs this test succeeds
// we also check that no update has been triggered
this.selectionLayer.clear();
this.selectionLayer.addLayerListener(new ILayerListener() {
@Override
public void handleLayerEvent(ILayerEvent event) {
if (event instanceof CellVisualChangeEvent) {
fail("update triggered");
}
}
});
this.commandHandler.doCommand(new TickUpdateCommand(this.testConfigRegistry, true));
}
}