bpmn-js/test/spec/features/modeling/behavior/util/LineAttachmentUtilSpec.js

301 lines
6.0 KiB
JavaScript

var getAttachment = require('lib/features/modeling/behavior/util/LineAttachmentUtil').getAttachment;
var EPSILON = 0.1;
describe('modeling/behavior/util - LineAttachmentUtil#getAttachment', function() {
// test line
//
// *--*
// |
// *
// \
// *
//
var line = [
{ x: 10, y: 10 },
// -
{ x: 30, y: 10 },
// |
{ x: 30, y: 30 },
// \
{ x: 130, y: 130 }
];
describe('should recognize segment', function() {
it('horizontal', function() {
// when
var attachment = getAttachment({ x: 20, y: 5 }, line);
// then
expect(attachment).to.eql({
type: 'segment',
position: { x: 20, y: 10 },
segmentIndex: 0,
relativeLocation: 0.5
});
});
it('horizontal (on line)', function() {
// when
var attachment = getAttachment({ x: 20, y: 10 }, line);
// then
expect(attachment).to.eql({
type: 'segment',
position: { x: 20, y: 10 },
segmentIndex: 0,
relativeLocation: 0.5
});
});
it('vertical', function() {
// when
var attachment = getAttachment({ x: 40, y: 20 }, line);
// then
expect(attachment).to.eql({
type: 'segment',
position: { x: 30, y: 20 },
segmentIndex: 1,
relativeLocation: 0.5
});
});
it('diagonal', function() {
// when
var attachment = getAttachment({ x: 30, y: 40 }, line);
// then
expect(attachment).to.eql({
type: 'segment',
position: { x: 35, y: 35 },
segmentIndex: 2,
relativeLocation: 0.05
});
});
it('diagonal (on line)', function() {
// when
var attachment = getAttachment({ x: 50, y: 50 }, line);
// then
expect(attachment).to.eql({
type: 'segment',
position: { x: 50, y: 50 },
segmentIndex: 2,
relativeLocation: 0.2
});
});
it('horizontal (conflicting with vertical)', function() {
// when
var attachment = getAttachment({ x: 25, y: 15 }, line);
// then
expect(attachment).to.eql({
type: 'segment',
position: { x: 25, y: 10 },
segmentIndex: 0,
relativeLocation: 0.75
});
});
});
describe('should recognize bendpoint', function() {
it('horizontal', function() {
// when
var attachment = getAttachment({ x: 35, y: 5 }, line);
// then
expect(attachment).to.eql({
type: 'bendpoint',
position: { x: 30, y: 10 },
bendpointIndex: 1,
segmentIndex: 0
});
});
it('horizontal (segment start)', function() {
// when
var attachment = getAttachment({ x: 5, y: 5 }, line);
// then
expect(attachment).to.eql({
type: 'bendpoint',
position: { x: 10, y: 10 },
bendpointIndex: 0,
segmentIndex: 0
});
});
it('vertical', function() {
// when
var attachment = getAttachment({ x: 35, y: 10 }, line);
// then
expect(attachment).to.eql({
type: 'bendpoint',
position: { x: 30, y: 10 },
bendpointIndex: 1,
segmentIndex: 0
});
});
it('vertical (segment start)', function() {
var otherLine = [
{ x: 10, y: 10 },
{ x: 10, y: 50 }
];
// when
var attachment = getAttachment({ x: 5, y: 5 }, otherLine);
// then
expect(attachment).to.eql({
type: 'bendpoint',
position: { x: 10, y: 10 },
bendpointIndex: 0,
segmentIndex: 0
});
});
});
describe('should handle float values', function() {
// test line
//
// *--*
// |
// *
// \
// *
//
var floatingPointLine = [
{ x: 10.141592, y: 10.653589 },
// -
{ x: 30.793238, y: 10.462643 },
// |
{ x: 30.383279, y: 30.502884 },
// \
{ x: 130.197169, y: 130.399375 }
];
it('float value segment', function() {
// when
var attachment = getAttachment({ x: 20.197169, y: 5.399375 }, floatingPointLine);
// then
expect(attachment.type).to.equal('segment');
expect(attachment.segmentIndex).to.equal(0);
// expect values to be roughly equal
expect(attachment.relativeLocation).to.be.within(0.5 - EPSILON, 0.5 + EPSILON);
expect(attachment.position.x).to.be.within(20.25 - EPSILON, 20.25 + EPSILON);
expect(attachment.position.y).to.be.within(10.5 - EPSILON, 10.5 + EPSILON);
});
it('float value bendboint', function() {
// when
var attachment = getAttachment({ x: 35.197169, y: 5.399375 }, floatingPointLine);
// then
expect(attachment.type).to.equal('bendpoint');
expect(attachment.segmentIndex).to.equal(1);
expect(attachment.bendpointIndex).to.equal(1);
// expect values to be roughly equal
expect(attachment.position.x).to.be.within(30.793 - EPSILON, 30.793 + EPSILON);
expect(attachment.position.y).to.be.within(10.463 - EPSILON, 10.463 + EPSILON);
});
});
describe('handle zero-length line', function() {
var zeroLengthLine = [
{ x: 10, y: 10 },
// -
{ x: 10, y: 10 }
];
var zeroLengthFloatingPointLine = [
{ x: 10.1, y: 10.12313 },
// -
{ x: 10, y: 10.112 }
];
it('should treat zero-length as bendpoint attach', function() {
// when
var attachment = getAttachment({ x: 15.1, y: 15.123 }, zeroLengthLine);
// then
expect(attachment).to.eql({
type: 'bendpoint',
position: { x: 10, y: 10 },
segmentIndex: 0,
bendpointIndex: 0
});
});
it('should treat approx zero-length as bendpoint attach', function() {
// when
var attachment = getAttachment({ x: 15.1, y: 15.123 }, zeroLengthFloatingPointLine);
// then
expect(attachment).to.eql({
type: 'bendpoint',
position: { x: 10.1, y: 10.12313 },
segmentIndex: 0,
bendpointIndex: 0
});
});
});
});