import { bootstrapModeler, inject } from 'test/TestHelper'; import coreModule from 'lib/core'; import createModule from 'diagram-js/lib/features/create'; import modelingModule from 'lib/features/modeling'; import { getBBox } from 'diagram-js/lib/util/Elements'; import { asTRBL } from 'diagram-js/lib/layout/LayoutUtil'; import { getDi } from 'lib/util/ModelUtil'; import { createCanvasEvent as canvasEvent } from '../../../../util/MockEvents'; describe('features/modeling - create participant', function() { var testModules = [ coreModule, createModule, modelingModule ]; describe('process', function() { describe('turning process into collaboration', function() { var processDiagramXML = require('../../../../fixtures/bpmn/collaboration/process-empty.bpmn'); beforeEach(bootstrapModeler(processDiagramXML, { modules: testModules })); var collaboration, collaborationBo, collaborationDi, diRoot, participant, participant2, participants, participantBo, participant2Bo, participantDi, participant2Di, process, processBo, processDi; beforeEach(inject(function(canvas, elementFactory) { // given process = canvas.getRootElement(); processBo = process.businessObject; processDi = getDi(process); diRoot = processDi.$parent; participant = elementFactory.createParticipantShape({ x: 100, y: 100 }); participantBo = participant.businessObject; participantDi = getDi(participant); participant2 = elementFactory.createParticipantShape({ x: 100, y: 400 }); participant2Bo = participant2.businessObject; participant2Di = getDi(participant2); participants = [ participant, participant2 ]; })); describe('creating one participant', function() { beforeEach(inject(function(canvas, modeling) { // when modeling.createShape(participant, { x: 400, y: 225 }, process); collaboration = canvas.getRootElement(); collaborationBo = collaboration.businessObject; collaborationDi = getDi(collaboration); })); it('execute', function() { // then expect(participantBo.$parent).to.equal(collaborationBo); expect(participantBo.processRef).to.equal(processBo); expect(participantBo.processRef.id).to.equal(processBo.id); expect(collaborationBo.$instanceOf('bpmn:Collaboration')).to.be.true; expect(collaborationBo.$parent).to.equal(processBo.$parent); expect(collaborationBo.participants).to.include(participantBo); expect(participantDi.$parent).to.equal(collaborationDi); expect(collaborationDi.$parent).to.equal(diRoot); }); it('undo', inject(function(commandStack) { // when commandStack.undo(); // then expect(participantBo.$parent).not.to.exist; expect(participantBo.processRef).not.to.equal(processBo); expect(collaborationBo.$parent).not.to.exist; expect(collaborationBo.participants).not.to.include(participantBo); expect(processDi.$parent).to.equal(diRoot); })); it('redo', inject(function(commandStack) { // when commandStack.undo(); commandStack.redo(); // then expect(participantBo.$parent).to.equal(collaborationBo); expect(participantBo.processRef).to.equal(processBo); expect(participantBo.processRef.id).to.equal(processBo.id); expect(collaborationBo.$instanceOf('bpmn:Collaboration')).to.be.true; expect(collaborationBo.$parent).to.equal(processBo.$parent); expect(collaborationBo.participants).to.include(participantBo); expect(participantDi.$parent).to.equal(collaborationDi); expect(collaborationDi.$parent).to.equal(diRoot); })); }); describe('creating two participants', function() { beforeEach(inject(function(canvas, modeling) { // when modeling.createElements(participants, { x: 400, y: 375 }, process); collaboration = canvas.getRootElement(); collaborationBo = collaboration.businessObject; collaborationDi = getDi(collaboration); })); it('execute', function() { // then expect(participantBo.$parent).to.equal(collaborationBo); expect(participantBo.processRef).to.equal(processBo); expect(participant2Bo.$parent).to.equal(collaborationBo); expect(participant2Bo.processRef).not.to.equal(processBo); expect(collaborationBo.$instanceOf('bpmn:Collaboration')).to.be.true; expect(collaborationBo.$parent).to.equal(processBo.$parent); expect(collaborationBo.participants).to.include(participantBo); expect(participantDi.$parent).to.equal(collaborationDi); expect(participant2Di.$parent).to.equal(collaborationDi); expect(collaborationDi.$parent).to.equal(diRoot); }); it('undo', inject(function(commandStack) { // when commandStack.undo(); // then expect(participantBo.$parent).not.to.exist; expect(participantBo.processRef).not.to.equal(processBo); expect(participant2Bo.$parent).not.to.exist; expect(participant2Bo.processRef).not.to.equal(processBo); expect(collaborationBo.$parent).not.to.exist; expect(collaborationBo.participants).not.to.include(participantBo); expect(collaborationBo.participants).not.to.include(participant2Bo); expect(processDi.$parent).to.equal(diRoot); })); it('redo', inject(function(commandStack) { // when commandStack.undo(); commandStack.redo(); // then expect(participantBo.$parent).to.equal(collaborationBo); expect(participantBo.processRef).to.equal(processBo); expect(participant2Bo.$parent).to.equal(collaborationBo); expect(participant2Bo.processRef).not.to.equal(processBo); expect(collaborationBo.$instanceOf('bpmn:Collaboration')).to.be.true; expect(collaborationBo.$parent).to.equal(processBo.$parent); expect(collaborationBo.participants).to.include(participantBo); expect(participantDi.$parent).to.equal(collaborationDi); expect(participant2Di.$parent).to.equal(collaborationDi); expect(collaborationDi.$parent).to.equal(diRoot); })); }); }); describe('moving process children', function() { var processDiagramXML = require('../../../../fixtures/bpmn/collaboration/process.bpmn'); beforeEach(bootstrapModeler(processDiagramXML, { modules: testModules })); var collaboration, collaborationDi, participant, process, processDi; beforeEach(inject(function(canvas, elementFactory, modeling) { // given process = canvas.getRootElement(); processDi = getDi(process); participant = elementFactory.createParticipantShape(); // when modeling.createShape(participant, { x: 350, y: 200 }, process); collaboration = canvas.getRootElement(); collaborationDi = getDi(collaboration); })); it('execute', function() { // then expect(collaboration.children).to.have.length(4); collaboration.children.forEach(function(child) { var childDi = getDi(child); expect(childDi.$parent).to.eql(collaborationDi); expect(collaborationDi.planeElement).to.include(childDi); }); expect(participant.children).to.have.length(5); participant.children.forEach(function(child) { var childDi = getDi(child); expect(childDi.$parent).to.eql(collaborationDi); expect(collaborationDi.planeElement).to.include(childDi); }); }); it('undo', inject(function(commandStack) { // when commandStack.undo(); expect(process.children).to.have.length(8); process.children.forEach(function(child) { var childDi = getDi(child); expect(childDi.$parent).to.eql(processDi); expect(processDi.planeElement).to.include(childDi); }); expect(participant.children.length).to.equal(0); })); it('should detach DI when turning process into collaboration', inject(function(modeling) { // when modeling.makeCollaboration(); // then process.children.forEach(function(child) { var childDi = getDi(child); expect(childDi.$parent).not.to.exist; expect(processDi.planeElement).not.to.include(childDi); }); })); }); describe('hovering process when creating first participant', function() { var processDiagramXML = require('../../../../fixtures/bpmn/collaboration/process.bpmn'); beforeEach(bootstrapModeler(processDiagramXML, { modules: testModules })); var participant, process, processGfx, subProcess, subProcessGfx; beforeEach(inject(function(canvas, elementFactory, elementRegistry) { // given process = canvas.getRootElement(); processGfx = canvas.getGraphics(process); participant = elementFactory.createParticipantShape(); subProcess = elementRegistry.get('SubProcess_1'); subProcessGfx = canvas.getGraphics(subProcess); })); it('should ensure hovering process', inject(function(create, dragging, eventBus) { // given create.start(canvasEvent({ x: 100, y: 100 }), participant); var event = eventBus.createEvent({ element: subProcess, gfx: subProcessGfx }); // when eventBus.fire('element.hover', event); // then expect(event.element).to.equal(process); expect(event.gfx).to.equal(processGfx); })); it('should clean up', inject(function(create, dragging, eventBus) { // given create.start(canvasEvent({ x: 100, y: 100 }), participant); // when dragging.end(); // then var event = eventBus.createEvent({ element: subProcess, gfx: subProcessGfx }); eventBus.fire('element.hover', event); expect(event.element).to.equal(subProcess); expect(event.gfx).to.equal(subProcessGfx); })); }); describe('fitting participant (default size)', function() { var processDiagramXML = require('../../../../fixtures/bpmn/collaboration/process.bpmn'); beforeEach(bootstrapModeler(processDiagramXML, { modules: testModules })); var participant, process, processGfx; beforeEach(inject(function(canvas, create, dragging, elementFactory) { // given process = canvas.getRootElement(); processGfx = canvas.getGraphics(process); participant = elementFactory.createParticipantShape(); create.start(canvasEvent({ x: 100, y: 100 }), participant); dragging.hover({ element: process, gfx: processGfx }); })); it('should fit participant', inject(function(elementFactory) { // then var defaultSize = elementFactory.getDefaultSize(participant); expect(participant.width).to.equal(defaultSize.width); expect(participant.height).to.equal(defaultSize.height); })); describe('create constraints', function() { function expectBoundsWithin(inner, outer, padding) { expect(inner.top >= outer.top + padding.top).to.be.true; expect(inner.right <= outer.right - padding.right).to.be.true; expect(inner.bottom <= outer.bottom - padding.bottom).to.be.true; expect(inner.left >= outer.left + padding.left).to.be.true; } var padding = { top: 20, right: 20, bottom: 20, left: 50 }; [ { x: 0, y: 0 }, { x: 1000, y: 0 }, { x: 0, y: 1000 }, { x: 1000, y: 1000 } ].forEach(function(position) { it('should constrain ' + JSON.stringify(position), inject(function(dragging) { // when dragging.move(canvasEvent(position)); dragging.end(); // then expectBoundsWithin( asTRBL(getBBox(participant.children)), asTRBL(getBBox(participant)), padding ); })); }); }); }); describe('fitting participant (only groups)', function() { var processDiagramXML = require('../../../../fixtures/bpmn/collaboration/process-empty.bpmn'); beforeEach(bootstrapModeler(processDiagramXML, { modules: testModules })); it('should fit participant', inject( function(canvas, create, dragging, elementFactory, modeling) { // given var process = canvas.getRootElement(), processGfx = canvas.getGraphics(process), participant = elementFactory.createParticipantShape(), groupElement = elementFactory.createShape({ type: 'bpmn:Group' }); modeling.createShape(groupElement, { x: 100, y: 100 }, process); // when create.start(canvasEvent({ x: 100, y: 100 }), participant); dragging.hover({ element: process, gfx: processGfx }); // then var defaultSize = elementFactory.getDefaultSize(participant); expect(participant.width).to.equal(defaultSize.width); expect(participant.height).to.equal(defaultSize.height); } )); }); }); describe('collaboration', function() { var collaborationDiagramXML = require('../../../../fixtures/bpmn/collaboration/collaboration-participant.bpmn'); beforeEach(bootstrapModeler(collaborationDiagramXML, { modules: testModules })); var collaborationBo, participant, participantBo, rootElement; beforeEach(inject(function(canvas, elementFactory, modeling) { // given rootElement = canvas.getRootElement(); collaborationBo = rootElement.businessObject; participant = elementFactory.createParticipantShape(); participantBo = participant.businessObject; // when modeling.createShape(participant, { x: 350, y: 500 }, rootElement); })); it('execute', function() { // then expect(rootElement.children).to.include(participant); expect(participantBo.$parent).to.equal(collaborationBo); expect(collaborationBo.participants).to.include(participantBo); }); it('undo', inject(function(commandStack) { // when commandStack.undo(); // then expect(rootElement.children).not.to.include(participant); expect(participantBo.$parent).not.to.exist; expect(collaborationBo.participants).not.to.include(participantBo); })); }); });