mirror of
https://github.com/mermaid-js/mermaid.git
synced 2025-01-28 07:03:17 +08:00
132 lines
3.5 KiB
JavaScript
132 lines
3.5 KiB
JavaScript
import { addToRender } from './flowChartShapes';
|
|
|
|
describe('flowchart shapes', function() {
|
|
// rect-based shapes
|
|
[
|
|
['stadium', useWidth, useHeight]
|
|
].forEach(function([shapeType, getW, getH]) {
|
|
it(`should add a ${shapeType} shape that renders a properly positioned rect element`, function() {
|
|
const mockRender = MockRender();
|
|
const mockSvg = MockSvg();
|
|
addToRender(mockRender);
|
|
|
|
[[100, 100], [123, 45], [71, 300]].forEach(function([width, height]) {
|
|
const shape = mockRender.shapes()[shapeType](mockSvg, { width, height }, {});
|
|
const w = width + height / 4;
|
|
const h = height;
|
|
const dx = -getW(w, h) / 2;
|
|
const dy = -getH(w, h) / 2;
|
|
expect(shape.__tag).toEqual('rect');
|
|
expect(shape.__attrs).toHaveProperty('x', dx);
|
|
expect(shape.__attrs).toHaveProperty('y', dy);
|
|
});
|
|
});
|
|
});
|
|
|
|
// path-based shapes
|
|
[
|
|
['cylinder', useWidth, useHeight]
|
|
].forEach(function([shapeType, getW, getH]) {
|
|
it(`should add a ${shapeType} shape that renders a properly positioned path element`, function() {
|
|
const mockRender = MockRender();
|
|
const mockSvg = MockSvg();
|
|
addToRender(mockRender);
|
|
|
|
[[100, 100], [123, 45], [71, 300]].forEach(function([width, height]) {
|
|
const shape = mockRender.shapes()[shapeType](mockSvg, { width, height }, {});
|
|
expect(shape.__tag).toEqual('path');
|
|
expect(shape.__attrs).toHaveProperty('d');
|
|
});
|
|
});
|
|
});
|
|
|
|
// polygon-based shapes
|
|
[
|
|
[
|
|
'question',
|
|
4,
|
|
function(w, h) {
|
|
return (w + h) * 0.9;
|
|
},
|
|
function(w, h) {
|
|
return (w + h) * 0.9;
|
|
}
|
|
],
|
|
[
|
|
'hexagon',
|
|
6,
|
|
function(w, h) {
|
|
return w + h / 2;
|
|
},
|
|
useHeight
|
|
],
|
|
['rect_left_inv_arrow', 5, useWidth, useHeight],
|
|
['rect_right_inv_arrow', 5, useWidth, useHeight],
|
|
['lean_right', 4, useWidth, useHeight],
|
|
['lean_left', 4, useWidth, useHeight],
|
|
['trapezoid', 4, useWidth, useHeight],
|
|
['inv_trapezoid', 4, useWidth, useHeight]
|
|
].forEach(function([shapeType, expectedPointCount, getW, getH]) {
|
|
it(`should add a ${shapeType} shape that renders a properly translated polygon element`, function() {
|
|
const mockRender = MockRender();
|
|
const mockSvg = MockSvg();
|
|
addToRender(mockRender);
|
|
|
|
[[100, 100], [123, 45], [71, 300]].forEach(function([width, height]) {
|
|
const shape = mockRender.shapes()[shapeType](mockSvg, { width, height }, {});
|
|
const dx = -getW(width, height) / 2;
|
|
const dy = getH(width, height) / 2;
|
|
const points = shape.__attrs.points.split(' ');
|
|
expect(shape.__tag).toEqual('polygon');
|
|
expect(shape.__attrs).toHaveProperty('transform', `translate(${dx},${dy})`);
|
|
expect(points).toHaveLength(expectedPointCount);
|
|
});
|
|
});
|
|
});
|
|
});
|
|
|
|
function MockRender() {
|
|
const shapes = {};
|
|
return {
|
|
shapes() {
|
|
return shapes;
|
|
}
|
|
};
|
|
}
|
|
|
|
function MockSvg(tag, ...args) {
|
|
const children = [];
|
|
const attributes = {};
|
|
return {
|
|
get __args() {
|
|
return args;
|
|
},
|
|
get __tag() {
|
|
return tag;
|
|
},
|
|
get __children() {
|
|
return children;
|
|
},
|
|
get __attrs() {
|
|
return attributes;
|
|
},
|
|
insert: function(tag, ...args) {
|
|
const child = MockSvg(tag, ...args);
|
|
children.push(child);
|
|
return child;
|
|
},
|
|
attr(name, value) {
|
|
this.__attrs[name] = value;
|
|
return this;
|
|
}
|
|
};
|
|
}
|
|
|
|
function useWidth(w, h) {
|
|
return w;
|
|
}
|
|
|
|
function useHeight(w, h) {
|
|
return h;
|
|
}
|