blob: fcffd261203a587b7f40413d7a23928d8fc86b58 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012 Original authors and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Original authors and others - initial API and implementation
******************************************************************************/
package org.eclipse.nebula.widgets.nattable.selection;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.util.Arrays;
import java.util.List;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.eclipse.nebula.widgets.nattable.coordinate.Range;
import org.eclipse.nebula.widgets.nattable.coordinate.RangeList;
import org.eclipse.nebula.widgets.nattable.coordinate.Rectangle;
import org.eclipse.nebula.widgets.nattable.test.fixture.layer.DataLayerFixture;
import org.eclipse.nebula.widgets.nattable.util.ObjectUtils;
public class SelectionModelTest {
private SelectionModel model;
@Before
public void before() {
SelectionLayer selectionLayer = new SelectionLayer(new DataLayerFixture(100, 100, 100, 40));
model = new SelectionModel(selectionLayer);
}
@Test
public void isCellSelected() {
assertFalse("Empty model should have no selection.", model.isCellPositionSelected(0, 0));
}
@Test
public void addCellSelection() {
model.addSelection(0,0);
assertTrue("Failed to add selection.", model.isCellPositionSelected(0, 0));
}
@Test
public void isColumnFullySelected() throws Exception {
model.addSelection(new Rectangle(3, 0, 10, 100));
assertTrue(model.isColumnPositionFullySelected(3));
model.clearSelection(3, 1);
assertFalse(model.isColumnPositionFullySelected(3));
}
@Test
public void isColumnFullySelectedForContiguousRectangles() throws Exception {
model.addSelection(new Rectangle(0, 0, 10, 10));
model.addSelection(new Rectangle(5, 10, 10, 90));
assertTrue(model.isColumnPositionFullySelected(5));
}
@Test
public void isColumnFullySelectedForNonContiguousRectangles() throws Exception {
model.addSelection(new Rectangle(0, 0, 10, 10));
model.addSelection(new Rectangle(5, 5, 10, 8));
model.addSelection(new Rectangle(5, 15, 10, 90));
assertFalse(model.isColumnPositionFullySelected(5));
}
@Test
public void isColumnFullySelectedForOverlapingRectangles() throws Exception {
model.addSelection(new Rectangle(0, 0, 10, 10));
model.addSelection(new Rectangle(5, 5, 10, 95));
assertTrue(model.isColumnPositionFullySelected(5));
}
@Test
public void isColumnFullySelectedWhenIndividualCellsSelected() throws Exception {
model.addSelection(new Rectangle(1, 5, 1, 1));
model.addSelection(new Rectangle(1, 10, 1, 1));
assertFalse(model.isColumnPositionFullySelected(1));
}
@Test
public void isColumnFullySelectedWhenLastCellSelected() throws Exception {
model.addSelection(new Rectangle(1, 5, 1, 1));
assertFalse(model.isColumnPositionFullySelected(1));
}
@Test
public void isRowFullySelected() throws Exception {
model.addSelection(new Rectangle(0, 3, 100, 10));
assertTrue(model.isRowPositionFullySelected(3));
}
@Test
public void isRowFullySelectedWhenMultipleRowsAndColumnsAreSelected() throws Exception {
//Rows 3, 6 fully selected
model.addSelection(new Rectangle(0, 3, 100, 1));
model.addSelection(new Rectangle(0, 6, 100, 1));
//Column 2, 5 fully selected
model.addSelection(new Rectangle(2, 0, 1, 100));
model.addSelection(new Rectangle(5, 0, 1, 100));
assertTrue(model.isRowPositionFullySelected(6));
assertTrue(model.isRowPositionFullySelected(3));
// Remove Column 2
model.clearSelection(new Rectangle(2, 0, 1, 100));
assertFalse(model.isRowPositionFullySelected(6));
assertFalse(model.isRowPositionFullySelected(3));
//Add column 2 again
model.addSelection(new Rectangle(2, 0, 1, 100));
assertTrue(model.isRowPositionFullySelected(6));
assertTrue(model.isRowPositionFullySelected(3));
}
@Test
public void isRowNotFullySelected() throws Exception {
model.addSelection(new Rectangle(0, 3, 10, 10));
assertFalse(model.isRowPositionFullySelected(3));
}
@Test
public void contains() throws Exception {
assertTrue(new Rectangle(0, 0, 10, 10).contains(new Rectangle(1, 1, 5, 5)));
assertTrue(new Rectangle(0, 0, 10, 1).contains(new Rectangle(5, 0, 1, 1)));
assertFalse(new Rectangle(0, 6, 0, 0).contains(new Rectangle(2, 6, 1, 1)));
}
@Test
public void isMltipleCol() throws Exception {
model.addSelection(new Rectangle(1, 0, 1, 100));
model.addSelection(new Rectangle(2, 0, 1, 100));
model.addSelection(new Rectangle(3, 0, 1, 100));
assertTrue(model.isColumnPositionFullySelected(1));
assertTrue(model.isColumnPositionFullySelected(2));
assertFalse(model.isColumnPositionFullySelected(4));
}
@Test
public void shouldReturnListOfFullySelectedColumns() throws Exception {
RangeList fullySelectedColumns = model.getFullySelectedColumnPositions();
Assert.assertEquals(0, fullySelectedColumns.size());
model.addSelection(new Rectangle(1, 0, 1, 100));
model.addSelection(new Rectangle(2, 10, 1, 4));
model.addSelection(new Rectangle(3, 0, 1, 100));
fullySelectedColumns = model.getFullySelectedColumnPositions();
Assert.assertEquals(2, fullySelectedColumns.size());
Assert.assertEquals(new Range(1), fullySelectedColumns.get(0));
Assert.assertEquals(new Range(3), fullySelectedColumns.get(1));
}
@Test
public void shouldReturnListOfFullySelectedRows() throws Exception {
RangeList fullySelectedRows = model.getFullySelectedRowPositions();
Assert.assertEquals(0, fullySelectedRows.size());
model.addSelection(new Rectangle(0, 1, 100, 1));
model.addSelection(new Rectangle(3, 2, 4, 1));
model.addSelection(new Rectangle(0, 3, 100, 1));
fullySelectedRows = model.getFullySelectedRowPositions();
Assert.assertEquals(2, fullySelectedRows.size());
Assert.assertEquals(new Range(1), fullySelectedRows.get(0));
Assert.assertEquals(new Range(3), fullySelectedRows.get(1));
}
@Test
public void addMultipleAdjacentCellSelection() {
for (int row = 0; row < 3; row++) {
for (int col = 0; col < 3; col++) {
model.addSelection(col, row);
}
}
for (int row = 0; row < 3; row++) {
for (int col = 0; col < 3; col++) {
assertTrue("Failed to add selection [" + row + ", " + col + "]", model.isCellPositionSelected(col, row));
}
}
}
@Test
public void addMultipleDisjointCellSelection() {
model.addSelection(0, 0);
model.addSelection(2, 0);
model.addSelection(0, 2);
assertTrue("Failed to add selection [0, 0]", model.isCellPositionSelected(0, 0));
assertTrue("Failed to add selection [0, 2]", model.isCellPositionSelected(2, 0));
assertTrue("Failed to add selection [2, 0]", model.isCellPositionSelected(0, 2));
assertFalse("Added too many cells to the range", model.isCellPositionSelected(1, 0));
assertFalse("Added too many cells to the range", model.isCellPositionSelected(0, 1));
assertFalse("Added too many cells to the range", model.isCellPositionSelected(1, 1));
assertFalse("Added too many cells to the range", model.isCellPositionSelected(2, 1));
assertFalse("Added too many cells to the range", model.isCellPositionSelected(1, 2));
assertFalse("Added too many cells to the range", model.isCellPositionSelected(2, 2));
assertFalse("Added too many cells to the range", model.isCellPositionSelected(3, 3));
}
@Test
public void clearSelection() {
model.addSelection(0, 0);
model.clearSelection();
assertFalse("Failed to clear selection", model.isCellPositionSelected(0, 0));
}
@Test
public void addRangeSelection() {
int col = 2;
int row = 3;
int numCols = 4;
int numRows = 5;
model.addSelection(new Rectangle(col, row, numCols, numRows));
for (int rowIndex = row; rowIndex < row + numRows; rowIndex++) {
for (int colIndex = col; colIndex < col + numCols; colIndex++) {
assertTrue("Failed to add range [" + rowIndex + ", " + colIndex + "]", model.isCellPositionSelected(colIndex, rowIndex));
}
}
assertFalse("Added too many cells from range", model.isCellPositionSelected(col, row + numRows));
}
@Test
public void addNullRangeSelection() {
model.addSelection(null);
assertTrue(model.isEmpty());
}
@Test
public void removeSingleCell() {
model.addSelection(0, 0);
model.clearSelection(0, 0);
assertFalse("Failed to remove selection [0, 0].", model.isCellPositionSelected(0, 0));
}
@Test
public void removeSingleCellAfterMultipleAdds() {
model.addSelection(0, 0);
model.addSelection(1, 1);
model.addSelection(2, 1);
model.addSelection(2, 3);
model.clearSelection(1, 1);
assertFalse("Failed to remove selection [1, 1].", model.isCellPositionSelected(1, 1));
}
private void removeSingleCellFromRange(int col, int row, int numCols, int numRows, int removedRow, int removedColumn) {
model.addSelection(new Rectangle(col, row, numCols, numRows));
model.clearSelection(removedColumn, removedRow);
assertFalse("Failed to remove selection [" + removedRow + ", " + removedColumn + "]", model.isCellPositionSelected(removedColumn, removedRow));
for (int rowIndex = row; rowIndex < row + numRows; rowIndex++) {
for (int colIndex = col; colIndex < col + numCols; colIndex++) {
if (!(rowIndex == removedRow && colIndex == removedColumn))
assertTrue("Failed to add range [" + rowIndex + ", " + colIndex + "]", model.isCellPositionSelected(colIndex, rowIndex));
}
}
}
private void removeRangeFromRange(int col, int row, int numCols,
int numRows, int removedRow, int removedColumn, int removedNumCols,
int removedNumRows) {
model.addSelection(new Rectangle(col, row, numCols, numRows));
Rectangle removedSelection = new Rectangle(removedColumn, removedRow, removedNumCols, removedNumRows);
model.clearSelection(removedSelection);
for (int rowIndex = removedRow; rowIndex < removedRow + removedNumRows; rowIndex++) {
for (int colIndex = removedColumn; colIndex < removedColumn + removedNumCols; colIndex++) {
assertFalse("Failed to remove selection [" + rowIndex + ", " + colIndex + "]", model.isCellPositionSelected(colIndex, rowIndex));
}
}
for (int rowIndex = row; rowIndex < row + numRows; rowIndex++) {
for (int colIndex = col; colIndex < col + numCols; colIndex++) {
if (!removedSelection.contains(colIndex, rowIndex))
assertTrue("Failed to add range [" + rowIndex + ", " + colIndex + "]", model.isCellPositionSelected(colIndex, rowIndex));
}
}
}
@Test
public void removeSingleCellFrom1x1Range() {
int col = 2;
int row = 3;
int numCols = 1;
int numRows = 1;
int removedColumn = 2;
int removedRow = 3;
removeSingleCellFromRange(col, row, numCols, numRows, removedRow, removedColumn);
}
@Test
public void removeSingleCellFromBeginning1x10Range() {
int col = 2;
int row = 3;
int numCols = 10;
int numRows = 1;
int removedColumn = 2;
int removedRow = 3;
removeSingleCellFromRange(col, row, numCols, numRows, removedRow, removedColumn);
}
@Test
public void removeSingleCellFromEnd1x10Range() {
int col = 2;
int row = 3;
int numCols = 10;
int numRows = 1;
int removedColumn = 11;
int removedRow = 3;
removeSingleCellFromRange(col, row, numCols, numRows, removedRow, removedColumn);
}
@Test
public void removeSingleCellFromMiddle1x10Range() {
int col = 2;
int row = 3;
int numCols = 10;
int numRows = 1;
int removedColumn = 8;
int removedRow = 3;
removeSingleCellFromRange(col, row, numCols, numRows, removedRow, removedColumn);
}
@Test
public void removeSingleCellFromBeginning10x1Range() {
int col = 2;
int row = 3;
int numCols = 1;
int numRows = 10;
int removedColumn = 2;
int removedRow = 3;
removeSingleCellFromRange(col, row, numCols, numRows, removedRow, removedColumn);
}
@Test
public void removeSingleCellFromEnd10x1Range() {
int col = 2;
int row = 3;
int numCols = 1;
int numRows = 10;
int removedColumn = 2;
int removedRow = 12;
removeSingleCellFromRange(col, row, numCols, numRows, removedRow, removedColumn);
}
@Test
public void removeSingleCellFromMiddle10x1Range() {
int col = 2;
int row = 3;
int numCols = 1;
int numRows = 10;
int removedColumn = 2;
int removedRow = 7;
removeSingleCellFromRange(col, row, numCols, numRows, removedRow, removedColumn);
}
@Test
public void removeTopLeftFrom3x4Range() {
int col = 2;
int row = 3;
int numCols = 3;
int numRows = 4;
int removedColumn = 2;
int removedRow = 3;
removeSingleCellFromRange(col, row, numCols, numRows, removedRow, removedColumn);
}
@Test
public void removeTopRightFrom3x4Range() {
int col = 2;
int row = 3;
int numCols = 3;
int numRows = 4;
int removedColumn = 4;
int removedRow = 3;
removeSingleCellFromRange(col, row, numCols, numRows, removedRow, removedColumn);
}
@Test
public void removeTopMiddleFrom3x4Range() {
int col = 2;
int row = 3;
int numCols = 3;
int numRows = 4;
int removedColumn = 3;
int removedRow = 3;
removeSingleCellFromRange(col, row, numCols, numRows, removedRow, removedColumn);
}
@Test
public void removeBottomLeftFrom3x4Range() {
int col = 2;
int row = 3;
int numCols = 3;
int numRows = 4;
int removedColumn = 2;
int removedRow = 6;
removeSingleCellFromRange(col, row, numCols, numRows, removedRow, removedColumn);
}
@Test
public void removeBottomRightFrom3x4Range() {
int col = 2;
int row = 3;
int numCols = 3;
int numRows = 4;
int removedColumn = 4;
int removedRow = 6;
removeSingleCellFromRange(col, row, numCols, numRows, removedRow, removedColumn);
}
@Test
public void removeBottomMiddleFrom3x4Range() {
int col = 2;
int row = 3;
int numCols = 3;
int numRows = 4;
int removedColumn = 3;
int removedRow = 6;
removeSingleCellFromRange(col, row, numCols, numRows, removedRow, removedColumn);
}
@Test
public void removeMidLeftFrom3x4Range() {
int col = 2;
int row = 3;
int numCols = 3;
int numRows = 4;
int removedColumn = 2;
int removedRow = 5;
removeSingleCellFromRange(col, row, numCols, numRows, removedRow, removedColumn);
}
@Test
public void removeMidRightFrom3x4Range() {
int col = 2;
int row = 3;
int numCols = 3;
int numRows = 4;
int removedColumn = 4;
int removedRow = 5;
removeSingleCellFromRange(col, row, numCols, numRows, removedRow, removedColumn);
}
@Test
public void removeMidMiddleFrom3x4Range() {
int col = 2;
int row = 3;
int numCols = 3;
int numRows = 4;
int removedColumn = 3;
int removedRow = 5;
removeSingleCellFromRange(col, row, numCols, numRows, removedRow, removedColumn);
}
@Test
public void getSelectedRows() {
model.addSelection(10, 1);
model.addSelection(10, 2);
model.addSelection(10, 7);
model.addSelection(new Rectangle(10, 50, 5, 10));
List<Range> selectedRows = ObjectUtils.asList(model.getSelectedRowPositions());
assertTrue(selectedRows.contains(new Range(1, 3)));
assertTrue(selectedRows.contains(new Range(7, 8)));
assertTrue(selectedRows.contains(new Range(50, 60)));
}
@Test
public void getSelectedRowsForOverlapingSelections() {
model.addSelection(new Rectangle(10, 3, 5, 2));
model.addSelection(new Rectangle(10, 4, 5, 10));
model.addSelection(new Rectangle(10, 20, 5, 10));
List<Range> selectedRows = ObjectUtils.asList(model.getSelectedRowPositions());
assertEquals(2, selectedRows.size());
assertTrue(selectedRows.contains(new Range(3, 14)));
assertTrue(selectedRows.contains(new Range(20, 30)));
}
@Test
public void getSelectedRowsForLargeNumberOfSelections() {
model.addSelection(1, 10);
model.addSelection(new Rectangle(5, 1, 1, 100));
List<Range> selectedRows = ObjectUtils.asList(model.getSelectedRowPositions());
assertEquals(1, selectedRows.size());
assertTrue(selectedRows.contains(new Range(1, 100)));
}
@Test
public void getSelectedRowCount() throws Exception {
model.addSelection(new Rectangle(10, 3, 1, 1));
model.addSelection(new Rectangle(10, 10, 1, 1));
model.addSelection(new Rectangle(10, 5, 1, 20));
assertEquals(21, model.getSelectedRowCount());
}
@Test
public void isRowPositionSelected() throws Exception {
model.addSelection(1, 10);
model.addSelection(new Rectangle(5, 1, 100, 10000000));
assertTrue(model.isRowPositionSelected(10));
assertTrue(model.isRowPositionSelected(99));
}
@Test
public void getSelectedColumns() {
int [] columns = new int [] {
1,4,3
};
for (int column : columns) {
model.addSelection(column, column % 3);
}
RangeList selectedColumns = model.getSelectedColumnPositions();
Arrays.sort(columns);
assertEquals(Arrays.toString(columns), RangeList.listValues(selectedColumns).toString());
}
@Test
public void removeFromEmptySelection() {
Rectangle removedSelection = new Rectangle(0, 0, 10, 10);
model.clearSelection(removedSelection);
assertTrue("Removal from empty selection failed.", model.isEmpty());
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
assertFalse("Selection was not removed [" + i + ", " + j + "]", model.isCellPositionSelected(j, i));
}
}
}
@Test
public void removeTopRange() {
int col = 2;
int row = 3;
int numCols = 3;
int numRows = 4;
int removedColumn = 2;
int removedRow = 2;
int removedNumCols = 3;
int removedNumRows = 3;
removeRangeFromRange(col, row, numCols, numRows, removedRow, removedColumn, removedNumCols, removedNumRows);
}
@Test
public void removeMidRange() {
int col = 2;
int row = 3;
int numCols = 3;
int numRows = 10;
int removedColumn = 2;
int removedRow = 7;
int removedNumCols = 3;
int removedNumRows = 3;
removeRangeFromRange(col, row, numCols, numRows, removedRow, removedColumn, removedNumCols, removedNumRows);
}
@Test
public void removeBottomRange() {
int col = 2;
int row = 3;
int numCols = 3;
int numRows = 10;
int removedColumn = 2;
int removedRow = 7;
int removedNumCols = 3;
int removedNumRows = 7;
removeRangeFromRange(col, row, numCols, numRows, removedRow, removedColumn, removedNumCols, removedNumRows);
}
@Test
public void removeLeftRange() {
int col = 2;
int row = 3;
int numCols = 6;
int numRows = 4;
int removedColumn = 1;
int removedRow = 3;
int removedNumCols = 3;
int removedNumRows = 4;
removeRangeFromRange(col, row, numCols, numRows, removedRow, removedColumn, removedNumCols, removedNumRows);
}
@Test
public void removeMiddleRange() {
int col = 2;
int row = 3;
int numCols = 6;
int numRows = 4;
int removedColumn = 4;
int removedRow = 3;
int removedNumCols = 2;
int removedNumRows = 4;
removeRangeFromRange(col, row, numCols, numRows, removedRow, removedColumn, removedNumCols, removedNumRows);
}
@Test
public void removeRightRange() {
int col = 2;
int row = 3;
int numCols = 6;
int numRows = 4;
int removedColumn = 5;
int removedRow = 3;
int removedNumCols = 5;
int removedNumRows = 4;
removeRangeFromRange(col, row, numCols, numRows, removedRow, removedColumn, removedNumCols, removedNumRows);
}
@Test
public void removeTopFromTwoRows() {
int col = 0;
int row = 0;
int numCols = 10;
int numRows = 2;
int removedColumn = col;
int removedRow = row;
int removedNumCols = numCols;
int removedNumRows = 1;
removeRangeFromRange(col, row, numCols, numRows, removedRow, removedColumn, removedNumCols, removedNumRows);
}
}