mirror of
https://github.com/mermaid-js/mermaid.git
synced 2025-09-12 03:49:43 +02:00
Merge pull request #908 from knsv/bug/subgraphs_number_in_id_and_space_in_titles_895_and_900
Bug/subgraphs number in id and space in titles 895 and 900
This commit is contained in:
44
e2e/platform/subgraph.html
Normal file
44
e2e/platform/subgraph.html
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<title>Mermaid Quick Test Page</title>
|
||||||
|
<link rel="icon" type="image/png" href="data:image/png;base64,iVBORw0KGgo=">
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
font-family: 'trebuchet ms', verdana, arial;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="mermaid">
|
||||||
|
graph TD
|
||||||
|
A[Christmas] -->|Get money| B(Go shopping)
|
||||||
|
subgraph 1test["id starting with number"]
|
||||||
|
A
|
||||||
|
end
|
||||||
|
style 1test fill:#F99,stroke-width:2px,stroke:#F0F
|
||||||
|
</div>
|
||||||
|
<div class="mermaid">
|
||||||
|
graph TD
|
||||||
|
A[Christmas] -->|Get money| B(Go shopping)
|
||||||
|
subgraph test["id starting with number"]
|
||||||
|
A
|
||||||
|
end
|
||||||
|
style test fill:#F99,stroke-width:2px,stroke:#F0F
|
||||||
|
</div>
|
||||||
|
<div class="mermaid">
|
||||||
|
graph TD
|
||||||
|
9e122290-->82072290_1ec3_e711_8c5a_005056ad0002
|
||||||
|
style 9e122290 fill:#F99,stroke-width:2px,stroke:#F0F
|
||||||
|
</div>
|
||||||
|
<script src="./mermaid.js"></script>
|
||||||
|
<script>
|
||||||
|
function showFullFirstSquad(elemName) {
|
||||||
|
console.log('show ' + elemName);
|
||||||
|
}
|
||||||
|
mermaid.initialize({ startOnLoad: true, securityLevel: 'loose', logLevel: 1 });
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
@@ -37,9 +37,9 @@ const sanitize = text => {
|
|||||||
* @param style
|
* @param style
|
||||||
* @param classes
|
* @param classes
|
||||||
*/
|
*/
|
||||||
export const addVertex = function (id, text, type, style, classes) {
|
export const addVertex = function (_id, text, type, style, classes) {
|
||||||
let txt
|
let txt
|
||||||
|
let id = _id
|
||||||
if (typeof id === 'undefined') {
|
if (typeof id === 'undefined') {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -47,6 +47,8 @@ export const addVertex = function (id, text, type, style, classes) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (id[0].match(/\d/)) id = 's' + id
|
||||||
|
|
||||||
if (typeof vertices[id] === 'undefined') {
|
if (typeof vertices[id] === 'undefined') {
|
||||||
vertices[id] = { id: id, styles: [], classes: [] }
|
vertices[id] = { id: id, styles: [], classes: [] }
|
||||||
}
|
}
|
||||||
@@ -86,8 +88,13 @@ export const addVertex = function (id, text, type, style, classes) {
|
|||||||
* @param type
|
* @param type
|
||||||
* @param linktext
|
* @param linktext
|
||||||
*/
|
*/
|
||||||
export const addLink = function (start, end, type, linktext) {
|
export const addLink = function (_start, _end, type, linktext) {
|
||||||
|
let start = _start
|
||||||
|
let end = _end
|
||||||
|
if (start[0].match(/\d/)) start = 's' + start
|
||||||
|
if (end[0].match(/\d/)) end = 's' + end
|
||||||
logger.info('Got edge...', start, end)
|
logger.info('Got edge...', start, end)
|
||||||
|
|
||||||
const edge = { start: start, end: end, type: undefined, text: '' }
|
const edge = { start: start, end: end, type: undefined, text: '' }
|
||||||
linktext = type.text
|
linktext = type.text
|
||||||
|
|
||||||
@@ -338,7 +345,12 @@ export const defaultStyle = function () {
|
|||||||
/**
|
/**
|
||||||
* Clears the internal graph db so that a new graph can be parsed.
|
* Clears the internal graph db so that a new graph can be parsed.
|
||||||
*/
|
*/
|
||||||
export const addSubGraph = function (id, list, title) {
|
export const addSubGraph = function (_id, list, _title) {
|
||||||
|
let id = _id
|
||||||
|
let title = _title
|
||||||
|
if (_id === _title && _title.match(/\s/)) {
|
||||||
|
id = undefined
|
||||||
|
}
|
||||||
function uniq (a) {
|
function uniq (a) {
|
||||||
const prims = { 'boolean': {}, 'number': {}, 'string': {} }
|
const prims = { 'boolean': {}, 'number': {}, 'string': {} }
|
||||||
const objs = []
|
const objs = []
|
||||||
@@ -357,6 +369,7 @@ export const addSubGraph = function (id, list, title) {
|
|||||||
nodeList = uniq(nodeList.concat.apply(nodeList, list))
|
nodeList = uniq(nodeList.concat.apply(nodeList, list))
|
||||||
|
|
||||||
id = id || ('subGraph' + subCount)
|
id = id || ('subGraph' + subCount)
|
||||||
|
if (id[0].match(/\d/)) id = 's' + id
|
||||||
title = title || ''
|
title = title || ''
|
||||||
title = sanitize(title)
|
title = sanitize(title)
|
||||||
subCount = subCount + 1
|
subCount = subCount + 1
|
||||||
|
@@ -251,12 +251,12 @@ statement
|
|||||||
{$$=[];}
|
{$$=[];}
|
||||||
| clickStatement separator
|
| clickStatement separator
|
||||||
{$$=[];}
|
{$$=[];}
|
||||||
| subgraph SPACE alphaNum SQS text SQE separator document end
|
| subgraph SPACE text SQS text SQE separator document end
|
||||||
{$$=yy.addSubGraph($3,$8,$5);}
|
{$$=yy.addSubGraph($3,$8,$5);}
|
||||||
| subgraph SPACE STR separator document end
|
| subgraph SPACE text separator document end
|
||||||
{$$=yy.addSubGraph(undefined,$5,$3);}
|
|
||||||
| subgraph SPACE alphaNum separator document end
|
|
||||||
{$$=yy.addSubGraph($3,$5,$3);}
|
{$$=yy.addSubGraph($3,$5,$3);}
|
||||||
|
// | subgraph SPACE text separator document end
|
||||||
|
// {$$=yy.addSubGraph($3,$5,$3);}
|
||||||
| subgraph separator document end
|
| subgraph separator document end
|
||||||
{$$=yy.addSubGraph(undefined,$3,undefined);}
|
{$$=yy.addSubGraph(undefined,$3,undefined);}
|
||||||
;
|
;
|
||||||
@@ -265,20 +265,20 @@ separator: NEWLINE | SEMI | EOF ;
|
|||||||
|
|
||||||
verticeStatement:
|
verticeStatement:
|
||||||
vertex link vertex
|
vertex link vertex
|
||||||
{ yy.addLink($1,$3,$2);$$ = [$1,$3];}
|
{ yy.addLink($1,$3,$2);$$ = [$1,$3];}
|
||||||
| vertex link vertex DOT idString
|
| vertex link vertex DOT idString
|
||||||
{ yy.addLink($1,$3,$2);$$ = [$1,$3];yy.setClass($3,$5);}
|
{ yy.addLink($1,$3,$2);$$ = [$1,$3];yy.setClass($3,$5);}
|
||||||
| vertex DOT idString link vertex
|
| vertex DOT idString link vertex
|
||||||
{ yy.addLink($1,$5,$4);$$ = [$1,$5];yy.setClass($1,$3);}
|
{ yy.addLink($1,$5,$4);$$ = [$1,$5];yy.setClass($1,$3);}
|
||||||
| vertex DOT idString link vertex DOT idString
|
| vertex DOT idString link vertex DOT idString
|
||||||
{ yy.addLink($1,$5,$4);$$ = [$1,$5];yy.setClass($5,$7);yy.setClass($1,$3);}
|
{ yy.addLink($1,$5,$4);$$ = [$1,$5];yy.setClass($5,$7);yy.setClass($1,$3);}
|
||||||
|vertex
|
|vertex
|
||||||
{$$ = [$1];}
|
{$$ = [$1];}
|
||||||
|vertex DOT idString
|
|vertex DOT idString
|
||||||
{$$ = [$1];yy.setClass($1,$3)}
|
{$$ = [$1];yy.setClass($1,$3)}
|
||||||
;
|
;
|
||||||
|
|
||||||
vertex: idString SQS text SQE
|
vertex: idString SQS text SQE
|
||||||
{$$ = $1;yy.addVertex($1,$3,'square');}
|
{$$ = $1;yy.addVertex($1,$3,'square');}
|
||||||
| idString SQS text SQE spaceList
|
| idString SQS text SQE spaceList
|
||||||
{$$ = $1;yy.addVertex($1,$3,'square');}
|
{$$ = $1;yy.addVertex($1,$3,'square');}
|
||||||
@@ -403,25 +403,25 @@ linkStatement: ARROW_POINT
|
|||||||
| DOTTED_ARROW_CIRCLE
|
| DOTTED_ARROW_CIRCLE
|
||||||
{$$ = {"type":"arrow_circle","stroke":"dotted"};}
|
{$$ = {"type":"arrow_circle","stroke":"dotted"};}
|
||||||
| DOUBLE_DOTTED_ARROW_CIRCLE
|
| DOUBLE_DOTTED_ARROW_CIRCLE
|
||||||
{$$ = {"type":"double_arrow_circle","stroke":"dotted"};}
|
{$$ = {"type":"double_arrow_circle","stroke":"dotted"};}
|
||||||
| DOTTED_ARROW_CROSS
|
| DOTTED_ARROW_CROSS
|
||||||
{$$ = {"type":"arrow_cross","stroke":"dotted"};}
|
{$$ = {"type":"arrow_cross","stroke":"dotted"};}
|
||||||
| DOUBLE_DOTTED_ARROW_CROSS
|
| DOUBLE_DOTTED_ARROW_CROSS
|
||||||
{$$ = {"type":"double_arrow_cross","stroke":"dotted"};}
|
{$$ = {"type":"double_arrow_cross","stroke":"dotted"};}
|
||||||
| DOTTED_ARROW_OPEN
|
| DOTTED_ARROW_OPEN
|
||||||
{$$ = {"type":"arrow_open","stroke":"dotted"};}
|
{$$ = {"type":"arrow_open","stroke":"dotted"};}
|
||||||
| THICK_ARROW_POINT
|
| THICK_ARROW_POINT
|
||||||
{$$ = {"type":"arrow","stroke":"thick"};}
|
{$$ = {"type":"arrow","stroke":"thick"};}
|
||||||
| DOUBLE_THICK_ARROW_POINT
|
| DOUBLE_THICK_ARROW_POINT
|
||||||
{$$ = {"type":"double_arrow_point","stroke":"thick"};}
|
{$$ = {"type":"double_arrow_point","stroke":"thick"};}
|
||||||
| THICK_ARROW_CIRCLE
|
| THICK_ARROW_CIRCLE
|
||||||
{$$ = {"type":"arrow_circle","stroke":"thick"};}
|
{$$ = {"type":"arrow_circle","stroke":"thick"};}
|
||||||
| DOUBLE_THICK_ARROW_CIRCLE
|
| DOUBLE_THICK_ARROW_CIRCLE
|
||||||
{$$ = {"type":"double_arrow_circle","stroke":"thick"};}
|
{$$ = {"type":"double_arrow_circle","stroke":"thick"};}
|
||||||
| THICK_ARROW_CROSS
|
| THICK_ARROW_CROSS
|
||||||
{$$ = {"type":"arrow_cross","stroke":"thick"};}
|
{$$ = {"type":"arrow_cross","stroke":"thick"};}
|
||||||
| DOUBLE_THICK_ARROW_CROSS
|
| DOUBLE_THICK_ARROW_CROSS
|
||||||
{$$ = {"type":"double_arrow_cross","stroke":"thick"};}
|
{$$ = {"type":"double_arrow_cross","stroke":"thick"};}
|
||||||
| THICK_ARROW_OPEN
|
| THICK_ARROW_OPEN
|
||||||
{$$ = {"type":"arrow_open","stroke":"thick"};}
|
{$$ = {"type":"arrow_open","stroke":"thick"};}
|
||||||
;
|
;
|
||||||
|
@@ -27,54 +27,6 @@ describe('when parsing ', function () {
|
|||||||
expect(edges[0].text).toBe('')
|
expect(edges[0].text).toBe('')
|
||||||
})
|
})
|
||||||
|
|
||||||
it('should handle subgraph with tab indentation', function () {
|
|
||||||
const res = flow.parser.parse('graph TB\nsubgraph One\n\ta1-->a2\nend')
|
|
||||||
const subgraphs = flow.parser.yy.getSubGraphs()
|
|
||||||
expect(subgraphs.length).toBe(1)
|
|
||||||
const subgraph = subgraphs[0]
|
|
||||||
expect(subgraph.nodes.length).toBe(2)
|
|
||||||
expect(subgraph.nodes[0]).toBe('a1')
|
|
||||||
expect(subgraph.nodes[1]).toBe('a2')
|
|
||||||
expect(subgraph.title).toBe('One')
|
|
||||||
expect(subgraph.id).toBe('One')
|
|
||||||
})
|
|
||||||
|
|
||||||
it('should handle subgraph with multiple words in title', function () {
|
|
||||||
const res = flow.parser.parse('graph TB\nsubgraph "Some Title"\n\ta1-->a2\nend')
|
|
||||||
const subgraphs = flow.parser.yy.getSubGraphs()
|
|
||||||
expect(subgraphs.length).toBe(1)
|
|
||||||
const subgraph = subgraphs[0]
|
|
||||||
expect(subgraph.nodes.length).toBe(2)
|
|
||||||
expect(subgraph.nodes[0]).toBe('a1')
|
|
||||||
expect(subgraph.nodes[1]).toBe('a2')
|
|
||||||
expect(subgraph.title).toBe('Some Title')
|
|
||||||
expect(subgraph.id).toBe('subGraph0')
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should handle subgraph with id and title notation', function () {
|
|
||||||
const res = flow.parser.parse('graph TB\nsubgraph some-id[Some Title]\n\ta1-->a2\nend')
|
|
||||||
const subgraphs = flow.parser.yy.getSubGraphs()
|
|
||||||
expect(subgraphs.length).toBe(1)
|
|
||||||
const subgraph = subgraphs[0]
|
|
||||||
expect(subgraph.nodes.length).toBe(2)
|
|
||||||
expect(subgraph.nodes[0]).toBe('a1')
|
|
||||||
expect(subgraph.nodes[1]).toBe('a2')
|
|
||||||
expect(subgraph.title).toBe('Some Title')
|
|
||||||
expect(subgraph.id).toBe('some-id')
|
|
||||||
});
|
|
||||||
|
|
||||||
xit('should handle subgraph without id and space in title', function () {
|
|
||||||
const res = flow.parser.parse('graph TB\nsubgraph Some Title\n\ta1-->a2\nend')
|
|
||||||
const subgraphs = flow.parser.yy.getSubGraphs()
|
|
||||||
expect(subgraphs.length).toBe(1)
|
|
||||||
const subgraph = subgraphs[0]
|
|
||||||
expect(subgraph.nodes.length).toBe(2)
|
|
||||||
expect(subgraph.nodes[0]).toBe('a1')
|
|
||||||
expect(subgraph.nodes[1]).toBe('a2')
|
|
||||||
expect(subgraph.title).toBe('Some Title')
|
|
||||||
expect(subgraph.id).toBe('some-id')
|
|
||||||
});
|
|
||||||
|
|
||||||
it("should handle angle bracket ' > ' as direction LR", function () {
|
it("should handle angle bracket ' > ' as direction LR", function () {
|
||||||
const res = flow.parser.parse('graph >;A-->B;')
|
const res = flow.parser.parse('graph >;A-->B;')
|
||||||
|
|
||||||
@@ -384,53 +336,6 @@ describe('when parsing ', function () {
|
|||||||
|
|
||||||
expect(edges[0].type).toBe('arrow_circle')
|
expect(edges[0].type).toBe('arrow_circle')
|
||||||
})
|
})
|
||||||
it('should handle subgraphs', function () {
|
|
||||||
const res = flow.parser.parse('graph TD;A-->B;subgraph myTitle;c-->d;end;')
|
|
||||||
|
|
||||||
const vert = flow.parser.yy.getVertices()
|
|
||||||
const edges = flow.parser.yy.getEdges()
|
|
||||||
|
|
||||||
expect(edges[0].type).toBe('arrow')
|
|
||||||
})
|
|
||||||
|
|
||||||
it('should handle subgraphs', function () {
|
|
||||||
const res = flow.parser.parse('graph TD\nA-->B\nsubgraph myTitle\n\n c-->d \nend\n')
|
|
||||||
|
|
||||||
const vert = flow.parser.yy.getVertices()
|
|
||||||
const edges = flow.parser.yy.getEdges()
|
|
||||||
|
|
||||||
expect(edges[0].type).toBe('arrow')
|
|
||||||
})
|
|
||||||
|
|
||||||
it('should handle nested subgraphs', function () {
|
|
||||||
const str = 'graph TD\n' +
|
|
||||||
'A-->B\n' +
|
|
||||||
'subgraph myTitle\n\n' +
|
|
||||||
' c-->d \n\n' +
|
|
||||||
' subgraph inner\n\n e-->f \n end \n\n' +
|
|
||||||
' subgraph inner\n\n h-->i \n end \n\n' +
|
|
||||||
'end\n'
|
|
||||||
const res = flow.parser.parse(str)
|
|
||||||
})
|
|
||||||
|
|
||||||
it('should handle subgraphs', function () {
|
|
||||||
const res = flow.parser.parse('graph TD\nA-->B\nsubgraph myTitle\nc-->d\nend;')
|
|
||||||
|
|
||||||
const vert = flow.parser.yy.getVertices()
|
|
||||||
const edges = flow.parser.yy.getEdges()
|
|
||||||
|
|
||||||
expect(edges[0].type).toBe('arrow')
|
|
||||||
})
|
|
||||||
|
|
||||||
it('should handle subgraphs', function () {
|
|
||||||
const res = flow.parser.parse('graph TD\nA-->B\nsubgraph myTitle\nc-- text -->d\nd-->e\n end;')
|
|
||||||
|
|
||||||
const vert = flow.parser.yy.getVertices()
|
|
||||||
const edges = flow.parser.yy.getEdges()
|
|
||||||
|
|
||||||
expect(edges[0].type).toBe('arrow')
|
|
||||||
})
|
|
||||||
|
|
||||||
it('should handle classDefs with style in classes', function () {
|
it('should handle classDefs with style in classes', function () {
|
||||||
const res = flow.parser.parse('graph TD\nA-->B\nclassDef exClass font-style:bold;')
|
const res = flow.parser.parse('graph TD\nA-->B\nclassDef exClass font-style:bold;')
|
||||||
|
|
||||||
@@ -449,7 +354,7 @@ describe('when parsing ', function () {
|
|||||||
expect(edges[0].type).toBe('arrow')
|
expect(edges[0].type).toBe('arrow')
|
||||||
})
|
})
|
||||||
|
|
||||||
it('should handle style definitons with more then 1 digit in a row', function () {
|
it('should handle style definitions with more then 1 digit in a row', function () {
|
||||||
const res = flow.parser.parse('graph TD\n' +
|
const res = flow.parser.parse('graph TD\n' +
|
||||||
'A-->B1\n' +
|
'A-->B1\n' +
|
||||||
'A-->B2\n' +
|
'A-->B2\n' +
|
||||||
@@ -613,10 +518,10 @@ describe('when parsing ', function () {
|
|||||||
describe('point', function () {
|
describe('point', function () {
|
||||||
it('should handle double edged nodes and edges', function () {
|
it('should handle double edged nodes and edges', function () {
|
||||||
const res = flow.parser.parse('graph TD;\nA<-->B;')
|
const res = flow.parser.parse('graph TD;\nA<-->B;')
|
||||||
|
|
||||||
const vert = flow.parser.yy.getVertices()
|
const vert = flow.parser.yy.getVertices()
|
||||||
const edges = flow.parser.yy.getEdges()
|
const edges = flow.parser.yy.getEdges()
|
||||||
|
|
||||||
expect(vert['A'].id).toBe('A')
|
expect(vert['A'].id).toBe('A')
|
||||||
expect(vert['B'].id).toBe('B')
|
expect(vert['B'].id).toBe('B')
|
||||||
expect(edges.length).toBe(1)
|
expect(edges.length).toBe(1)
|
||||||
@@ -627,10 +532,10 @@ describe('when parsing ', function () {
|
|||||||
})
|
})
|
||||||
it('should handle double edged nodes with text', function () {
|
it('should handle double edged nodes with text', function () {
|
||||||
const res = flow.parser.parse('graph TD;\nA<-- text -->B;')
|
const res = flow.parser.parse('graph TD;\nA<-- text -->B;')
|
||||||
|
|
||||||
const vert = flow.parser.yy.getVertices()
|
const vert = flow.parser.yy.getVertices()
|
||||||
const edges = flow.parser.yy.getEdges()
|
const edges = flow.parser.yy.getEdges()
|
||||||
|
|
||||||
expect(vert['A'].id).toBe('A')
|
expect(vert['A'].id).toBe('A')
|
||||||
expect(vert['B'].id).toBe('B')
|
expect(vert['B'].id).toBe('B')
|
||||||
expect(edges.length).toBe(1)
|
expect(edges.length).toBe(1)
|
||||||
@@ -642,10 +547,10 @@ describe('when parsing ', function () {
|
|||||||
})
|
})
|
||||||
it('should handle double edged nodes and edges on thick arrows', function () {
|
it('should handle double edged nodes and edges on thick arrows', function () {
|
||||||
const res = flow.parser.parse('graph TD;\nA<==>B;')
|
const res = flow.parser.parse('graph TD;\nA<==>B;')
|
||||||
|
|
||||||
const vert = flow.parser.yy.getVertices()
|
const vert = flow.parser.yy.getVertices()
|
||||||
const edges = flow.parser.yy.getEdges()
|
const edges = flow.parser.yy.getEdges()
|
||||||
|
|
||||||
expect(vert['A'].id).toBe('A')
|
expect(vert['A'].id).toBe('A')
|
||||||
expect(vert['B'].id).toBe('B')
|
expect(vert['B'].id).toBe('B')
|
||||||
expect(edges.length).toBe(1)
|
expect(edges.length).toBe(1)
|
||||||
@@ -657,10 +562,10 @@ describe('when parsing ', function () {
|
|||||||
})
|
})
|
||||||
it('should handle double edged nodes with text on thick arrows', function () {
|
it('should handle double edged nodes with text on thick arrows', function () {
|
||||||
const res = flow.parser.parse('graph TD;\nA<== text ==>B;')
|
const res = flow.parser.parse('graph TD;\nA<== text ==>B;')
|
||||||
|
|
||||||
const vert = flow.parser.yy.getVertices()
|
const vert = flow.parser.yy.getVertices()
|
||||||
const edges = flow.parser.yy.getEdges()
|
const edges = flow.parser.yy.getEdges()
|
||||||
|
|
||||||
expect(vert['A'].id).toBe('A')
|
expect(vert['A'].id).toBe('A')
|
||||||
expect(vert['B'].id).toBe('B')
|
expect(vert['B'].id).toBe('B')
|
||||||
expect(edges.length).toBe(1)
|
expect(edges.length).toBe(1)
|
||||||
@@ -672,10 +577,10 @@ describe('when parsing ', function () {
|
|||||||
})
|
})
|
||||||
it('should handle double edged nodes and edges on dotted arrows', function () {
|
it('should handle double edged nodes and edges on dotted arrows', function () {
|
||||||
const res = flow.parser.parse('graph TD;\nA<-.->B;')
|
const res = flow.parser.parse('graph TD;\nA<-.->B;')
|
||||||
|
|
||||||
const vert = flow.parser.yy.getVertices()
|
const vert = flow.parser.yy.getVertices()
|
||||||
const edges = flow.parser.yy.getEdges()
|
const edges = flow.parser.yy.getEdges()
|
||||||
|
|
||||||
expect(vert['A'].id).toBe('A')
|
expect(vert['A'].id).toBe('A')
|
||||||
expect(vert['B'].id).toBe('B')
|
expect(vert['B'].id).toBe('B')
|
||||||
expect(edges.length).toBe(1)
|
expect(edges.length).toBe(1)
|
||||||
@@ -687,10 +592,10 @@ describe('when parsing ', function () {
|
|||||||
})
|
})
|
||||||
it('should handle double edged nodes with text on dotted arrows', function () {
|
it('should handle double edged nodes with text on dotted arrows', function () {
|
||||||
const res = flow.parser.parse('graph TD;\nA<-. text .->B;')
|
const res = flow.parser.parse('graph TD;\nA<-. text .->B;')
|
||||||
|
|
||||||
const vert = flow.parser.yy.getVertices()
|
const vert = flow.parser.yy.getVertices()
|
||||||
const edges = flow.parser.yy.getEdges()
|
const edges = flow.parser.yy.getEdges()
|
||||||
|
|
||||||
expect(vert['A'].id).toBe('A')
|
expect(vert['A'].id).toBe('A')
|
||||||
expect(vert['B'].id).toBe('B')
|
expect(vert['B'].id).toBe('B')
|
||||||
expect(edges.length).toBe(1)
|
expect(edges.length).toBe(1)
|
||||||
@@ -704,10 +609,10 @@ describe('when parsing ', function () {
|
|||||||
describe('cross', function () {
|
describe('cross', function () {
|
||||||
it('should handle double edged nodes and edges', function () {
|
it('should handle double edged nodes and edges', function () {
|
||||||
const res = flow.parser.parse('graph TD;\nA x--x B;')
|
const res = flow.parser.parse('graph TD;\nA x--x B;')
|
||||||
|
|
||||||
const vert = flow.parser.yy.getVertices()
|
const vert = flow.parser.yy.getVertices()
|
||||||
const edges = flow.parser.yy.getEdges()
|
const edges = flow.parser.yy.getEdges()
|
||||||
|
|
||||||
expect(vert['A'].id).toBe('A')
|
expect(vert['A'].id).toBe('A')
|
||||||
expect(vert['B'].id).toBe('B')
|
expect(vert['B'].id).toBe('B')
|
||||||
expect(edges.length).toBe(1)
|
expect(edges.length).toBe(1)
|
||||||
@@ -718,10 +623,10 @@ describe('when parsing ', function () {
|
|||||||
})
|
})
|
||||||
it('should handle double edged nodes with text', function () {
|
it('should handle double edged nodes with text', function () {
|
||||||
const res = flow.parser.parse('graph TD;\nA x-- text --x B;')
|
const res = flow.parser.parse('graph TD;\nA x-- text --x B;')
|
||||||
|
|
||||||
const vert = flow.parser.yy.getVertices()
|
const vert = flow.parser.yy.getVertices()
|
||||||
const edges = flow.parser.yy.getEdges()
|
const edges = flow.parser.yy.getEdges()
|
||||||
|
|
||||||
expect(vert['A'].id).toBe('A')
|
expect(vert['A'].id).toBe('A')
|
||||||
expect(vert['B'].id).toBe('B')
|
expect(vert['B'].id).toBe('B')
|
||||||
expect(edges.length).toBe(1)
|
expect(edges.length).toBe(1)
|
||||||
@@ -733,10 +638,10 @@ describe('when parsing ', function () {
|
|||||||
})
|
})
|
||||||
it('should handle double edged nodes and edges on thick arrows', function () {
|
it('should handle double edged nodes and edges on thick arrows', function () {
|
||||||
const res = flow.parser.parse('graph TD;\nA x==x B;')
|
const res = flow.parser.parse('graph TD;\nA x==x B;')
|
||||||
|
|
||||||
const vert = flow.parser.yy.getVertices()
|
const vert = flow.parser.yy.getVertices()
|
||||||
const edges = flow.parser.yy.getEdges()
|
const edges = flow.parser.yy.getEdges()
|
||||||
|
|
||||||
expect(vert['A'].id).toBe('A')
|
expect(vert['A'].id).toBe('A')
|
||||||
expect(vert['B'].id).toBe('B')
|
expect(vert['B'].id).toBe('B')
|
||||||
expect(edges.length).toBe(1)
|
expect(edges.length).toBe(1)
|
||||||
@@ -748,10 +653,10 @@ describe('when parsing ', function () {
|
|||||||
})
|
})
|
||||||
it('should handle double edged nodes with text on thick arrows', function () {
|
it('should handle double edged nodes with text on thick arrows', function () {
|
||||||
const res = flow.parser.parse('graph TD;\nA x== text ==x B;')
|
const res = flow.parser.parse('graph TD;\nA x== text ==x B;')
|
||||||
|
|
||||||
const vert = flow.parser.yy.getVertices()
|
const vert = flow.parser.yy.getVertices()
|
||||||
const edges = flow.parser.yy.getEdges()
|
const edges = flow.parser.yy.getEdges()
|
||||||
|
|
||||||
expect(vert['A'].id).toBe('A')
|
expect(vert['A'].id).toBe('A')
|
||||||
expect(vert['B'].id).toBe('B')
|
expect(vert['B'].id).toBe('B')
|
||||||
expect(edges.length).toBe(1)
|
expect(edges.length).toBe(1)
|
||||||
@@ -763,10 +668,10 @@ describe('when parsing ', function () {
|
|||||||
})
|
})
|
||||||
it('should handle double edged nodes and edges on dotted arrows', function () {
|
it('should handle double edged nodes and edges on dotted arrows', function () {
|
||||||
const res = flow.parser.parse('graph TD;\nA x-.-x B;')
|
const res = flow.parser.parse('graph TD;\nA x-.-x B;')
|
||||||
|
|
||||||
const vert = flow.parser.yy.getVertices()
|
const vert = flow.parser.yy.getVertices()
|
||||||
const edges = flow.parser.yy.getEdges()
|
const edges = flow.parser.yy.getEdges()
|
||||||
|
|
||||||
expect(vert['A'].id).toBe('A')
|
expect(vert['A'].id).toBe('A')
|
||||||
expect(vert['B'].id).toBe('B')
|
expect(vert['B'].id).toBe('B')
|
||||||
expect(edges.length).toBe(1)
|
expect(edges.length).toBe(1)
|
||||||
@@ -778,10 +683,10 @@ describe('when parsing ', function () {
|
|||||||
})
|
})
|
||||||
it('should handle double edged nodes with text on dotted arrows', function () {
|
it('should handle double edged nodes with text on dotted arrows', function () {
|
||||||
const res = flow.parser.parse('graph TD;\nA x-. text .-x B;')
|
const res = flow.parser.parse('graph TD;\nA x-. text .-x B;')
|
||||||
|
|
||||||
const vert = flow.parser.yy.getVertices()
|
const vert = flow.parser.yy.getVertices()
|
||||||
const edges = flow.parser.yy.getEdges()
|
const edges = flow.parser.yy.getEdges()
|
||||||
|
|
||||||
expect(vert['A'].id).toBe('A')
|
expect(vert['A'].id).toBe('A')
|
||||||
expect(vert['B'].id).toBe('B')
|
expect(vert['B'].id).toBe('B')
|
||||||
expect(edges.length).toBe(1)
|
expect(edges.length).toBe(1)
|
||||||
@@ -795,10 +700,10 @@ describe('when parsing ', function () {
|
|||||||
describe('circle', function () {
|
describe('circle', function () {
|
||||||
it('should handle double edged nodes and edges', function () {
|
it('should handle double edged nodes and edges', function () {
|
||||||
const res = flow.parser.parse('graph TD;\nA o--o B;')
|
const res = flow.parser.parse('graph TD;\nA o--o B;')
|
||||||
|
|
||||||
const vert = flow.parser.yy.getVertices()
|
const vert = flow.parser.yy.getVertices()
|
||||||
const edges = flow.parser.yy.getEdges()
|
const edges = flow.parser.yy.getEdges()
|
||||||
|
|
||||||
expect(vert['A'].id).toBe('A')
|
expect(vert['A'].id).toBe('A')
|
||||||
expect(vert['B'].id).toBe('B')
|
expect(vert['B'].id).toBe('B')
|
||||||
expect(edges.length).toBe(1)
|
expect(edges.length).toBe(1)
|
||||||
@@ -809,10 +714,10 @@ describe('when parsing ', function () {
|
|||||||
})
|
})
|
||||||
it('should handle double edged nodes with text', function () {
|
it('should handle double edged nodes with text', function () {
|
||||||
const res = flow.parser.parse('graph TD;\nA o-- text --o B;')
|
const res = flow.parser.parse('graph TD;\nA o-- text --o B;')
|
||||||
|
|
||||||
const vert = flow.parser.yy.getVertices()
|
const vert = flow.parser.yy.getVertices()
|
||||||
const edges = flow.parser.yy.getEdges()
|
const edges = flow.parser.yy.getEdges()
|
||||||
|
|
||||||
expect(vert['A'].id).toBe('A')
|
expect(vert['A'].id).toBe('A')
|
||||||
expect(vert['B'].id).toBe('B')
|
expect(vert['B'].id).toBe('B')
|
||||||
expect(edges.length).toBe(1)
|
expect(edges.length).toBe(1)
|
||||||
@@ -824,10 +729,10 @@ describe('when parsing ', function () {
|
|||||||
})
|
})
|
||||||
it('should handle double edged nodes and edges on thick arrows', function () {
|
it('should handle double edged nodes and edges on thick arrows', function () {
|
||||||
const res = flow.parser.parse('graph TD;\nA o==o B;')
|
const res = flow.parser.parse('graph TD;\nA o==o B;')
|
||||||
|
|
||||||
const vert = flow.parser.yy.getVertices()
|
const vert = flow.parser.yy.getVertices()
|
||||||
const edges = flow.parser.yy.getEdges()
|
const edges = flow.parser.yy.getEdges()
|
||||||
|
|
||||||
expect(vert['A'].id).toBe('A')
|
expect(vert['A'].id).toBe('A')
|
||||||
expect(vert['B'].id).toBe('B')
|
expect(vert['B'].id).toBe('B')
|
||||||
expect(edges.length).toBe(1)
|
expect(edges.length).toBe(1)
|
||||||
@@ -839,10 +744,10 @@ describe('when parsing ', function () {
|
|||||||
})
|
})
|
||||||
it('should handle double edged nodes with text on thick arrows', function () {
|
it('should handle double edged nodes with text on thick arrows', function () {
|
||||||
const res = flow.parser.parse('graph TD;\nA o== text ==o B;')
|
const res = flow.parser.parse('graph TD;\nA o== text ==o B;')
|
||||||
|
|
||||||
const vert = flow.parser.yy.getVertices()
|
const vert = flow.parser.yy.getVertices()
|
||||||
const edges = flow.parser.yy.getEdges()
|
const edges = flow.parser.yy.getEdges()
|
||||||
|
|
||||||
expect(vert['A'].id).toBe('A')
|
expect(vert['A'].id).toBe('A')
|
||||||
expect(vert['B'].id).toBe('B')
|
expect(vert['B'].id).toBe('B')
|
||||||
expect(edges.length).toBe(1)
|
expect(edges.length).toBe(1)
|
||||||
@@ -854,10 +759,10 @@ describe('when parsing ', function () {
|
|||||||
})
|
})
|
||||||
it('should handle double edged nodes and edges on dotted arrows', function () {
|
it('should handle double edged nodes and edges on dotted arrows', function () {
|
||||||
const res = flow.parser.parse('graph TD;\nA o-.-o B;')
|
const res = flow.parser.parse('graph TD;\nA o-.-o B;')
|
||||||
|
|
||||||
const vert = flow.parser.yy.getVertices()
|
const vert = flow.parser.yy.getVertices()
|
||||||
const edges = flow.parser.yy.getEdges()
|
const edges = flow.parser.yy.getEdges()
|
||||||
|
|
||||||
expect(vert['A'].id).toBe('A')
|
expect(vert['A'].id).toBe('A')
|
||||||
expect(vert['B'].id).toBe('B')
|
expect(vert['B'].id).toBe('B')
|
||||||
expect(edges.length).toBe(1)
|
expect(edges.length).toBe(1)
|
||||||
@@ -869,10 +774,10 @@ describe('when parsing ', function () {
|
|||||||
})
|
})
|
||||||
it('should handle double edged nodes with text on dotted arrows', function () {
|
it('should handle double edged nodes with text on dotted arrows', function () {
|
||||||
const res = flow.parser.parse('graph TD;\nA o-. text .-o B;')
|
const res = flow.parser.parse('graph TD;\nA o-. text .-o B;')
|
||||||
|
|
||||||
const vert = flow.parser.yy.getVertices()
|
const vert = flow.parser.yy.getVertices()
|
||||||
const edges = flow.parser.yy.getEdges()
|
const edges = flow.parser.yy.getEdges()
|
||||||
|
|
||||||
expect(vert['A'].id).toBe('A')
|
expect(vert['A'].id).toBe('A')
|
||||||
expect(vert['B'].id).toBe('B')
|
expect(vert['B'].id).toBe('B')
|
||||||
expect(edges.length).toBe(1)
|
expect(edges.length).toBe(1)
|
||||||
@@ -1508,7 +1413,7 @@ describe('when parsing ', function () {
|
|||||||
const edges = flow.parser.yy.getEdges()
|
const edges = flow.parser.yy.getEdges()
|
||||||
|
|
||||||
expect(edges.length).toBe(0)
|
expect(edges.length).toBe(0)
|
||||||
expect(vert['1id'].styles.length).toBe(0)
|
expect(vert['s1id'].styles.length).toBe(0)
|
||||||
})
|
})
|
||||||
it('should handle a single node with alphanumerics containing a minus sign', function () {
|
it('should handle a single node with alphanumerics containing a minus sign', function () {
|
||||||
// Silly but syntactically correct
|
// Silly but syntactically correct
|
||||||
@@ -1530,7 +1435,7 @@ describe('when parsing ', function () {
|
|||||||
expect(edges.length).toBe(0)
|
expect(edges.length).toBe(0)
|
||||||
expect(vert['i_d'].styles.length).toBe(0)
|
expect(vert['i_d'].styles.length).toBe(0)
|
||||||
})
|
})
|
||||||
|
|
||||||
// log.debug(flow.parser.parse('graph TD;style Q background:#fff;'));
|
// log.debug(flow.parser.parse('graph TD;style Q background:#fff;'));
|
||||||
it('should handle styles for vertices', function () {
|
it('should handle styles for vertices', function () {
|
||||||
const res = flow.parser.parse('graph TD;style Q background:#fff;')
|
const res = flow.parser.parse('graph TD;style Q background:#fff;')
|
||||||
|
211
src/diagrams/flowchart/parser/subgraph.spec.js
Normal file
211
src/diagrams/flowchart/parser/subgraph.spec.js
Normal file
@@ -0,0 +1,211 @@
|
|||||||
|
import flowDb from '../flowDb'
|
||||||
|
import flow from './flow'
|
||||||
|
import { setConfig } from '../../../config'
|
||||||
|
|
||||||
|
setConfig({
|
||||||
|
securityLevel: 'strict',
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('when parsing subgraphs', function () {
|
||||||
|
beforeEach(function () {
|
||||||
|
flow.parser.yy = flowDb
|
||||||
|
flow.parser.yy.clear()
|
||||||
|
})
|
||||||
|
it('should handle subgraph with tab indentation', function () {
|
||||||
|
const res = flow.parser.parse('graph TB\nsubgraph One\n\ta1-->a2\nend')
|
||||||
|
const subgraphs = flow.parser.yy.getSubGraphs()
|
||||||
|
expect(subgraphs.length).toBe(1)
|
||||||
|
const subgraph = subgraphs[0]
|
||||||
|
expect(subgraph.nodes.length).toBe(2)
|
||||||
|
expect(subgraph.nodes[0]).toBe('a1')
|
||||||
|
expect(subgraph.nodes[1]).toBe('a2')
|
||||||
|
expect(subgraph.title).toBe('One')
|
||||||
|
expect(subgraph.id).toBe('One')
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should handle subgraph with multiple words in title', function () {
|
||||||
|
const res = flow.parser.parse('graph TB\nsubgraph "Some Title"\n\ta1-->a2\nend')
|
||||||
|
const subgraphs = flow.parser.yy.getSubGraphs()
|
||||||
|
expect(subgraphs.length).toBe(1)
|
||||||
|
const subgraph = subgraphs[0]
|
||||||
|
expect(subgraph.nodes.length).toBe(2)
|
||||||
|
expect(subgraph.nodes[0]).toBe('a1')
|
||||||
|
expect(subgraph.nodes[1]).toBe('a2')
|
||||||
|
expect(subgraph.title).toBe('Some Title')
|
||||||
|
expect(subgraph.id).toBe('subGraph0')
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle subgraph with id and title notation', function () {
|
||||||
|
const res = flow.parser.parse('graph TB\nsubgraph some-id[Some Title]\n\ta1-->a2\nend')
|
||||||
|
const subgraphs = flow.parser.yy.getSubGraphs()
|
||||||
|
expect(subgraphs.length).toBe(1)
|
||||||
|
const subgraph = subgraphs[0]
|
||||||
|
expect(subgraph.nodes.length).toBe(2)
|
||||||
|
expect(subgraph.nodes[0]).toBe('a1')
|
||||||
|
expect(subgraph.nodes[1]).toBe('a2')
|
||||||
|
expect(subgraph.title).toBe('Some Title')
|
||||||
|
expect(subgraph.id).toBe('some-id')
|
||||||
|
});
|
||||||
|
|
||||||
|
xit('should handle subgraph without id and space in title', function () {
|
||||||
|
const res = flow.parser.parse('graph TB\nsubgraph Some Title\n\ta1-->a2\nend')
|
||||||
|
const subgraphs = flow.parser.yy.getSubGraphs()
|
||||||
|
expect(subgraphs.length).toBe(1)
|
||||||
|
const subgraph = subgraphs[0]
|
||||||
|
expect(subgraph.nodes.length).toBe(2)
|
||||||
|
expect(subgraph.nodes[0]).toBe('a1')
|
||||||
|
expect(subgraph.nodes[1]).toBe('a2')
|
||||||
|
expect(subgraph.title).toBe('Some Title')
|
||||||
|
expect(subgraph.id).toBe('some-id')
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle subgraph id starting with a number', function () {
|
||||||
|
const res = flow.parser.parse(`graph TD
|
||||||
|
A[Christmas] -->|Get money| B(Go shopping)
|
||||||
|
subgraph 1test
|
||||||
|
A
|
||||||
|
end`)
|
||||||
|
|
||||||
|
const subgraphs = flow.parser.yy.getSubGraphs()
|
||||||
|
expect(subgraphs.length).toBe(1)
|
||||||
|
const subgraph = subgraphs[0]
|
||||||
|
expect(subgraph.nodes.length).toBe(1)
|
||||||
|
expect(subgraph.nodes[0]).toBe('A')
|
||||||
|
expect(subgraph.id).toBe('s1test')
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle subgraphs1', function () {
|
||||||
|
const res = flow.parser.parse('graph TD;A-->B;subgraph myTitle;c-->d;end;')
|
||||||
|
|
||||||
|
const vert = flow.parser.yy.getVertices()
|
||||||
|
const edges = flow.parser.yy.getEdges()
|
||||||
|
|
||||||
|
expect(edges[0].type).toBe('arrow')
|
||||||
|
})
|
||||||
|
it('should handle subgraphs with title in quotes', function () {
|
||||||
|
const res = flow.parser.parse('graph TD;A-->B;subgraph "title in quotes";c-->d;end;')
|
||||||
|
|
||||||
|
const vert = flow.parser.yy.getVertices()
|
||||||
|
const edges = flow.parser.yy.getEdges()
|
||||||
|
|
||||||
|
const subgraphs = flow.parser.yy.getSubGraphs()
|
||||||
|
expect(subgraphs.length).toBe(1)
|
||||||
|
const subgraph = subgraphs[0]
|
||||||
|
|
||||||
|
expect(subgraph.title).toBe('title in quotes')
|
||||||
|
|
||||||
|
expect(edges[0].type).toBe('arrow')
|
||||||
|
})
|
||||||
|
it('should handle subgraphs in old style that was broken', function () {
|
||||||
|
const res = flow.parser.parse('graph TD;A-->B;subgraph old style that is broken;c-->d;end;')
|
||||||
|
|
||||||
|
const vert = flow.parser.yy.getVertices()
|
||||||
|
const edges = flow.parser.yy.getEdges()
|
||||||
|
|
||||||
|
const subgraphs = flow.parser.yy.getSubGraphs()
|
||||||
|
expect(subgraphs.length).toBe(1)
|
||||||
|
const subgraph = subgraphs[0]
|
||||||
|
|
||||||
|
expect(subgraph.title).toBe('old style that is broken')
|
||||||
|
|
||||||
|
expect(edges[0].type).toBe('arrow')
|
||||||
|
})
|
||||||
|
it('should handle subgraphs with dashes in the title', function () {
|
||||||
|
const res = flow.parser.parse('graph TD;A-->B;subgraph a-b-c;c-->d;end;')
|
||||||
|
|
||||||
|
const vert = flow.parser.yy.getVertices()
|
||||||
|
const edges = flow.parser.yy.getEdges()
|
||||||
|
|
||||||
|
const subgraphs = flow.parser.yy.getSubGraphs()
|
||||||
|
expect(subgraphs.length).toBe(1)
|
||||||
|
const subgraph = subgraphs[0]
|
||||||
|
|
||||||
|
expect(subgraph.title).toBe('a-b-c')
|
||||||
|
|
||||||
|
expect(edges[0].type).toBe('arrow')
|
||||||
|
})
|
||||||
|
it('should handle subgraphs with id and title in brackets', function () {
|
||||||
|
const res = flow.parser.parse('graph TD;A-->B;subgraph uid1[text of doom];c-->d;end;')
|
||||||
|
|
||||||
|
const vert = flow.parser.yy.getVertices()
|
||||||
|
const edges = flow.parser.yy.getEdges()
|
||||||
|
|
||||||
|
const subgraphs = flow.parser.yy.getSubGraphs()
|
||||||
|
expect(subgraphs.length).toBe(1)
|
||||||
|
const subgraph = subgraphs[0]
|
||||||
|
|
||||||
|
expect(subgraph.title).toBe('text of doom')
|
||||||
|
expect(subgraph.id).toBe('uid1')
|
||||||
|
|
||||||
|
expect(edges[0].type).toBe('arrow')
|
||||||
|
})
|
||||||
|
it('should handle subgraphs with id and title in brackets and quotes', function () {
|
||||||
|
const res = flow.parser.parse('graph TD;A-->B;subgraph uid2["text of doom"];c-->d;end;')
|
||||||
|
|
||||||
|
const vert = flow.parser.yy.getVertices()
|
||||||
|
const edges = flow.parser.yy.getEdges()
|
||||||
|
|
||||||
|
const subgraphs = flow.parser.yy.getSubGraphs()
|
||||||
|
expect(subgraphs.length).toBe(1)
|
||||||
|
const subgraph = subgraphs[0]
|
||||||
|
|
||||||
|
expect(subgraph.title).toBe('text of doom')
|
||||||
|
expect(subgraph.id).toBe('uid2')
|
||||||
|
|
||||||
|
expect(edges[0].type).toBe('arrow')
|
||||||
|
})
|
||||||
|
it('should handle subgraphs with id and title in brackets without spaces', function () {
|
||||||
|
const res = flow.parser.parse('graph TD;A-->B;subgraph uid2[textofdoom];c-->d;end;')
|
||||||
|
|
||||||
|
const vert = flow.parser.yy.getVertices()
|
||||||
|
const edges = flow.parser.yy.getEdges()
|
||||||
|
|
||||||
|
const subgraphs = flow.parser.yy.getSubGraphs()
|
||||||
|
expect(subgraphs.length).toBe(1)
|
||||||
|
const subgraph = subgraphs[0]
|
||||||
|
|
||||||
|
expect(subgraph.title).toBe('textofdoom')
|
||||||
|
expect(subgraph.id).toBe('uid2')
|
||||||
|
|
||||||
|
expect(edges[0].type).toBe('arrow')
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should handle subgraphs2', function () {
|
||||||
|
const res = flow.parser.parse('graph TD\nA-->B\nsubgraph myTitle\n\n c-->d \nend\n')
|
||||||
|
|
||||||
|
const vert = flow.parser.yy.getVertices()
|
||||||
|
const edges = flow.parser.yy.getEdges()
|
||||||
|
|
||||||
|
expect(edges[0].type).toBe('arrow')
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should handle nested subgraphs', function () {
|
||||||
|
const str = 'graph TD\n' +
|
||||||
|
'A-->B\n' +
|
||||||
|
'subgraph myTitle\n\n' +
|
||||||
|
' c-->d \n\n' +
|
||||||
|
' subgraph inner\n\n e-->f \n end \n\n' +
|
||||||
|
' subgraph inner\n\n h-->i \n end \n\n' +
|
||||||
|
'end\n'
|
||||||
|
const res = flow.parser.parse(str)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should handle subgraphs4', function () {
|
||||||
|
const res = flow.parser.parse('graph TD\nA-->B\nsubgraph myTitle\nc-->d\nend;')
|
||||||
|
|
||||||
|
const vert = flow.parser.yy.getVertices()
|
||||||
|
const edges = flow.parser.yy.getEdges()
|
||||||
|
|
||||||
|
expect(edges[0].type).toBe('arrow')
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should handle subgraphs5', function () {
|
||||||
|
const res = flow.parser.parse('graph TD\nA-->B\nsubgraph myTitle\nc-- text -->d\nd-->e\n end;')
|
||||||
|
|
||||||
|
const vert = flow.parser.yy.getVertices()
|
||||||
|
const edges = flow.parser.yy.getEdges()
|
||||||
|
|
||||||
|
expect(edges[0].type).toBe('arrow')
|
||||||
|
})
|
||||||
|
|
||||||
|
})
|
Reference in New Issue
Block a user