From b6f4d826eae9434c3af99bdc8127412a6af7a168 Mon Sep 17 00:00:00 2001 From: Thomas Bouffard <27200110+tbouffard@users.noreply.github.com> Date: Thu, 4 Dec 2025 16:09:55 +0100 Subject: [PATCH] fix: correctly ignore activity and task label bounds The position (x and y coordinates) were not ignored. Only the global positioning of the label, relative to the shape was updated. Also rename some visual tests prior adding new ones. --- src/component/mxgraph/BpmnRenderer.ts | 31 +++- .../mxgraph/renderer/StyleComputer.ts | 49 +------ ...ivities.with.wrongly.positioned.labels.png | Bin 0 -> 28443 bytes .../ignored/labels.with.font.styles.png | Bin 0 -> 15164 bytes ...ivities.with.wrongly.positioned.labels.png | Bin 0 -> 30228 bytes .../not-ignored/labels.with.font.styles.png | Bin 0 -> 14996 bytes .../e2e/bpmn.rendering.ignore.options.test.ts | 138 ++++++++++++++++++ ...vities.with.wrongly.positioned.labels.bpmn | 49 +++++++ .../labels.with.font.styles.bpmn | 34 +++++ .../pools.01.labels.and.lanes.bpmn | 4 + .../pools.02.vertical.with.lanes.bpmn | 8 + .../bpmn-rendering/pools.03.black.box.bpmn | 4 + test/shared/visu/bpmn-page-utils.ts | 5 + .../component/mxgraph/BpmnRenderer.test.ts | 85 +++++++++++ .../mxgraph/renderer/StyleComputer.test.ts | 132 ----------------- 15 files changed, 356 insertions(+), 183 deletions(-) create mode 100644 test/e2e/__image_snapshots__/bpmn-rendering-ignore-options/ignored/activities.with.wrongly.positioned.labels.png create mode 100644 test/e2e/__image_snapshots__/bpmn-rendering-ignore-options/ignored/labels.with.font.styles.png create mode 100644 test/e2e/__image_snapshots__/bpmn-rendering-ignore-options/not-ignored/activities.with.wrongly.positioned.labels.png create mode 100644 test/e2e/__image_snapshots__/bpmn-rendering-ignore-options/not-ignored/labels.with.font.styles.png create mode 100644 test/e2e/bpmn.rendering.ignore.options.test.ts create mode 100644 test/fixtures/bpmn/bpmn-rendering-ignore-options/activities.with.wrongly.positioned.labels.bpmn create mode 100644 test/fixtures/bpmn/bpmn-rendering-ignore-options/labels.with.font.styles.bpmn create mode 100644 test/unit/component/mxgraph/BpmnRenderer.test.ts diff --git a/src/component/mxgraph/BpmnRenderer.ts b/src/component/mxgraph/BpmnRenderer.ts index 6d4819e374..b96c46c269 100644 --- a/src/component/mxgraph/BpmnRenderer.ts +++ b/src/component/mxgraph/BpmnRenderer.ts @@ -34,11 +34,18 @@ import StyleComputer from './renderer/StyleComputer'; * @internal */ export class BpmnRenderer { + private readonly ignoreBpmnActivityLabelBounds: boolean; + private readonly ignoreBpmnTaskLabelBounds: boolean; + constructor( readonly graph: BpmnGraph, readonly coordinatesTranslator: CoordinatesTranslator, readonly styleComputer: StyleComputer, - ) {} + rendererOptions: RendererOptions, + ) { + this.ignoreBpmnActivityLabelBounds = rendererOptions?.ignoreBpmnActivityLabelBounds ?? false; + this.ignoreBpmnTaskLabelBounds = rendererOptions?.ignoreBpmnTaskLabelBounds ?? false; + } render(renderedModel: RenderedModel): void { this.insertShapesAndEdges(renderedModel); @@ -71,9 +78,7 @@ export class BpmnRenderer { const bpmnElement = shape.bpmnElement; const parent = this.getParent(bpmnElement); const bounds = shape.bounds; - let labelBounds = shape.label?.bounds; - // pool/lane label bounds are not managed for now (use hard coded values) - labelBounds = ShapeUtil.isPoolOrLane(bpmnElement.kind) ? undefined : labelBounds; + const labelBounds = isLabelBoundsIgnored(shape, this.ignoreBpmnActivityLabelBounds, this.ignoreBpmnTaskLabelBounds) ? undefined : shape.label?.bounds; const style = this.styleComputer.computeStyle(shape, labelBounds); this.insertVertex(parent, bpmnElement.id, bpmnElement.name, bounds, labelBounds, style); @@ -139,11 +144,27 @@ export class BpmnRenderer { } } +/** + * @internal + */ +export function isLabelBoundsIgnored(shape: Shape, ignoreBpmnActivityLabelBounds: boolean, ignoreBpmnTaskLabelBounds: boolean): boolean { + const kind = shape.bpmnElement.kind; + if (ShapeUtil.isPoolOrLane(kind)) { + return true; + } + + if (ignoreBpmnActivityLabelBounds && ShapeUtil.isActivity(kind)) { + return true; + } + + return ignoreBpmnTaskLabelBounds && ShapeUtil.isTask(kind); +} + /** * @internal */ export function newBpmnRenderer(graph: BpmnGraph, options: RendererOptions): BpmnRenderer { - return new BpmnRenderer(graph, new CoordinatesTranslator(graph), new StyleComputer(options)); + return new BpmnRenderer(graph, new CoordinatesTranslator(graph), new StyleComputer(options), options); } /** diff --git a/src/component/mxgraph/renderer/StyleComputer.ts b/src/component/mxgraph/renderer/StyleComputer.ts index 7bb645a603..d24cb54c42 100644 --- a/src/component/mxgraph/renderer/StyleComputer.ts +++ b/src/component/mxgraph/renderer/StyleComputer.ts @@ -40,14 +40,10 @@ import { BpmnStyleIdentifier } from '../style'; export default class StyleComputer { private readonly ignoreBpmnColors: boolean; private readonly ignoreBpmnLabelStyles: boolean; - private readonly ignoreBpmnActivityLabelBounds: boolean; - private readonly ignoreBpmnTaskLabelBounds: boolean; constructor(options?: RendererOptions) { this.ignoreBpmnColors = options?.ignoreBpmnColors ?? true; this.ignoreBpmnLabelStyles = options?.ignoreBpmnLabelStyles ?? false; - this.ignoreBpmnActivityLabelBounds = options?.ignoreBpmnActivityLabelBounds ?? false; - this.ignoreBpmnTaskLabelBounds = options?.ignoreBpmnTaskLabelBounds ?? false; } computeStyle(bpmnCell: Shape | Edge, labelBounds: Bounds): string { @@ -62,16 +58,12 @@ export default class StyleComputer { } const fontStyleValues = this.computeFontStyleValues(bpmnCell); - const labelStyleValues = this.computeLabelStyleValues(bpmnCell, labelBounds); + const labelStyleValues = computeLabelStyleValues(bpmnCell, labelBounds); styles.push(...toArrayOfMxGraphStyleEntries([...mainStyleValues, ...fontStyleValues, ...labelStyleValues])); return styles.join(';'); } - private computeLabelStyleValues(bpmnCell: Shape | Edge, labelBounds: Bounds): Map { - return computeLabelStyleValues(bpmnCell, labelBounds, this.ignoreBpmnActivityLabelBounds, this.ignoreBpmnTaskLabelBounds); - } - private computeShapeStyleValues(shape: Shape): Map { const styleValues = new Map(); const bpmnElement = shape.bpmnElement; @@ -182,20 +174,11 @@ function computeEdgeBaseStyles(edge: Edge): string[] { return styles; } -function computeLabelStyleValues( - bpmnCell: Shape | Edge, - labelBounds: Bounds, - ignoreBpmnActivityLabelBounds: boolean, - ignoreBpmnTaskLabelBounds: boolean, -): Map { +function computeLabelStyleValues(bpmnCell: Shape | Edge, labelBounds: Bounds): Map { const styleValues = new Map(); const bpmnElement = bpmnCell.bpmnElement; - - // Check if we should ignore label bounds for this element - const shouldIgnoreLabelBounds = shouldIgnoreBpmnLabelBounds(bpmnCell, ignoreBpmnActivityLabelBounds, ignoreBpmnTaskLabelBounds); - - if (labelBounds && !shouldIgnoreLabelBounds) { + if (labelBounds) { styleValues.set(mxConstants.STYLE_VERTICAL_ALIGN, mxConstants.ALIGN_TOP); if (bpmnCell.bpmnElement.kind != ShapeBpmnElementKind.TEXT_ANNOTATION) { styleValues.set(mxConstants.STYLE_ALIGN, mxConstants.ALIGN_CENTER); @@ -224,32 +207,6 @@ function computeLabelStyleValues( return styleValues; } -/** - * Determines if label bounds should be ignored based on the element type and options. - */ -function shouldIgnoreBpmnLabelBounds(bpmnCell: Shape | Edge, ignoreBpmnActivityLabelBounds: boolean, ignoreBpmnTaskLabelBounds: boolean): boolean { - // Only apply to shapes, not edges - if (!(bpmnCell instanceof Shape)) { - return false; - } - - const bpmnElement = bpmnCell.bpmnElement; - - // If ignoring all activity label bounds - if (ignoreBpmnActivityLabelBounds && bpmnElement instanceof ShapeBpmnActivity) { - return true; - } - - // If ignoring task label bounds only, check if it's a task (but not subprocess or call activity) - if (ignoreBpmnTaskLabelBounds && bpmnElement instanceof ShapeBpmnActivity) { - // Activities include tasks, sub-processes, and call activities - // We only want to ignore bounds for tasks, not sub-processes or call activities - return !(bpmnElement instanceof ShapeBpmnSubProcess) && !(bpmnElement instanceof ShapeBpmnCallActivity); - } - - return false; -} - /** * @internal * @private diff --git a/test/e2e/__image_snapshots__/bpmn-rendering-ignore-options/ignored/activities.with.wrongly.positioned.labels.png b/test/e2e/__image_snapshots__/bpmn-rendering-ignore-options/ignored/activities.with.wrongly.positioned.labels.png new file mode 100644 index 0000000000000000000000000000000000000000..73c01805926ec776a73754189530abea33d820e9 GIT binary patch literal 28443 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 literal 0 HcmV?d00001 diff --git a/test/e2e/__image_snapshots__/bpmn-rendering-ignore-options/ignored/labels.with.font.styles.png b/test/e2e/__image_snapshots__/bpmn-rendering-ignore-options/ignored/labels.with.font.styles.png new file mode 100644 index 0000000000000000000000000000000000000000..79ecfc1d4025e5a211319e8737778b3c63e74cb9 GIT binary patch literal 15164 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 PBOrMh73tDfCLjM7fXT+6 literal 0 HcmV?d00001 diff --git a/test/e2e/__image_snapshots__/bpmn-rendering-ignore-options/not-ignored/activities.with.wrongly.positioned.labels.png b/test/e2e/__image_snapshots__/bpmn-rendering-ignore-options/not-ignored/activities.with.wrongly.positioned.labels.png new file mode 100644 index 0000000000000000000000000000000000000000..db365ef543ed5dbd842c19034bc9112caafb2c1f GIT binary patch literal 30228 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 B+A{zE literal 0 HcmV?d00001 diff --git a/test/e2e/__image_snapshots__/bpmn-rendering-ignore-options/not-ignored/labels.with.font.styles.png b/test/e2e/__image_snapshots__/bpmn-rendering-ignore-options/not-ignored/labels.with.font.styles.png new file mode 100644 index 0000000000000000000000000000000000000000..543118da1945e4ff472386ab8405db769138da08 GIT binary patch literal 14996 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 J%2!rz{s+FpzYhQa literal 0 HcmV?d00001 diff --git a/test/e2e/bpmn.rendering.ignore.options.test.ts b/test/e2e/bpmn.rendering.ignore.options.test.ts new file mode 100644 index 0000000000..1966bdee40 --- /dev/null +++ b/test/e2e/bpmn.rendering.ignore.options.test.ts @@ -0,0 +1,138 @@ +/* +Copyright 2025 Bonitasoft S.A. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import type { ImageSnapshotThresholdConfig } from './helpers/visu/image-snapshot-config'; + +import { ImageSnapshotConfigurator, MultiBrowserImageSnapshotThresholds } from './helpers/visu/image-snapshot-config'; + +import { AvailableTestPages, PageTester } from '@test/shared/visu/bpmn-page-utils'; + +class ImageSnapshotThresholdsActivityLabelBounds extends MultiBrowserImageSnapshotThresholds { + constructor() { + super({ chromium: 0 / 100, firefox: 0 / 100, webkit: 0 / 100 }); + } + + protected override getChromiumThresholds(): Map { + return new Map(); + } + + protected override getFirefoxThresholds(): Map { + return new Map(); + } + + protected override getWebkitThresholds(): Map { + return new Map(); + } +} + +class ImageSnapshotThresholdsActivityLabelBoundsIgnored extends MultiBrowserImageSnapshotThresholds { + constructor() { + super({ chromium: 0 / 100, firefox: 0 / 100, webkit: 0 / 100 }); + } + + protected override getChromiumThresholds(): Map { + return new Map(); + } + + protected override getFirefoxThresholds(): Map { + return new Map(); + } + + protected override getWebkitThresholds(): Map { + return new Map(); + } +} + +class ImageSnapshotThresholdsLabelStyles extends MultiBrowserImageSnapshotThresholds { + constructor() { + super({ chromium: 0 / 100, firefox: 0 / 100, webkit: 0 / 100 }); + } + + protected override getChromiumThresholds(): Map { + return new Map(); + } + + protected override getFirefoxThresholds(): Map { + return new Map(); + } + + protected override getWebkitThresholds(): Map { + return new Map(); + } +} + +class ImageSnapshotThresholdsLabelStylesIgnored extends MultiBrowserImageSnapshotThresholds { + constructor() { + super({ chromium: 0 / 100, firefox: 0 / 100, webkit: 0 / 100 }); + } + + protected override getChromiumThresholds(): Map { + return new Map(); + } + + protected override getFirefoxThresholds(): Map { + return new Map(); + } + + protected override getWebkitThresholds(): Map { + return new Map(); + } +} + +describe('BPMN rendering - ignore options', () => { + const diagramSubfolder = 'bpmn-rendering-ignore-options'; + const pageTester = new PageTester({ targetedPage: AvailableTestPages.BPMN_RENDERING, diagramSubfolder }, page); + + describe('Ignore activity label bounds', () => { + const bpmnDiagramName = 'activities.with.wrongly.positioned.labels'; + + describe.each([false, true])('ignoreBpmnActivityLabelBounds: %s', (ignoreBpmnActivityLabelBounds: boolean) => { + const imageSnapshotConfigurator = ignoreBpmnActivityLabelBounds + ? new ImageSnapshotConfigurator(new ImageSnapshotThresholdsActivityLabelBoundsIgnored(), 'bpmn-rendering-ignore-options/ignored') + : new ImageSnapshotConfigurator(new ImageSnapshotThresholdsActivityLabelBounds(), 'bpmn-rendering-ignore-options/not-ignored'); + + it(`${bpmnDiagramName}`, async () => { + await pageTester.gotoPageAndLoadBpmnDiagram(bpmnDiagramName, { + rendererIgnoreBpmnActivityLabelBounds: ignoreBpmnActivityLabelBounds, + }); + + const image = await page.screenshot({ fullPage: true }); + const config = imageSnapshotConfigurator.getConfig(bpmnDiagramName); + expect(image).toMatchImageSnapshot(config); + }); + }); + }); + + describe('Ignore label styles', () => { + const bpmnDiagramName = 'labels.with.font.styles'; + + describe.each([false, true])('ignoreBpmnLabelStyles: %s', (ignoreBpmnLabelStyles: boolean) => { + const imageSnapshotConfigurator = ignoreBpmnLabelStyles + ? new ImageSnapshotConfigurator(new ImageSnapshotThresholdsLabelStylesIgnored(), 'bpmn-rendering-ignore-options/ignored') + : new ImageSnapshotConfigurator(new ImageSnapshotThresholdsLabelStyles(), 'bpmn-rendering-ignore-options/not-ignored'); + + it(`${bpmnDiagramName}`, async () => { + await pageTester.gotoPageAndLoadBpmnDiagram(bpmnDiagramName, { + rendererIgnoreBpmnLabelStyles: ignoreBpmnLabelStyles, + }); + + const image = await page.screenshot({ fullPage: true }); + const config = imageSnapshotConfigurator.getConfig(bpmnDiagramName); + expect(image).toMatchImageSnapshot(config); + }); + }); + }); +}); diff --git a/test/fixtures/bpmn/bpmn-rendering-ignore-options/activities.with.wrongly.positioned.labels.bpmn b/test/fixtures/bpmn/bpmn-rendering-ignore-options/activities.with.wrongly.positioned.labels.bpmn new file mode 100644 index 0000000000..32e03654bc --- /dev/null +++ b/test/fixtures/bpmn/bpmn-rendering-ignore-options/activities.with.wrongly.positioned.labels.bpmn @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/fixtures/bpmn/bpmn-rendering-ignore-options/labels.with.font.styles.bpmn b/test/fixtures/bpmn/bpmn-rendering-ignore-options/labels.with.font.styles.bpmn new file mode 100644 index 0000000000..bc7a3f607d --- /dev/null +++ b/test/fixtures/bpmn/bpmn-rendering-ignore-options/labels.with.font.styles.bpmn @@ -0,0 +1,34 @@ + + + + + Flow_1 + + + Flow_1 + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/fixtures/bpmn/bpmn-rendering/pools.01.labels.and.lanes.bpmn b/test/fixtures/bpmn/bpmn-rendering/pools.01.labels.and.lanes.bpmn index efc62629d9..2602b66766 100644 --- a/test/fixtures/bpmn/bpmn-rendering/pools.01.labels.and.lanes.bpmn +++ b/test/fixtures/bpmn/bpmn-rendering/pools.01.labels.and.lanes.bpmn @@ -38,6 +38,10 @@ + + + + diff --git a/test/fixtures/bpmn/bpmn-rendering/pools.02.vertical.with.lanes.bpmn b/test/fixtures/bpmn/bpmn-rendering/pools.02.vertical.with.lanes.bpmn index 30eaf58ce5..eb361986bd 100644 --- a/test/fixtures/bpmn/bpmn-rendering/pools.02.vertical.with.lanes.bpmn +++ b/test/fixtures/bpmn/bpmn-rendering/pools.02.vertical.with.lanes.bpmn @@ -18,9 +18,17 @@ + + + + + + + + diff --git a/test/fixtures/bpmn/bpmn-rendering/pools.03.black.box.bpmn b/test/fixtures/bpmn/bpmn-rendering/pools.03.black.box.bpmn index be6b75082a..09315b7302 100644 --- a/test/fixtures/bpmn/bpmn-rendering/pools.03.black.box.bpmn +++ b/test/fixtures/bpmn/bpmn-rendering/pools.03.black.box.bpmn @@ -8,6 +8,10 @@ + + + + diff --git a/test/shared/visu/bpmn-page-utils.ts b/test/shared/visu/bpmn-page-utils.ts index 8fc760bad5..1bcf699265 100644 --- a/test/shared/visu/bpmn-page-utils.ts +++ b/test/shared/visu/bpmn-page-utils.ts @@ -143,6 +143,8 @@ export interface PageOptions { bpmnElementIdToCollapse?: string; poolIdsToFilter?: string | string[]; rendererIgnoreBpmnColors?: boolean; + rendererIgnoreBpmnLabelStyles?: boolean; + rendererIgnoreBpmnActivityLabelBounds?: boolean; } export interface Point { @@ -256,6 +258,9 @@ export class PageTester { otherPageOptions?.poolIdsToFilter && (url += `&bpmn.filter.pool.ids=${otherPageOptions.poolIdsToFilter}`); // renderer options otherPageOptions?.rendererIgnoreBpmnColors !== undefined && (url += `&renderer.ignore.bpmn.colors=${otherPageOptions.rendererIgnoreBpmnColors}`); + otherPageOptions?.rendererIgnoreBpmnLabelStyles !== undefined && (url += `&renderer.ignore.label.style=${otherPageOptions.rendererIgnoreBpmnLabelStyles}`); + otherPageOptions?.rendererIgnoreBpmnActivityLabelBounds !== undefined && + (url += `&renderer.ignore.activity.label.bounds=${otherPageOptions.rendererIgnoreBpmnActivityLabelBounds}`); return url; } diff --git a/test/unit/component/mxgraph/BpmnRenderer.test.ts b/test/unit/component/mxgraph/BpmnRenderer.test.ts new file mode 100644 index 0000000000..49645d4b8b --- /dev/null +++ b/test/unit/component/mxgraph/BpmnRenderer.test.ts @@ -0,0 +1,85 @@ +/** + * @jest-environment jsdom + */ +/* +Copyright 2025 Bonitasoft S.A. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import { isLabelBoundsIgnored } from '@lib/component/mxgraph/BpmnRenderer'; +import { ShapeBpmnElementKind } from '@lib/model/bpmn/internal'; +import Shape from '@lib/model/bpmn/internal/shape/Shape'; +import ShapeBpmnElement from '@lib/model/bpmn/internal/shape/ShapeBpmnElement'; + +describe('isLabelBoundsIgnored', () => { + describe('no specific option', () => { + const cases: [ShapeBpmnElementKind, boolean][] = [ + [ShapeBpmnElementKind.POOL, true], + [ShapeBpmnElementKind.LANE, true], + [ShapeBpmnElementKind.TASK_USER, false], + [ShapeBpmnElementKind.CALL_ACTIVITY, false], + [ShapeBpmnElementKind.EVENT_START, false], + [ShapeBpmnElementKind.EVENT_END, false], + [ShapeBpmnElementKind.GATEWAY_EXCLUSIVE, false], + [ShapeBpmnElementKind.GATEWAY_PARALLEL, false], + ]; + + test.each(cases)('should ignore %s label bounds? %s', (kind, expected) => { + const shape = new Shape('id', new ShapeBpmnElement('id', 'name', kind)); + expect(isLabelBoundsIgnored(shape, false, false)).toBe(expected); + }); + }); + + describe('with ignoreBpmnActivityLabelBounds option', () => { + const cases: [ShapeBpmnElementKind, boolean][] = [ + [ShapeBpmnElementKind.POOL, true], + [ShapeBpmnElementKind.LANE, true], + [ShapeBpmnElementKind.TASK_USER, true], + [ShapeBpmnElementKind.TASK_SCRIPT, true], + [ShapeBpmnElementKind.CALL_ACTIVITY, true], + [ShapeBpmnElementKind.SUB_PROCESS, true], + [ShapeBpmnElementKind.EVENT_START, false], + [ShapeBpmnElementKind.EVENT_END, false], + [ShapeBpmnElementKind.GATEWAY_EXCLUSIVE, false], + [ShapeBpmnElementKind.GATEWAY_PARALLEL, false], + ]; + + describe.each([true, false])('with ignoreBpmnTaskLabelBounds option set to %b', (ignoreBpmnTaskLabelBounds: boolean) => { + test.each(cases)('should ignore %s label bounds? %s', (kind, expected) => { + const shape = new Shape('id', new ShapeBpmnElement('id', 'name', kind)); + expect(isLabelBoundsIgnored(shape, true, ignoreBpmnTaskLabelBounds)).toBe(expected); + }); + }); + }); + + describe('with ignoreBpmnTaskLabelBounds option', () => { + const cases: [ShapeBpmnElementKind, boolean][] = [ + [ShapeBpmnElementKind.POOL, true], + [ShapeBpmnElementKind.LANE, true], + [ShapeBpmnElementKind.TASK_USER, true], + [ShapeBpmnElementKind.TASK_SCRIPT, true], + [ShapeBpmnElementKind.CALL_ACTIVITY, false], + [ShapeBpmnElementKind.SUB_PROCESS, false], + [ShapeBpmnElementKind.EVENT_START, false], + [ShapeBpmnElementKind.EVENT_END, false], + [ShapeBpmnElementKind.GATEWAY_EXCLUSIVE, false], + [ShapeBpmnElementKind.GATEWAY_PARALLEL, false], + ]; + + test.each(cases)('should ignore %s label bounds? %s', (kind, expected) => { + const shape = new Shape('id', new ShapeBpmnElement('id', 'name', kind)); + expect(isLabelBoundsIgnored(shape, false, true)).toBe(expected); + }); + }); +}); diff --git a/test/unit/component/mxgraph/renderer/StyleComputer.test.ts b/test/unit/component/mxgraph/renderer/StyleComputer.test.ts index f162411ade..46c2d6a144 100644 --- a/test/unit/component/mxgraph/renderer/StyleComputer.test.ts +++ b/test/unit/component/mxgraph/renderer/StyleComputer.test.ts @@ -607,136 +607,4 @@ describe('Style Computer', () => { }); }); }); - - describe('compute style - ignore label bounds options', () => { - describe('ignoreBpmnActivityLabelBounds', () => { - const styleComputer = new StyleComputer({ ignoreBpmnActivityLabelBounds: true }); - - function computeStyleWithIgnoreActivityBounds(element: Shape | Edge): string { - return styleComputer.computeStyle(element, element.label?.bounds); - } - - it('should ignore label bounds for task', () => { - const shape = newShape(newShapeBpmnActivity(ShapeBpmnElementKind.TASK), newLabel({ name: 'Arial' }, new Bounds(50, 50, 100, 100))); - // Without the ignore option, this would include labelWidth, labelPosition, etc. - expect(computeStyleWithIgnoreActivityBounds(shape)).toBe('task;fontFamily=Arial'); - }); - - it('should ignore label bounds for user task', () => { - const shape = newShape(newShapeBpmnActivity(ShapeBpmnElementKind.TASK_USER), newLabel({ name: 'Arial' }, new Bounds(50, 50, 100, 100))); - expect(computeStyleWithIgnoreActivityBounds(shape)).toBe('userTask;fontFamily=Arial'); - }); - - it('should ignore label bounds for sub-process', () => { - const shape = newShape(newShapeBpmnSubProcess(ShapeBpmnSubProcessKind.EMBEDDED, []), newLabel({ name: 'Arial' }, new Bounds(50, 50, 100, 100))); - expect(computeStyleWithIgnoreActivityBounds(shape)).toBe('subProcess;bpmn.subProcessKind=embedded;fontFamily=Arial;verticalAlign=top'); - }); - - it('should ignore label bounds for call activity', () => { - const shape = newShape(newShapeBpmnCallActivityCallingProcess([]), newLabel({ name: 'Arial' }, new Bounds(50, 50, 100, 100))); - expect(computeStyleWithIgnoreActivityBounds(shape)).toBe('callActivity;fontFamily=Arial;verticalAlign=top'); - }); - - it('should NOT ignore label bounds for events', () => { - const shape = newShape(newShapeBpmnElement(ShapeBpmnElementKind.EVENT_START), newLabel({ name: 'Arial' }, new Bounds(50, 50, 100, 100))); - // Events are not activities, so their label bounds should still be used - expect(computeStyleWithIgnoreActivityBounds(shape)).toBe( - 'startEvent;fontFamily=Arial;verticalAlign=top;align=center;labelWidth=101;labelPosition=ignore;verticalLabelPosition=middle', - ); - }); - - it('should NOT ignore label bounds for gateways', () => { - const shape = newShape(newShapeBpmnElement(ShapeBpmnElementKind.GATEWAY_EXCLUSIVE), newLabel({ name: 'Arial' }, new Bounds(50, 50, 100, 100))); - // Gateways are not activities, so their label bounds should still be used - expect(computeStyleWithIgnoreActivityBounds(shape)).toBe( - 'exclusiveGateway;fontFamily=Arial;verticalAlign=top;align=center;labelWidth=101;labelPosition=ignore;verticalLabelPosition=middle', - ); - }); - - it('should NOT ignore label bounds for edges', () => { - const edge = new Edge('id', newSequenceFlow(SequenceFlowKind.NORMAL), undefined, newLabel({ name: 'Arial' }, new Bounds(50, 50, 100, 100))); - // Edges are not activities, so their label bounds should still be used - expect(computeStyleWithIgnoreActivityBounds(edge)).toBe('sequenceFlow;normal;fontFamily=Arial;verticalAlign=top;align=center'); - }); - }); - - describe('ignoreBpmnTaskLabelBounds', () => { - const styleComputer = new StyleComputer({ ignoreBpmnTaskLabelBounds: true }); - - function computeStyleWithIgnoreTaskBounds(element: Shape | Edge): string { - return styleComputer.computeStyle(element, element.label?.bounds); - } - - it('should ignore label bounds for task', () => { - const shape = newShape(newShapeBpmnActivity(ShapeBpmnElementKind.TASK), newLabel({ name: 'Arial' }, new Bounds(50, 50, 100, 100))); - expect(computeStyleWithIgnoreTaskBounds(shape)).toBe('task;fontFamily=Arial'); - }); - - it('should ignore label bounds for user task', () => { - const shape = newShape(newShapeBpmnActivity(ShapeBpmnElementKind.TASK_USER), newLabel({ name: 'Arial' }, new Bounds(50, 50, 100, 100))); - expect(computeStyleWithIgnoreTaskBounds(shape)).toBe('userTask;fontFamily=Arial'); - }); - - it('should ignore label bounds for service task', () => { - const shape = newShape(newShapeBpmnActivity(ShapeBpmnElementKind.TASK_SERVICE), newLabel({ name: 'Arial' }, new Bounds(50, 50, 100, 100))); - expect(computeStyleWithIgnoreTaskBounds(shape)).toBe('serviceTask;fontFamily=Arial'); - }); - - it('should NOT ignore label bounds for sub-process (still an activity but not a task)', () => { - const shape = newShape(newShapeBpmnSubProcess(ShapeBpmnSubProcessKind.EMBEDDED, []), newLabel({ name: 'Arial' }, new Bounds(50, 50, 100, 100))); - // Sub-processes should still have their label bounds applied since ignoreBpmnTaskLabelBounds only affects tasks - expect(computeStyleWithIgnoreTaskBounds(shape)).toBe( - 'subProcess;bpmn.subProcessKind=embedded;fontFamily=Arial;verticalAlign=top;align=center;labelWidth=101;labelPosition=ignore;verticalLabelPosition=middle', - ); - }); - - it('should NOT ignore label bounds for call activity (still an activity but not a task)', () => { - const shape = newShape(newShapeBpmnCallActivityCallingProcess([]), newLabel({ name: 'Arial' }, new Bounds(50, 50, 100, 100))); - // Call activities should still have their label bounds applied since ignoreBpmnTaskLabelBounds only affects tasks - expect(computeStyleWithIgnoreTaskBounds(shape)).toBe( - 'callActivity;fontFamily=Arial;verticalAlign=top;align=center;labelWidth=101;labelPosition=ignore;verticalLabelPosition=middle', - ); - }); - }); - - describe('both options false (default behavior)', () => { - const styleComputer = new StyleComputer({ ignoreBpmnActivityLabelBounds: false, ignoreBpmnTaskLabelBounds: false }); - - function computeStyleWithDefaultOptions(element: Shape | Edge): string { - return styleComputer.computeStyle(element, element.label?.bounds); - } - - it('should use label bounds for task', () => { - const shape = newShape(newShapeBpmnActivity(ShapeBpmnElementKind.TASK), newLabel({ name: 'Arial' }, new Bounds(50, 50, 100, 100))); - expect(computeStyleWithDefaultOptions(shape)).toBe('task;fontFamily=Arial;verticalAlign=top;align=center;labelWidth=101;labelPosition=ignore;verticalLabelPosition=middle'); - }); - - it('should use label bounds for sub-process', () => { - const shape = newShape(newShapeBpmnSubProcess(ShapeBpmnSubProcessKind.EMBEDDED, []), newLabel({ name: 'Arial' }, new Bounds(50, 50, 100, 100))); - expect(computeStyleWithDefaultOptions(shape)).toBe( - 'subProcess;bpmn.subProcessKind=embedded;fontFamily=Arial;verticalAlign=top;align=center;labelWidth=101;labelPosition=ignore;verticalLabelPosition=middle', - ); - }); - }); - - describe('option precedence', () => { - const styleComputer = new StyleComputer({ ignoreBpmnActivityLabelBounds: true, ignoreBpmnTaskLabelBounds: true }); - - function computeStyleWithBothOptions(element: Shape | Edge): string { - return styleComputer.computeStyle(element, element.label?.bounds); - } - - it('should ignore label bounds for task when both options are true', () => { - const shape = newShape(newShapeBpmnActivity(ShapeBpmnElementKind.TASK), newLabel({ name: 'Arial' }, new Bounds(50, 50, 100, 100))); - // Both options would apply to tasks, result should be the same - expect(computeStyleWithBothOptions(shape)).toBe('task;fontFamily=Arial'); - }); - - it('should ignore label bounds for sub-process when ignoreBpmnActivityLabelBounds is true', () => { - const shape = newShape(newShapeBpmnSubProcess(ShapeBpmnSubProcessKind.EMBEDDED, []), newLabel({ name: 'Arial' }, new Bounds(50, 50, 100, 100))); - // Only ignoreBpmnActivityLabelBounds applies to sub-processes - expect(computeStyleWithBothOptions(shape)).toBe('subProcess;bpmn.subProcessKind=embedded;fontFamily=Arial;verticalAlign=top'); - }); - }); - }); });