zombie-mermaid 2.2.3 → 2.2.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -4
- package/dist/ascii.cjs +1 -11
- package/dist/ascii.d.cts +1 -167
- package/dist/ascii.d.ts +1 -167
- package/dist/ascii.js +1 -6591
- package/dist/cli.js +836 -10946
- package/dist/index.cjs +2 -81
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +42 -680
- package/dist/index.d.ts +42 -680
- package/dist/index.js +408 -10002
- package/dist/index.js.map +1 -1
- package/dist/mcp.cjs +1 -17909
- package/dist/mcp.d.cts +1 -11
- package/dist/mcp.d.ts +1 -11
- package/dist/mcp.js +1 -17884
- package/package.json +29 -29
- package/src/__tests__/workspace-package-boundaries.test.ts +15 -16
- package/src/__tests__/xychart-parser-categories.test.ts +78 -0
- package/src/ascii-entry.ts +14 -0
- package/src/cli/html-viewer.ts +5 -0
- package/src/mcp-entry.ts +21 -0
- package/dist/ascii.cjs.map +0 -1
- package/dist/ascii.js.map +0 -1
- package/dist/mcp.cjs.map +0 -1
- package/dist/mcp.js.map +0 -1
- package/packages/ascii-renderer/LICENSE +0 -22
- package/packages/ascii-renderer/src/ansi.ts +0 -490
- package/packages/ascii-renderer/src/canvas.ts +0 -658
- package/packages/ascii-renderer/src/class-diagram.ts +0 -2001
- package/packages/ascii-renderer/src/converter.ts +0 -446
- package/packages/ascii-renderer/src/coords.ts +0 -58
- package/packages/ascii-renderer/src/display-width.ts +0 -151
- package/packages/ascii-renderer/src/draw-arrows.ts +0 -549
- package/packages/ascii-renderer/src/draw-boxes.ts +0 -267
- package/packages/ascii-renderer/src/draw-bundles.ts +0 -611
- package/packages/ascii-renderer/src/draw-lines.ts +0 -174
- package/packages/ascii-renderer/src/draw-subgraphs.ts +0 -108
- package/packages/ascii-renderer/src/draw.ts +0 -337
- package/packages/ascii-renderer/src/edge-bundling.ts +0 -435
- package/packages/ascii-renderer/src/edge-cell-styles.ts +0 -81
- package/packages/ascii-renderer/src/edge-routing.ts +0 -1049
- package/packages/ascii-renderer/src/er-diagram.ts +0 -1488
- package/packages/ascii-renderer/src/flowchart.ts +0 -94
- package/packages/ascii-renderer/src/grid-occupancy.ts +0 -234
- package/packages/ascii-renderer/src/grid.ts +0 -1267
- package/packages/ascii-renderer/src/hyperlinks.ts +0 -248
- package/packages/ascii-renderer/src/index.ts +0 -163
- package/packages/ascii-renderer/src/lane-search.ts +0 -68
- package/packages/ascii-renderer/src/multiline-utils.ts +0 -82
- package/packages/ascii-renderer/src/pathfinder.ts +0 -448
- package/packages/ascii-renderer/src/registry.ts +0 -88
- package/packages/ascii-renderer/src/sequence.ts +0 -1318
- package/packages/ascii-renderer/src/shapes/circle.ts +0 -31
- package/packages/ascii-renderer/src/shapes/corners.ts +0 -273
- package/packages/ascii-renderer/src/shapes/diamond.ts +0 -31
- package/packages/ascii-renderer/src/shapes/hexagon.ts +0 -31
- package/packages/ascii-renderer/src/shapes/index.ts +0 -123
- package/packages/ascii-renderer/src/shapes/rectangle.ts +0 -199
- package/packages/ascii-renderer/src/shapes/rounded.ts +0 -31
- package/packages/ascii-renderer/src/shapes/special.ts +0 -352
- package/packages/ascii-renderer/src/shapes/stadium.ts +0 -122
- package/packages/ascii-renderer/src/shapes/state.ts +0 -204
- package/packages/ascii-renderer/src/shapes/types.ts +0 -78
- package/packages/ascii-renderer/src/territory.ts +0 -136
- package/packages/ascii-renderer/src/types.ts +0 -454
- package/packages/ascii-renderer/src/validate.ts +0 -189
- package/packages/ascii-renderer/src/xychart.ts +0 -1085
- package/packages/core/LICENSE +0 -22
- package/packages/core/src/click-directive.ts +0 -106
- package/packages/core/src/color-utils.ts +0 -205
- package/packages/core/src/diagram-type.ts +0 -35
- package/packages/core/src/direction-override.ts +0 -46
- package/packages/core/src/direction.ts +0 -56
- package/packages/core/src/index.ts +0 -34
- package/packages/core/src/init-directive.ts +0 -248
- package/packages/core/src/multiline-utils.ts +0 -275
- package/packages/core/src/statements.ts +0 -197
- package/packages/core/src/style-directives.ts +0 -214
- package/packages/core/src/text-metrics.ts +0 -498
- package/packages/core/src/theme.ts +0 -696
- package/packages/core/src/types.ts +0 -670
- package/packages/mcp/LICENSE +0 -22
- package/packages/mcp/src/index.ts +0 -17
- package/packages/mcp/src/server.ts +0 -135
- package/packages/mcp/src/tools/check-sequence-activations.ts +0 -91
- package/packages/mcp/src/tools/fix-sequence-activations.ts +0 -77
- package/packages/mcp/src/tools/render-ascii.ts +0 -99
- package/packages/mcp/src/tools/render-svg.ts +0 -95
- package/packages/mermaid-parser/LICENSE +0 -22
- package/packages/mermaid-parser/src/class/format.ts +0 -15
- package/packages/mermaid-parser/src/class/parser.ts +0 -593
- package/packages/mermaid-parser/src/class/types.ts +0 -166
- package/packages/mermaid-parser/src/er/parser.ts +0 -286
- package/packages/mermaid-parser/src/er/types.ts +0 -99
- package/packages/mermaid-parser/src/expanded-shapes.ts +0 -376
- package/packages/mermaid-parser/src/index.ts +0 -48
- package/packages/mermaid-parser/src/sequence/activation-check.ts +0 -149
- package/packages/mermaid-parser/src/sequence/activation-fix.ts +0 -112
- package/packages/mermaid-parser/src/sequence/box-color.ts +0 -85
- package/packages/mermaid-parser/src/sequence/parser.ts +0 -613
- package/packages/mermaid-parser/src/sequence/types.ts +0 -242
- package/packages/mermaid-parser/src/xychart/colors.ts +0 -177
- package/packages/mermaid-parser/src/xychart/parser.ts +0 -203
- package/packages/mermaid-parser/src/xychart/types.ts +0 -150
- package/packages/svg-renderer/LICENSE +0 -22
- package/packages/svg-renderer/src/class/layout.ts +0 -360
- package/packages/svg-renderer/src/class/renderer.ts +0 -636
- package/packages/svg-renderer/src/edge-curves.ts +0 -204
- package/packages/svg-renderer/src/elk-instance.ts +0 -292
- package/packages/svg-renderer/src/er/layout.ts +0 -200
- package/packages/svg-renderer/src/er/renderer.ts +0 -493
- package/packages/svg-renderer/src/index.ts +0 -58
- package/packages/svg-renderer/src/layout-engine/constants.ts +0 -19
- package/packages/svg-renderer/src/layout-engine/edge-bundling.ts +0 -379
- package/packages/svg-renderer/src/layout-engine/elk-adapter-utils.ts +0 -81
- package/packages/svg-renderer/src/layout-engine/elk-graph-builder.ts +0 -240
- package/packages/svg-renderer/src/layout-engine/from-elk.ts +0 -685
- package/packages/svg-renderer/src/layout-engine/layer-alignment.ts +0 -174
- package/packages/svg-renderer/src/layout-engine/to-elk.ts +0 -695
- package/packages/svg-renderer/src/layout-engine.ts +0 -74
- package/packages/svg-renderer/src/layout.ts +0 -8
- package/packages/svg-renderer/src/renderer.ts +0 -1485
- package/packages/svg-renderer/src/resolve-colors.ts +0 -339
- package/packages/svg-renderer/src/sequence/layout.ts +0 -698
- package/packages/svg-renderer/src/sequence/renderer.ts +0 -546
- package/packages/svg-renderer/src/shape-clipping.ts +0 -197
- package/packages/svg-renderer/src/styles.ts +0 -118
- package/packages/svg-renderer/src/xychart/layout.ts +0 -682
- package/packages/svg-renderer/src/xychart/renderer.ts +0 -684
- package/src/__tests__/ascii-canvas-write.test.ts +0 -137
- package/src/__tests__/ascii-charset-border-junctions.test.ts +0 -63
- package/src/__tests__/ascii-cjk-width.test.ts +0 -150
- package/src/__tests__/ascii-class-box-occupancy.test.ts +0 -462
- package/src/__tests__/ascii-class-column-width-488-489.test.ts +0 -639
- package/src/__tests__/ascii-class-cross-level-jog-corruption.test.ts +0 -187
- package/src/__tests__/ascii-class-detour-label-routing-487.test.ts +0 -114
- package/src/__tests__/ascii-class-diagram-compartments.test.ts +0 -70
- package/src/__tests__/ascii-class-label-box-collision.test.ts +0 -60
- package/src/__tests__/ascii-class-label-row-collision-531.test.ts +0 -135
- package/src/__tests__/ascii-class-label-territory-row-awareness.test.ts +0 -57
- package/src/__tests__/ascii-class-padding.test.ts +0 -104
- package/src/__tests__/ascii-class-parent-alignment-971.test.ts +0 -139
- package/src/__tests__/ascii-class-parent-alignment-972.test.ts +0 -208
- package/src/__tests__/ascii-class-reciprocal-relationships-448.test.ts +0 -169
- package/src/__tests__/ascii-combining-mark-width.test.ts +0 -70
- package/src/__tests__/ascii-coords-overlay.test.ts +0 -64
- package/src/__tests__/ascii-decision-lr-box-start.test.ts +0 -106
- package/src/__tests__/ascii-display-width-unit.test.ts +0 -154
- package/src/__tests__/ascii-draw-arrows-coverage.test.ts +0 -171
- package/src/__tests__/ascii-draw-arrows-single-point-path.test.ts +0 -112
- package/src/__tests__/ascii-edge-bundling-rank-violation-454.test.ts +0 -72
- package/src/__tests__/ascii-edge-ending-glyphs.test.ts +0 -206
- package/src/__tests__/ascii-edge-label-diagonal-fallback-418.test.ts +0 -95
- package/src/__tests__/ascii-edge-routing-fixes.test.ts +0 -178
- package/src/__tests__/ascii-edge-routing-single-point-path.test.ts +0 -107
- package/src/__tests__/ascii-edge-styles.test.ts +0 -149
- package/src/__tests__/ascii-emoji-cluster-width.test.ts +0 -101
- package/src/__tests__/ascii-er-box-occupancy.test.ts +0 -251
- package/src/__tests__/ascii-er-cardinality.test.ts +0 -40
- package/src/__tests__/ascii-er-corner-glyphs.test.ts +0 -249
- package/src/__tests__/ascii-er-jog-stray-line.test.ts +0 -111
- package/src/__tests__/ascii-er-label-padding.test.ts +0 -118
- package/src/__tests__/ascii-er-padding.test.ts +0 -114
- package/src/__tests__/ascii-er-relationship-label-corruption-350.test.ts +0 -458
- package/src/__tests__/ascii-er-relationship-overwrite.test.ts +0 -325
- package/src/__tests__/ascii-er-stray-connectors.test.ts +0 -347
- package/src/__tests__/ascii-er-unrelated-stem-separation-411.test.ts +0 -98
- package/src/__tests__/ascii-er-vertical-one-marker.test.ts +0 -110
- package/src/__tests__/ascii-label-line-terminal-fallback.test.ts +0 -172
- package/src/__tests__/ascii-lane-search.test.ts +0 -207
- package/src/__tests__/ascii-multibox-cjk-width.test.ts +0 -184
- package/src/__tests__/ascii-multiline.test.ts +0 -291
- package/src/__tests__/ascii-padding-edge-cases.test.ts +0 -154
- package/src/__tests__/ascii-pathfinder-route-edge.test.ts +0 -194
- package/src/__tests__/ascii-sequence-alt-else-label.test.ts +0 -236
- package/src/__tests__/ascii-sequence-block-wall-clearance.test.ts +0 -217
- package/src/__tests__/ascii-sequence-box-group.test.ts +0 -159
- package/src/__tests__/ascii-sequence-cjk-width.test.ts +0 -235
- package/src/__tests__/ascii-sequence-create-destroy.test.ts +0 -114
- package/src/__tests__/ascii-sequence-form-invariants.test.ts +0 -432
- package/src/__tests__/ascii-sequence-mermaid-parity.test.ts +0 -219
- package/src/__tests__/ascii-sequence-notes.test.ts +0 -61
- package/src/__tests__/ascii-sequence-padding.test.ts +0 -119
- package/src/__tests__/ascii-sequence-self-arrow.test.ts +0 -206
- package/src/__tests__/ascii-shape-diamond.test.ts +0 -38
- package/src/__tests__/ascii-shape-rectangle.test.ts +0 -258
- package/src/__tests__/ascii-shape-rounded.test.ts +0 -36
- package/src/__tests__/ascii-shapes-circle.test.ts +0 -41
- package/src/__tests__/ascii-shapes-hexagon.test.ts +0 -42
- package/src/__tests__/ascii-shapes-special.test.ts +0 -349
- package/src/__tests__/ascii-shapes-stadium.test.ts +0 -217
- package/src/__tests__/ascii-shapes-state.test.ts +0 -234
- package/src/__tests__/ascii-state-bidirectional-label-swap-530.test.ts +0 -130
- package/src/__tests__/ascii-subgraph-direction-honored-445.test.ts +0 -90
- package/src/__tests__/ascii-subgraph-label-border-clip.test.ts +0 -152
- package/src/__tests__/ascii-subgraph-title-padding.test.ts +0 -77
- package/src/__tests__/ascii-territory-unit.test.ts +0 -219
- package/src/__tests__/ascii-validate.test.ts +0 -220
- package/src/__tests__/ascii.test.ts +0 -328
- package/src/__tests__/box-color.test.ts +0 -80
- package/src/__tests__/class-arrow-directions.test.ts +0 -505
- package/src/__tests__/click-directive.test.ts +0 -63
- package/src/__tests__/color-utils.test.ts +0 -186
- package/src/__tests__/diagram-type.test.ts +0 -28
- package/src/__tests__/draw-lines.test.ts +0 -93
- package/src/__tests__/edge-cell-styles.test.ts +0 -180
- package/src/__tests__/elk-adapter-utils.test.ts +0 -166
- package/src/__tests__/grid-occupancy.test.ts +0 -240
- package/src/__tests__/helpers/ascii-form.ts +0 -142
- package/src/__tests__/helpers/terminal-display-width.ts +0 -74
- package/src/__tests__/mcp-check-sequence-activations-tool.test.ts +0 -85
- package/src/__tests__/mcp-fix-sequence-activations-tool.test.ts +0 -134
- package/src/__tests__/mcp-server.test.ts +0 -163
- package/src/__tests__/pathfinder.test.ts +0 -246
- package/src/__tests__/sequence-activation-fix.test.ts +0 -91
- package/src/__tests__/testdata/ascii/ampersand_lhs.txt +0 -18
- package/src/__tests__/testdata/ascii/ampersand_lhs_and_rhs.txt +0 -18
- package/src/__tests__/testdata/ascii/ampersand_rhs.txt +0 -18
- package/src/__tests__/testdata/ascii/ampersand_td_fanin.txt +0 -18
- package/src/__tests__/testdata/ascii/ampersand_td_fanout.txt +0 -18
- package/src/__tests__/testdata/ascii/ampersand_without_edge.txt +0 -18
- package/src/__tests__/testdata/ascii/back_reference_from_child.txt +0 -10
- package/src/__tests__/testdata/ascii/backlink_from_bottom.txt +0 -22
- package/src/__tests__/testdata/ascii/backlink_from_top.txt +0 -22
- package/src/__tests__/testdata/ascii/backlink_with_short_y_padding.txt +0 -20
- package/src/__tests__/testdata/ascii/cls_all_relationships.txt +0 -19
- package/src/__tests__/testdata/ascii/cls_annotation.txt +0 -29
- package/src/__tests__/testdata/ascii/cls_association.txt +0 -14
- package/src/__tests__/testdata/ascii/cls_basic.txt +0 -15
- package/src/__tests__/testdata/ascii/cls_dependency.txt +0 -14
- package/src/__tests__/testdata/ascii/cls_inheritance.txt +0 -20
- package/src/__tests__/testdata/ascii/cls_methods.txt +0 -21
- package/src/__tests__/testdata/ascii/comments.txt +0 -23
- package/src/__tests__/testdata/ascii/custom_padding.txt +0 -10
- package/src/__tests__/testdata/ascii/duplicate_labels.txt +0 -19
- package/src/__tests__/testdata/ascii/er_attributes.txt +0 -21
- package/src/__tests__/testdata/ascii/er_basic.txt +0 -8
- package/src/__tests__/testdata/ascii/er_identifying.txt +0 -18
- package/src/__tests__/testdata/ascii/flowchart_tb_simple.txt +0 -29
- package/src/__tests__/testdata/ascii/graph_bt_direction.txt +0 -28
- package/src/__tests__/testdata/ascii/graph_tb_direction.txt +0 -26
- package/src/__tests__/testdata/ascii/nested_subgraphs_with_labels.txt +0 -36
- package/src/__tests__/testdata/ascii/preserve_order_of_definition.txt +0 -23
- package/src/__tests__/testdata/ascii/self_reference.txt +0 -10
- package/src/__tests__/testdata/ascii/self_reference_with_edge.txt +0 -10
- package/src/__tests__/testdata/ascii/seq_basic.txt +0 -17
- package/src/__tests__/testdata/ascii/seq_multiple_messages.txt +0 -25
- package/src/__tests__/testdata/ascii/seq_self_message.txt +0 -18
- package/src/__tests__/testdata/ascii/single_node.txt +0 -8
- package/src/__tests__/testdata/ascii/single_node_longer_name.txt +0 -8
- package/src/__tests__/testdata/ascii/subgraph_complex_mixed.txt +0 -38
- package/src/__tests__/testdata/ascii/subgraph_complex_nested.txt +0 -49
- package/src/__tests__/testdata/ascii/subgraph_direction_override.txt +0 -47
- package/src/__tests__/testdata/ascii/subgraph_empty.txt +0 -10
- package/src/__tests__/testdata/ascii/subgraph_mixed_nodes.txt +0 -20
- package/src/__tests__/testdata/ascii/subgraph_mixed_nodes_td.txt +0 -48
- package/src/__tests__/testdata/ascii/subgraph_multiple_edges.txt +0 -32
- package/src/__tests__/testdata/ascii/subgraph_multiple_nodes.txt +0 -16
- package/src/__tests__/testdata/ascii/subgraph_nested.txt +0 -24
- package/src/__tests__/testdata/ascii/subgraph_nested_with_external.txt +0 -30
- package/src/__tests__/testdata/ascii/subgraph_node_outside_lr.txt +0 -17
- package/src/__tests__/testdata/ascii/subgraph_single_node.txt +0 -16
- package/src/__tests__/testdata/ascii/subgraph_td_direction.txt +0 -26
- package/src/__tests__/testdata/ascii/subgraph_td_multiple.txt +0 -44
- package/src/__tests__/testdata/ascii/subgraph_td_multiple_paddingy.txt +0 -42
- package/src/__tests__/testdata/ascii/subgraph_three_levels_nested.txt +0 -32
- package/src/__tests__/testdata/ascii/subgraph_three_separate.txt +0 -24
- package/src/__tests__/testdata/ascii/subgraph_two_separate.txt +0 -20
- package/src/__tests__/testdata/ascii/subgraph_with_labels.txt +0 -20
- package/src/__tests__/testdata/ascii/three_nodes.txt +0 -9
- package/src/__tests__/testdata/ascii/three_nodes_single_line.txt +0 -8
- package/src/__tests__/testdata/ascii/two_layer_single_graph.txt +0 -19
- package/src/__tests__/testdata/ascii/two_layer_single_graph_longer_names.txt +0 -19
- package/src/__tests__/testdata/ascii/two_nodes_linked.txt +0 -8
- package/src/__tests__/testdata/ascii/two_nodes_longer_names.txt +0 -8
- package/src/__tests__/testdata/ascii/two_root_nodes.txt +0 -19
- package/src/__tests__/testdata/ascii/two_root_nodes_longer_names.txt +0 -19
- package/src/__tests__/testdata/ascii/two_single_root_nodes.txt +0 -19
- package/src/__tests__/testdata/unicode/ampersand_lhs.txt +0 -18
- package/src/__tests__/testdata/unicode/ampersand_lhs_and_rhs.txt +0 -18
- package/src/__tests__/testdata/unicode/ampersand_rhs.txt +0 -18
- package/src/__tests__/testdata/unicode/ampersand_without_edge.txt +0 -18
- package/src/__tests__/testdata/unicode/back_reference_from_child.txt +0 -10
- package/src/__tests__/testdata/unicode/backlink_from_bottom.txt +0 -22
- package/src/__tests__/testdata/unicode/backlink_from_top.txt +0 -22
- package/src/__tests__/testdata/unicode/cls_all_relationships.txt +0 -19
- package/src/__tests__/testdata/unicode/cls_annotation.txt +0 -29
- package/src/__tests__/testdata/unicode/cls_association.txt +0 -14
- package/src/__tests__/testdata/unicode/cls_basic.txt +0 -15
- package/src/__tests__/testdata/unicode/cls_dependency.txt +0 -14
- package/src/__tests__/testdata/unicode/cls_inheritance.txt +0 -20
- package/src/__tests__/testdata/unicode/cls_methods.txt +0 -21
- package/src/__tests__/testdata/unicode/comments.txt +0 -23
- package/src/__tests__/testdata/unicode/duplicate_labels.txt +0 -19
- package/src/__tests__/testdata/unicode/er_attributes.txt +0 -21
- package/src/__tests__/testdata/unicode/er_basic.txt +0 -8
- package/src/__tests__/testdata/unicode/er_identifying.txt +0 -18
- package/src/__tests__/testdata/unicode/graph_bt_direction.txt +0 -28
- package/src/__tests__/testdata/unicode/preserve_order_of_definition.txt +0 -23
- package/src/__tests__/testdata/unicode/self_reference.txt +0 -10
- package/src/__tests__/testdata/unicode/self_reference_with_edge.txt +0 -10
- package/src/__tests__/testdata/unicode/seq_basic.txt +0 -17
- package/src/__tests__/testdata/unicode/seq_multiple_messages.txt +0 -25
- package/src/__tests__/testdata/unicode/seq_self_message.txt +0 -18
- package/src/__tests__/testdata/unicode/single_node.txt +0 -8
- package/src/__tests__/testdata/unicode/single_node_longer_name.txt +0 -8
- package/src/__tests__/testdata/unicode/three_nodes.txt +0 -9
- package/src/__tests__/testdata/unicode/three_nodes_single_line.txt +0 -8
- package/src/__tests__/testdata/unicode/two_layer_single_graph.txt +0 -19
- package/src/__tests__/testdata/unicode/two_layer_single_graph_longer_names.txt +0 -19
- package/src/__tests__/testdata/unicode/two_nodes_linked.txt +0 -8
- package/src/__tests__/testdata/unicode/two_nodes_longer_names.txt +0 -8
- package/src/__tests__/testdata/unicode/two_root_nodes.txt +0 -19
- package/src/__tests__/testdata/unicode/two_root_nodes_longer_names.txt +0 -19
- package/src/__tests__/testdata/unicode/two_single_root_nodes.txt +0 -19
- package/src/__tests__/text-metrics.test.ts +0 -473
- package/src/__tests__/theme-palette-contrast.test.ts +0 -84
- package/src/__tests__/theme.test.ts +0 -132
- package/src/__tests__/xychart-ascii.test.ts +0 -376
- package/src/__tests__/xychart-colors.test.ts +0 -149
|
@@ -1,149 +0,0 @@
|
|
|
1
|
-
// ============================================================================
|
|
2
|
-
// ASCII edge style tests — dotted and thick line rendering
|
|
3
|
-
// ============================================================================
|
|
4
|
-
|
|
5
|
-
import { describe, it, expect } from 'vitest'
|
|
6
|
-
import { renderMermaidASCII } from '@zombie-mermaid/ascii-renderer'
|
|
7
|
-
|
|
8
|
-
describe('ASCII edge styles', () => {
|
|
9
|
-
describe('solid edges (default)', () => {
|
|
10
|
-
it('renders solid edges with ─ in unicode mode', () => {
|
|
11
|
-
const result = renderMermaidASCII(`
|
|
12
|
-
graph LR
|
|
13
|
-
A --> B
|
|
14
|
-
`)
|
|
15
|
-
expect(result).toContain('─')
|
|
16
|
-
expect(result).not.toContain('┄')
|
|
17
|
-
expect(result).not.toContain('━')
|
|
18
|
-
})
|
|
19
|
-
|
|
20
|
-
it('renders solid edges with - in ascii mode', () => {
|
|
21
|
-
const result = renderMermaidASCII(
|
|
22
|
-
`
|
|
23
|
-
graph LR
|
|
24
|
-
A --> B
|
|
25
|
-
`,
|
|
26
|
-
{ useAscii: true },
|
|
27
|
-
)
|
|
28
|
-
expect(result).toContain('-')
|
|
29
|
-
})
|
|
30
|
-
})
|
|
31
|
-
|
|
32
|
-
describe('dotted edges (-.->)', () => {
|
|
33
|
-
it('renders dotted edges with ┄ in unicode mode', () => {
|
|
34
|
-
const result = renderMermaidASCII(`
|
|
35
|
-
graph LR
|
|
36
|
-
A -.-> B
|
|
37
|
-
`)
|
|
38
|
-
// Should contain dotted horizontal line character
|
|
39
|
-
expect(result).toContain('┄')
|
|
40
|
-
})
|
|
41
|
-
|
|
42
|
-
it('renders dotted edges with . in ascii mode', () => {
|
|
43
|
-
const result = renderMermaidASCII(
|
|
44
|
-
`
|
|
45
|
-
graph LR
|
|
46
|
-
A -.-> B
|
|
47
|
-
`,
|
|
48
|
-
{ useAscii: true },
|
|
49
|
-
)
|
|
50
|
-
// Should contain dots for dotted lines
|
|
51
|
-
expect(result).toContain('.')
|
|
52
|
-
})
|
|
53
|
-
|
|
54
|
-
it('renders dotted vertical edges with ┆ in unicode mode', () => {
|
|
55
|
-
const result = renderMermaidASCII(`
|
|
56
|
-
graph TD
|
|
57
|
-
A -.-> B
|
|
58
|
-
`)
|
|
59
|
-
// Should contain dotted vertical line character
|
|
60
|
-
expect(result).toContain('┆')
|
|
61
|
-
})
|
|
62
|
-
|
|
63
|
-
it('renders dotted vertical edges with : in ascii mode', () => {
|
|
64
|
-
const result = renderMermaidASCII(
|
|
65
|
-
`
|
|
66
|
-
graph TD
|
|
67
|
-
A -.-> B
|
|
68
|
-
`,
|
|
69
|
-
{ useAscii: true },
|
|
70
|
-
)
|
|
71
|
-
// Should contain colons for dotted vertical lines
|
|
72
|
-
expect(result).toContain(':')
|
|
73
|
-
})
|
|
74
|
-
|
|
75
|
-
it('renders dotted edges with labels', () => {
|
|
76
|
-
const result = renderMermaidASCII(`
|
|
77
|
-
graph LR
|
|
78
|
-
A -.->|optional| B
|
|
79
|
-
`)
|
|
80
|
-
expect(result).toContain('┄')
|
|
81
|
-
expect(result).toContain('optional')
|
|
82
|
-
})
|
|
83
|
-
})
|
|
84
|
-
|
|
85
|
-
describe('thick edges (==>)', () => {
|
|
86
|
-
it('renders thick edges with ━ in unicode mode', () => {
|
|
87
|
-
const result = renderMermaidASCII(`
|
|
88
|
-
graph LR
|
|
89
|
-
A ==> B
|
|
90
|
-
`)
|
|
91
|
-
// Should contain thick horizontal line character
|
|
92
|
-
expect(result).toContain('━')
|
|
93
|
-
})
|
|
94
|
-
|
|
95
|
-
it('renders thick edges with = in ascii mode', () => {
|
|
96
|
-
const result = renderMermaidASCII(
|
|
97
|
-
`
|
|
98
|
-
graph LR
|
|
99
|
-
A ==> B
|
|
100
|
-
`,
|
|
101
|
-
{ useAscii: true },
|
|
102
|
-
)
|
|
103
|
-
// Should contain equals for thick lines
|
|
104
|
-
expect(result).toContain('=')
|
|
105
|
-
})
|
|
106
|
-
|
|
107
|
-
it('renders thick vertical edges with ┃ in unicode mode', () => {
|
|
108
|
-
const result = renderMermaidASCII(`
|
|
109
|
-
graph TD
|
|
110
|
-
A ==> B
|
|
111
|
-
`)
|
|
112
|
-
// Should contain thick vertical line character
|
|
113
|
-
expect(result).toContain('┃')
|
|
114
|
-
})
|
|
115
|
-
})
|
|
116
|
-
|
|
117
|
-
describe('mixed edge styles', () => {
|
|
118
|
-
it('renders different styles in the same diagram', () => {
|
|
119
|
-
const result = renderMermaidASCII(`
|
|
120
|
-
graph LR
|
|
121
|
-
A --> B
|
|
122
|
-
B -.-> C
|
|
123
|
-
C ==> D
|
|
124
|
-
`)
|
|
125
|
-
// Should have all three line types
|
|
126
|
-
expect(result).toContain('─') // solid
|
|
127
|
-
expect(result).toContain('┄') // dotted
|
|
128
|
-
expect(result).toContain('━') // thick
|
|
129
|
-
})
|
|
130
|
-
|
|
131
|
-
it('renders mixed styles in ascii mode', () => {
|
|
132
|
-
const result = renderMermaidASCII(
|
|
133
|
-
`
|
|
134
|
-
graph LR
|
|
135
|
-
A --> B
|
|
136
|
-
B -.-> C
|
|
137
|
-
C ==> D
|
|
138
|
-
`,
|
|
139
|
-
{ useAscii: true },
|
|
140
|
-
)
|
|
141
|
-
// Note: ASCII mode uses - for solid, . for dotted, = for thick
|
|
142
|
-
// We just check that the diagram renders without error
|
|
143
|
-
expect(result).toContain('A')
|
|
144
|
-
expect(result).toContain('B')
|
|
145
|
-
expect(result).toContain('C')
|
|
146
|
-
expect(result).toContain('D')
|
|
147
|
-
})
|
|
148
|
-
})
|
|
149
|
-
})
|
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Regression tests for issue #214 — ASCII renderer boxes several columns too
|
|
3
|
-
* wide for composed emoji / grapheme clusters (ZWJ sequences, flags,
|
|
4
|
-
* skin-tone modifiers).
|
|
5
|
-
*
|
|
6
|
-
* `displayWidth()` used to add up "wide" columns per JS code point rather
|
|
7
|
-
* than per rendered grapheme cluster, so a multi-code-point emoji sequence —
|
|
8
|
-
* which a real terminal renders as a single glyph occupying at most 2
|
|
9
|
-
* columns — was counted once per code point:
|
|
10
|
-
*
|
|
11
|
-
* | Input | Code points | old displayWidth | actual columns |
|
|
12
|
-
* |---------------------------|------------|-------------------|-----------------|
|
|
13
|
-
* | 👨👩👧 (ZWJ family) | 5 | 8 | 2 |
|
|
14
|
-
* | 🇺🇸 (regional indicators) | 2 | 4 | 2 |
|
|
15
|
-
* | 👍🏽 (skin-tone modifier) | 2 | 4 | 2 |
|
|
16
|
-
* | 日本 (plain CJK, contrast) | 2 | 4 | 4 |
|
|
17
|
-
*
|
|
18
|
-
* `terminalDisplayWidth` re-implements the "how many terminal columns does
|
|
19
|
-
* this string occupy" calculation independently of
|
|
20
|
-
* `src/ascii/display-width.ts`, so these tests verify the *rendered output*
|
|
21
|
-
* against an authority separate from the implementation under test.
|
|
22
|
-
*/
|
|
23
|
-
import { describe, it, expect } from 'vitest'
|
|
24
|
-
import { renderMermaidASCII } from '@zombie-mermaid/ascii-renderer'
|
|
25
|
-
import { displayWidth } from '../../packages/ascii-renderer/src/display-width.ts'
|
|
26
|
-
import {
|
|
27
|
-
terminalDisplayWidth,
|
|
28
|
-
assertUniformDisplayWidth,
|
|
29
|
-
} from './helpers/terminal-display-width.ts'
|
|
30
|
-
|
|
31
|
-
// 👨👩👧 — MAN, ZWJ, WOMAN, ZWJ, GIRL (5 code points, 1 grapheme cluster).
|
|
32
|
-
const ZWJ_FAMILY = '\u{1F468}' + '' + '\u{1F469}' + '' + '\u{1F467}'
|
|
33
|
-
// 🇺🇸 — REGIONAL INDICATOR U + REGIONAL INDICATOR S (2 code points, 1 cluster).
|
|
34
|
-
const FLAG_US = '\u{1F1FA}' + '\u{1F1F8}'
|
|
35
|
-
// 👍🏽 — THUMBS UP + MEDIUM SKIN TONE modifier (2 code points, 1 cluster).
|
|
36
|
-
const THUMB_MEDIUM = '\u{1F44D}' + '\u{1F3FD}'
|
|
37
|
-
|
|
38
|
-
describe('ASCII renderer — composed emoji cluster width (issue #214)', () => {
|
|
39
|
-
it.each([
|
|
40
|
-
['ZWJ family emoji', ZWJ_FAMILY, 5, 2],
|
|
41
|
-
['regional-indicator flag', FLAG_US, 2, 2],
|
|
42
|
-
['skin-tone-modified emoji', THUMB_MEDIUM, 2, 2],
|
|
43
|
-
['plain CJK (contrast)', '日本', 2, 4],
|
|
44
|
-
])(
|
|
45
|
-
'%s: %j has %i code points and measures as %i columns',
|
|
46
|
-
(_label, text, codePointCount, expectedWidth) => {
|
|
47
|
-
expect([...text].length).toBe(codePointCount)
|
|
48
|
-
expect(displayWidth(text)).toBe(expectedWidth)
|
|
49
|
-
expect(terminalDisplayWidth(text)).toBe(expectedWidth)
|
|
50
|
-
},
|
|
51
|
-
)
|
|
52
|
-
|
|
53
|
-
for (const useAscii of [false, true]) {
|
|
54
|
-
describe(useAscii ? 'ASCII charset' : 'Unicode charset', () => {
|
|
55
|
-
it('renders the issue repro (family emoji + CJK) with all rows at equal terminal width', () => {
|
|
56
|
-
const mermaid = `flowchart TD\n A[${ZWJ_FAMILY} team] --> B[日本]`
|
|
57
|
-
const ascii = renderMermaidASCII(mermaid, {
|
|
58
|
-
useAscii,
|
|
59
|
-
colorMode: 'none',
|
|
60
|
-
})
|
|
61
|
-
assertUniformDisplayWidth(ascii)
|
|
62
|
-
expect(ascii).toContain(ZWJ_FAMILY)
|
|
63
|
-
expect(ascii).toContain('日本')
|
|
64
|
-
})
|
|
65
|
-
|
|
66
|
-
it('sizes a flag-emoji label box to 2 columns, not 4', () => {
|
|
67
|
-
const mermaid = `flowchart TD\n A[${FLAG_US}] --> B[ok]`
|
|
68
|
-
const ascii = renderMermaidASCII(mermaid, {
|
|
69
|
-
useAscii,
|
|
70
|
-
colorMode: 'none',
|
|
71
|
-
})
|
|
72
|
-
assertUniformDisplayWidth(ascii)
|
|
73
|
-
expect(ascii).toContain(FLAG_US)
|
|
74
|
-
})
|
|
75
|
-
|
|
76
|
-
it('sizes a skin-tone-modifier label box to 2 columns, not 4', () => {
|
|
77
|
-
const mermaid = `flowchart TD\n A[${THUMB_MEDIUM}] --> B[ok]`
|
|
78
|
-
const ascii = renderMermaidASCII(mermaid, {
|
|
79
|
-
useAscii,
|
|
80
|
-
colorMode: 'none',
|
|
81
|
-
})
|
|
82
|
-
assertUniformDisplayWidth(ascii)
|
|
83
|
-
expect(ascii).toContain(THUMB_MEDIUM)
|
|
84
|
-
})
|
|
85
|
-
})
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
it('renders a class diagram compartment box with a composed emoji member at uniform width', () => {
|
|
89
|
-
const mermaid = `classDiagram\n class Team {\n +String ${ZWJ_FAMILY}\n }`
|
|
90
|
-
const ascii = renderMermaidASCII(mermaid, { colorMode: 'none' })
|
|
91
|
-
assertUniformDisplayWidth(ascii)
|
|
92
|
-
expect(ascii).toContain(ZWJ_FAMILY)
|
|
93
|
-
})
|
|
94
|
-
|
|
95
|
-
it('renders an ER diagram compartment box with a composed emoji attribute at uniform width', () => {
|
|
96
|
-
const mermaid = `erDiagram\n ITEM {\n string ${FLAG_US}\n }`
|
|
97
|
-
const ascii = renderMermaidASCII(mermaid, { colorMode: 'none' })
|
|
98
|
-
assertUniformDisplayWidth(ascii)
|
|
99
|
-
expect(ascii).toContain(FLAG_US)
|
|
100
|
-
})
|
|
101
|
-
})
|
|
@@ -1,251 +0,0 @@
|
|
|
1
|
-
// ============================================================================
|
|
2
|
-
// ASCII ER diagram box-occupancy invariants
|
|
3
|
-
//
|
|
4
|
-
// Generalizes issue #350's fix (src/ascii/er-diagram.ts's `setCGuarded`/
|
|
5
|
-
// `boxCells`/`regionClear` occupancy guard — see
|
|
6
|
-
// ascii-er-relationship-label-corruption-350.test.ts for the original fixed
|
|
7
|
-
// repro) from a single fixed repro into a swept matrix: no two entity boxes
|
|
8
|
-
// ever overlap, and no relationship label ever lands inside an entity box it
|
|
9
|
-
// isn't attached to. svg-samples.visual.test.ts / ascii-samples.visual.test.ts
|
|
10
|
-
// only self-diff against a committed baseline screenshot, so they can't catch
|
|
11
|
-
// this shape of regression on their own — these assertions check the
|
|
12
|
-
// renderer's own occupancy guarantee directly, on any diagram shape, not just
|
|
13
|
-
// the one screenshot on file.
|
|
14
|
-
// ============================================================================
|
|
15
|
-
|
|
16
|
-
import { describe, it, expect } from 'vitest'
|
|
17
|
-
import { renderMermaidASCII } from '@zombie-mermaid/ascii-renderer'
|
|
18
|
-
import {
|
|
19
|
-
findBoxRect,
|
|
20
|
-
findTextRect,
|
|
21
|
-
rectsOverlap,
|
|
22
|
-
} from './helpers/ascii-form.ts'
|
|
23
|
-
|
|
24
|
-
/** Assert no two named entity boxes in `ascii` overlap. */
|
|
25
|
-
function expectNoBoxOverlap(ascii: string, names: string[]): void {
|
|
26
|
-
const rects = names.map((n) => ({ n, r: findBoxRect(ascii, n) }))
|
|
27
|
-
for (let i = 0; i < rects.length; i++) {
|
|
28
|
-
for (let j = i + 1; j < rects.length; j++) {
|
|
29
|
-
expect(
|
|
30
|
-
rectsOverlap(rects[i]!.r, rects[j]!.r),
|
|
31
|
-
`${rects[i]!.n} and ${rects[j]!.n} boxes overlap`,
|
|
32
|
-
).toBe(false)
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
/** Assert `label` doesn't land inside any of `names`' boxes. */
|
|
38
|
-
function expectLabelOutsideBoxes(
|
|
39
|
-
ascii: string,
|
|
40
|
-
label: string,
|
|
41
|
-
names: string[],
|
|
42
|
-
): void {
|
|
43
|
-
const labelRect = findTextRect(ascii, label)
|
|
44
|
-
for (const name of names) {
|
|
45
|
-
const boxRect = findBoxRect(ascii, name)
|
|
46
|
-
expect(
|
|
47
|
-
rectsOverlap(labelRect, boxRect),
|
|
48
|
-
`label "${label}" lands inside ${name}'s box`,
|
|
49
|
-
).toBe(false)
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
describe('ASCII ER diagrams — entity boxes never overlap (issue #350 family)', () => {
|
|
54
|
-
it('2 entities, 1 direct relationship, short label', () => {
|
|
55
|
-
const src = `erDiagram
|
|
56
|
-
A ||--o{ B : owns`
|
|
57
|
-
const ascii = renderMermaidASCII(src, { useAscii: true })
|
|
58
|
-
expectNoBoxOverlap(ascii, ['A', 'B'])
|
|
59
|
-
})
|
|
60
|
-
|
|
61
|
-
it('2 entities, direct, long label', () => {
|
|
62
|
-
const src = `erDiagram
|
|
63
|
-
A ||--o{ B : ships_to_a_regional_warehouse`
|
|
64
|
-
const ascii = renderMermaidASCII(src, { useAscii: true })
|
|
65
|
-
expectNoBoxOverlap(ascii, ['A', 'B'])
|
|
66
|
-
})
|
|
67
|
-
|
|
68
|
-
it('2 entities, direct, long identifier names', () => {
|
|
69
|
-
const src = `erDiagram
|
|
70
|
-
CUSTOMER_ACCOUNT_PROFILE ||--o{ SHIPPING_ADDRESS_RECORD : has`
|
|
71
|
-
const ascii = renderMermaidASCII(src, { useAscii: true })
|
|
72
|
-
expectNoBoxOverlap(ascii, [
|
|
73
|
-
'CUSTOMER_ACCOUNT_PROFILE',
|
|
74
|
-
'SHIPPING_ADDRESS_RECORD',
|
|
75
|
-
])
|
|
76
|
-
})
|
|
77
|
-
|
|
78
|
-
it('3 entities, adjacent-only chain (smoke case)', () => {
|
|
79
|
-
const src = `erDiagram
|
|
80
|
-
A ||--o{ B : one
|
|
81
|
-
B ||--o{ C : two`
|
|
82
|
-
const ascii = renderMermaidASCII(src, { useAscii: true })
|
|
83
|
-
expectNoBoxOverlap(ascii, ['A', 'B', 'C'])
|
|
84
|
-
})
|
|
85
|
-
|
|
86
|
-
it('3 entities same row, A-C skipping B (direct issue #350 shape)', () => {
|
|
87
|
-
const src = `erDiagram
|
|
88
|
-
A ||--o{ B : one
|
|
89
|
-
A ||--o| C : skips_b`
|
|
90
|
-
const ascii = renderMermaidASCII(src, { useAscii: true })
|
|
91
|
-
expectNoBoxOverlap(ascii, ['A', 'B', 'C'])
|
|
92
|
-
expectLabelOutsideBoxes(ascii, 'skips_b', ['B'])
|
|
93
|
-
})
|
|
94
|
-
|
|
95
|
-
it('3 entities, A-C skip B, long multi-word label', () => {
|
|
96
|
-
const src = `erDiagram
|
|
97
|
-
A ||--o{ B : one
|
|
98
|
-
A ||--o| C : a_very_long_descriptive_relationship_name`
|
|
99
|
-
const ascii = renderMermaidASCII(src, { useAscii: true })
|
|
100
|
-
expectNoBoxOverlap(ascii, ['A', 'B', 'C'])
|
|
101
|
-
expectLabelOutsideBoxes(
|
|
102
|
-
ascii,
|
|
103
|
-
'a_very_long_descriptive_relationship_name',
|
|
104
|
-
['B'],
|
|
105
|
-
)
|
|
106
|
-
})
|
|
107
|
-
|
|
108
|
-
it('3 entities, A-C skip B, long names', () => {
|
|
109
|
-
const src = `erDiagram
|
|
110
|
-
ALPHA_ENTITY ||--o{ BRAVO_ENTITY : one
|
|
111
|
-
ALPHA_ENTITY ||--o| CHARLIE_ENTITY : skips_b`
|
|
112
|
-
const ascii = renderMermaidASCII(src, { useAscii: true })
|
|
113
|
-
expectNoBoxOverlap(ascii, [
|
|
114
|
-
'ALPHA_ENTITY',
|
|
115
|
-
'BRAVO_ENTITY',
|
|
116
|
-
'CHARLIE_ENTITY',
|
|
117
|
-
])
|
|
118
|
-
})
|
|
119
|
-
|
|
120
|
-
it('5 entities, 3-per-row layout, A-C skip B in row 1', () => {
|
|
121
|
-
const src = `erDiagram
|
|
122
|
-
A ||--o{ B : one
|
|
123
|
-
A ||--o| C : skips_b
|
|
124
|
-
A ||--o{ D : two
|
|
125
|
-
A ||--o{ E : three`
|
|
126
|
-
const ascii = renderMermaidASCII(src, { useAscii: true })
|
|
127
|
-
expectNoBoxOverlap(ascii, ['A', 'B', 'C', 'D', 'E'])
|
|
128
|
-
})
|
|
129
|
-
|
|
130
|
-
it('5 entities, two same-row obstructed pairs sharing the row-gap band', () => {
|
|
131
|
-
const src = `erDiagram
|
|
132
|
-
A ||--o{ B : one
|
|
133
|
-
A ||--o| C : first_skip
|
|
134
|
-
D ||--o{ E : two
|
|
135
|
-
A ||--o{ D : bridge
|
|
136
|
-
D ||--o| B : second_skip`
|
|
137
|
-
const ascii = renderMermaidASCII(src, { useAscii: true })
|
|
138
|
-
expectNoBoxOverlap(ascii, ['A', 'B', 'C', 'D', 'E'])
|
|
139
|
-
const firstSkip = findTextRect(ascii, 'first_skip')
|
|
140
|
-
const secondSkip = findTextRect(ascii, 'second_skip')
|
|
141
|
-
expect(
|
|
142
|
-
rectsOverlap(firstSkip, secondSkip),
|
|
143
|
-
'first_skip and second_skip labels overlap each other',
|
|
144
|
-
).toBe(false)
|
|
145
|
-
})
|
|
146
|
-
|
|
147
|
-
it('5 entities, vertical relationship whose row-mate is taller', () => {
|
|
148
|
-
const src = `erDiagram
|
|
149
|
-
A ||--o{ B : one
|
|
150
|
-
A {
|
|
151
|
-
string id
|
|
152
|
-
string a1
|
|
153
|
-
string a2
|
|
154
|
-
string a3
|
|
155
|
-
string a4
|
|
156
|
-
string a5
|
|
157
|
-
}
|
|
158
|
-
C ||--o{ D : two
|
|
159
|
-
A ||--o| D : cross_row`
|
|
160
|
-
const ascii = renderMermaidASCII(src, { useAscii: true })
|
|
161
|
-
expectNoBoxOverlap(ascii, ['A', 'B', 'C', 'D'])
|
|
162
|
-
})
|
|
163
|
-
|
|
164
|
-
it('7 entities, multi-row skip spanning 3 rows', () => {
|
|
165
|
-
const src = `erDiagram
|
|
166
|
-
A ||--o{ B : r1a
|
|
167
|
-
A ||--o{ C : r1b
|
|
168
|
-
D ||--o{ E : r2a
|
|
169
|
-
D ||--o{ F : r2b
|
|
170
|
-
G ||--o{ A : r3
|
|
171
|
-
G ||--o| D : long_skip_across_rows`
|
|
172
|
-
const ascii = renderMermaidASCII(src, { useAscii: true })
|
|
173
|
-
expectNoBoxOverlap(ascii, ['A', 'B', 'C', 'D', 'E', 'F', 'G'])
|
|
174
|
-
})
|
|
175
|
-
|
|
176
|
-
it('4 entities, mixed same-row + cross-row + diagonal relationship', () => {
|
|
177
|
-
const src = `erDiagram
|
|
178
|
-
A ||--o{ B : same_row
|
|
179
|
-
C ||--o{ D : same_row_2
|
|
180
|
-
A ||--o| D : diagonal`
|
|
181
|
-
const ascii = renderMermaidASCII(src, { useAscii: true })
|
|
182
|
-
expectNoBoxOverlap(ascii, ['A', 'B', 'C', 'D'])
|
|
183
|
-
})
|
|
184
|
-
|
|
185
|
-
it('2 entities, parallel relationships (2 labels, same pair)', () => {
|
|
186
|
-
const src = `erDiagram
|
|
187
|
-
A ||--o{ B : places_order
|
|
188
|
-
A ||--o{ B : returns_item`
|
|
189
|
-
const ascii = renderMermaidASCII(src, { useAscii: true })
|
|
190
|
-
const label1 = findTextRect(ascii, 'places_order')
|
|
191
|
-
const label2 = findTextRect(ascii, 'returns_item')
|
|
192
|
-
expect(
|
|
193
|
-
rectsOverlap(label1, label2),
|
|
194
|
-
'the two relationship labels overlap',
|
|
195
|
-
).toBe(false)
|
|
196
|
-
})
|
|
197
|
-
|
|
198
|
-
it("3 entities, two-char crow's-foot markers, minimal gap", () => {
|
|
199
|
-
const src = `erDiagram
|
|
200
|
-
A }o--o{ B : m2m
|
|
201
|
-
B }o--o{ C : m2m2`
|
|
202
|
-
const ascii = renderMermaidASCII(src, { useAscii: true })
|
|
203
|
-
expectNoBoxOverlap(ascii, ['A', 'B', 'C'])
|
|
204
|
-
})
|
|
205
|
-
|
|
206
|
-
it('6 entities, 2 disconnected components, each with same-row obstruction', () => {
|
|
207
|
-
const src = `erDiagram
|
|
208
|
-
A ||--o{ B : one
|
|
209
|
-
A ||--o| C : skip_1
|
|
210
|
-
|
|
211
|
-
D ||--o{ E : two
|
|
212
|
-
D ||--o| F : skip_2`
|
|
213
|
-
const ascii = renderMermaidASCII(src, { useAscii: true })
|
|
214
|
-
expectNoBoxOverlap(ascii, ['A', 'B', 'C', 'D', 'E', 'F'])
|
|
215
|
-
})
|
|
216
|
-
|
|
217
|
-
it('3 entities, A-C skip B, B has zero attributes (short box)', () => {
|
|
218
|
-
const src = `erDiagram
|
|
219
|
-
A ||--o{ B : one
|
|
220
|
-
A ||--o| C : skip_short_b`
|
|
221
|
-
const ascii = renderMermaidASCII(src, { useAscii: true })
|
|
222
|
-
expectNoBoxOverlap(ascii, ['A', 'B', 'C'])
|
|
223
|
-
})
|
|
224
|
-
|
|
225
|
-
it('3 entities, A-C skip B, B has 8 attributes (tall box)', () => {
|
|
226
|
-
const src = `erDiagram
|
|
227
|
-
A ||--o{ B : one
|
|
228
|
-
B {
|
|
229
|
-
string id
|
|
230
|
-
string b1
|
|
231
|
-
string b2
|
|
232
|
-
string b3
|
|
233
|
-
string b4
|
|
234
|
-
string b5
|
|
235
|
-
string b6
|
|
236
|
-
string b7
|
|
237
|
-
}
|
|
238
|
-
A ||--o| C : skip_tall_b`
|
|
239
|
-
const ascii = renderMermaidASCII(src, { useAscii: true })
|
|
240
|
-
expectNoBoxOverlap(ascii, ['A', 'B', 'C'])
|
|
241
|
-
})
|
|
242
|
-
|
|
243
|
-
it('4 entities in one row, A-D skipping 2 (B and C)', () => {
|
|
244
|
-
const src = `erDiagram
|
|
245
|
-
A ||--o{ B : one
|
|
246
|
-
B ||--o{ C : two
|
|
247
|
-
A ||--o| D : skip_two`
|
|
248
|
-
const ascii = renderMermaidASCII(src, { useAscii: true })
|
|
249
|
-
expectNoBoxOverlap(ascii, ['A', 'B', 'C', 'D'])
|
|
250
|
-
})
|
|
251
|
-
})
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
// ============================================================================
|
|
2
|
-
// ASCII ER diagram crow's-foot cardinality marker tests
|
|
3
|
-
// ============================================================================
|
|
4
|
-
|
|
5
|
-
import { describe, it, expect } from 'vitest'
|
|
6
|
-
import { renderMermaidASCII } from '@zombie-mermaid/ascii-renderer'
|
|
7
|
-
|
|
8
|
-
describe('ASCII ER crow-foot cardinality markers', () => {
|
|
9
|
-
it('mirrors the zero-one marker orientation on the left side (regression)', () => {
|
|
10
|
-
// Left-side markers sit at the left entity's right edge, pointing away
|
|
11
|
-
// from it (line nearest the entity, circle furthest): "|o". Before the
|
|
12
|
-
// fix, getCrowsFootChars() always returned "o|" regardless of side,
|
|
13
|
-
// which is only correct on the right side.
|
|
14
|
-
const ascii = renderMermaidASCII(
|
|
15
|
-
`erDiagram
|
|
16
|
-
WIDGET |o--|| GADGET : rel`,
|
|
17
|
-
{ useAscii: true },
|
|
18
|
-
)
|
|
19
|
-
expect(ascii).toContain('|o')
|
|
20
|
-
|
|
21
|
-
const unicode = renderMermaidASCII(`erDiagram
|
|
22
|
-
WIDGET |o--|| GADGET : rel`)
|
|
23
|
-
expect(unicode).toContain('│○')
|
|
24
|
-
})
|
|
25
|
-
|
|
26
|
-
it('keeps the zero-one marker orientation on the right side', () => {
|
|
27
|
-
// Right-side markers sit at the right entity's left edge, pointing away
|
|
28
|
-
// from it: circle nearest the entity, line furthest: "o|".
|
|
29
|
-
const ascii = renderMermaidASCII(
|
|
30
|
-
`erDiagram
|
|
31
|
-
WIDGET ||--o| GADGET : rel`,
|
|
32
|
-
{ useAscii: true },
|
|
33
|
-
)
|
|
34
|
-
expect(ascii).toContain('o|')
|
|
35
|
-
|
|
36
|
-
const unicode = renderMermaidASCII(`erDiagram
|
|
37
|
-
WIDGET ||--o| GADGET : rel`)
|
|
38
|
-
expect(unicode).toContain('○│')
|
|
39
|
-
})
|
|
40
|
-
})
|