From e7a017e018dcecf9f5d90ca4eabee96b98525f9b Mon Sep 17 00:00:00 2001 From: Stefan Kapferer Date: Tue, 22 Oct 2019 13:34:10 +0200 Subject: [PATCH] Major grammar change: bracket positions in upstream-downstream relationships only around arrow --- ...DownstreamRelationshipDSLParsingTest.xtend | 121 ++++++++++++------ .../contextmapper/dsl/ContextMappingDSL.xtext | 30 +---- 2 files changed, 85 insertions(+), 66 deletions(-) diff --git a/org.contextmapper.dsl.tests/src/org/contextmapper/dsl/tests/UpstreamDownstreamRelationshipDSLParsingTest.xtend b/org.contextmapper.dsl.tests/src/org/contextmapper/dsl/tests/UpstreamDownstreamRelationshipDSLParsingTest.xtend index 04054776..e4f50beb 100644 --- a/org.contextmapper.dsl.tests/src/org/contextmapper/dsl/tests/UpstreamDownstreamRelationshipDSLParsingTest.xtend +++ b/org.contextmapper.dsl.tests/src/org/contextmapper/dsl/tests/UpstreamDownstreamRelationshipDSLParsingTest.xtend @@ -127,15 +127,9 @@ class UpstreamDownstreamRelationshipDSLParsingTest { '''; val dslSnippets = new ArrayList; dslSnippets.add(dslSnippetTemplate.replace("<>", "testContext [U,OHS,PL]->[D,CF] anotherTestContext")); - dslSnippets.add(dslSnippetTemplate.replace("<>", "[U,OHS,PL]testContext -> [D,CF]anotherTestContext")); - dslSnippets.add(dslSnippetTemplate.replace("<>", "testContext[U,OHS,PL] -> anotherTestContext[D,CF]")); - dslSnippets.add(dslSnippetTemplate.replace("<>", "[U,OHS,PL]testContext -> anotherTestContext[D,CF]")); - - // also without the U and D: + dslSnippets.add(dslSnippetTemplate.replace("<>", "testContext [U,OHS,PL]->[CF] anotherTestContext")); + dslSnippets.add(dslSnippetTemplate.replace("<>", "testContext [OHS,PL]->[D,CF] anotherTestContext")); dslSnippets.add(dslSnippetTemplate.replace("<>", "testContext [OHS,PL]->[CF] anotherTestContext")); - dslSnippets.add(dslSnippetTemplate.replace("<>", "[OHS,PL]testContext -> [CF]anotherTestContext")); - dslSnippets.add(dslSnippetTemplate.replace("<>", "testContext[OHS,PL] -> anotherTestContext[CF]")); - dslSnippets.add(dslSnippetTemplate.replace("<>", "[OHS,PL]testContext -> anotherTestContext[CF]")); for(dslSnippet : dslSnippets) { // when @@ -174,15 +168,9 @@ class UpstreamDownstreamRelationshipDSLParsingTest { '''; val dslSnippets = new ArrayList; dslSnippets.add(dslSnippetTemplate.replace("<>", "anotherTestContext [D,CF]<-[U,OHS,PL] testContext")); - dslSnippets.add(dslSnippetTemplate.replace("<>", "[D,CF]anotherTestContext <- [U,OHS,PL]testContext")); - dslSnippets.add(dslSnippetTemplate.replace("<>", "anotherTestContext[D,CF] <- testContext[U,OHS,PL]")); - dslSnippets.add(dslSnippetTemplate.replace("<>", "[D,CF]anotherTestContext <- testContext[U,OHS,PL]")); - - // also without the U and D: + dslSnippets.add(dslSnippetTemplate.replace("<>", "anotherTestContext [D,CF]<-[OHS,PL] testContext")); + dslSnippets.add(dslSnippetTemplate.replace("<>", "anotherTestContext [CF]<-[U,OHS,PL] testContext")); dslSnippets.add(dslSnippetTemplate.replace("<>", "anotherTestContext [CF]<-[OHS,PL] testContext")); - dslSnippets.add(dslSnippetTemplate.replace("<>", "[CF]anotherTestContext <- [OHS,PL]testContext")); - dslSnippets.add(dslSnippetTemplate.replace("<>", "anotherTestContext[CF] <- testContext[OHS,PL]")); - dslSnippets.add(dslSnippetTemplate.replace("<>", "[CF]anotherTestContext <- testContext[OHS,PL]")); for(dslSnippet : dslSnippets) { // when @@ -204,6 +192,83 @@ class UpstreamDownstreamRelationshipDSLParsingTest { assertTrue(upstreamDownstreamRelationship.downstreamRoles.contains(DownstreamRole.CONFORMIST)) } } + + @Test + def void canDefineUpstreamDownstreamInShortSyntaxWithUpstreamRolesOnly() { + // given + val String dslSnippetTemplate = ''' + ContextMap { + contains testContext + contains anotherTestContext + + <> + } + + BoundedContext testContext + BoundedContext anotherTestContext + '''; + val dslSnippets = new ArrayList; + dslSnippets.add(dslSnippetTemplate.replace("<>", "anotherTestContext [D]<-[U,OHS,PL] testContext")); + dslSnippets.add(dslSnippetTemplate.replace("<>", "anotherTestContext [D]<-[OHS,PL] testContext")); + dslSnippets.add(dslSnippetTemplate.replace("<>", "anotherTestContext <-[U,OHS,PL] testContext")); + dslSnippets.add(dslSnippetTemplate.replace("<>", "anotherTestContext <-[OHS,PL] testContext")); + + for(dslSnippet : dslSnippets) { + // when + val ContextMappingModel result = parseHelper.parse(dslSnippet); + // then + assertThatNoParsingErrorsOccurred(result); + assertThatNoValidationErrorsOccurred(result); + + val Relationship relationship = result.map.relationships.get(0) + assertTrue(relationship.class.interfaces.contains(UpstreamDownstreamRelationship)) + + val UpstreamDownstreamRelationship upstreamDownstreamRelationship = relationship as UpstreamDownstreamRelationship + assertEquals("testContext", upstreamDownstreamRelationship.upstream.name) + assertEquals("anotherTestContext", upstreamDownstreamRelationship.downstream.name) + + assertTrue(upstreamDownstreamRelationship.upstreamRoles.contains(UpstreamRole.OPEN_HOST_SERVICE)) + assertTrue(upstreamDownstreamRelationship.upstreamRoles.contains(UpstreamRole.PUBLISHED_LANGUAGE)) + } + } + + @Test + def void canDefineUpstreamDownstreamInShortSyntaxWithDownstreamRolesOnly() { + // given + val String dslSnippetTemplate = ''' + ContextMap { + contains testContext + contains anotherTestContext + + <> + } + + BoundedContext testContext + BoundedContext anotherTestContext + '''; + val dslSnippets = new ArrayList; + dslSnippets.add(dslSnippetTemplate.replace("<>", "anotherTestContext [D,CF]<-[U] testContext")); + dslSnippets.add(dslSnippetTemplate.replace("<>", "anotherTestContext [D,CF]<- testContext")); + dslSnippets.add(dslSnippetTemplate.replace("<>", "anotherTestContext [CF]<-[U] testContext")); + dslSnippets.add(dslSnippetTemplate.replace("<>", "anotherTestContext [CF]<- testContext")); + + for(dslSnippet : dslSnippets) { + // when + val ContextMappingModel result = parseHelper.parse(dslSnippet); + // then + assertThatNoParsingErrorsOccurred(result); + assertThatNoValidationErrorsOccurred(result); + + val Relationship relationship = result.map.relationships.get(0) + assertTrue(relationship.class.interfaces.contains(UpstreamDownstreamRelationship)) + + val UpstreamDownstreamRelationship upstreamDownstreamRelationship = relationship as UpstreamDownstreamRelationship + assertEquals("testContext", upstreamDownstreamRelationship.upstream.name) + assertEquals("anotherTestContext", upstreamDownstreamRelationship.downstream.name) + + assertTrue(upstreamDownstreamRelationship.downstreamRoles.contains(DownstreamRole.CONFORMIST)) + } + } @Test def void canDefineCustomerSupplier() { @@ -309,15 +374,7 @@ class UpstreamDownstreamRelationshipDSLParsingTest { val dslSnippets = new ArrayList; // all variants only with S and C dslSnippets.add(dslSnippetTemplate.replace("<>", "anotherTestContext [C]<-[S] testContext")); - dslSnippets.add(dslSnippetTemplate.replace("<>", "[C]anotherTestContext <- [S]testContext")); - dslSnippets.add(dslSnippetTemplate.replace("<>", "anotherTestContext[C] <- testContext[S]")); - dslSnippets.add(dslSnippetTemplate.replace("<>", "[C]anotherTestContext <- testContext[S]")); - - // all variants with U, S and D, C dslSnippets.add(dslSnippetTemplate.replace("<>", "anotherTestContext [D,C]<-[U,S] testContext")); - dslSnippets.add(dslSnippetTemplate.replace("<>", "[D,C]anotherTestContext <- [U,S]testContext")); - dslSnippets.add(dslSnippetTemplate.replace("<>", "anotherTestContext[D,C] <- testContext[U,S]")); - dslSnippets.add(dslSnippetTemplate.replace("<>", "[D,C]anotherTestContext <- testContext[U,S]")); for(dslSnippet : dslSnippets) { // when @@ -352,15 +409,7 @@ class UpstreamDownstreamRelationshipDSLParsingTest { val dslSnippets = new ArrayList; // all variants only with S and C dslSnippets.add(dslSnippetTemplate.replace("<>", "testContext [S]->[C] anotherTestContext")); - dslSnippets.add(dslSnippetTemplate.replace("<>", "[S]testContext -> [C]anotherTestContext")); - dslSnippets.add(dslSnippetTemplate.replace("<>", "testContext[S] -> anotherTestContext[C]")); - dslSnippets.add(dslSnippetTemplate.replace("<>", "[S]testContext -> anotherTestContext[C]")); - - // all variants with U, S and D, C dslSnippets.add(dslSnippetTemplate.replace("<>", "testContext [U,S]->[D,C] anotherTestContext")); - dslSnippets.add(dslSnippetTemplate.replace("<>", "[U,S]testContext -> [D,C]anotherTestContext")); - dslSnippets.add(dslSnippetTemplate.replace("<>", "testContext[U,S] -> anotherTestContext[D,C]")); - dslSnippets.add(dslSnippetTemplate.replace("<>", "[U,S]testContext -> anotherTestContext[D,C]")); for(dslSnippet : dslSnippets) { // when @@ -395,15 +444,7 @@ class UpstreamDownstreamRelationshipDSLParsingTest { val dslSnippets = new ArrayList; // all variants only with S and C dslSnippets.add(dslSnippetTemplate.replace("<>", "testContext [S,PL]->[C,ACL] anotherTestContext")); - dslSnippets.add(dslSnippetTemplate.replace("<>", "[S,PL]testContext -> [C,ACL]anotherTestContext")); - dslSnippets.add(dslSnippetTemplate.replace("<>", "testContext[S,PL] -> anotherTestContext[C,ACL]")); - dslSnippets.add(dslSnippetTemplate.replace("<>", "[S,PL]testContext -> anotherTestContext[C,ACL]")); - - // all variants with U, S and D, C dslSnippets.add(dslSnippetTemplate.replace("<>", "testContext [U,S,PL]->[D,C,ACL] anotherTestContext")); - dslSnippets.add(dslSnippetTemplate.replace("<>", "[U,S,PL]testContext -> [D,C,ACL]anotherTestContext")); - dslSnippets.add(dslSnippetTemplate.replace("<>", "testContext[U,S,PL] -> anotherTestContext[D,C,ACL]")); - dslSnippets.add(dslSnippetTemplate.replace("<>", "[U,S,PL]testContext -> anotherTestContext[D,C,ACL]")); for(dslSnippet : dslSnippets) { // when diff --git a/org.contextmapper.dsl/src/org/contextmapper/dsl/ContextMappingDSL.xtext b/org.contextmapper.dsl/src/org/contextmapper/dsl/ContextMappingDSL.xtext index e7b81792..20c2e45b 100644 --- a/org.contextmapper.dsl/src/org/contextmapper/dsl/ContextMappingDSL.xtext +++ b/org.contextmapper.dsl/src/org/contextmapper/dsl/ContextMappingDSL.xtext @@ -123,20 +123,8 @@ UpstreamDownstreamRelationship: CustomerSupplierRelationship | ( ( - ( - ((upstream = [BoundedContext] (('[''U'']') | ('['('U'',')?(upstreamRoles+=UpstreamRole) ("," upstreamRoles+=UpstreamRole)*)']')) '->' ((('[''D'']') | ('['('D'',')?(downstreamRoles+=DownstreamRole) ("," downstreamRoles+=DownstreamRole)*)']') downstream = [BoundedContext])) | - (((('[''U'']') | ('['('U'',')?(upstreamRoles+=UpstreamRole) ("," upstreamRoles+=UpstreamRole)*)']') upstream = [BoundedContext]) '->'((('[''D'']') | ('['('D'',')?(downstreamRoles+=DownstreamRole) ("," downstreamRoles+=DownstreamRole)*)']') downstream = [BoundedContext])) | - ((upstream = [BoundedContext] (('[''U'']') | ('['('U'',')?(upstreamRoles+=UpstreamRole) ("," upstreamRoles+=UpstreamRole)*)']')) '->' (downstream = [BoundedContext] (('[''D'']') | ('['('D'',')?(downstreamRoles+=DownstreamRole) ("," downstreamRoles+=DownstreamRole)*)']'))) | - (((('[''U'']') | ('['('U'',')?(upstreamRoles+=UpstreamRole) ("," upstreamRoles+=UpstreamRole)*)']') upstream = [BoundedContext]) '->' (downstream = [BoundedContext] (('[''D'']') | ('['('D'',')?(downstreamRoles+=DownstreamRole) ("," downstreamRoles+=DownstreamRole)*)']'))) | - (upstream = [BoundedContext] '->' downstream = [BoundedContext]) - ) | - ( - (downstream = [BoundedContext] (('[''D'']') | ('['('D'',')?(downstreamRoles+=DownstreamRole) ("," downstreamRoles+=DownstreamRole)*)']') '<-' (('[''U'']') | ('['('U'',')?(upstreamRoles+=UpstreamRole) ("," upstreamRoles+=UpstreamRole)*)']') upstream = [BoundedContext]) | - ((('[''D'']') | ('['('D'',')?(downstreamRoles+=DownstreamRole) ("," downstreamRoles+=DownstreamRole)*)']') downstream = [BoundedContext] '<-'(('[''U'']') | ('['('U'',')?(upstreamRoles+=UpstreamRole) ("," upstreamRoles+=UpstreamRole)*)']') upstream = [BoundedContext]) | - (downstream = [BoundedContext] (('[''D'']') | ('['('D'',')?(downstreamRoles+=DownstreamRole) ("," downstreamRoles+=DownstreamRole)*)']') '<-' upstream = [BoundedContext] (('[''U'']') | ('['('U'',')?(upstreamRoles+=UpstreamRole) ("," upstreamRoles+=UpstreamRole)*)']')) | - ((('[''D'']') | ('['('D'',')?(downstreamRoles+=DownstreamRole) ("," downstreamRoles+=DownstreamRole)*)']') downstream = [BoundedContext] '<-' upstream = [BoundedContext] (('[''U'']') | ('['('U'',')?(upstreamRoles+=UpstreamRole) ("," upstreamRoles+=UpstreamRole)*)']')) | - (downstream = [BoundedContext] '<-' upstream = [BoundedContext]) - ) | + (upstream = [BoundedContext] (('[''U'']') | ('['('U'',')?(upstreamRoles+=UpstreamRole) ("," upstreamRoles+=UpstreamRole)*)']')? '->' (('[''D'']') | ('['('D'',')?(downstreamRoles+=DownstreamRole) ("," downstreamRoles+=DownstreamRole)*)']')? downstream = [BoundedContext]) | + (downstream = [BoundedContext] (('[''D'']') | ('['('D'',')?(downstreamRoles+=DownstreamRole) ("," downstreamRoles+=DownstreamRole)*)']')? '<-' (('[''U'']') | ('['('U'',')?(upstreamRoles+=UpstreamRole) ("," upstreamRoles+=UpstreamRole)*)']')? upstream = [BoundedContext]) | (upstream = [BoundedContext] ('['((upstreamRoles+=UpstreamRole) ("," upstreamRoles+=UpstreamRole)*)?']')?'Upstream-Downstream'('['((downstreamRoles+=DownstreamRole) ("," downstreamRoles+=DownstreamRole)*)?']')? downstream = [BoundedContext]) | (downstream = [BoundedContext] ('['((downstreamRoles+=DownstreamRole) ("," downstreamRoles+=DownstreamRole)*)?']')?'Downstream-Upstream'('['((upstreamRoles+=UpstreamRole) ("," upstreamRoles+=UpstreamRole)*)?']')? upstream = [BoundedContext]) ) @@ -153,18 +141,8 @@ UpstreamDownstreamRelationship: CustomerSupplierRelationship: ( ( - ( - (upstream = [BoundedContext] '['('U'',')?'S'(','(upstreamRoles+=UpstreamRole) ("," upstreamRoles+=UpstreamRole)*)?']' '->' '['('D'',')?'C'(','(downstreamRoles+=DownstreamRole) ("," downstreamRoles+=DownstreamRole)*)?']' downstream = [BoundedContext]) | - ('['('U'',')?'S'(','(upstreamRoles+=UpstreamRole) ("," upstreamRoles+=UpstreamRole)*)?']' upstream = [BoundedContext] '->' '['('D'',')?'C'(','(downstreamRoles+=DownstreamRole) ("," downstreamRoles+=DownstreamRole)*)?']' downstream = [BoundedContext]) | - (upstream = [BoundedContext] '['('U'',')?'S'(','(upstreamRoles+=UpstreamRole) ("," upstreamRoles+=UpstreamRole)*)?']' '->' downstream = [BoundedContext] '['('D'',')?'C'(','(downstreamRoles+=DownstreamRole) ("," downstreamRoles+=DownstreamRole)*)?']') | - ('['('U'',')?'S'(','(upstreamRoles+=UpstreamRole) ("," upstreamRoles+=UpstreamRole)*)?']' upstream = [BoundedContext] '->' downstream = [BoundedContext] '['('D'',')?'C'(','(downstreamRoles+=DownstreamRole) ("," downstreamRoles+=DownstreamRole)*)?']') - ) | - ( - (downstream = [BoundedContext] '['('D'',')?'C'(','(downstreamRoles+=DownstreamRole) ("," downstreamRoles+=DownstreamRole)*)?']' '<-' '['('U'',')?'S'(','(upstreamRoles+=UpstreamRole) ("," upstreamRoles+=UpstreamRole)*)?']' upstream = [BoundedContext]) | - ('['('D'',')?'C'(','(downstreamRoles+=DownstreamRole) ("," downstreamRoles+=DownstreamRole)*)?']' downstream = [BoundedContext] '<-''['('U'',')?'S'(','(upstreamRoles+=UpstreamRole) ("," upstreamRoles+=UpstreamRole)*)?']' upstream = [BoundedContext]) | - (downstream = [BoundedContext] '['('D'',')?'C'(','(downstreamRoles+=DownstreamRole) ("," downstreamRoles+=DownstreamRole)*)?']' '<-' upstream = [BoundedContext] '['('U'',')?'S'(','(upstreamRoles+=UpstreamRole) ("," upstreamRoles+=UpstreamRole)*)?']') | - ('['('D'',')?'C'(','(downstreamRoles+=DownstreamRole) ("," downstreamRoles+=DownstreamRole)*)?']' downstream = [BoundedContext] '<-' upstream = [BoundedContext] '['('U'',')?'S'(','(upstreamRoles+=UpstreamRole) ("," upstreamRoles+=UpstreamRole)*)?']') - ) | + (upstream = [BoundedContext] '['('U'',')?'S'(','(upstreamRoles+=UpstreamRole) ("," upstreamRoles+=UpstreamRole)*)?']' '->' '['('D'',')?'C'(','(downstreamRoles+=DownstreamRole) ("," downstreamRoles+=DownstreamRole)*)?']' downstream = [BoundedContext]) | + (downstream = [BoundedContext] '['('D'',')?'C'(','(downstreamRoles+=DownstreamRole) ("," downstreamRoles+=DownstreamRole)*)?']' '<-' '['('U'',')?'S'(','(upstreamRoles+=UpstreamRole) ("," upstreamRoles+=UpstreamRole)*)?']' upstream = [BoundedContext]) | (downstream = [BoundedContext] ('['((downstreamRoles+=DownstreamRole) ("," downstreamRoles+=DownstreamRole)*)?']')?'Customer-Supplier'('['((upstreamRoles+=UpstreamRole) ("," upstreamRoles+=UpstreamRole)*)?']')? upstream = [BoundedContext]) | (upstream = [BoundedContext] ('['((upstreamRoles+=UpstreamRole) ("," upstreamRoles+=UpstreamRole)*)?']')?'Supplier-Customer'('['((downstreamRoles+=DownstreamRole) ("," downstreamRoles+=DownstreamRole)*)?']')? downstream = [BoundedContext]) )