text: import {
    bootstrapModeler,
    inject
  } from 'test/TestHelper';
  
  var pick = require('min-dash').pick;
  
  var getBBox = require('diagram-js/lib/util/Elements').getBBox;
  
  var getParent = require('lib/features/modeling/util/ModelingUtil').getParent;
  
  
  import bpmnEditorActionsModule from 'lib/features/editor-actions';
  import selectionModule from 'diagram-js/lib/features/selection';
  import alignElementsModule from 'diagram-js/lib/features/align-elements';
  import distributeElementsModule from 'diagram-js/lib/features/distribute-elements';
  import modelingModule from 'lib/features/modeling';
  import coreModule from 'lib/core';
  
  var basicXML = require('../../../fixtures/bpmn/nested-subprocesses.bpmn');
  var collaborationXML = require('../../../fixtures/bpmn/collaboration.bpmn');
  
  
  describe('features/editor-actions', function() {
  
    describe('#moveToOrigin', function() {
  
      function testMoveToOrigin(xml) {
  
        return function() {
  
          beforeEach(bootstrapModeler(xml, {
            modules: [
              bpmnEditorActionsModule,
              modelingModule,
              coreModule
            ]
          }));
  
  
          it('should move to origin', inject(function(editorActions) {
  
            // given
            var elements = editorActions.trigger('selectElements'),
                boundingBox;
  
            // when
            editorActions.trigger('moveToOrigin');
  
            boundingBox = getBBox(elements);
  
            // then
            expect(pick(boundingBox, [ 'x', 'y' ])).to.eql({ x: 0, y: 0 });
          }));
  
        };
  
      }
  
  
      describe('single process', testMoveToOrigin(basicXML));
  
  
      describe('collaboration', testMoveToOrigin(collaborationXML));
  
  
      describe('subprocesses', function() {
  
        beforeEach(bootstrapModeler(basicXML, {
          modules: [
            bpmnEditorActionsModule,
            modelingModule,
            coreModule
          ]
        }));
  
        it('should ignore children of subprocesses', inject(
          function(editorActions, elementRegistry) {
  
            // given
            var startEvent = elementRegistry.get('StartEvent_3'),
                startEventParent = getParent(startEvent);
  
            // when
            editorActions.trigger('moveToOrigin');
  
            // then
            expect(getParent(startEvent)).to.equal(startEventParent);
          }
        ));
  
      });
  
    });
  
  
    describe('#alignElements', function() {
  
      beforeEach(bootstrapModeler(basicXML, {
        modules: [
          selectionModule,
          alignElementsModule,
          bpmnEditorActionsModule,
          modelingModule,
          coreModule
        ]
      }));
  
  
      it('should align items', inject(
        function(elementRegistry, selection, editorActions) {
  
          // given
          var elementIds = [ 'StartEvent_1', 'UserTask_1', 'EndEvent_1' ];
          var elements = elementIds.map(function(id) {
            return elementRegistry.get(id);
          });
  
          // when
          selection.select(elements);
          editorActions.trigger('alignElements', { type: 'middle' });
  
          // then
          expect(elements.map(function(e) {
            return e.y + e.height / 2;
          })).to.eql([ 311, 311, 311 ]);
        }
      ));
  
  
      it('should not align if too few elements', inject(
        function(elementRegistry, eventBus, editorActions, selection) {
  
          // given
          var elementIds = [ 'StartEvent_1' ];
          var elements = elementIds.map(function(id) {
            return elementRegistry.get(id);
          });
  
          var changedSpy = sinon.spy();
  
          // when
          eventBus.once('commandStack.changed', changedSpy);
  
          selection.select(elements);
          editorActions.trigger('alignElements', { type: 'center' });
  
          // then
          expect(changedSpy).not.to.have.been.called;
        }
      ));
  
    });
  
  
    describe('#distributeElements', function() {
  
      beforeEach(bootstrapModeler(basicXML, {
        modules: [
          selectionModule,
          distributeElementsModule,
          bpmnEditorActionsModule,
          modelingModule,
          coreModule
        ]
      }));
  
  
      it('should distribute items', inject(
        function(elementRegistry, selection, editorActions) {
  
          // given
          var elementIds = [ 'StartEvent_1', 'UserTask_1', 'EndEvent_1' ];
          var elements = elementIds.map(function(id) {
            return elementRegistry.get(id);
          });
  
          // when
          selection.select(elements);
          editorActions.trigger('distributeElements', { type: 'horizontal' });
  
          // then
          expect(elements.map(function(e) {
            return e.x + e.width / 2;
          })).to.eql([ 433, 574, 714 ]);
        }
      ));
  
  
      it('should not distribute if too few elements', inject(
        function(elementRegistry, eventBus, editorActions, selection) {
  
          // given
          var elementIds = [ 'StartEvent_1', 'UserTask_1' ];
          var elements = elementIds.map(function(id) {
            return elementRegistry.get(id);
          });
  
          var changedSpy = sinon.spy();
  
          // when
          eventBus.once('commandStack.changed', changedSpy);
  
          selection.select(elements);
          editorActions.trigger('distributeElements', { type: 'horizontal' });
  
          // then
          expect(changedSpy).not.to.have.been.called;
        }
      ));
  
    });
  
  });
  