/*
* Copyright 2016 Red Hat, Inc. and/or its affiliates.
*
* 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 org.uberfire.ext.wires.core.grids.client.widget.grid.selections.impl;
import java.util.List;
import com.ait.lienzo.client.core.shape.Group;
import com.ait.lienzo.client.core.shape.Viewport;
import com.ait.lienzo.client.core.types.Point2D;
import com.ait.lienzo.client.core.types.Transform;
import com.ait.lienzo.test.LienzoMockitoTestRunner;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.uberfire.client.callbacks.Callback;
import org.uberfire.ext.wires.core.grids.client.model.Bounds;
import org.uberfire.ext.wires.core.grids.client.model.GridCell;
import org.uberfire.ext.wires.core.grids.client.model.GridColumn;
import org.uberfire.ext.wires.core.grids.client.model.GridData;
import org.uberfire.ext.wires.core.grids.client.model.impl.BaseBounds;
import org.uberfire.ext.wires.core.grids.client.model.impl.BaseGridData;
import org.uberfire.ext.wires.core.grids.client.model.impl.BaseGridRow;
import org.uberfire.ext.wires.core.grids.client.model.impl.BaseGridTest;
import org.uberfire.ext.wires.core.grids.client.widget.context.GridBodyCellRenderContext;
import org.uberfire.ext.wires.core.grids.client.widget.grid.GridWidget;
import org.uberfire.ext.wires.core.grids.client.widget.grid.renderers.grids.GridRenderer;
import org.uberfire.ext.wires.core.grids.client.widget.grid.renderers.grids.impl.BaseGridRendererHelper;
import org.uberfire.ext.wires.core.grids.client.widget.grid.selections.CellSelectionManager;
import org.uberfire.ext.wires.core.grids.client.widget.grid.selections.SelectionExtension;
import org.uberfire.ext.wires.core.grids.client.widget.layer.impl.DefaultGridLayer;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
@RunWith(LienzoMockitoTestRunner.class)
public class BaseCellSelectionManagerTest {
private static final double HEADER_HEIGHT = 32.0;
private static final double ROW_HEIGHT = 20.0;
@Mock
private GridWidget gridWidget;
@Mock
private DefaultGridLayer gridLayer;
@Mock
private GridRenderer gridWidgetRenderer;
@Mock
private Group gridWidgetHeader;
@Mock
private Viewport viewport;
@Mock
private Transform transform;
private GridData gridWidgetData;
private GridColumn<String> col1 = spy(new BaseGridTest.MockMergableGridColumn<>("col1",
100));
private GridColumn<String> col2 = spy(new BaseGridTest.MockMergableGridColumn<>("col2",
100));
private BaseGridRendererHelper gridWidgetRendererHelper;
private Bounds visibleBounds = new BaseBounds(-1000,
-1000,
2000,
2000);
private CellSelectionManager cellSelectionManager;
@Before
public void setup() {
gridWidgetData = new BaseGridData();
gridWidgetData.appendRow(new BaseGridRow(ROW_HEIGHT));
gridWidgetData.appendRow(new BaseGridRow(ROW_HEIGHT));
gridWidgetData.appendColumn(col1);
gridWidgetData.appendColumn(col2);
when(gridWidget.getModel()).thenReturn(gridWidgetData);
cellSelectionManager = new BaseCellSelectionManager(gridWidget);
gridWidgetRendererHelper = new BaseGridRendererHelper(gridWidget);
when(gridWidget.getRenderer()).thenReturn(gridWidgetRenderer);
when(gridWidget.getRendererHelper()).thenReturn(gridWidgetRendererHelper);
when(gridWidget.getLayer()).thenReturn(gridLayer);
when(gridWidget.getWidth()).thenReturn(200.0);
when(gridWidget.getHeader()).thenReturn(gridWidgetHeader);
when(gridWidget.getHeight()).thenReturn(HEADER_HEIGHT + (ROW_HEIGHT * 2));
when(gridWidget.getViewport()).thenReturn(viewport);
when(gridWidget.getX()).thenReturn(0.0);
when(gridWidget.getY()).thenReturn(0.0);
when(gridLayer.getVisibleBounds()).thenReturn(visibleBounds);
when(gridWidgetRenderer.getHeaderHeight()).thenReturn(HEADER_HEIGHT);
when(viewport.getTransform()).thenReturn(transform);
}
@Test
public void selectCellPointCoordinateOutsideGridBounds() {
cellSelectionManager.selectCell(new Point2D(-10,
-10),
false,
false);
final List<GridData.SelectedCell> selectedCells = gridWidgetData.getSelectedCells();
assertTrue(selectedCells.isEmpty());
}
@Test
public void selectCellPointCoordinateWithinGridBounds() {
cellSelectionManager.selectCell(new Point2D(50,
42),
false,
false);
final List<GridData.SelectedCell> selectedCells = gridWidgetData.getSelectedCells();
assertEquals(1,
selectedCells.size());
assertEquals(0,
selectedCells.get(0).getRowIndex());
assertEquals(0,
selectedCells.get(0).getColumnIndex());
}
@Test
public void selectCellPointCoordinateWithinGridBoundsWithShiftKey() {
cellSelectionManager.selectCell(new Point2D(50,
42),
false,
false);
cellSelectionManager.selectCell(new Point2D(150,
62),
true,
false);
final List<GridData.SelectedCell> selectedCells = gridWidgetData.getSelectedCells();
assertEquals(4,
selectedCells.size());
assertTrue(selectedCells.contains(new GridData.SelectedCell(0,
0)));
assertTrue(selectedCells.contains(new GridData.SelectedCell(0,
1)));
assertTrue(selectedCells.contains(new GridData.SelectedCell(0,
1)));
assertTrue(selectedCells.contains(new GridData.SelectedCell(1,
1)));
assertEquals(new GridData.SelectedCell(0,
0),
gridWidgetData.getSelectedCellsOrigin());
}
@Test
public void selectCellPointCoordinateWithinGridBoundsWithControlKey() {
cellSelectionManager.selectCell(new Point2D(50,
42),
false,
false);
cellSelectionManager.selectCell(new Point2D(150,
62),
false,
true);
final List<GridData.SelectedCell> selectedCells = gridWidgetData.getSelectedCells();
assertEquals(2,
selectedCells.size());
assertTrue(selectedCells.contains(new GridData.SelectedCell(0,
0)));
assertTrue(selectedCells.contains(new GridData.SelectedCell(1,
1)));
assertEquals(new GridData.SelectedCell(0,
0),
gridWidgetData.getSelectedCellsOrigin());
}
@Test
public void selectCellRowCoordinateLessThanZero() {
cellSelectionManager.selectCell(-1,
0,
false,
false);
final List<GridData.SelectedCell> selectedCells = gridWidgetData.getSelectedCells();
assertTrue(selectedCells.isEmpty());
}
@Test
public void selectCellRowCoordinateGreaterThanRowCount() {
cellSelectionManager.selectCell(2,
0,
false,
false);
final List<GridData.SelectedCell> selectedCells = gridWidgetData.getSelectedCells();
assertTrue(selectedCells.isEmpty());
}
@Test
public void selectCellColumnCoordinateLessThanZero() {
cellSelectionManager.selectCell(0,
-1,
false,
false);
final List<GridData.SelectedCell> selectedCells = gridWidgetData.getSelectedCells();
assertTrue(selectedCells.isEmpty());
}
@Test
public void selectCellColumnCoordinateGreaterThanColumnCount() {
cellSelectionManager.selectCell(0,
2,
false,
false);
final List<GridData.SelectedCell> selectedCells = gridWidgetData.getSelectedCells();
assertTrue(selectedCells.isEmpty());
}
@Test
public void selectCellWithoutShiftKeyWithoutControlKey() {
cellSelectionManager.selectCell(0,
0,
false,
false);
final List<GridData.SelectedCell> selectedCells = gridWidgetData.getSelectedCells();
assertEquals(1,
selectedCells.size());
assertEquals(0,
selectedCells.get(0).getRowIndex());
assertEquals(0,
selectedCells.get(0).getColumnIndex());
assertEquals(new GridData.SelectedCell(0,
0),
gridWidgetData.getSelectedCellsOrigin());
}
@Test
public void selectCellWithShiftKey() {
cellSelectionManager.selectCell(0,
0,
false,
false);
cellSelectionManager.selectCell(1,
1,
true,
false);
final List<GridData.SelectedCell> selectedCells = gridWidgetData.getSelectedCells();
assertEquals(4,
selectedCells.size());
assertTrue(selectedCells.contains(new GridData.SelectedCell(0,
0)));
assertTrue(selectedCells.contains(new GridData.SelectedCell(0,
1)));
assertTrue(selectedCells.contains(new GridData.SelectedCell(0,
1)));
assertTrue(selectedCells.contains(new GridData.SelectedCell(1,
1)));
assertEquals(new GridData.SelectedCell(0,
0),
gridWidgetData.getSelectedCellsOrigin());
}
@Test
public void selectCellWithControlKey() {
cellSelectionManager.selectCell(0,
0,
false,
false);
cellSelectionManager.selectCell(1,
1,
false,
true);
final List<GridData.SelectedCell> selectedCells = gridWidgetData.getSelectedCells();
assertEquals(2,
selectedCells.size());
assertTrue(selectedCells.contains(new GridData.SelectedCell(0,
0)));
assertTrue(selectedCells.contains(new GridData.SelectedCell(1,
1)));
}
@Test
public void adjustSelectionLeft() {
cellSelectionManager.selectCell(0,
1,
false,
false);
cellSelectionManager.adjustSelection(SelectionExtension.LEFT,
false);
final List<GridData.SelectedCell> selectedCells = gridWidgetData.getSelectedCells();
assertEquals(1,
selectedCells.size());
assertTrue(selectedCells.contains(new GridData.SelectedCell(0,
0)));
assertEquals(new GridData.SelectedCell(0,
0),
gridWidgetData.getSelectedCellsOrigin());
}
@Test
public void adjustSelectionLeftWithShiftKey() {
cellSelectionManager.selectCell(0,
1,
false,
false);
cellSelectionManager.adjustSelection(SelectionExtension.LEFT,
true);
final List<GridData.SelectedCell> selectedCells = gridWidgetData.getSelectedCells();
assertEquals(2,
selectedCells.size());
assertTrue(selectedCells.contains(new GridData.SelectedCell(0,
0)));
assertTrue(selectedCells.contains(new GridData.SelectedCell(0,
1)));
assertEquals(new GridData.SelectedCell(0,
1),
gridWidgetData.getSelectedCellsOrigin());
}
@Test
public void adjustSelectionRight() {
cellSelectionManager.selectCell(0,
0,
false,
false);
cellSelectionManager.adjustSelection(SelectionExtension.RIGHT,
false);
final List<GridData.SelectedCell> selectedCells = gridWidgetData.getSelectedCells();
assertEquals(1,
selectedCells.size());
assertTrue(selectedCells.contains(new GridData.SelectedCell(0,
1)));
assertEquals(new GridData.SelectedCell(0,
1),
gridWidgetData.getSelectedCellsOrigin());
}
@Test
public void adjustSelectionRightWithShiftKey() {
cellSelectionManager.selectCell(0,
0,
false,
false);
cellSelectionManager.adjustSelection(SelectionExtension.RIGHT,
true);
final List<GridData.SelectedCell> selectedCells = gridWidgetData.getSelectedCells();
assertEquals(2,
selectedCells.size());
assertTrue(selectedCells.contains(new GridData.SelectedCell(0,
0)));
assertTrue(selectedCells.contains(new GridData.SelectedCell(0,
1)));
assertEquals(new GridData.SelectedCell(0,
0),
gridWidgetData.getSelectedCellsOrigin());
}
@Test
public void adjustSelectionUp() {
cellSelectionManager.selectCell(1,
0,
false,
false);
cellSelectionManager.adjustSelection(SelectionExtension.UP,
false);
final List<GridData.SelectedCell> selectedCells = gridWidgetData.getSelectedCells();
assertEquals(1,
selectedCells.size());
assertTrue(selectedCells.contains(new GridData.SelectedCell(0,
0)));
assertEquals(new GridData.SelectedCell(0,
0),
gridWidgetData.getSelectedCellsOrigin());
}
@Test
public void adjustSelectionUpWithShiftKey() {
cellSelectionManager.selectCell(1,
0,
false,
false);
cellSelectionManager.adjustSelection(SelectionExtension.UP,
true);
final List<GridData.SelectedCell> selectedCells = gridWidgetData.getSelectedCells();
assertEquals(2,
selectedCells.size());
assertTrue(selectedCells.contains(new GridData.SelectedCell(0,
0)));
assertTrue(selectedCells.contains(new GridData.SelectedCell(1,
0)));
assertEquals(new GridData.SelectedCell(1,
0),
gridWidgetData.getSelectedCellsOrigin());
}
@Test
public void adjustSelectionDown() {
cellSelectionManager.selectCell(0,
0,
false,
false);
cellSelectionManager.adjustSelection(SelectionExtension.DOWN,
false);
final List<GridData.SelectedCell> selectedCells = gridWidgetData.getSelectedCells();
assertEquals(1,
selectedCells.size());
assertTrue(selectedCells.contains(new GridData.SelectedCell(1,
0)));
assertEquals(new GridData.SelectedCell(1,
0),
gridWidgetData.getSelectedCellsOrigin());
}
@Test
public void adjustSelectionDownWithShiftKey() {
cellSelectionManager.selectCell(0,
0,
false,
false);
cellSelectionManager.adjustSelection(SelectionExtension.DOWN,
true);
final List<GridData.SelectedCell> selectedCells = gridWidgetData.getSelectedCells();
assertEquals(2,
selectedCells.size());
assertTrue(selectedCells.contains(new GridData.SelectedCell(0,
0)));
assertTrue(selectedCells.contains(new GridData.SelectedCell(1,
0)));
assertEquals(new GridData.SelectedCell(0,
0),
gridWidgetData.getSelectedCellsOrigin());
}
@Test
public void adjustSelectionRightDownWithShiftKey() {
cellSelectionManager.selectCell(0,
0,
false,
false);
cellSelectionManager.adjustSelection(SelectionExtension.RIGHT,
true);
cellSelectionManager.adjustSelection(SelectionExtension.DOWN,
true);
final List<GridData.SelectedCell> selectedCells = gridWidgetData.getSelectedCells();
assertEquals(4,
selectedCells.size());
assertTrue(selectedCells.contains(new GridData.SelectedCell(0,
0)));
assertTrue(selectedCells.contains(new GridData.SelectedCell(0,
1)));
assertTrue(selectedCells.contains(new GridData.SelectedCell(1,
0)));
assertTrue(selectedCells.contains(new GridData.SelectedCell(1,
1)));
assertEquals(new GridData.SelectedCell(0,
0),
gridWidgetData.getSelectedCellsOrigin());
}
@Test
@SuppressWarnings("unchecked")
public void startEditingCellPointCoordinateOutsideGridBounds() {
cellSelectionManager.startEditingCell(new Point2D(-10,
-10));
verify(col1,
never()).edit(any(GridCell.class),
any(GridBodyCellRenderContext.class),
any(Callback.class));
verify(col2,
never()).edit(any(GridCell.class),
any(GridBodyCellRenderContext.class),
any(Callback.class));
}
@Test
@SuppressWarnings("unchecked")
public void startEditingCellPointCoordinateWithinGridBounds() {
final ArgumentCaptor<GridBodyCellRenderContext> contextArgumentCaptor = ArgumentCaptor.forClass(GridBodyCellRenderContext.class);
cellSelectionManager.startEditingCell(new Point2D(150,
42));
verify(col2,
times(1)).edit(any(GridCell.class),
contextArgumentCaptor.capture(),
any(Callback.class));
final GridBodyCellRenderContext context = contextArgumentCaptor.getValue();
assertEquals(0,
context.getRowIndex());
assertEquals(1,
context.getColumnIndex());
}
@Test
@SuppressWarnings("unchecked")
public void startEditingCellCoordinateOutsideGridBounds() {
cellSelectionManager.startEditingCell(-1,
-1);
verify(col1,
never()).edit(any(GridCell.class),
any(GridBodyCellRenderContext.class),
any(Callback.class));
verify(col2,
never()).edit(any(GridCell.class),
any(GridBodyCellRenderContext.class),
any(Callback.class));
}
@Test
@SuppressWarnings("unchecked")
public void startEditingCoordinateWithinGridBounds() {
final ArgumentCaptor<GridBodyCellRenderContext> contextArgumentCaptor = ArgumentCaptor.forClass(GridBodyCellRenderContext.class);
cellSelectionManager.startEditingCell(0,
1);
verify(col2,
times(1)).edit(any(GridCell.class),
contextArgumentCaptor.capture(),
any(Callback.class));
final GridBodyCellRenderContext context = contextArgumentCaptor.getValue();
assertEquals(0,
context.getRowIndex());
assertEquals(1,
context.getColumnIndex());
}
}