/*
* 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.drools.workbench.screens.guided.dtable.client.widget.table;
import java.util.HashSet;
import com.ait.lienzo.client.core.shape.Layer;
import com.ait.lienzo.client.core.shape.Viewport;
import com.ait.lienzo.client.core.types.Point2D;
import com.ait.lienzo.test.LienzoMockitoTestRunner;
import com.google.gwt.dom.client.Document;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.NativeEvent;
import com.google.gwt.event.dom.client.ContextMenuEvent;
import com.google.gwt.event.dom.client.ContextMenuHandler;
import com.google.gwt.event.dom.client.MouseDownHandler;
import org.drools.workbench.models.guided.dtable.shared.model.GuidedDecisionTable52;
import org.drools.workbench.screens.guided.dtable.client.editor.menu.CellContextMenu;
import org.drools.workbench.screens.guided.dtable.client.editor.menu.RowContextMenu;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Mock;
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.BaseGridColumn;
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.widget.grid.columns.RowNumberColumn;
import org.uberfire.ext.wires.core.grids.client.widget.grid.renderers.columns.GridColumnRenderer;
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.CellSelectionStrategy;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
@RunWith(LienzoMockitoTestRunner.class)
public class GuidedDecisionTableModellerContextMenuSupportTest {
@Mock
private CellContextMenu cellContextMenu;
@Mock
private RowContextMenu rowContextMenu;
@Mock
private GuidedDecisionTableModellerPresenter modellerPresenter;
@Mock
private BaseGridRendererHelper.ColumnInformation columnInformation;
@Mock
private ContextMenuEvent event;
@Mock
private NativeEvent nativeEvent;
@Mock
private Element element;
@Mock
private Document document;
@Mock
private Viewport viewport;
@Mock
private Layer layer;
@Mock
private GridCell uiCell;
@Mock
private CellSelectionStrategy cellSelectionStrategy;
@Captor
private ArgumentCaptor<GridData> uiModelCaptor;
private GuidedDecisionTableModellerContextMenuSupport contextMenuSupport;
@Before
public void setup() {
this.contextMenuSupport = new GuidedDecisionTableModellerContextMenuSupport( cellContextMenu,
rowContextMenu );
when( event.getNativeEvent() ).thenReturn( nativeEvent );
when( event.getRelativeElement() ).thenReturn( element );
when( element.getAbsoluteLeft() ).thenReturn( 0 );
when( element.getScrollLeft() ).thenReturn( 0 );
when( element.getAbsoluteTop() ).thenReturn( 0 );
when( element.getScrollTop() ).thenReturn( 0 );
when( element.getOwnerDocument() ).thenReturn( document );
when( document.getScrollLeft() ).thenReturn( 0 );
when( document.getScrollTop() ).thenReturn( 0 );
when( nativeEvent.getShiftKey() ).thenReturn( false );
when( nativeEvent.getCtrlKey() ).thenReturn( false );
when( nativeEvent.getClientX() ).thenReturn( 50 );
when( nativeEvent.getClientY() ).thenReturn( 50 );
when( uiCell.getSelectionManager() ).thenReturn( cellSelectionStrategy );
}
@Test
public void getContextMenuHandler() {
final ContextMenuHandler handler = contextMenuSupport.getContextMenuHandler( modellerPresenter );
assertNotNull( handler );
}
@Test
public void getContextMenuMouseDownHandler() {
final MouseDownHandler handler = contextMenuSupport.getContextMenuMouseDownHandler();
assertNotNull( handler );
}
@Test
@SuppressWarnings("unchecked")
public void onContextMenu_RowContextMenu() {
final GuidedDecisionTableView.Presenter dtPresenter = makeDecisionTable();
final GridData uiModel = dtPresenter.getView().getModel();
final GridColumn uiColumn = new RowNumberColumn();
uiModel.appendColumn( uiColumn );
when( columnInformation.getColumn() ).thenReturn( uiColumn );
when( modellerPresenter.getAvailableDecisionTables() ).thenReturn( new HashSet<GuidedDecisionTableView.Presenter>() {{
add( dtPresenter );
}} );
final ContextMenuHandler handler = contextMenuSupport.getContextMenuHandler( modellerPresenter );
handler.onContextMenu( event );
verify( rowContextMenu,
times( 1 ) ).show( any( Integer.class ),
any( Integer.class ) );
verify( cellContextMenu,
never() ).show( any( Integer.class ),
any( Integer.class ) );
}
@Test
@SuppressWarnings("unchecked")
public void onContextMenu_CellContextMenu() {
final GuidedDecisionTableView.Presenter dtPresenter = makeDecisionTable();
final GridData uiModel = dtPresenter.getView().getModel();
final GridColumn uiColumn = new BaseGridColumn( mock( GridColumn.HeaderMetaData.class ),
mock( GridColumnRenderer.class ),
100.0 );
uiModel.appendColumn( uiColumn );
when( columnInformation.getColumn() ).thenReturn( uiColumn );
when( modellerPresenter.getAvailableDecisionTables() ).thenReturn( new HashSet<GuidedDecisionTableView.Presenter>() {{
add( dtPresenter );
}} );
final ContextMenuHandler handler = contextMenuSupport.getContextMenuHandler( modellerPresenter );
handler.onContextMenu( event );
verify( rowContextMenu,
never() ).show( any( Integer.class ),
any( Integer.class ) );
verify( cellContextMenu,
times( 1 ) ).show( any( Integer.class ),
any( Integer.class ) );
}
@Test
@SuppressWarnings("unchecked")
public void onContextMenuWithCellSelectionManagerWithChangeInSelection() {
final GuidedDecisionTableView.Presenter dtPresenter = makeDecisionTable();
final GridData uiModel = dtPresenter.getView().getModel();
final GridColumn uiColumn = new RowNumberColumn();
uiModel.appendColumn( uiColumn );
when( columnInformation.getColumn() ).thenReturn( uiColumn );
when( modellerPresenter.getAvailableDecisionTables() ).thenReturn( new HashSet<GuidedDecisionTableView.Presenter>() {{
add( dtPresenter );
}} );
when( uiModel.getCell( any( Integer.class ),
any( Integer.class ) ) ).thenReturn( uiCell );
when( cellSelectionStrategy.handleSelection( any( GridData.class ),
any( Integer.class ),
any( Integer.class ),
any( Boolean.class ),
any( Boolean.class ) ) ).thenReturn( true );
final ContextMenuHandler handler = contextMenuSupport.getContextMenuHandler( modellerPresenter );
handler.onContextMenu( event );
verify( cellSelectionStrategy,
times( 1 ) ).handleSelection( eq( uiModel ),
eq( 0 ),
eq( 0 ),
eq( false ),
eq( false ) );
verify( layer,
times( 1 ) ).batch();
}
@Test
@SuppressWarnings("unchecked")
public void onContextMenuWithCellSelectionManagerWithoutChangeInSelection() {
final GuidedDecisionTableView.Presenter dtPresenter = makeDecisionTable();
final GridData uiModel = dtPresenter.getView().getModel();
final GridColumn uiColumn = new RowNumberColumn();
uiModel.appendColumn( uiColumn );
when( columnInformation.getColumn() ).thenReturn( uiColumn );
when( modellerPresenter.getAvailableDecisionTables() ).thenReturn( new HashSet<GuidedDecisionTableView.Presenter>() {{
add( dtPresenter );
}} );
when( uiModel.getCell( any( Integer.class ),
any( Integer.class ) ) ).thenReturn( uiCell );
final ContextMenuHandler handler = contextMenuSupport.getContextMenuHandler( modellerPresenter );
handler.onContextMenu( event );
verify( cellSelectionStrategy,
times( 1 ) ).handleSelection( eq( uiModel ),
eq( 0 ),
eq( 0 ),
eq( false ),
eq( false ) );
verify( layer,
never() ).batch();
}
@Test
@SuppressWarnings("unchecked")
public void onContextMenuWithoutCellSelectionManager() {
final GuidedDecisionTableView.Presenter dtPresenter = makeDecisionTable();
final GridData uiModel = dtPresenter.getView().getModel();
final GridColumn uiColumn = new RowNumberColumn();
uiModel.appendColumn( uiColumn );
when( columnInformation.getColumn() ).thenReturn( uiColumn );
when( modellerPresenter.getAvailableDecisionTables() ).thenReturn( new HashSet<GuidedDecisionTableView.Presenter>() {{
add( dtPresenter );
}} );
final GridCell uiCell = mock( GridCell.class );
when( uiModel.getCell( any( Integer.class ),
any( Integer.class ) ) ).thenReturn( uiCell );
when( uiCell.getSelectionManager() ).thenReturn( null );
final ContextMenuHandler handler = contextMenuSupport.getContextMenuHandler( modellerPresenter );
handler.onContextMenu( event );
verify( layer,
never() ).batch();
}
@Test
@SuppressWarnings("unchecked")
public void onContextMenuWithMultipleTables() {
final GuidedDecisionTableView.Presenter dtPresenter1 = makeDecisionTable( 0,
0 );
final GuidedDecisionTableView.Presenter dtPresenter2 = makeDecisionTable( 200,
200 );
when( modellerPresenter.getAvailableDecisionTables() ).thenReturn( new HashSet<GuidedDecisionTableView.Presenter>() {{
add( dtPresenter1 );
add( dtPresenter2 );
}} );
final GridData uiModel1 = dtPresenter1.getView().getModel();
final GridData uiModel2 = dtPresenter2.getView().getModel();
final GridColumn uiColumn = new BaseGridColumn( mock( GridColumn.HeaderMetaData.class ),
mock( GridColumnRenderer.class ),
100.0 );
uiModel1.appendColumn( uiColumn );
uiModel2.appendColumn( uiColumn );
when( uiModel1.getCell( any( Integer.class ),
any( Integer.class ) ) ).thenReturn( uiCell );
when( uiModel2.getCell( any( Integer.class ),
any( Integer.class ) ) ).thenReturn( uiCell );
when( columnInformation.getColumn() ).thenReturn( uiColumn );
final ContextMenuHandler handler = contextMenuSupport.getContextMenuHandler( modellerPresenter );
when( nativeEvent.getClientX() ).thenReturn( 50 );
when( nativeEvent.getClientY() ).thenReturn( 50 );
handler.onContextMenu( event );
verify( cellSelectionStrategy,
times( 1 ) ).handleSelection( uiModelCaptor.capture(),
any( Integer.class ),
any( Integer.class ),
any( Boolean.class ),
any( Boolean.class ) );
assertEquals( uiModel1,
uiModelCaptor.getValue() );
when( nativeEvent.getClientX() ).thenReturn( 250 );
when( nativeEvent.getClientY() ).thenReturn( 250 );
handler.onContextMenu( event );
verify( cellSelectionStrategy,
times( 2 ) ).handleSelection( uiModelCaptor.capture(),
any( Integer.class ),
any( Integer.class ),
any( Boolean.class ),
any( Boolean.class ) );
assertEquals( uiModel2,
uiModelCaptor.getValue() );
}
private GuidedDecisionTableView.Presenter makeDecisionTable() {
return makeDecisionTable( 0,
0 );
}
private GuidedDecisionTableView.Presenter makeDecisionTable( final double x,
final double y ) {
final GridData uiModel = spy( new BaseGridData() );
final GuidedDecisionTableView.Presenter dtPresenter = mock( GuidedDecisionTableView.Presenter.class );
final GuidedDecisionTableView dtView = mock( GuidedDecisionTableView.class );
final GridRenderer renderer = mock( GridRenderer.class );
final BaseGridRendererHelper helper = mock( BaseGridRendererHelper.class );
uiModel.appendRow( new BaseGridRow() );
when( dtPresenter.getView() ).thenReturn( dtView );
when( dtPresenter.getAccess() ).thenReturn( mock( GuidedDecisionTablePresenter.Access.class ) );
when( dtPresenter.getModel() ).thenReturn( mock( GuidedDecisionTable52.class ) );
when( dtView.getViewport() ).thenReturn( viewport );
when( dtView.getLayer() ).thenReturn( layer );
when( dtView.getLocation() ).thenReturn( new Point2D( x, y ) );
when( dtView.getWidth() ).thenReturn( 50.0 );
when( dtView.getHeight() ).thenReturn( 52.0 );
when( dtView.getModel() ).thenReturn( uiModel );
when( dtView.getRenderer() ).thenReturn( renderer );
when( renderer.getHeaderHeight() ).thenReturn( 32.0 );
when( dtView.getRendererHelper() ).thenReturn( helper );
when( helper.getColumnInformation( any( Double.class ) ) ).thenReturn( columnInformation );
return dtPresenter;
}
}