bpmn-js/test/spec/features/ordering/Helper.js

215 lines
3.8 KiB
JavaScript

import {
getBpmnJS
} from 'test/TestHelper';
import {
map,
forEach
} from 'min-dash';
function sign(x) {
x = +x; // convert to a number
if (x === 0 || isNaN(x)) {
return x;
}
return x > 0 ? 1 : -1;
}
export function move(elementIds, delta, targetId, isAttach) {
if (typeof elementIds === 'string') {
elementIds = [ elementIds ];
}
if (typeof delta !== 'object') {
isAttach = targetId;
targetId = delta;
delta = { x: 0, y: 0 };
}
if (typeof targetId !== 'string') {
isAttach = targetId;
targetId = null;
}
return getBpmnJS().invoke(function(canvas, elementRegistry, modeling) {
function getElement(id) {
var element = elementRegistry.get(id);
expect(element).to.exist;
return element;
}
var elements = map(elementIds, getElement),
target;
if (targetId === 'Root') {
target = canvas.getRootElement();
} else {
target = targetId && getElement(targetId);
}
var hints = isAttach ? { attach: true } : {};
return modeling.moveElements(elements, delta, target, hints);
});
}
export function add(attrs, position, target, isAttach) {
return getBpmnJS().invoke(function(canvas, elementRegistry, modeling) {
function getElement(id) {
var element = elementRegistry.get(id);
expect(element).to.exist;
return element;
}
if (!target) {
target = canvas.getRootElement();
} else
if (typeof target === 'string') {
target = getElement(target);
}
return modeling.createShape(attrs, position, target, { attach: isAttach });
});
}
export function connect(source, target) {
return getBpmnJS().invoke(function(canvas, elementRegistry, modeling) {
function getElement(id) {
var element = elementRegistry.get(id);
expect(element).to.exist;
return element;
}
if (typeof target === 'string') {
target = getElement(target);
}
if (typeof source === 'string') {
source = getElement(source);
}
return modeling.connect(source, target);
});
}
export function attach(attrs, position, target) {
return add(attrs, position, target, true);
}
function getAncestors(element) {
var ancestors = [];
while (element) {
ancestors.push(element);
element = element.parent;
}
return ancestors;
}
function compareZOrder(a, b) {
var elementA,
elementB;
getBpmnJS().invoke(function(elementRegistry) {
function getElement(id) {
var element = elementRegistry.get(id);
expect(element).to.exist;
return element;
}
if (typeof a === 'string') {
a = getElement(a);
}
if (typeof b === 'string') {
b = getElement(b);
}
elementA = a;
elementB = b;
});
var aAncestors = getAncestors(elementA),
bAncestors = getAncestors(elementB);
var sharedRoot = aAncestors.reduce(function(result, aAncestor, aParentIndex) {
if (result) {
return result;
}
var bParentIndex = bAncestors.indexOf(aAncestor);
if (bParentIndex !== -1) {
return {
a: aAncestors[aParentIndex - 1],
b: bAncestors[bParentIndex - 1],
parent: aAncestor
};
}
}, false);
// b contained in a
if (!sharedRoot.a) {
return -1;
}
// a contained in b
if (!sharedRoot.b) {
return 1;
}
var aIndex = sharedRoot.parent.children.indexOf(sharedRoot.a),
bIndex = sharedRoot.parent.children.indexOf(sharedRoot.b);
return sign(aIndex - bIndex);
}
export function expectZOrder() {
var elements = Array.prototype.slice.call(arguments);
var next;
forEach(elements, function(e, idx) {
next = elements[idx + 1];
if (next && compareZOrder(e, next) !== -1) {
throw new Error(
'expected <element#' + next + '> to be in front of <element#' + e + '>'
);
}
});
return true;
}