From 7457131d1ed98e5bff766aba38d2036d2039eb33 Mon Sep 17 00:00:00 2001 From: David Evans Date: Sun, 5 Nov 2017 13:15:41 +0000 Subject: [PATCH] Add support for creating and destroying agents during connections --- README.md | 6 +- screenshots/ConnectionTypes.png | Bin 50543 -> 54205 bytes scripts/readme_images.js | 2 +- scripts/sequence/CodeMirrorMode.js | 70 +++++-- scripts/sequence/Generator.js | 48 +++-- scripts/sequence/Generator_spec.js | 56 +++++ scripts/sequence/Parser.js | 11 +- scripts/sequence/Parser_spec.js | 13 +- scripts/sequence/Renderer.js | 9 +- scripts/sequence/Tokeniser.js | 7 +- scripts/sequence/components/AgentCap.js | 40 +++- scripts/sequence/components/AgentHighlight.js | 23 +- scripts/sequence/components/BaseComponent.js | 2 - scripts/sequence/components/Connect.js | 6 +- scripts/sequence/components/Note.js | 12 +- scripts/sequence/sequence_integration_spec.js | 196 +++--------------- scripts/sequence/themes/Basic.js | 1 + 17 files changed, 258 insertions(+), 244 deletions(-) diff --git a/README.md b/README.md index 62c1c60..bbc6b43 100644 --- a/README.md +++ b/README.md @@ -55,6 +55,10 @@ Foo -> Foo: Foo talks to itself Foo -> +Bar: Foo asks Bar -Bar --> Foo: and Bar replies +# * and ! cause agents to be created and destroyed inline +Bar -> *Baz +Bar <- !Baz + # Arrows leaving on the left and right of the diagram [ -> Foo: From the left [ <- Foo: To the left @@ -258,7 +262,7 @@ Note: the linter can't run from the local filesystem, so you'll need to run a local HTTP server to ensure linting is successful. One option if you have NPM installed is: -``` +```shell # Setup npm install http-server -g; diff --git a/screenshots/ConnectionTypes.png b/screenshots/ConnectionTypes.png index 428b4f851d5f7eb9fb66468492d6fc40b566dc13..a57f090ae0d74a19d6f730aba923620bf3263310 100644 GIT binary patch literal 54205 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

wo zDWL()OVKHZlo;uKsa+u8B`l@ufIvc7hMUFSKjV|CEy|cs6=50mN_cij_4SrE(Jri> z?x``P&6CW_GM2f~&4oCYWyfNdqSQjKoGHIK%l|Tvb5o?+7uCDl=D!Y#YgYH}rNE1T z2a+W@tEP_}JV{D;&Z+Q~n!bOctiNRYesy=3Fbl9!ThK(w+g^gptbd3Rdn@5gl8ItKcsbY-EKwM4Co zW?hBr^+HQH`)YDpP$ zfOt1xtJ_BsudJh3P5bb1Fj>5Etmy>gWQ`wce5Q!$vs;3{Rs&ws2sDqxzI65)qHRWfHjL> z>wuB}3cS1|=K+R@g? zi5t2RSSAB*&2bpuMwiM5*ua!>FWRL05K@}-2yJo{>?g82jXcpEn=3fXB;emKpvEVC z3x;NkacM91VX$?o#?5C?=Olp%42`^tMm~#BFB)>e4SBG77u5wR{j%h8MD;wX5A5JP zm&&DAcc;J97qt-g9GQ+s2ZuN>1GwbAG`QI-${%|f*6J{Q+k&LoG!(PhxPvs^Wzrt! z;e_07TdkbF^UhL(bD%Slr7jroKV1~5p0Fdk!S)ld^!8n(jc zmUu3|sbSP|AuhkaX94qS7(pZVcBF8eQkmTDlUAilPW4*R0XIP4wy396Yl&u0?0|0)Et%|p1JfwF$tQ=GYQ!!Ue+*6*< zEZTZMly;v!adRq1gMck%zVOdpT+Adc9Q&v@S?lDxdw8wMxY7Hg`s?T3C=b``Wl87; za0>!M7?=Yf8ZM&G2$R$EVqlT>x-HLp%6Uhas~9KA(U6j)y zuClQ%ljkO#y)apvnjBK*X$YL`n${pS)% zx{Lc z$7_N42Y6Ad4_EuJf|62&?a^8~0O80Uxb-jo->wkWUPY-{S~~ievr;otn;L=hsSq`I zBmrkZ_L}F3nV1DANGyR!0vmaj3rZQ92K%Qx$Akg%i|=N`MUd?Ns+j$>;f~uO)(x7? zBMLyoTV%jE69BWmT+%NEHZR~Fq$n1K*MyNFEQ?d%G6V*iUaXqsay*!pHtt(_r4fe)lWIHW*4@UA9_JvuJt9OkFEtIBCad{?)v^svMTRI=+>1%Qw~>n<&{_QESa&oz`duMd1;qkJEvT~E3us% zvzcolW^>T+om)W2A%h4&y#E(G=wINYzd709k=h1Ir9(onv7+DuEu6=Ihyalz|C@^8 zW&>7iWDG7BKs#)#hkcg>UoQQB^2&X3SyzE$t&rp2`ZEz<)!gf(Qu(LUmU%dX?n(U< Jd4FPV{09rn`eOh9 literal 50543 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 U={6z3C|#q(H)6@_BO;<{;#fs5*`v)y~<7ek@`h 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 diff --git a/scripts/readme_images.js b/scripts/readme_images.js index 43379a8..6ab372e 100644 --- a/scripts/readme_images.js +++ b/scripts/readme_images.js @@ -18,7 +18,7 @@ } const SAMPLE_REGEX = new RegExp( - /]*>[\s]*```([^]+?)```/g + /]*>[\s]*```(?!shell).*\n([^]+?)```/g ); function findSamples(content) { diff --git a/scripts/sequence/CodeMirrorMode.js b/scripts/sequence/CodeMirrorMode.js index defdc58..169af6b 100644 --- a/scripts/sequence/CodeMirrorMode.js +++ b/scripts/sequence/CodeMirrorMode.js @@ -46,24 +46,57 @@ define(['core/ArrayUtilities'], (array) => { }; } - const CM_CONNECT = {type: 'keyword', suggest: true, then: { - '+': {type: 'operator', suggest: true, then: {'': CM_AGENT_TO_OPTTEXT}}, - '-': {type: 'operator', suggest: true, then: {'': CM_AGENT_TO_OPTTEXT}}, - '': CM_AGENT_TO_OPTTEXT, - }}; + function makeCMOperatorBlock(exit) { + const op = {type: 'operator', suggest: true, then: { + '+': CM_ERROR, + '-': CM_ERROR, + '*': CM_ERROR, + '!': CM_ERROR, + '': exit, + }}; + const pm = {type: 'operator', suggest: true, then: { + '+': CM_ERROR, + '-': CM_ERROR, + '*': op, + '!': op, + '': exit, + }}; + const se = {type: 'operator', suggest: true, then: { + '+': op, + '-': op, + '*': CM_ERROR, + '!': CM_ERROR, + '': exit, + }}; + return { + '+': pm, + '-': pm, + '*': se, + '!': se, + '': exit, + }; + } - const CM_CONNECT_FULL = {type: 'variable', suggest: 'Agent', then: { - '->': CM_CONNECT, - '-->': CM_CONNECT, - '<-': CM_CONNECT, - '<--': CM_CONNECT, - '<->': CM_CONNECT, - '<-->': CM_CONNECT, - ':': {type: 'operator', suggest: true, override: 'Label', then: {}}, - '': 0, - }}; + function makeCMConnect() { + const connect = { + type: 'keyword', + suggest: true, + then: makeCMOperatorBlock(CM_AGENT_TO_OPTTEXT), + }; - const CM_COMMANDS = {type: 'error line-error', then: { + return makeCMOperatorBlock({type: 'variable', suggest: 'Agent', then: { + '->': connect, + '-->': connect, + '<-': connect, + '<--': connect, + '<->': connect, + '<-->': connect, + ':': {type: 'operator', suggest: true, override: 'Label', then: {}}, + '': 0, + }}); + } + + const CM_COMMANDS = {type: 'error line-error', then: Object.assign({ 'title': {type: 'keyword', suggest: true, then: { '': CM_TEXT_TO_END, }}, @@ -134,10 +167,7 @@ define(['core/ArrayUtilities'], (array) => { }}, }}, }}, - '+': {type: 'operator', suggest: true, then: {'': CM_CONNECT_FULL}}, - '-': {type: 'operator', suggest: true, then: {'': CM_CONNECT_FULL}}, - '': CM_CONNECT_FULL, - }}; + }, makeCMConnect())}; function cmCappedToken(token, current) { if(Object.keys(current.then).length > 0) { diff --git a/scripts/sequence/Generator.js b/scripts/sequence/Generator.js index f951689..791c301 100644 --- a/scripts/sequence/Generator.js +++ b/scripts/sequence/Generator.js @@ -25,8 +25,8 @@ define(['core/ArrayUtilities'], (array) => { return agent.name; } - function agentHasFlag(flag) { - return (agent) => agent.flags.includes(flag); + function agentHasFlag(flag, has = true) { + return (agent) => (agent.flags.includes(flag) === has); } const MERGABLE = { @@ -235,7 +235,7 @@ define(['core/ArrayUtilities'], (array) => { array.mergeSets(this.agents, agents, agentEqCheck); } - setAgentVis(agents, visible, mode, checked = false) { + setAgentVisRaw(agents, visible, mode, checked = false) { const filteredAgents = agents.filter((agent) => { const state = this.agentStates.get(agent.name) || DEFAULT_AGENT; if(state.locked) { @@ -269,6 +269,15 @@ define(['core/ArrayUtilities'], (array) => { }; } + setAgentVis(agents, visible, mode, checked = false) { + return this.setAgentVisRaw( + agents.map(convertAgent), + visible, + mode, + checked + ); + } + setAgentHighlight(agents, highlighted, checked = false) { const filteredAgents = agents.filter((agent) => { const state = this.agentStates.get(agent.name) || DEFAULT_AGENT; @@ -340,15 +349,24 @@ define(['core/ArrayUtilities'], (array) => { } handleConnect({agents, label, options}) { - const colAgents = agents.map(convertAgent); - this.addStage(this.setAgentVis(colAgents, true, 'box')); - this.defineAgents(colAgents); + const beginAgents = agents.filter(agentHasFlag('begin')); + const endAgents = agents.filter(agentHasFlag('end')); + if(array.hasIntersection(beginAgents, endAgents, agentEqCheck)) { + throw new Error('Cannot set agent visibility multiple times'); + } const startAgents = agents.filter(agentHasFlag('start')); const stopAgents = agents.filter(agentHasFlag('stop')); + array.mergeSets(stopAgents, endAgents); if(array.hasIntersection(startAgents, stopAgents, agentEqCheck)) { throw new Error('Cannot set agent highlighting multiple times'); } + + this.defineAgents(agents.map(convertAgent)); + + const implicitBegin = agents.filter(agentHasFlag('begin', false)); + this.addStage(this.setAgentVis(implicitBegin, true, 'box')); + const connectStage = { type: 'connect', agentNames: agents.map(getAgentName), @@ -357,9 +375,11 @@ define(['core/ArrayUtilities'], (array) => { }; this.addParallelStages([ + this.setAgentVis(beginAgents, true, 'box', true), this.setAgentHighlight(startAgents, true, true), connectStage, this.setAgentHighlight(stopAgents, false, true), + this.setAgentVis(endAgents, false, 'cross', true), ]); } @@ -371,7 +391,7 @@ define(['core/ArrayUtilities'], (array) => { colAgents = agents.map(convertAgent); } - this.addStage(this.setAgentVis(colAgents, true, 'box')); + this.addStage(this.setAgentVisRaw(colAgents, true, 'box')); this.defineAgents(colAgents); this.addStage({ @@ -383,23 +403,17 @@ define(['core/ArrayUtilities'], (array) => { } handleAgentDefine({agents}) { - const colAgents = agents.map(convertAgent); - this.defineAgents(colAgents); + this.defineAgents(agents.map(convertAgent)); } handleAgentBegin({agents, mode}) { - this.addStage(this.setAgentVis( - agents.map(convertAgent), - true, - mode, - true - )); + this.addStage(this.setAgentVis(agents, true, mode, true)); } handleAgentEnd({agents, mode}) { this.addParallelStages([ this.setAgentHighlight(agents, false), - this.setAgentVis(agents.map(convertAgent), false, mode, true), + this.setAgentVis(agents, false, mode, true), ]); } @@ -471,7 +485,7 @@ define(['core/ArrayUtilities'], (array) => { this.addParallelStages([ this.setAgentHighlight(this.agents, false), - this.setAgentVis(this.agents, false, terminators), + this.setAgentVisRaw(this.agents, false, terminators), ]); addBounds( diff --git a/scripts/sequence/Generator_spec.js b/scripts/sequence/Generator_spec.js index ca1cf6e..4f4ed59 100644 --- a/scripts/sequence/Generator_spec.js +++ b/scripts/sequence/Generator_spec.js @@ -426,6 +426,51 @@ defineDescribe('Sequence Generator', ['./Generator'], (Generator) => { ]); }); + it('adds parallel begin stages', () => { + const sequence = generator.generate({stages: [ + PARSED.connect(['A', {name: 'B', flags: ['begin']}]), + ]}); + expect(sequence.stages).toEqual([ + GENERATED.beginAgents(['A']), + GENERATED.parallel([ + GENERATED.beginAgents(['B']), + GENERATED.connect(['A', 'B']), + ]), + GENERATED.endAgents(['A', 'B']), + ]); + }); + + it('adds parallel end stages', () => { + const sequence = generator.generate({stages: [ + PARSED.connect(['A', {name: 'B', flags: ['end']}]), + ]}); + expect(sequence.stages).toEqual([ + GENERATED.beginAgents(['A', 'B']), + GENERATED.parallel([ + GENERATED.connect(['A', 'B']), + GENERATED.endAgents(['B']), + ]), + GENERATED.endAgents(['A']), + ]); + }); + + it('implicitly ends highlighting when ending a stage', () => { + const sequence = generator.generate({stages: [ + PARSED.connect(['A', {name: 'B', flags: ['start']}]), + PARSED.connect(['A', {name: 'B', flags: ['end']}]), + ]}); + expect(sequence.stages).toEqual([ + jasmine.anything(), + jasmine.anything(), + GENERATED.parallel([ + GENERATED.connect(['A', 'B']), + GENERATED.highlight(['B'], false), + GENERATED.endAgents(['B']), + ]), + GENERATED.endAgents(['A']), + ]); + }); + it('rejects conflicting flags', () => { expect(() => generator.generate({stages: [ PARSED.connect(['A', {name: 'B', flags: ['start', 'stop']}]), @@ -437,6 +482,17 @@ defineDescribe('Sequence Generator', ['./Generator'], (Generator) => { {name: 'A', flags: ['stop']}, ]), ]})).toThrow(); + + expect(() => generator.generate({stages: [ + PARSED.connect(['A', {name: 'B', flags: ['begin', 'end']}]), + ]})).toThrow(); + + expect(() => generator.generate({stages: [ + PARSED.connect([ + {name: 'A', flags: ['begin']}, + {name: 'A', flags: ['end']}, + ]), + ]})).toThrow(); }); it('adds implicit highlight end with implicit terminator', () => { diff --git a/scripts/sequence/Parser.js b/scripts/sequence/Parser.js index 6ee861d..2aaaf69 100644 --- a/scripts/sequence/Parser.js +++ b/scripts/sequence/Parser.js @@ -26,8 +26,10 @@ define([ }; const CONNECT_AGENT_FLAGS = { + '*': 'begin', '+': 'start', '-': 'stop', + '!': 'end', }; const TERMINATOR_TYPES = [ @@ -116,13 +118,20 @@ define([ const flags = []; let p = start; for(; p < end; ++ p) { - const flag = flagTypes[tokenKeyword(line[p])]; + const rawFlag = tokenKeyword(line[p]); + const flag = flagTypes[rawFlag]; if(flag) { + if(flags.includes(flag)) { + throw new Error('Duplicate agent flag: ' + rawFlag); + } flags.push(flag); } else { break; } } + if(p >= end) { + throw new Error('Missing agent name'); + } return { name: joinLabel(line, p, end), flags, diff --git a/scripts/sequence/Parser_spec.js b/scripts/sequence/Parser_spec.js index 5b06a15..503428d 100644 --- a/scripts/sequence/Parser_spec.js +++ b/scripts/sequence/Parser_spec.js @@ -79,13 +79,13 @@ defineDescribe('Sequence Parser', ['./Parser'], (Parser) => { }); it('parses optional flags', () => { - const parsed = parser.parse('+A -> -B'); + const parsed = parser.parse('+A -> -*!B'); expect(parsed.stages).toEqual([ { type: 'connect', agents: [ {name: 'A', flags: ['start']}, - {name: 'B', flags: ['stop']}, + {name: 'B', flags: ['stop', 'begin', 'end']}, ], label: jasmine.anything(), options: jasmine.anything(), @@ -93,6 +93,15 @@ defineDescribe('Sequence Parser', ['./Parser'], (Parser) => { ]); }); + it('rejects duplicate flags', () => { + expect(() => parser.parse('A -> +*+B')).toThrow(); + expect(() => parser.parse('A -> **B')).toThrow(); + }); + + it('rejects missing agent names', () => { + expect(() => parser.parse('A -> +')).toThrow(); + }); + it('converts multiple entries', () => { const parsed = parser.parse('A -> B\nB -> A'); expect(parsed.stages).toEqual([ diff --git a/scripts/sequence/Renderer.js b/scripts/sequence/Renderer.js index 942ec85..5f189dc 100644 --- a/scripts/sequence/Renderer.js +++ b/scripts/sequence/Renderer.js @@ -161,10 +161,10 @@ define([ const agentSpaces = new Map(); const agentNames = this.visibleAgents.slice(); - const addSpacing = (agentName, spacing) => { + const addSpacing = (agentName, {left, right}) => { const current = agentSpaces.get(agentName); - current.left = Math.max(current.left, spacing.left); - current.right = Math.max(current.right, spacing.right); + current.left = Math.max(current.left, left); + current.right = Math.max(current.right, right); }; this.agentInfos.forEach((agentInfo) => { @@ -366,7 +366,7 @@ define([ const touchedAgentNames = []; stages.forEach((stage) => { const component = this.components.get(stage.type); - const r = component.renderPre(stage, envPre); + const r = component.renderPre(stage, envPre) || {}; if(r.topShift !== undefined) { maxTopShift = Math.max(maxTopShift, r.topShift); } @@ -460,6 +460,7 @@ define([ x: null, latestYStart: null, currentRad: 0, + currentMaxRad: 0, latestY: 0, maxRPad: 0, maxLPad: 0, diff --git a/scripts/sequence/Tokeniser.js b/scripts/sequence/Tokeniser.js index 4114459..7105d12 100644 --- a/scripts/sequence/Tokeniser.js +++ b/scripts/sequence/Tokeniser.js @@ -31,10 +31,13 @@ define(['./CodeMirrorMode'], (CMMode) => { unescape, baseToken: {q: true}, }, - {start: /(?=[^ \t\r\n:+\-<>,])/y, end: /(?=[ \t\r\n:+\-<>,])|$/y}, - {start: /(?=[+\-<>])/y, end: /(?=[^+\-<>])|$/y}, + {start: /(?=[^ \t\r\n:+\-*!<>,])/y, end: /(?=[ \t\r\n:+\-*!<>,])|$/y}, + {start: /(?=[\-<>])/y, end: /(?=[^\-<>])|$/y}, {start: /,/y, baseToken: {v: ','}}, {start: /:/y, baseToken: {v: ':'}}, + {start: /!/y, baseToken: {v: '!'}}, + {start: /\+/y, baseToken: {v: '+'}}, + {start: /\*/y, baseToken: {v: '*'}}, {start: /\n/y, baseToken: {v: '\n'}}, ]; diff --git a/scripts/sequence/components/AgentCap.js b/scripts/sequence/components/AgentCap.js index c492cf5..95e0a13 100644 --- a/scripts/sequence/components/AgentCap.js +++ b/scripts/sequence/components/AgentCap.js @@ -23,11 +23,18 @@ define([ return { left: width / 2, right: width / 2, + radius: width / 2, }; } - topShift() { - return 0; + topShift({label}, env) { + const config = env.theme.agentCap.box; + const height = ( + env.textSizer.measureHeight(config.labelAttrs, label) + + config.padding.top + + config.padding.bottom + ); + return Math.max(0, height - config.arrowBottom); } render(y, {x, label}, env) { @@ -57,6 +64,7 @@ define([ return { left: config.size / 2, right: config.size / 2, + radius: 0, }; } @@ -98,6 +106,7 @@ define([ return { left: width / 2, right: width / 2, + radius: width / 2, }; } @@ -131,7 +140,11 @@ define([ class CapNone { separation({currentRad}) { - return {left: currentRad, right: currentRad}; + return { + left: currentRad, + right: currentRad, + radius: currentRad, + }; } topShift(agentInfo, env) { @@ -162,18 +175,24 @@ define([ this.begin = begin; } + separationPre({mode, agentNames}, env) { + agentNames.forEach((name) => { + const agentInfo = env.agentInfos.get(name); + const sep = AGENT_CAPS[mode].separation(agentInfo, env); + env.addSpacing(name, sep); + agentInfo.currentMaxRad = Math.max( + agentInfo.currentMaxRad, + sep.radius + ); + }); + } + separation({mode, agentNames}, env) { if(this.begin) { array.mergeSets(env.visibleAgents, agentNames); } else { array.removeAll(env.visibleAgents, agentNames); } - - agentNames.forEach((name) => { - const agentInfo = env.agentInfos.get(name); - const separationFn = AGENT_CAPS[mode].separation; - env.addSpacing(name, separationFn(agentInfo, env)); - }); } renderPre({mode, agentNames}, env) { @@ -182,6 +201,9 @@ define([ const agentInfo = env.agentInfos.get(name); const topShift = AGENT_CAPS[mode].topShift(agentInfo, env); maxTopShift = Math.max(maxTopShift, topShift); + + const r = AGENT_CAPS[mode].separation(agentInfo, env).radius; + agentInfo.currentMaxRad = Math.max(agentInfo.currentMaxRad, r); }); return { agentNames, diff --git a/scripts/sequence/components/AgentHighlight.js b/scripts/sequence/components/AgentHighlight.js index b379283..314fd94 100644 --- a/scripts/sequence/components/AgentHighlight.js +++ b/scripts/sequence/components/AgentHighlight.js @@ -2,21 +2,32 @@ define(['./BaseComponent'], (BaseComponent) => { 'use strict'; class AgentHighlight extends BaseComponent { + radius(highlighted, env) { + return highlighted ? env.theme.agentLineHighlightRadius : 0; + } + separationPre({agentNames, highlighted}, env) { - const rad = highlighted ? env.theme.agentLineHighlightRadius : 0; + const r = this.radius(highlighted, env); agentNames.forEach((name) => { const agentInfo = env.agentInfos.get(name); - const maxRad = Math.max(agentInfo.currentMaxRad, rad); - agentInfo.currentRad = rad; - agentInfo.currentMaxRad = maxRad; + agentInfo.currentRad = r; + agentInfo.currentMaxRad = Math.max(agentInfo.currentMaxRad, r); + }); + } + + renderPre({agentNames, highlighted}, env) { + const r = this.radius(highlighted, env); + agentNames.forEach((name) => { + const agentInfo = env.agentInfos.get(name); + agentInfo.currentMaxRad = Math.max(agentInfo.currentMaxRad, r); }); } render({agentNames, highlighted}, env) { - const rad = highlighted ? env.theme.agentLineHighlightRadius : 0; + const r = this.radius(highlighted, env); agentNames.forEach((name) => { env.drawAgentLine(name, env.primaryY); - env.agentInfos.get(name).currentRad = rad; + env.agentInfos.get(name).currentRad = r; }); } } diff --git a/scripts/sequence/components/BaseComponent.js b/scripts/sequence/components/BaseComponent.js index 89ebab3..6223e84 100644 --- a/scripts/sequence/components/BaseComponent.js +++ b/scripts/sequence/components/BaseComponent.js @@ -35,7 +35,6 @@ define(() => { textSizer, state, }*/) { - return {}; } render(/*stage, { @@ -49,7 +48,6 @@ define(() => { SVGTextBlockClass, state, }*/) { - return 0; } } diff --git a/scripts/sequence/components/Connect.js b/scripts/sequence/components/Connect.js index 1af5be6..ab5d4c5 100644 --- a/scripts/sequence/components/Connect.js +++ b/scripts/sequence/components/Connect.js @@ -83,7 +83,7 @@ define([ config.label.margin.bottom ); - const lineX = from.x + from.currentRad; + const lineX = from.x + from.currentMaxRad; const y0 = env.primaryY; const x0 = ( lineX + @@ -159,8 +159,8 @@ define([ config.label.margin.bottom ); - const x0 = from.x + from.currentRad * dir; - const x1 = to.x - to.currentRad * dir; + const x0 = from.x + from.currentMaxRad * dir; + const x1 = to.x - to.currentMaxRad * dir; let y = env.primaryY; SVGShapes.renderBoxedText(label, { diff --git a/scripts/sequence/components/Note.js b/scripts/sequence/components/Note.js index 4f41388..bc705f9 100644 --- a/scripts/sequence/components/Note.js +++ b/scripts/sequence/components/Note.js @@ -131,8 +131,8 @@ define(['./BaseComponent'], (BaseComponent) => { const infoL = env.agentInfos.get(left); const infoR = env.agentInfos.get(right); return this.renderNote({ - x0: infoL.x - infoL.currentRad - config.overlap.left, - x1: infoR.x + infoR.currentRad + config.overlap.right, + x0: infoL.x - infoL.currentMaxRad - config.overlap.left, + x1: infoR.x + infoR.currentMaxRad + config.overlap.right, anchor: 'middle', mode, label, @@ -186,7 +186,7 @@ define(['./BaseComponent'], (BaseComponent) => { const {left, right} = findExtremes(env.agentInfos, agentNames); if(this.isRight) { const info = env.agentInfos.get(right); - const x0 = info.x + info.currentRad + config.margin.left; + const x0 = info.x + info.currentMaxRad + config.margin.left; return this.renderNote({ x0, anchor: 'start', @@ -195,7 +195,7 @@ define(['./BaseComponent'], (BaseComponent) => { }, env); } else { const info = env.agentInfos.get(left); - const x1 = info.x - info.currentRad - config.margin.right; + const x1 = info.x - info.currentMaxRad - config.margin.right; return this.renderNote({ x1, anchor: 'end', @@ -232,8 +232,8 @@ define(['./BaseComponent'], (BaseComponent) => { const infoL = env.agentInfos.get(left); const infoR = env.agentInfos.get(right); const xMid = ( - infoL.x + infoL.currentRad + - infoR.x - infoR.currentRad + infoL.x + infoL.currentMaxRad + + infoR.x - infoR.currentMaxRad ) / 2; return this.renderNote({ diff --git a/scripts/sequence/sequence_integration_spec.js b/scripts/sequence/sequence_integration_spec.js index bbb8667..0a772c5 100644 --- a/scripts/sequence/sequence_integration_spec.js +++ b/scripts/sequence/sequence_integration_spec.js @@ -108,176 +108,32 @@ defineDescribe('Sequence Integration', [ ); }); - it('Renders the "Simple Usage" example without error', () => { - const parsed = parser.parse( - 'title Labyrinth\n' + - '\n' + - 'Bowie -> Gremlin: You remind me of the babe\n' + - 'Gremlin -> Bowie: What babe?\n' + - 'Bowie -> Gremlin: The babe with the power\n' + - 'Gremlin -> Bowie: What power?\n' + - 'note right of Bowie, Gremlin: Most people get muddled here!\n' + - 'Bowie -> Gremlin: \'The power of voodoo\'\n' + - 'Gremlin -> Bowie: "Who-do?"\n' + - 'Bowie -> Gremlin: You do!\n' + - 'Gremlin -> Bowie: Do what?\n' + - 'Bowie -> Gremlin: Remind me of the babe!\n' + - '\n' + - 'Bowie -> Audience: Sings\n' + - '\n' + - 'terminators box\n' - ); - const sequence = generator.generate(parsed); - expect(() => renderer.render(sequence)).not.toThrow(); - }); + const SAMPLE_REGEX = new RegExp( + /```(?!shell).*\n([^]+?)```/g + ); - it('Renders the "Connection Types" example without error', () => { - const parsed = parser.parse( - 'title Connection Types\n' + - '\n' + - 'Foo -> Bar: Simple arrow\n' + - 'Foo --> Bar: Dashed arrow\n' + - 'Foo <- Bar: Reversed arrow\n' + - 'Foo <-- Bar: Reversed dashed arrow\n' + - 'Foo <-> Bar: Double arrow\n' + - 'Foo <--> Bar: Double dashed arrow\n' + - '\n' + - '# An arrow with no label:\n' + - 'Foo -> Bar\n' + - '\n' + - 'Foo -> Foo: Foo talks to itself\n' + - '\n' + - '# Arrows leaving on the left and right of the diagram\n' + - '[ -> Foo: From the left\n' + - '[ <- Foo: To the left\n' + - 'Foo -> ]: To the right\n' + - 'Foo <- ]: From the right\n' + - '[ -> ]: Left to right!\n' + - '# (etc.)\n' - ); - const sequence = generator.generate(parsed); - expect(() => renderer.render(sequence)).not.toThrow(); - }); + function findSamples(content) { + SAMPLE_REGEX.lastIndex = 0; + const results = []; + while(true) { + const match = SAMPLE_REGEX.exec(content); + if(!match) { + break; + } + results.push(match[1]); + } + return results; + } - it('Renders the "Notes & State" example without error', () => { - const parsed = parser.parse( - 'title Note Placements\n' + - '\n' + - 'note over Foo: Foo says something\n' + - 'note left of Foo: Stuff\n' + - 'note right of Bar: More stuff\n' + - 'note over Foo, Bar: "Foo and Bar\n' + - 'on multiple lines"\n' + - 'note between Foo, Bar: Link\n' + - '\n' + - 'text right: \'Comments\\nOver here\!\'\n' + - '\n' + - 'state over Foo: Foo is ponderous' - ); - const sequence = generator.generate(parsed); - expect(() => renderer.render(sequence)).not.toThrow(); - }); - - it('Renders the "Logic" example without error', () => { - const parsed = parser.parse( - 'title At the Bank\n' + - '\n' + - 'begin Person, ATM, Bank\n' + - 'Person -> ATM: Request money\n' + - 'ATM -> Bank: Check funds\n' + - 'if fraud detected\n' + - ' Bank -> Police: "Get \'em!"\n' + - ' Police -> Person: "You\'re nicked"\n' + - ' end Police\n' + - 'else if sufficient funds\n' + - ' ATM -> Bank: Withdraw funds\n' + - ' repeat until "all requested money\n' + - ' has been handed over"\n' + - ' ATM -> Person: Dispense note\n' + - ' end\n' + - 'else\n' + - ' ATM -> Person: Error\n' + - 'end' - ); - const sequence = generator.generate(parsed); - expect(() => renderer.render(sequence)).not.toThrow(); - }); - - it('Renders the "Multiline Text" example without error', () => { - const parsed = parser.parse( - 'title \'My Multiline\n' + - 'Title\'\n' + - '\n' + - 'note over Foo: \'Also possible\\nwith escapes\'\n' + - '\n' + - 'Foo -> Bar: \'Lines of text\\non this arrow\'\n' + - '\n' + - 'if \'Even multiline\\ninside conditions like this\'\n' + - ' Foo -> \'Multiline\\nagent\'\n' + - 'end\n' + - '\n' + - 'state over Foo: \'Newlines here,\\ntoo!\'' - ); - const sequence = generator.generate(parsed); - expect(() => renderer.render(sequence)).not.toThrow(); - }); - - it('Renders the "Short-Lived Agents" example without error', () => { - const parsed = parser.parse( - 'title "Baz doesn\'t live long"\n' + - '\n' + - 'Foo -> Bar\n' + - 'begin Baz\n' + - 'Bar -> Baz\n' + - 'Baz -> Foo\n' + - 'end Baz\n' + - 'Foo -> Bar\n' + - '\n' + - '# Foo and Bar end with black bars\n' + - 'terminators bar\n' + - '# (options are: box, bar, cross, none)' - ); - const sequence = generator.generate(parsed); - expect(() => renderer.render(sequence)).not.toThrow(); - }); - - it('Renders the "Alternative Agent Ordering" example without error', () => { - const parsed = parser.parse( - 'define Baz, Foo\n' + - 'Foo -> Bar\n' + - 'Bar -> Baz\n' - ); - const sequence = generator.generate(parsed); - expect(() => renderer.render(sequence)).not.toThrow(); - }); - - it('Renders the "Simultaneous Actions" example without error', () => { - const parsed = parser.parse( - 'begin A, B, C, D\n' + - 'A -> C\n' + - '\n' + - '# Define a marker which can be returned to later\n' + - '\n' + - 'some primary process:\n' + - 'A -> B\n' + - 'B -> A\n' + - 'A -> B\n' + - 'B -> A\n' + - '\n' + - '# Return to the defined marker\n' + - '# (should be interpreted as no-higher-then the marker; may be\n' + - '# pushed down to keep relative action ordering consistent)\n' + - '\n' + - 'simultaneously with some primary process:\n' + - 'C -> D\n' + - 'D -> C\n' + - 'end D\n' + - 'C -> A\n' + - '\n' + - '# The marker name is optional; using "simultaneously:" with no\n' + - '# marker will jump to the top of the entire sequence.' - ); - const sequence = generator.generate(parsed); - expect(() => renderer.render(sequence)).not.toThrow(); - }); + return (fetch('README.md') + .then((response) => response.text()) + .then(findSamples) + .then((samples) => samples.forEach((code, i) => { + it('Renders readme example #' + (i + 1) + ' without error', () => { + const parsed = parser.parse(code); + const sequence = generator.generate(parsed); + expect(() => renderer.render(sequence)).not.toThrow(); + }); + })) + ); }); diff --git a/scripts/sequence/themes/Basic.js b/scripts/sequence/themes/Basic.js index 12efaa6..856ab6b 100644 --- a/scripts/sequence/themes/Basic.js +++ b/scripts/sequence/themes/Basic.js @@ -18,6 +18,7 @@ define(['core/ArrayUtilities', 'svg/SVGShapes'], (array, SVGShapes) => { right: 10, bottom: 5, }, + arrowBottom: 5 + 12 * 1.3 / 2, boxAttrs: { 'fill': '#FFFFFF', 'stroke': '#000000',