/*******************************************************************************
* Copyright (c) 2012, 2013 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.layer;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import org.eclipse.nebula.widgets.nattable.grid.GridRegion;
import org.eclipse.nebula.widgets.nattable.layer.cell.ILayerCell;
import org.eclipse.nebula.widgets.nattable.style.DisplayMode;
import org.eclipse.nebula.widgets.nattable.test.fixture.layer.CompositeLayerFixture;
import org.eclipse.nebula.widgets.nattable.test.fixture.layer.DataLayerFixture;
import org.eclipse.nebula.widgets.nattable.test.fixture.layer.ViewportLayerFixture;
import org.eclipse.nebula.widgets.nattable.util.IClientAreaProvider;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.junit.Before;
import org.junit.Test;
/**
* @see org.eclipse.nebula.widgets.nattable.test.fixture.layer.CompositeLayerFixture
* for the layout of columns/rows.
*/
public class CompositeLayerTest {
private CompositeLayerFixture layerFixture;
@Before
public void setup() {
this.layerFixture = new CompositeLayerFixture();
this.layerFixture.bodyLayer.setClientAreaProvider(new IClientAreaProvider() {
@Override
public Rectangle getClientArea() {
return new Rectangle(0, 0, 160, 100);
}
});
}
@Test
public void testingChildLayerInfoForCornerByLayout() {
ILayer childLayer = this.layerFixture.getChildLayerByLayoutCoordinate(0, 0);
assertEquals(this.layerFixture.cornerLayer, childLayer);
assertEquals(0, this.layerFixture.getColumnPositionOffset(0));
assertEquals(0, this.layerFixture.getRowPositionOffset(0));
assertEquals(0, this.layerFixture.getWidthOffset(0));
assertEquals(0, this.layerFixture.getHeightOffset(0));
}
@Test
public void testChildLayerInfoForViewportByLayout() {
ILayer childLayer = this.layerFixture.getChildLayerByLayoutCoordinate(1, 1);
assertEquals(this.layerFixture.bodyLayer, childLayer);
assertEquals(5, this.layerFixture.getColumnPositionOffset(1));
assertEquals(7, this.layerFixture.getRowPositionOffset(1));
assertEquals(this.layerFixture.cornerLayer.getWidth(),
this.layerFixture.getWidthOffset(1));
assertEquals(this.layerFixture.cornerLayer.getHeight(),
this.layerFixture.getHeightOffset(1));
}
@Test
public void childLayerInfoByPixelPosition() throws Exception {
Point layoutCoordinate = this.layerFixture.getLayoutXYByPixelXY(30, 40);
ILayer layer = this.layerFixture.getChildLayerByLayoutCoordinate(
layoutCoordinate.x, layoutCoordinate.y);
assertEquals(this.layerFixture.bodyLayer, layer);
}
@Test
public void getChildLayerByLayoutPosition() throws Exception {
assertIsCorner(this.layerFixture.getChildLayerByLayoutCoordinate(0, 0));
assertIsColHeader(this.layerFixture.getChildLayerByLayoutCoordinate(1, 0));
assertIsRowHeader(this.layerFixture.getChildLayerByLayoutCoordinate(0, 1));
assertIsBody(this.layerFixture.getChildLayerByLayoutCoordinate(1, 1));
}
/*
* Column specific tests
*/
@Test
public void getColumnCount() throws Exception {
assertEquals(10, this.layerFixture.getColumnCount());
}
@Test
public void getColumnIndexByPosition() throws Exception {
assertEquals(0, this.layerFixture.getColumnIndexByPosition(0));
assertEquals(1, this.layerFixture.getColumnIndexByPosition(1));
assertEquals(4, this.layerFixture.getColumnIndexByPosition(4));
assertEquals(0, this.layerFixture.getColumnIndexByPosition(5));
assertEquals(1, this.layerFixture.getColumnIndexByPosition(6));
// Non existent col position
assertEquals(-1, this.layerFixture.getColumnIndexByPosition(12));
}
@Test
public void getWidth() throws Exception {
assertEquals(150, this.layerFixture.getWidth());
// 20 columns total - 100 wide each
this.layerFixture.setChildLayer(GridRegion.CORNER, new DataLayerFixture(10,
10, 100, 20), 0, 0);
this.layerFixture.setChildLayer(GridRegion.COLUMN_HEADER,
new DataLayerFixture(10, 10, 100, 20), 1, 0);
assertEquals(2000, this.layerFixture.getWidth());
}
@Test
public void getColumnWidthByPosition() throws Exception {
assertEquals(5, this.layerFixture.getColumnWidthByPosition(0));
assertEquals(5, this.layerFixture.getColumnWidthByPosition(4));
assertEquals(25, this.layerFixture.getColumnWidthByPosition(5));
assertEquals(25, this.layerFixture.getColumnWidthByPosition(8));
// Non existent
assertEquals(0, this.layerFixture.getColumnWidthByPosition(15));
}
@Test
public void isColumnPositionResizable() throws Exception {
assertTrue(this.layerFixture.isColumnPositionResizable(5));
// Non existent
assertFalse(this.layerFixture.isColumnPositionResizable(15));
this.layerFixture.colHeaderLayer.setColumnPositionResizable(0, false);
assertFalse(this.layerFixture.isColumnPositionResizable(5));
}
@Test
public void getColumnPositionByX() throws Exception {
assertEquals(0, this.layerFixture.getColumnPositionByX(0));
assertEquals(0, this.layerFixture.getColumnPositionByX(4));
assertEquals(1, this.layerFixture.getColumnPositionByX(5));
assertEquals(1, this.layerFixture.getColumnPositionByX(9));
assertEquals(2, this.layerFixture.getColumnPositionByX(10));
// Non existent
assertEquals(-1, this.layerFixture.getColumnPositionByX(200));
}
@Test
public void getStartXOfColumnPosition() throws Exception {
assertEquals(0, this.layerFixture.getStartXOfColumnPosition(0));
assertEquals(5, this.layerFixture.getStartXOfColumnPosition(1));
// Non existent
assertEquals(-1, this.layerFixture.getStartXOfColumnPosition(12));
}
/*
* Row specific tests
*/
@Test
public void getRowCount() throws Exception {
assertEquals(14, this.layerFixture.getRowCount());
}
@Test
public void getRowIndexByPosition() throws Exception {
assertEquals(0, this.layerFixture.getRowIndexByPosition(0));
assertEquals(1, this.layerFixture.getRowIndexByPosition(1));
assertEquals(4, this.layerFixture.getRowIndexByPosition(4));
assertEquals(0, this.layerFixture.getRowIndexByPosition(7));
assertEquals(1, this.layerFixture.getRowIndexByPosition(8));
// Non existent
assertEquals(-1, this.layerFixture.getRowIndexByPosition(20));
}
@Test
public void getHeight() throws Exception {
assertEquals(70, this.layerFixture.getHeight());
// 20 rows, each 20 high
this.layerFixture.setChildLayer(GridRegion.CORNER, new DataLayerFixture(10,
10, 100, 20), 0, 0);
this.layerFixture.setChildLayer(GridRegion.ROW_HEADER, new DataLayerFixture(
10, 10, 100, 20), 0, 1);
assertEquals(400, this.layerFixture.getHeight());
}
@Test
public void getRowHeightByPosition() throws Exception {
assertEquals(5, this.layerFixture.getRowHeightByPosition(0));
assertEquals(5, this.layerFixture.getRowHeightByPosition(4));
assertEquals(5, this.layerFixture.getRowHeightByPosition(5));
assertEquals(5, this.layerFixture.getRowHeightByPosition(8));
// Non existent
assertEquals(0, this.layerFixture.getRowHeightByPosition(20));
}
@Test
public void isRowPositionResizable() throws Exception {
assertTrue(this.layerFixture.isRowPositionResizable(7));
// Non existent
assertFalse(this.layerFixture.isRowPositionResizable(20));
this.layerFixture.rowHeaderLayer.setRowPositionResizable(0, false);
assertFalse(this.layerFixture.isRowPositionResizable(7));
}
@Test
public void getRowPositionByY() throws Exception {
assertEquals(0, this.layerFixture.getRowPositionByY(0));
assertEquals(0, this.layerFixture.getRowPositionByY(4));
assertEquals(1, this.layerFixture.getRowPositionByY(5));
assertEquals(1, this.layerFixture.getRowPositionByY(9));
assertEquals(2, this.layerFixture.getRowPositionByY(10));
// Non existent
assertEquals(-1, this.layerFixture.getRowPositionByY(200));
}
@Test
public void getStartYOfRowPosition() throws Exception {
assertEquals(0, this.layerFixture.getStartYOfRowPosition(0));
assertEquals(5, this.layerFixture.getStartYOfRowPosition(1));
assertEquals(50, this.layerFixture.getStartYOfRowPosition(10));
// Non existent
assertEquals(-1, this.layerFixture.getStartYOfRowPosition(20));
}
@Test
public void getCellBounds() throws Exception {
Rectangle cellBounds = this.layerFixture.getBoundsByPosition(0, 0);
assertEquals(0, cellBounds.x);
assertEquals(0, cellBounds.y);
assertEquals(5, cellBounds.height);
assertEquals(5, cellBounds.width);
cellBounds = this.layerFixture.getBoundsByPosition(6, 6);
assertEquals(50, cellBounds.x);
assertEquals(30, cellBounds.y);
assertEquals(5, cellBounds.height);
assertEquals(25, cellBounds.width);
}
@Test
public void cellBoundsForNonExistentCellPosition() throws Exception {
Rectangle cellBounds = this.layerFixture.getBoundsByPosition(20, 20);
assertNull(cellBounds);
}
@Test
public void getDataValueByPosition() throws Exception {
assertEquals("[0, 0]", this.layerFixture.getDataValueByPosition(0, 0)
.toString());
assertEquals("[0, 1]", this.layerFixture.getDataValueByPosition(0, 8)
.toString());
assertEquals("[3, 0]", this.layerFixture.getDataValueByPosition(8, 0)
.toString());
}
@Test
public void getDataValueForPositionNotInTheViewport() throws Exception {
assertNull(this.layerFixture.getDataValueByPosition(12, 8));
}
@Test
public void getUnderlyingLayersByColumnPosition() throws Exception {
Collection<ILayer> underlyingLayers = this.layerFixture
.getUnderlyingLayersByColumnPosition(5);
assertEquals(2, underlyingLayers.size());
List<String> classNames = new ArrayList<String>();
for (Iterator<ILayer> iterator = underlyingLayers.iterator(); iterator
.hasNext();) {
ILayer iLayer = iterator.next();
classNames.add(iLayer.getClass().getSimpleName());
}
assertTrue(classNames.contains("DataLayerFixture"));
assertTrue(classNames.contains("ViewportLayerFixture"));
}
@Test
public void getCellByPosition() throws Exception {
ILayerCell cell = this.layerFixture.getCellByPosition(3, 2);
assertIsCorner(cell.getLayer());
assertEquals("[3, 2]", cell.getDataValue());
assertEquals(new Rectangle(15, 10, 5, 5), cell.getBounds()); // pixel
// values
assertEquals(DisplayMode.NORMAL, cell.getDisplayMode());
// Get a cell from the body
cell = this.layerFixture.getCellByPosition(8, 8);
assertTrue(cell.getLayer() instanceof CompositeLayer);
assertEquals("[3, 1]", cell.getDataValue());
assertEquals(new Rectangle(310, 75, 100, 70), cell.getBounds());
assertEquals(DisplayMode.NORMAL, cell.getDisplayMode());
assertEquals(8, cell.getOriginColumnPosition());
assertEquals(8, cell.getOriginRowPosition());
}
@Test
public void getBoundsByPosition() throws Exception {
Rectangle rowHeaderCellBounds = this.layerFixture.getBoundsByPosition(1, 10);
assertEquals(new Rectangle(10, 50, 10, 5), rowHeaderCellBounds);
}
/*
* The following methods probe the underlying DataLayerFixture to ensure
* that we got the right one.
*/
private void assertIsBody(ILayer bodyLayer) {
assertTrue(bodyLayer instanceof ViewportLayerFixture);
}
private void assertIsRowHeader(ILayer rowHeaderLayer) {
assertEquals(10, rowHeaderLayer.getColumnWidthByPosition(0));
}
private void assertIsColHeader(ILayer colHeaderLayer) {
assertEquals(25, colHeaderLayer.getColumnWidthByPosition(0));
}
private void assertIsCorner(ILayer cornerLayer) {
assertEquals(5, cornerLayer.getColumnWidthByPosition(0));
}
}