/* * Copyright 2017 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.kie.workbench.common.stunner.cm.client.canvas.controls.containment; import java.util.Optional; import com.ait.lienzo.client.core.shape.wires.IContainmentAcceptor; import com.ait.lienzo.client.core.shape.wires.ILayoutHandler; import com.ait.lienzo.client.core.shape.wires.WiresContainer; import com.ait.lienzo.client.core.shape.wires.WiresShape; import com.ait.lienzo.client.core.types.Point2D; import com.ait.lienzo.test.LienzoMockitoTestRunner; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.kie.workbench.common.stunner.client.lienzo.canvas.wires.WiresCanvas; import org.kie.workbench.common.stunner.client.lienzo.canvas.wires.WiresUtils; import org.kie.workbench.common.stunner.cm.client.canvas.CaseManagementCanvasHandler; import org.kie.workbench.common.stunner.cm.client.canvas.CaseManagementCanvasView; import org.kie.workbench.common.stunner.cm.client.command.CaseManagementCanvasCommandFactory; import org.kie.workbench.common.stunner.cm.client.wires.CaseManagementContainmentStateHolder; import org.kie.workbench.common.stunner.cm.client.wires.MockCaseManagementShape; import org.kie.workbench.common.stunner.core.client.canvas.AbstractCanvas; import org.kie.workbench.common.stunner.core.client.canvas.AbstractCanvasHandler; import org.kie.workbench.common.stunner.core.client.command.CanvasCommandManager; import org.kie.workbench.common.stunner.core.client.command.RequiresCommandManager; import org.kie.workbench.common.stunner.core.graph.Edge; import org.kie.workbench.common.stunner.core.graph.Node; import org.kie.workbench.common.stunner.core.graph.content.relationship.Child; import org.kie.workbench.common.stunner.core.graph.content.view.View; import org.kie.workbench.common.stunner.core.graph.impl.EdgeImpl; import org.kie.workbench.common.stunner.core.graph.processing.index.Index; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Mock; import static org.junit.Assert.*; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.*; @RunWith(LienzoMockitoTestRunner.class) public class CaseManagementContainmentAcceptorControlImplTest { @Mock private AbstractCanvas canvas; @Mock private CaseManagementCanvasView canvasView; @Mock private CaseManagementCanvasHandler canvasHandler; @Mock private Index graphIndex; @Mock private CaseManagementCanvasCommandFactory canvasCommandFactory; @Mock private RequiresCommandManager.CommandManagerProvider<AbstractCanvasHandler> commandManagerProvider; @Mock private CanvasCommandManager<AbstractCanvasHandler> commandManager; @Captor private ArgumentCaptor<IContainmentAcceptor> containmentAcceptorArgumentCaptor; private CaseManagementContainmentStateHolder state; private CaseManagementContainmentAcceptorControlImpl control; @Before public void setup() { this.state = new CaseManagementContainmentStateHolder(); this.control = new CaseManagementContainmentAcceptorControlImpl(canvasCommandFactory, state); this.control.setCommandManagerProvider(commandManagerProvider); when(commandManagerProvider.getCommandManager()).thenReturn(commandManager); when(canvasHandler.getAbstractCanvas()).thenReturn(canvas); when(canvasHandler.getGraphIndex()).thenReturn(graphIndex); when(graphIndex.getNode(anyString())).thenReturn(mock(Node.class)); when(canvas.getView()).thenReturn(canvasView); } @Test public void checkDoEnable() { control.doEnable(canvasView); final IContainmentAcceptor containmentAcceptor = getContainmentAcceptor(); assertNotNull(containmentAcceptor); assertTrue(containmentAcceptor instanceof CaseManagementContainmentAcceptorControlImpl.CanvasManagementContainmentAcceptor); } private IContainmentAcceptor getContainmentAcceptor() { verify(canvasView, times(1)).setContainmentAcceptor(containmentAcceptorArgumentCaptor.capture()); final IContainmentAcceptor containmentAcceptor = containmentAcceptorArgumentCaptor.getValue(); return containmentAcceptor; } @Test public void checkDoDisable() { control.doDisable(canvasView); verify(canvasView, times(1)).setContainmentAcceptor(eq(IContainmentAcceptor.NONE)); } @Test public void isEdgeAcceptedWhenView() { final Edge<View, Node> view = new EdgeImpl<>("view"); view.setContent(mock(View.class)); assertFalse(control.isEdgeAccepted(view)); } @Test public void isEdgeAcceptedWhenChild() { final Edge<Child, Node> view = new EdgeImpl<>("view"); view.setContent(mock(Child.class)); assertTrue(control.isEdgeAccepted(view)); } @Test public void getAddEdgeCommand() { final Node parent = mock(Node.class); final Node child = mock(Node.class); control.getAddEdgeCommand(parent, child); verify(canvasCommandFactory, times(1)).setChildNode(eq(parent), eq(child)); } @Test public void getSetEdgeCommand() { final Node parent = mock(Node.class); final Node child = mock(Node.class); control.getSetEdgeCommand(parent, child, Optional.empty(), Optional.empty(), Optional.empty()); verify(canvasCommandFactory, times(1)).setChildNode(eq(parent), eq(child), eq(Optional.empty()), eq(Optional.empty()), eq(Optional.empty())); } @Test public void getDeleteEdgeCommand() { final Node parent = mock(Node.class); final Node child = mock(Node.class); control.getDeleteEdgeCommand(parent, child); verify(canvasCommandFactory, times(1)).removeChild(eq(parent), eq(child)); } @Test public void checkContainmentAllowed() { control.enable(canvasHandler); final IContainmentAcceptor containmentAcceptor = getContainmentAcceptor(); final WiresShape parentShape = makeWiresShape(); final WiresShape childShape = makeWiresShape(); assertTrue(containmentAcceptor.containmentAllowed(parentShape, childShape)); verify(canvasCommandFactory, times(1)).setChildNode(any(Node.class), any(Node.class)); } private WiresShape makeWiresShape() { final WiresShape shape = new MockCaseManagementShape(); WiresUtils.assertShapeGroup(shape.getGroup(), WiresCanvas.WIRES_CANVAS_GROUP_ID); return shape; } @Test public void checkAcceptContainment() { control.enable(canvasHandler); final IContainmentAcceptor containmentAcceptor = getContainmentAcceptor(); final WiresShape parentShape = makeWiresShape(); final WiresShape childShape = makeWiresShape(); assertTrue(containmentAcceptor.acceptContainment(parentShape, childShape)); assertTrue(parentShape.getLayoutHandler() instanceof CaseManagementContainmentAcceptorControlImpl.InterceptingLayoutHandler); } @Test public void checkInterceptingLayoutHandlerAdd() { control.enable(canvasHandler); final WiresShape parentShape = makeWiresShape(); final WiresShape childShape = makeWiresShape(); final ILayoutHandler layoutHandler = getILayoutHandler(parentShape, childShape); layoutHandler.add(childShape, parentShape, new Point2D()); verify(canvasCommandFactory, times(1)).setChildNode(any(Node.class), any(Node.class), eq(Optional.of(0)), eq(Optional.empty()), eq(Optional.empty())); assertTrue(parentShape.getLayoutHandler() instanceof ILayoutHandler.DefaultLayoutHandler); } private ILayoutHandler getILayoutHandler(final WiresContainer parentShape, final WiresShape childShape) { final IContainmentAcceptor containmentAcceptor = getContainmentAcceptor(); containmentAcceptor.acceptContainment(parentShape, childShape); return parentShape.getLayoutHandler(); } @Test public void checkInterceptingLayoutHandlerRemove() { control.enable(canvasHandler); final WiresShape parentShape = makeWiresShape(); final WiresShape childShape = makeWiresShape(); final ILayoutHandler layoutHandler = getILayoutHandler(parentShape, childShape); layoutHandler.remove(childShape, parentShape); assertTrue(parentShape.getLayoutHandler() instanceof ILayoutHandler.DefaultLayoutHandler); } }