/*
* 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;
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.cm.client.shape.ActivityShape;
import org.kie.workbench.common.stunner.cm.client.shape.def.CaseManagementTaskShapeDef;
import org.kie.workbench.common.stunner.cm.client.shape.view.ActivityView;
import org.kie.workbench.common.stunner.core.client.api.ClientDefinitionManager;
import org.kie.workbench.common.stunner.core.client.api.ShapeManager;
import org.kie.workbench.common.stunner.core.client.canvas.AbstractCanvasHandler;
import org.kie.workbench.common.stunner.core.client.canvas.Layer;
import org.kie.workbench.common.stunner.core.client.canvas.event.registration.CanvasElementAddedEvent;
import org.kie.workbench.common.stunner.core.client.canvas.event.registration.CanvasElementRemovedEvent;
import org.kie.workbench.common.stunner.core.client.canvas.event.registration.CanvasElementUpdatedEvent;
import org.kie.workbench.common.stunner.core.client.canvas.event.registration.CanvasElementsClearEvent;
import org.kie.workbench.common.stunner.core.client.command.CanvasCommandFactory;
import org.kie.workbench.common.stunner.core.client.service.ClientFactoryService;
import org.kie.workbench.common.stunner.core.client.shape.MutationContext;
import org.kie.workbench.common.stunner.core.client.shape.impl.AbstractElementShape;
import org.kie.workbench.common.stunner.core.definition.adapter.AdapterManager;
import org.kie.workbench.common.stunner.core.definition.adapter.DefinitionAdapter;
import org.kie.workbench.common.stunner.core.definition.adapter.PropertyAdapter;
import org.kie.workbench.common.stunner.core.definition.property.PropertyMetaTypes;
import org.kie.workbench.common.stunner.core.graph.Edge;
import org.kie.workbench.common.stunner.core.graph.Element;
import org.kie.workbench.common.stunner.core.graph.Node;
import org.kie.workbench.common.stunner.core.graph.content.view.BoundImpl;
import org.kie.workbench.common.stunner.core.graph.content.view.BoundsImpl;
import org.kie.workbench.common.stunner.core.graph.content.view.View;
import org.kie.workbench.common.stunner.core.graph.content.view.ViewImpl;
import org.kie.workbench.common.stunner.core.graph.impl.NodeImpl;
import org.kie.workbench.common.stunner.core.graph.processing.index.GraphIndexBuilder;
import org.kie.workbench.common.stunner.core.graph.processing.index.MutableIndex;
import org.kie.workbench.common.stunner.core.graph.util.GraphUtils;
import org.kie.workbench.common.stunner.core.rule.RuleManager;
import org.kie.workbench.common.stunner.shapes.def.RectangleShapeDef;
import org.mockito.Mock;
import org.uberfire.mocks.EventSourceMock;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
@RunWith(LienzoMockitoTestRunner.class)
public class CaseManagementCanvasHandlerTest {
@Mock
private ClientDefinitionManager clientDefinitionManager;
@Mock
private ClientFactoryService clientFactoryServices;
@Mock
private RuleManager ruleManager;
@Mock
private AdapterManager adapterManager;
@Mock
private DefinitionAdapter definitionAdapter;
@Mock
private PropertyAdapter propertyAdapter;
@Mock
private GraphUtils graphUtils;
@Mock
private GraphIndexBuilder<? extends MutableIndex<Node, Edge>> indexBuilder;
@Mock
private ShapeManager shapeManager;
@Mock
private EventSourceMock<CanvasElementAddedEvent> canvasElementAddedEvent;
@Mock
private EventSourceMock<CanvasElementRemovedEvent> canvasElementRemovedEvent;
@Mock
private EventSourceMock<CanvasElementUpdatedEvent> canvasElementUpdatedEvent;
@Mock
private EventSourceMock<CanvasElementsClearEvent> canvasElementsClearEvent;
@Mock
private CanvasCommandFactory<AbstractCanvasHandler> canvasCommandFactory;
@Mock
private CaseManagementCanvasPresenter canvas;
@Mock
private Layer layer;
private CaseManagementCanvasHandler handler;
@Before
@SuppressWarnings("unchecked")
public void setup() {
this.handler = new CaseManagementCanvasHandler(clientDefinitionManager,
clientFactoryServices,
ruleManager,
graphUtils,
indexBuilder,
shapeManager,
canvasElementAddedEvent,
canvasElementRemovedEvent,
canvasElementUpdatedEvent,
canvasElementsClearEvent,
canvasCommandFactory);
this.handler.handle(canvas);
when(canvas.getLayer()).thenReturn(layer);
}
@Test
public void checkCanvasRoot() {
assertFalse(handler.isCanvasRoot(mock(Element.class)));
}
@Test
public void checkCanvasRootUUID() {
assertFalse(handler.isCanvasRoot("any-uuid"));
}
@Test
@SuppressWarnings("unchecked")
public void checkRegisterRenderableShapes() {
final ActivityShape shape = makeShape();
final Node<View<?>, Edge> node = makeNode("uuid",
shape);
handler.register(shape,
node,
true);
verify(canvas,
times(1)).addShape(eq(shape));
verify(canvas,
times(1)).draw();
}
@SuppressWarnings("unchecked")
private ActivityShape makeShape() {
final RectangleShapeDef shapeDef = new CaseManagementTaskShapeDef();
final ActivityView shapeView = new ActivityView(10.0,
20.0);
final ActivityShape shape = new ActivityShape(shapeDef,
shapeView);
return shape;
}
@SuppressWarnings("unchecked")
private Node<View<?>, Edge> makeNode(final String uuid,
final AbstractElementShape shape) {
final Node<View<?>, Edge> node = new NodeImpl<>(uuid);
node.setContent(new ViewImpl(shape.getShapeDefinition(),
new BoundsImpl(new BoundImpl(0.0,
0.0),
new BoundImpl(10.0,
20.0))));
when(canvas.getShape(eq(uuid))).thenReturn(shape);
when(clientDefinitionManager.adapters()).thenReturn(adapterManager);
when(adapterManager.forDefinition()).thenReturn(definitionAdapter);
when(adapterManager.forProperty()).thenReturn(propertyAdapter);
when(definitionAdapter.getMetaProperty(eq(PropertyMetaTypes.NAME),
anyObject())).thenReturn(PropertyMetaTypes.NAME);
when(propertyAdapter.getValue(eq(PropertyMetaTypes.NAME))).thenReturn("name");
return node;
}
@Test
public void checkDeregisterRenderableShapes() {
final ActivityShape shape = makeShape();
final Node<View<?>, Edge> node = makeNode("uuid",
shape);
handler.deregister(shape,
node,
true);
verify(canvas,
times(1)).deleteShape(eq(shape));
verify(canvas,
times(1)).draw();
}
@Test
public void checkAddShapeRenderableShapes() {
final ActivityShape shape = makeShape();
handler.addShape(shape);
verify(canvas,
times(1)).addShape(eq(shape));
}
@Test
@SuppressWarnings("unchecked")
public void checkAddChildRenderableShapes() {
final ActivityShape parentShape = makeShape();
final ActivityShape childShape = makeShape();
final Node<View<?>, Edge> parentNode = makeNode("parent",
parentShape);
final Node<View<?>, Edge> childNode = makeNode("child",
childShape);
handler.register(parentShape,
parentNode,
true);
handler.register(childShape,
childNode,
true);
handler.addChild(parentNode,
childNode);
verify(canvas,
times(1)).addChildShape(eq(parentShape),
eq(childShape));
verify(layer,
never()).addShape(eq(childShape));
}
@Test
@SuppressWarnings("unchecked")
public void checkAddChildRenderableShapesAtIndex() {
final ActivityShape parentShape = makeShape();
final ActivityShape childShape = makeShape();
final Node<View<?>, Edge> parentNode = makeNode("parent",
parentShape);
final Node<View<?>, Edge> childNode = makeNode("child",
childShape);
handler.register(parentShape,
parentNode,
true);
handler.register(childShape,
childNode,
true);
handler.addChild(parentNode,
childNode,
0);
verify(canvas,
times(1)).addChildShape(eq(parentShape),
eq(childShape),
eq(0));
verify(layer,
never()).addShape(eq(childShape));
}
@Test
public void checkRemoveShapeRenderableShapes() {
final ActivityShape shape = makeShape();
handler.removeShape(shape);
verify(canvas,
times(1)).deleteShape(eq(shape));
}
@Test
@SuppressWarnings("unchecked")
public void checkRemoveChildRenderableShapes() {
final ActivityShape parentShape = makeShape();
final ActivityShape childShape = makeShape();
final Node<View<?>, Edge> parentNode = makeNode("parent",
parentShape);
final Node<View<?>, Edge> childNode = makeNode("child",
childShape);
handler.register(parentShape,
parentNode,
true);
handler.register(childShape,
childNode,
true);
handler.addChild(parentNode,
childNode);
handler.removeChild(parentNode,
childNode);
verify(canvas,
times(1)).deleteChildShape(parentShape,
childShape);
verify(layer,
never()).removeShape(childShape);
}
@Test
@SuppressWarnings("unchecked")
public void checkApplyElementMutationRenderableShapes() {
final ActivityShape shape = spy(makeShape());
final Node<View<?>, Edge> node = makeNode("uuid",
shape);
final MutationContext mutationContext = mock(MutationContext.class);
doNothing().when(shape).applyPosition(eq(node),
eq(mutationContext));
doNothing().when(shape).applyProperties(eq(node),
eq(mutationContext));
doNothing().when(shape).applyTitle(anyString(),
any(Node.class),
eq(mutationContext));
handler.applyElementMutation(shape,
node,
true,
true,
mutationContext);
verify(shape,
times(1)).applyPosition(eq(node),
eq(mutationContext));
verify(shape,
times(1)).applyProperties(eq(node),
eq(mutationContext));
verify(canvas,
times(1)).draw();
}
@Test
@SuppressWarnings("unchecked")
public void checkApplyShapeElementMutationRenderableShapes() {
final ActivityShape shape = spy(makeShape());
final Node<View<?>, Edge> node = makeNode("uuid",
shape);
final MutationContext mutationContext = mock(MutationContext.class);
doNothing().when(shape).applyPosition(eq(node),
eq(mutationContext));
doNothing().when(shape).applyProperties(eq(node),
eq(mutationContext));
doNothing().when(shape).applyTitle(anyString(),
any(Node.class),
eq(mutationContext));
handler.register(shape,
node,
true);
verify(canvas,
times(1)).draw();
handler.applyElementMutation(node,
true,
true,
mutationContext);
verify(shape,
times(1)).applyPosition(eq(node),
eq(mutationContext));
verify(shape,
times(1)).applyProperties(eq(node),
eq(mutationContext));
verify(canvas,
times(2)).draw();
}
}