/******************************************************************************* * Copyright (c) 2012, 2017 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.search.strategy; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import org.eclipse.nebula.widgets.nattable.config.ConfigRegistry; import org.eclipse.nebula.widgets.nattable.config.DefaultNatTableStyleConfiguration; import org.eclipse.nebula.widgets.nattable.coordinate.PositionCoordinate; import org.eclipse.nebula.widgets.nattable.data.IDataProvider; import org.eclipse.nebula.widgets.nattable.grid.command.ClientAreaResizeCommand; import org.eclipse.nebula.widgets.nattable.grid.layer.DefaultGridLayer; import org.eclipse.nebula.widgets.nattable.search.CellValueAsStringComparator; import org.eclipse.nebula.widgets.nattable.search.ISearchDirection; import org.eclipse.nebula.widgets.nattable.selection.SelectionLayer; import org.eclipse.nebula.widgets.nattable.selection.command.SelectCellCommand; import org.eclipse.nebula.widgets.nattable.test.fixture.layer.GridLayerFixture; import org.eclipse.nebula.widgets.nattable.util.IClientAreaProvider; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.junit.Before; import org.junit.Test; public class GridSearchStrategyTest { // Has 10 columns and 5 rows private DefaultGridLayer gridLayer; private SelectionLayer selectionLayer; private ConfigRegistry configRegistry; @Before public void setUp() { this.gridLayer = new DefaultGridLayer(getBodyDataProvider(), GridLayerFixture.colHeaderDataProvider); this.selectionLayer = this.gridLayer.getBodyLayer().getSelectionLayer(); this.gridLayer.setClientAreaProvider(new IClientAreaProvider() { @Override public Rectangle getClientArea() { return new Rectangle(0, 0, 1050, 250); } }); this.gridLayer.doCommand( new ClientAreaResizeCommand( new Shell(Display.getDefault(), SWT.V_SCROLL | SWT.H_SCROLL))); this.configRegistry = new ConfigRegistry(); new DefaultNatTableStyleConfiguration().configureRegistry(this.configRegistry); } public IDataProvider getBodyDataProvider() { return new IDataProvider() { final IDataProvider bodyDataProvider = GridLayerFixture.bodyDataProvider; @Override public int getColumnCount() { return this.bodyDataProvider.getColumnCount(); } @Override public Object getDataValue(int columnIndex, int rowIndex) { Object dataValue = null; if (columnIndex == 2 && rowIndex == 2) { dataValue = "body"; } else if (columnIndex == 4 && rowIndex == 4) { dataValue = "Body"; } else if (columnIndex == 3 && rowIndex == 3) { dataValue = "Body"; } else if (columnIndex == 0 && rowIndex == 0) { dataValue = "Body"; } else { dataValue = this.bodyDataProvider.getDataValue(columnIndex, rowIndex); } return dataValue; } @Override public int getRowCount() { return this.bodyDataProvider.getRowCount(); } @Override public void setDataValue(int columnIndex, int rowIndex, Object newValue) { this.bodyDataProvider.setDataValue(columnIndex, rowIndex, newValue); } }; } @Test public void searchShouldWrapAroundColumn() { // Select search starting point in composite coordinates this.gridLayer.doCommand(new SelectCellCommand(this.gridLayer, 3, 4, false, false)); GridSearchStrategy gridStrategy = new GridSearchStrategy(this.configRegistry, false, true); // If we don't specify to wrap the search, it will not find it. gridStrategy.setContextLayer(this.selectionLayer); gridStrategy.setCaseSensitive(true); gridStrategy.setComparator(new CellValueAsStringComparator<>()); PositionCoordinate searchResult = gridStrategy.executeSearch("body"); assertNull(searchResult); // Should find it when wrap search is enabled. gridStrategy.setWrapSearch(true); searchResult = gridStrategy.executeSearch("body"); assertNotNull(searchResult); assertEquals(2, searchResult.columnPosition); assertEquals(2, searchResult.rowPosition); } @Test public void searchShouldWrapAroundRow() { // Select search starting point in composite coordinates this.gridLayer.doCommand(new SelectCellCommand(this.gridLayer, 3, 4, false, false)); GridSearchStrategy gridStrategy = new GridSearchStrategy(this.configRegistry, false, true); gridStrategy.setComparator(new CellValueAsStringComparator<>()); // If we don't specify to wrap the search, it will not find it. gridStrategy.setContextLayer(this.selectionLayer); PositionCoordinate searchResult = gridStrategy.executeSearch("[1,3]"); assertNull(searchResult); // Should find it when wrap search is enabled. gridStrategy.setWrapSearch(true); searchResult = gridStrategy.executeSearch("[1,3]"); assertNotNull(searchResult); assertEquals(1, searchResult.columnPosition); assertEquals(3, searchResult.rowPosition); } @Test public void searchShouldMoveBackwardsToFindCell() { // Select search starting point in composite coordinates this.gridLayer.doCommand(new SelectCellCommand(this.gridLayer, 3, 4, false, false)); GridSearchStrategy gridStrategy = new GridSearchStrategy(this.configRegistry, false, ISearchDirection.SEARCH_BACKWARDS, true); gridStrategy.setComparator(new CellValueAsStringComparator<>()); gridStrategy.setContextLayer(this.selectionLayer); PositionCoordinate searchResult = gridStrategy.executeSearch("[1,3]"); assertNotNull(searchResult); assertEquals(1, searchResult.columnPosition); assertEquals(3, searchResult.rowPosition); } @Test public void shouldFindAllCellsWithValue() { GridSearchStrategy gridStrategy = new GridSearchStrategy(this.configRegistry, true, ISearchDirection.SEARCH_BACKWARDS, true); gridStrategy.setComparator(new CellValueAsStringComparator<>()); gridStrategy.setContextLayer(this.selectionLayer); gridStrategy.setCaseSensitive(true); gridStrategy.setWrapSearch(true); PositionCoordinate searchResult = gridStrategy.executeSearch("Body"); assertEquals(0, searchResult.columnPosition); assertEquals(0, searchResult.rowPosition); // Simulate selecting the search result this.selectionLayer.doCommand( new SelectCellCommand( this.selectionLayer, searchResult.columnPosition, searchResult.rowPosition, false, false)); searchResult = gridStrategy.executeSearch("Body"); assertEquals(4, searchResult.columnPosition); assertEquals(4, searchResult.rowPosition); // Simulate selecting the search result this.selectionLayer.doCommand( new SelectCellCommand( this.selectionLayer, searchResult.columnPosition, searchResult.rowPosition, false, false)); searchResult = gridStrategy.executeSearch("Body"); assertEquals(3, searchResult.columnPosition); assertEquals(3, searchResult.rowPosition); } }