From d9318c5af320a84ab8790c9c356f293311ce0c9d Mon Sep 17 00:00:00 2001 From: Knut Sveidqvist Date: Wed, 15 Jan 2020 20:27:31 +0100 Subject: [PATCH] #1205 Adding parsing exception for then an inactive participant is inactivated --- src/diagrams/sequence/sequenceDb.js | 37 +++++++++++++++++++ src/diagrams/sequence/sequenceDiagram.spec.js | 27 ++++++++++++++ 2 files changed, 64 insertions(+) diff --git a/src/diagrams/sequence/sequenceDb.js b/src/diagrams/sequence/sequenceDb.js index 050691a6cc..cb873147e8 100644 --- a/src/diagrams/sequence/sequenceDb.js +++ b/src/diagrams/sequence/sequenceDb.js @@ -16,6 +16,25 @@ export const addActor = function(id, name, description) { actors[id] = { name: name, description: description }; }; +const activationCount = part => { + let i = 0; + let count = 0; + for (i = 0; i < messages.length; i++) { + // console.warn(i, messages[i]); + if (messages[i].type === LINETYPE.ACTIVE_START) { + if (messages[i].from.actor === part) { + count++; + } + } + if (messages[i].type === LINETYPE.ACTIVE_END) { + if (messages[i].from.actor === part) { + count--; + } + } + } + return count; +}; + export const addMessage = function(idFrom, idTo, message, answer) { messages.push({ from: idFrom, to: idTo, message: message, answer: answer }); }; @@ -24,7 +43,25 @@ export const addSignal = function(idFrom, idTo, message, messageType) { logger.debug( 'Adding message from=' + idFrom + ' to=' + idTo + ' message=' + message + ' type=' + messageType ); + + if (messageType === LINETYPE.ACTIVE_END) { + const cnt = activationCount(idFrom.actor); + logger.debug('Adding message from=', messages, cnt); + if (cnt < 1) { + // Bail out as there is an activation signal from an inactive participant + var error = new Error('Trying to inactivate an inactive participant (' + idFrom.actor + ')'); + error.hash = { + text: '->>-', + token: '->>-', + line: '1', + loc: { first_line: 1, last_line: 1, first_column: 1, last_column: 1 }, + expected: ["'ACTIVE_PARTICIPANT'"] + }; + throw error; + } + } messages.push({ from: idFrom, to: idTo, message: message, type: messageType }); + return true; }; export const getMessages = function() { diff --git a/src/diagrams/sequence/sequenceDiagram.spec.js b/src/diagrams/sequence/sequenceDiagram.spec.js index 2f18328652..5b32c46279 100644 --- a/src/diagrams/sequence/sequenceDiagram.spec.js +++ b/src/diagrams/sequence/sequenceDiagram.spec.js @@ -214,6 +214,33 @@ describe('when parsing a sequenceDiagram', function() { expect(messages[7].type).toBe(parser.yy.LINETYPE.ACTIVE_END); expect(messages[7].from.actor).toBe('Carol'); }); + it('it should handle fail parsing when activating an inactive participant', function() { + const str = + `sequenceDiagram + participant user as End User + participant Server as Server + participant System as System + participant System2 as System2 + + user->>+Server: Test + user->>+Server: Test2 + user->>System: Test + Server->>-user: Test + Server->>-user: Test2 + + %% The following deactivation of Server will fail + Server->>-user: Test3`; + + let error = false; + try { + parser.parse(str); + } catch(e) { + console.log(e.hash); + error = true; + } + expect(error).toBe(true); + }); + it('it should handle comments in a sequenceDiagram', function() { const str = 'sequenceDiagram\n' +