diff --git a/test/spec/features/modeling/SpaceTool.basic.bpmn b/test/spec/features/modeling/SpaceTool.basic.bpmn new file mode 100644 index 00000000..f9ec5d4e --- /dev/null +++ b/test/spec/features/modeling/SpaceTool.basic.bpmn @@ -0,0 +1,61 @@ + + + + + SequenceFlow_3 + SequenceFlow_2 + + SequenceFlow_1 + + + SequenceFlow_1 + + + + + SequenceFlow_2 + + + + SequenceFlow_3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/spec/features/modeling/SpaceToolSpec.js b/test/spec/features/modeling/SpaceToolSpec.js index afb49911..e6235b32 100644 --- a/test/spec/features/modeling/SpaceToolSpec.js +++ b/test/spec/features/modeling/SpaceToolSpec.js @@ -1,249 +1,229 @@ import { bootstrapModeler, + getBpmnJS, inject } from 'test/TestHelper'; +import { + createCanvasEvent as canvasEvent +} from '../../../util/MockEvents'; + +import { + pick +} from 'min-dash'; + import modelingModule from 'lib/features/modeling'; import coreModule from 'lib/core'; +import { isMac } from 'diagram-js/lib/util/Platform'; + +var invertModifier = isMac() ? { metaKey: true } : { ctrlKey: true }; + describe('features/modeling - create/remove space', function() { - var diagramXML = require('../../../fixtures/bpmn/simple.bpmn'); - - var testModules = [ coreModule, modelingModule ]; - - beforeEach(bootstrapModeler(diagramXML, { modules: testModules })); - - describe('create space', function() { + var diagramXML = require('./SpaceTool.basic.bpmn'); - it('should create space to the right', inject(function(elementRegistry, modeling, bpmnFactory) { + var testModules = [ coreModule, modelingModule ]; + + beforeEach(bootstrapModeler(diagramXML, { modules: testModules })); + + + it('should create space to the right', inject(function(elementRegistry, spaceTool) { // given - var sequenceFlowElement = elementRegistry.get('SequenceFlow_3'), - sequenceFlow = sequenceFlowElement.businessObject; + var sequenceFlow = elementRegistry.get('SequenceFlow_3'), + subProcess = elementRegistry.get('SubProcess_1'), + endEvent = elementRegistry.get('EndEvent_1'); - var subProcessElement = elementRegistry.get('SubProcess_1'), - subProcess = subProcessElement.businessObject; - - var endEventElement = elementRegistry.get('EndEvent_1'), - endEvent = endEventElement.businessObject; - - - var subProcOldPos = { - x: subProcessElement.x, - y: subProcessElement.y - }; - - var endEventOldPos = { - x: endEventElement.x, - y: endEventElement.y - }; - - var delta = { x: 50, y: 0 }, - direction = 'e'; + var subProcessPosition_old = getPosition(subProcess), + endEventPosition_old = getPosition(endEvent); // when - modeling.createSpace([subProcessElement, endEventElement], [], delta, direction); + makeSpace({ x: 270, y: 80 }, { dx: 50 }); // then - expect(subProcess.di).to.have.position({ - x: subProcOldPos.x + 50, - y: subProcOldPos.y + expect(subProcess).to.have.diPosition({ + x: subProcessPosition_old.x + 50, + y: subProcessPosition_old.y }); - expect(endEvent.di).to.have.position({ - x: endEventOldPos.x + 50, - y: endEventOldPos.y + expect(endEvent).to.have.diPosition({ + x: endEventPosition_old.x + 50, + y: endEventPosition_old.y }); - var diWaypoints = bpmnFactory.createDiWaypoints([ + expect(sequenceFlow).to.have.diWaypoints([ { x: 144, y: 230 }, { x: 350, y: 230 } ]); - - expect(sequenceFlow.di.waypoint).eql(diWaypoints); })); it('should create space downwards', inject(function(elementRegistry, modeling, bpmnFactory) { // given - var startEventElement = elementRegistry.get('StartEvent_2'), - startEvent = startEventElement.businessObject; + var startEvent = elementRegistry.get('StartEvent_2'), + sequenceFlow = elementRegistry.get('SequenceFlow_3'), + subProcess = elementRegistry.get('SubProcess_1'), + endEvent = elementRegistry.get('EndEvent_1'); - var sequenceFlowElement = elementRegistry.get('SequenceFlow_3'), - sequenceFlow = sequenceFlowElement.businessObject; - - var subProcessElement = elementRegistry.get('SubProcess_1'), - subProcess = subProcessElement.businessObject; - - var endEventElement = elementRegistry.get('EndEvent_1'), - endEvent = endEventElement.businessObject; - - var startEventOldPos = { - x: startEventElement.x, - y: startEventElement.y - }; - - var subProcOldPos = { - x: subProcessElement.x, - y: subProcessElement.y - }; - - var endEventOldPos = { - x: endEventElement.x, - y: endEventElement.y - }; - - var delta = { x: 0, y: 50 }, - direction = 's'; + var startEventPosition_old = getPosition(startEvent), + subProcessPosition_old = getPosition(subProcess), + endEventPosition_old = getPosition(endEvent); // when - modeling.createSpace([startEventElement ,subProcessElement, endEventElement], [], delta, direction); + makeSpace({ x: 330, y: 50 }, { dy: 50 }); // then - expect(startEvent.di).to.have.position({ - x: startEventOldPos.x, - y: startEventOldPos.y + 50 + expect(startEvent).to.have.diPosition({ + x: startEventPosition_old.x, + y: startEventPosition_old.y + 50 }); - expect(subProcess.di).to.have.position({ - x: subProcOldPos.x, - y: subProcOldPos.y + 50 + expect(subProcess).to.have.diPosition({ + x: subProcessPosition_old.x, + y: subProcessPosition_old.y + 50 }); - expect(endEvent.di).to.have.position({ - x: endEventOldPos.x, - y: endEventOldPos.y + 50 + expect(endEvent).to.have.diPosition({ + x: endEventPosition_old.x, + y: endEventPosition_old.y + 50 }); - var diWaypoints = bpmnFactory.createDiWaypoints([ + expect(sequenceFlow).to.have.diWaypoints([ { x: 144, y: 280 }, { x: 300, y: 280 } ]); - - expect(sequenceFlow.di.waypoint).eql(diWaypoints); })); it('should remove space to the left', inject(function(elementRegistry, modeling, bpmnFactory) { // given - var sequenceFlowElement = elementRegistry.get('SequenceFlow_3'), - sequenceFlow = sequenceFlowElement.businessObject; + var sequenceFlow = elementRegistry.get('SequenceFlow_3'), + subProcess = elementRegistry.get('SubProcess_1'), + endEvent = elementRegistry.get('EndEvent_1'); - var subProcessElement = elementRegistry.get('SubProcess_1'), - subProcess = subProcessElement.businessObject; - - var endEventElement = elementRegistry.get('EndEvent_1'), - endEvent = endEventElement.businessObject; - - var subProcOldPos = { - x: subProcessElement.x, - y: subProcessElement.y - }; - - var endEventOldPos = { - x: endEventElement.x, - y: endEventElement.y - }; - - var delta = { x: -50, y: 0 }, - direction = 'w'; + var subProcessPosition_old = getPosition(subProcess), + endEventPosition_old = getPosition(endEvent); // when - modeling.createSpace([subProcessElement, endEventElement], [], delta, direction); + makeSpace({ x: 280, y: 100 }, { dx: -50 }); // then - expect(subProcess.di).to.have.position({ - x: subProcOldPos.x - 50, - y: subProcOldPos.y + expect(subProcess).to.have.diPosition({ + x: subProcessPosition_old.x - 50, + y: subProcessPosition_old.y }); - expect(endEvent.di).to.have.position({ - x: endEventOldPos.x - 50, - y: endEventOldPos.y + expect(endEvent).to.have.diPosition({ + x: endEventPosition_old.x - 50, + y: endEventPosition_old.y }); - var diWaypoints = bpmnFactory.createDiWaypoints([ + expect(sequenceFlow).to.have.diWaypoints([ { x: 144, y: 230 }, { x: 250, y: 230 } ]); - - expect(sequenceFlow.di.waypoint).eql(diWaypoints); })); it('should resize to the right', inject(function(elementRegistry, modeling) { // given - var taskElement = elementRegistry.get('Task_1'), - task = taskElement.businessObject; + var task = elementRegistry.get('Task_1'), + subProcess = elementRegistry.get('SubProcess_1'), + endEvent = elementRegistry.get('EndEvent_1'); - var subProcessElement = elementRegistry.get('SubProcess_1'), - subProcess = subProcessElement.businessObject; - - var startEventElement = elementRegistry.get('StartEvent_1'), - startEvent = startEventElement.businessObject; - - var startEventElement2 = elementRegistry.get('StartEvent_2'), - startEvent2 = startEventElement2.businessObject; - - var subProcOldPos = { - x: subProcessElement.x, - y: subProcessElement.y, - width: subProcessElement.width, - height: subProcessElement.height - }; - - var startEventOldPos2 = { - x: startEventElement2.x, - y: startEventElement2.y - }; - - var startEventOldPos = { - x: startEventElement.x, - y: startEventElement.y - }; - - var taskOldPos = { - x: taskElement.x, - y: taskElement.y - }; - - var delta = { x: 50, y: 0 }, - direction = 'w'; + var subProcessBounds_old = getBounds(subProcess), + endEventPosition_old = getPosition(endEvent), + taskPosition_old = getPosition(task); // when - modeling.createSpace([startEventElement, startEventElement2, taskElement], [subProcessElement], delta, direction); + makeSpace({ x: 450, y: 100 }, { dx: 50 }); // then - expect(subProcess.di).to.have.bounds({ - x: subProcOldPos.x + 50, - y: subProcOldPos.y, - width: subProcOldPos.width - 50, - height: subProcOldPos.height + expect(subProcess).to.have.diBounds({ + x: subProcessBounds_old.x, + y: subProcessBounds_old.y, + width: subProcessBounds_old.width + 50, + height: subProcessBounds_old.height }); - expect(startEvent.di).to.have.position({ - x: startEventOldPos.x + 50, - y: startEventOldPos.y + expect(endEvent).to.have.diPosition({ + x: endEventPosition_old.x + 50, + y: endEventPosition_old.y }); - expect(startEvent2.di).to.have.position({ - x: startEventOldPos2.x + 50, - y: startEventOldPos2.y + expect(task).to.have.diPosition(taskPosition_old); + })); + + + it('should create space to the left', inject(function(elementRegistry, modeling) { + + // given + var startEvent = elementRegistry.get('StartEvent_2'), + sequenceFlow = elementRegistry.get('SequenceFlow_3'), + sequenceFlowLabel = sequenceFlow.label; + + var startEventBounds_old = getBounds(startEvent), + sequenceFlowLabelBounds_old = getPosition(sequenceFlowLabel); + + // when + makeSpace({ x: 250, y: 100 }, { dx: -50 }, true); + + // then + expect(startEvent).to.have.diBounds({ + x: startEventBounds_old.x - 50, + y: startEventBounds_old.y, + width: startEventBounds_old.width, + height: startEventBounds_old.height }); - expect(task.di).to.have.position({ - x: taskOldPos.x + 50, - y: taskOldPos.y + expect(sequenceFlowLabel).to.have.position({ + x: sequenceFlowLabelBounds_old.x - 50, + y: sequenceFlowLabelBounds_old.y }); })); }); }); + + + +// helpers //////////////// + +function makeSpace(start, delta, invert) { + + if (delta.dx && delta.dy) { + throw new Error('must define either or '); + } + + var modifier = invert ? invertModifier : {}; + + var end = { + x: start.x + (delta.dx || 0), + y: start.y + (delta.dy || 0) + }; + + return getBpmnJS().invoke(function(spaceTool, dragging) { + spaceTool.activateMakeSpace(canvasEvent(start)); + + dragging.move(canvasEvent(end, modifier)); + + dragging.end(); + }); + +} + +function getPosition(element) { + return pick(element, [ 'x', 'y' ]); +} + +function getBounds(element) { + return pick(element, [ 'x', 'y', 'width', 'height' ]); +} \ No newline at end of file