/* * 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.shape.factory; import java.util.function.Consumer; import com.ait.lienzo.client.core.shape.Group; import com.ait.lienzo.client.core.shape.IContainer; 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.bpmn.client.shape.def.SequenceFlowConnectorDef; import org.kie.workbench.common.stunner.bpmn.definition.AdHocSubprocess; import org.kie.workbench.common.stunner.bpmn.definition.BPMNDefinition; import org.kie.workbench.common.stunner.bpmn.definition.BaseTask; import org.kie.workbench.common.stunner.bpmn.definition.BusinessRuleTask; import org.kie.workbench.common.stunner.bpmn.definition.EndNoneEvent; import org.kie.workbench.common.stunner.bpmn.definition.EndTerminateEvent; import org.kie.workbench.common.stunner.bpmn.definition.ExclusiveDatabasedGateway; import org.kie.workbench.common.stunner.bpmn.definition.Lane; import org.kie.workbench.common.stunner.bpmn.definition.NoneTask; import org.kie.workbench.common.stunner.bpmn.definition.ParallelGateway; import org.kie.workbench.common.stunner.bpmn.definition.SequenceFlow; import org.kie.workbench.common.stunner.bpmn.definition.StartNoneEvent; import org.kie.workbench.common.stunner.bpmn.definition.UserTask; import org.kie.workbench.common.stunner.cm.client.canvas.CaseManagementCanvasHandler; import org.kie.workbench.common.stunner.cm.client.shape.ActivityShape; import org.kie.workbench.common.stunner.cm.client.shape.DiagramShape; import org.kie.workbench.common.stunner.cm.client.shape.NullShape; import org.kie.workbench.common.stunner.cm.client.shape.StageShape; import org.kie.workbench.common.stunner.cm.client.shape.def.CaseManagementDiagramShapeDef; import org.kie.workbench.common.stunner.cm.client.shape.def.CaseManagementReusableSubprocessTaskShapeDef; import org.kie.workbench.common.stunner.cm.client.shape.def.CaseManagementSubprocessShapeDef; import org.kie.workbench.common.stunner.cm.client.shape.def.CaseManagementTaskShapeDef; import org.kie.workbench.common.stunner.cm.client.shape.def.NullShapeDef; import org.kie.workbench.common.stunner.cm.client.shape.view.ActivityView; import org.kie.workbench.common.stunner.cm.client.shape.view.DiagramView; import org.kie.workbench.common.stunner.cm.client.shape.view.NullView; import org.kie.workbench.common.stunner.cm.client.shape.view.StageView; import org.kie.workbench.common.stunner.cm.client.wires.AbstractCaseManagementShape; import org.kie.workbench.common.stunner.cm.definition.CaseManagementDiagram; import org.kie.workbench.common.stunner.cm.definition.ReusableSubprocess; import org.kie.workbench.common.stunner.core.api.DefinitionManager; import org.kie.workbench.common.stunner.core.api.FactoryManager; import org.kie.workbench.common.stunner.core.client.shape.Shape; import org.kie.workbench.common.stunner.core.client.shape.factory.ShapeFactory; import org.kie.workbench.common.stunner.core.client.shape.impl.AbstractElementShape; import org.kie.workbench.common.stunner.core.client.shape.impl.ConnectorShape; import org.kie.workbench.common.stunner.core.client.shape.view.ShapeView; import org.kie.workbench.common.stunner.core.client.shape.view.glyph.Glyph; import org.kie.workbench.common.stunner.core.client.shape.view.glyph.GlyphBuilder; import org.kie.workbench.common.stunner.core.client.shape.view.glyph.GlyphBuilderFactory; 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.shape.GlyphDef; import org.kie.workbench.common.stunner.shapes.client.factory.BasicShapesFactoryImpl; import org.kie.workbench.common.stunner.shapes.client.view.PictureShapeView; import org.kie.workbench.common.stunner.shapes.client.view.ShapeViewFactory; import org.kie.workbench.common.stunner.shapes.factory.BasicShapesFactory; 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 CaseManagementDelegateShapeFactoryTest { @Mock private DefinitionManager definitionManager; @Mock private FactoryManager factoryManager; @Mock private AdapterManager adapterManager; @Mock private DefinitionAdapter definitionAdapter; @Mock private GlyphBuilderFactory glyphBuilderFactory; @Mock private GlyphBuilder glyphBuilder; @Mock private ShapeViewFactory shapeViewFactory; @Mock private PictureShapeView pictureShapeView; private IContainer pictureShapeViewContainer = new Group(); @Mock private CaseManagementCanvasHandler canvasHandler; private Consumer<Shape> nullAssertions = (shape) -> { assertNotNull(shape.getShapeView()); assertTrue(shape instanceof NullShape); assertTrue(shape.getShapeView() instanceof NullView); assertTrue(((AbstractElementShape) shape).getShapeDefinition() instanceof NullShapeDef); }; private Consumer<Shape> stageAssertions = (shape) -> { assertNotNull(shape.getShapeView()); assertTrue(shape instanceof StageShape); assertTrue(shape.getShapeView() instanceof StageView); assertTrue(((AbstractElementShape) shape).getShapeDefinition() instanceof CaseManagementSubprocessShapeDef); assertShapeSize((StageView) shape.getShapeView()); }; private Consumer<Shape> activityAssertions = (shape) -> { assertNotNull(shape.getShapeView()); assertTrue(shape instanceof ActivityShape); assertTrue(shape.getShapeView() instanceof ActivityView); assertTrue(((AbstractElementShape) shape).getShapeDefinition() instanceof CaseManagementTaskShapeDef); assertShapeSize((ActivityView) shape.getShapeView()); }; private Consumer<Shape> reusableSubprocessActivityAssertions = (shape) -> { assertNotNull(shape.getShapeView()); assertTrue(shape instanceof ActivityShape); assertTrue(shape.getShapeView() instanceof ActivityView); assertTrue(((AbstractElementShape) shape).getShapeDefinition() instanceof CaseManagementReusableSubprocessTaskShapeDef); assertShapeSize((ActivityView) shape.getShapeView()); }; private CaseManagementDelegateShapeFactory factory; @Before @SuppressWarnings("unchecked") public void setup() { final BasicShapesFactory basicShapesFactory = new BasicShapesFactoryImpl(factoryManager, shapeViewFactory, definitionManager, glyphBuilderFactory); final CaseManagementShapesFactory caseManagementShapesFactory = new CaseManagementShapesFactoryImpl(factoryManager, shapeViewFactory, definitionManager, glyphBuilderFactory); this.factory = new CaseManagementDelegateShapeFactory(definitionManager, basicShapesFactory, caseManagementShapesFactory); this.factory.init(); when(shapeViewFactory.picture(anyObject(), anyDouble(), anyDouble())).thenReturn(pictureShapeView); when(pictureShapeView.getContainer()).thenReturn(pictureShapeViewContainer); when(definitionManager.adapters()).thenReturn(adapterManager); when(adapterManager.forDefinition()).thenReturn(definitionAdapter); when(glyphBuilderFactory.getBuilder(any(GlyphDef.class))).thenReturn(glyphBuilder); when(glyphBuilder.glyphDef(any(GlyphDef.class))).thenReturn(glyphBuilder); when(glyphBuilder.factory(any(ShapeFactory.class))).thenReturn(glyphBuilder); when(glyphBuilder.height(anyDouble())).thenReturn(glyphBuilder); when(glyphBuilder.width(anyDouble())).thenReturn(glyphBuilder); } @Test public void checkCMDiagram() { assertShapeConstruction(new CaseManagementDiagram.CaseManagementDiagramBuilder().build(), (shape) -> { assertNotNull(shape.getShapeView()); assertTrue(shape instanceof DiagramShape); assertTrue(shape.getShapeView() instanceof DiagramView); assertTrue(((AbstractElementShape) shape).getShapeDefinition() instanceof CaseManagementDiagramShapeDef); }); assertShapeGlyph(new CaseManagementDiagram.CaseManagementDiagramBuilder().build()); } @Test public void checkLane() { assertShapeConstruction(new Lane.LaneBuilder().build(), nullAssertions); assertShapeGlyph(new Lane.LaneBuilder().build()); } @Test public void checkNoneTask() { assertShapeConstruction(new NoneTask.NoneTaskBuilder().build(), activityAssertions); assertShapeGlyph(new NoneTask.NoneTaskBuilder().build()); } @Test public void checkUserTask() { assertShapeConstruction(new UserTask.UserTaskBuilder().build(), activityAssertions); assertShapeGlyph(new UserTask.UserTaskBuilder().build()); } @Test public void checkBusinessRuleTask() { assertShapeConstruction(new BusinessRuleTask.BusinessRuleTaskBuilder().build(), activityAssertions); assertShapeGlyph(new BusinessRuleTask.BusinessRuleTaskBuilder().build()); } @Test public void checkStartNoneEvent() { assertShapeConstruction(new StartNoneEvent.StartNoneEventBuilder().build(), nullAssertions); assertShapeGlyph(new StartNoneEvent.StartNoneEventBuilder().build()); } @Test public void checkEndNoneEvent() { assertShapeConstruction(new EndNoneEvent.EndNoneEventBuilder().build(), nullAssertions); assertShapeGlyph(new EndNoneEvent.EndNoneEventBuilder().build()); } @Test public void checkEndTerminateEvent() { assertShapeConstruction(new EndTerminateEvent.EndTerminateEventBuilder().build(), nullAssertions); assertShapeGlyph(new EndTerminateEvent.EndTerminateEventBuilder().build()); } @Test public void checkParallelGateway() { assertShapeConstruction(new ParallelGateway.ParallelGatewayBuilder().build(), nullAssertions); assertShapeGlyph(new ParallelGateway.ParallelGatewayBuilder().build()); } @Test public void checkExclusiveDatabasedGateway() { assertShapeConstruction(new ExclusiveDatabasedGateway.ExclusiveDatabasedGatewayBuilder().build(), nullAssertions); assertShapeGlyph(new ExclusiveDatabasedGateway.ExclusiveDatabasedGatewayBuilder().build()); } @Test public void checkAdHocSubprocess() { assertShapeConstruction(new AdHocSubprocess.AdHocSubprocessBuilder().build(), stageAssertions); assertShapeGlyph(new AdHocSubprocess.AdHocSubprocessBuilder().build()); } @Test public void checkReusableSubprocess() { assertShapeConstruction(new ReusableSubprocess.ReusableSubprocessBuilder().build(), reusableSubprocessActivityAssertions); assertShapeGlyph(new ReusableSubprocess.ReusableSubprocessBuilder().build()); } @Test public void checkSequenceFlow() { assertShapeConstruction(new SequenceFlow.SequenceFlowBuilder().build(), (shape) -> { assertNull(shape.getShapeView()); assertTrue(shape instanceof ConnectorShape); assertTrue(((AbstractElementShape) shape).getShapeDefinition() instanceof SequenceFlowConnectorDef); }); assertShapeGlyph(new SequenceFlow.SequenceFlowBuilder().build()); } @SuppressWarnings("unchecked") private void assertShapeConstruction(final BPMNDefinition definition, final Consumer<Shape> o) { when(definitionAdapter.getId(eq(definition))).thenReturn(definition.getClass().getName()); final Shape<? extends ShapeView> shape = factory.build(definition, canvasHandler); assertNotNull(shape); assertNotNull(((AbstractElementShape) shape).getShapeDefinition()); o.accept(shape); } @SuppressWarnings("unchecked") private void assertShapeGlyph(final BPMNDefinition definition) { when(glyphBuilder.definitionType(eq(definition.getClass()))).thenReturn(glyphBuilder); when(glyphBuilder.build()).thenReturn(mock(Glyph.class)); factory.glyph(definition.getClass().getName(), 20.0, 40.0); verify(glyphBuilder).width(eq(20.0)); verify(glyphBuilder).height(eq(40.0)); verify(glyphBuilder).build(); } private void assertShapeSize(final AbstractCaseManagementShape shapeView) { assertEquals(BaseTask.BaseTaskBuilder.WIDTH, shapeView.getWidth(), 0.0); assertEquals(BaseTask.BaseTaskBuilder.HEIGHT, shapeView.getHeight(), 0.0); } }