diff --git a/cddiff/src/main/java/de/monticore/cddiff/syn2semdiff/Syn2SemDiff.java b/cddiff/src/main/java/de/monticore/cddiff/syn2semdiff/Syn2SemDiff.java index b676f2cfe..7c332dd46 100644 --- a/cddiff/src/main/java/de/monticore/cddiff/syn2semdiff/Syn2SemDiff.java +++ b/cddiff/src/main/java/de/monticore/cddiff/syn2semdiff/Syn2SemDiff.java @@ -8,6 +8,7 @@ import de.monticore.cdbasis._ast.ASTCDClass; import de.monticore.cdbasis._ast.ASTCDCompilationUnit; import de.monticore.cdbasis._ast.ASTCDType; +import de.monticore.cddiff.CDDiffUtil; import de.monticore.cddiff.ow2cw.ReductionTrafo; import de.monticore.cddiff.syn2semdiff.datastructures.*; import de.monticore.cddiff.syn2semdiff.helpers.ODGenHelper; @@ -203,15 +204,28 @@ else if (astodArtifact.isPresent() && diffLimit == 0) { } comment.append(System.lineSeparator()).append("// is/are added in ").append(attribute.a .getSymbol().getInternalQualifiedName()); - Optional astodArtifact = generateArtifact(attribute.a, comment); - if (astodArtifact.isPresent() && diffLimit != 0 && artifactList.size() < diffLimit) { - artifactList.add(astodArtifact.get()); - if (artifactList.size() == diffLimit) { - return artifactList; - } + + Optional srcClass; + + if (CDDiffUtil.getAllTypesFromCD(syntaxDiff.getSrcCD()).contains(attribute.a)) { + srcClass = Optional.of(attribute.a); } - else if (astodArtifact.isPresent() && diffLimit == 0) { - artifactList.add(astodArtifact.get()); + else { + srcClass = syntaxDiff.getMatchedClasses().stream().filter(p -> p.b.equals( + attribute.a)).map(p -> p.a).findFirst(); + } + + if (srcClass.isPresent()) { + Optional astodArtifact = generateArtifact(srcClass.get(), comment); + if (astodArtifact.isPresent() && diffLimit != 0 && artifactList.size() < diffLimit) { + artifactList.add(astodArtifact.get()); + if (artifactList.size() == diffLimit) { + return artifactList; + } + } + else if (astodArtifact.isPresent() && diffLimit == 0) { + artifactList.add(astodArtifact.get()); + } } } } diff --git a/cddiff/src/main/java/de/monticore/cddiff/syn2semdiff/helpers/ODGenHelper.java b/cddiff/src/main/java/de/monticore/cddiff/syn2semdiff/helpers/ODGenHelper.java index e1ccc7872..276429b7f 100644 --- a/cddiff/src/main/java/de/monticore/cddiff/syn2semdiff/helpers/ODGenHelper.java +++ b/cddiff/src/main/java/de/monticore/cddiff/syn2semdiff/helpers/ODGenHelper.java @@ -46,8 +46,7 @@ public ODGenHelper(ASTCDCompilationUnit srcCD, Syn2SemDiffHelper syn2SemDiffHelp * @return List of types as Strings. */ public List getSuperTypes(ASTCDClass astcdClass) { - List typeList = new ArrayList<>(CDDiffUtil.getAllSuperTypes(astcdClass, srcCD - .getCDDefinition())); + List typeList = new ArrayList<>(CDDiffUtil.getAllSuperTypes(astcdClass)); List typesString = new ArrayList<>(); for (int i = typeList.size() - 1; i >= 0; i--) { String type = typeList.get(i).getSymbol().getInternalQualifiedName(); @@ -105,7 +104,7 @@ public static ASTCDClass getCDClass(ASTCDCompilationUnit compilationUnit, String public int getClassSize(ASTCDClass astcdClass) { int attributeCount = syn2SemDiffHelper.getAllAttr(astcdClass).b.size(); int associationCount = syn2SemDiffHelper.getAssociationCount(astcdClass, true); - int otherAssocsCount = syn2SemDiffHelper.getOtherAssocs(astcdClass, true, false).size(); + int otherAssocsCount = syn2SemDiffHelper.getOtherAssocs(astcdClass, true, false, false).size(); return attributeCount + associationCount + otherAssocsCount; } @@ -216,10 +215,9 @@ else if (subAssoc.getSide().equals(ClassSide.Right) && superAssoc.getSide().equa public List getTgtAssocs(ASTCDClass astcdClass) { List assocStructs = new ArrayList<>(); - Set superClassSet = CDDiffUtil.getAllSuperclasses(astcdClass, srcCD - .getCDDefinition().getCDClassesList()); - for (ASTCDClass superClass : superClassSet) { - assocStructs.addAll(syn2SemDiffHelper.getOtherAssocs(superClass, true, false)); + Set superClassSet = CDDiffUtil.getAllSuperTypes(astcdClass); + for (ASTCDType superClass : superClassSet) { + assocStructs.addAll(syn2SemDiffHelper.getOtherAssocs(superClass, true, false, false)); } List copy = new ArrayList<>(assocStructs); for (AssocStruct assocStruct : copy) { diff --git a/cddiff/src/main/java/de/monticore/cddiff/syn2semdiff/odgen/ODBuilder.java b/cddiff/src/main/java/de/monticore/cddiff/syn2semdiff/odgen/ODBuilder.java index 5aa9de343..287e388cd 100644 --- a/cddiff/src/main/java/de/monticore/cddiff/syn2semdiff/odgen/ODBuilder.java +++ b/cddiff/src/main/java/de/monticore/cddiff/syn2semdiff/odgen/ODBuilder.java @@ -2,6 +2,7 @@ package de.monticore.cddiff.syn2semdiff.odgen; import de.monticore.cddiff.syn2semdiff.datastructures.AssocDirection; +import de.monticore.expressions.expressionsbasis.ExpressionsBasisMill; import de.monticore.od4report.OD4ReportMill; import de.monticore.odbasis.ODBasisMill; import de.monticore.odbasis._ast.ASTODAttribute; @@ -13,6 +14,7 @@ import de.monticore.odlink._ast.ASTODLinkBuilder; import de.monticore.odlink._ast.ASTODLinkLeftSideBuilder; import de.monticore.odlink._ast.ASTODLinkRightSideBuilder; +import de.monticore.umlmodifier._ast.ASTModifier; import de.se_rwth.commons.logging.Log; import java.util.*; @@ -79,10 +81,13 @@ public ASTODObject buildObj(String id, String type, Collection types, objectBuilder.setName(id); - objectBuilder.setModifier(OD4ReportMill.modifierBuilder().setStereotype(OD4ReportMill + ASTModifier modifier = OD4ReportMill.modifierBuilder().setStereotype(OD4ReportMill .stereotypeBuilder().addValues(OD4ReportMill.stereoValueBuilder().setName("instanceof") - .setContent(String.join(", ", types)).setText(OD4ReportMill.stringLiteralBuilder() - .setSource(String.join(", ", types)).build()).build()).build()).build()); + .setExpression(ExpressionsBasisMill.literalExpressionBuilder().setLiteral(OD4ReportMill + .stringLiteralBuilder().setSource(String.join(", ", types)).build()).build()) + .build()).build()).build(); + + objectBuilder.setModifier(modifier); objectBuilder.setMCObjectType(ODBasisMill.mCQualifiedTypeBuilder().setMCQualifiedName( ODBasisMill.mCQualifiedNameBuilder().setPartsList(Collections.singletonList(type)).build()) diff --git a/cddiff/src/main/java/de/monticore/cddiff/syn2semdiff/odgen/Syn2SemDiffHelper.java b/cddiff/src/main/java/de/monticore/cddiff/syn2semdiff/odgen/Syn2SemDiffHelper.java index 09f10880c..1cda05004 100644 --- a/cddiff/src/main/java/de/monticore/cddiff/syn2semdiff/odgen/Syn2SemDiffHelper.java +++ b/cddiff/src/main/java/de/monticore/cddiff/syn2semdiff/odgen/Syn2SemDiffHelper.java @@ -236,7 +236,7 @@ public boolean isSubclassWithSuper(ASTCDType superClass, ASTCDType subClass) { * @return list of associations */ public List getOtherAssocs(ASTCDType astcdClass, boolean isSource, - boolean makeConditionStrict) { + boolean makeConditionStrict, boolean allowBiDirectional) { List list = new ArrayList<>(); ArrayListMultimap map = isSource ? srcMap : tgtMap; @@ -247,17 +247,18 @@ public List getOtherAssocs(ASTCDType astcdClass, boolean isSource, connectedTypes = Syn2SemDiffHelper.getConnectedTypes(assocStruct.getAssociation(), isSource ? srcCD : tgtCD); - if (assocStruct.getSide().equals(ClassSide.Left) && !assocStruct.getDirection().equals( - AssocDirection.BiDirectional) && (makeConditionStrict || assocStruct.getAssociation() - .getLeft().getCDCardinality().isOne() || assocStruct.getAssociation().getLeft() - .getCDCardinality().isAtLeastOne()) && connectedTypes.b == astcdClass) { + if (assocStruct.getSide().equals(ClassSide.Left) && (allowBiDirectional || !assocStruct + .getDirection().equals(AssocDirection.BiDirectional)) && (makeConditionStrict + || assocStruct.getAssociation().getLeft().getCDCardinality().isOne() + || assocStruct.getAssociation().getLeft().getCDCardinality().isAtLeastOne()) + && connectedTypes.b == astcdClass) { list.add(assocStruct.deepClone()); } - else if (assocStruct.getSide().equals(ClassSide.Right) && !assocStruct.getDirection() - .equals(AssocDirection.BiDirectional) && (makeConditionStrict || assocStruct - .getAssociation().getRight().getCDCardinality().isOne() || assocStruct - .getAssociation().getRight().getCDCardinality().isAtLeastOne()) - && connectedTypes.a == astcdClass) { + else if (assocStruct.getSide().equals(ClassSide.Right) && (allowBiDirectional + || !assocStruct.getDirection().equals(AssocDirection.BiDirectional)) + && (makeConditionStrict || assocStruct.getAssociation().getRight().getCDCardinality() + .isOne() || assocStruct.getAssociation().getRight().getCDCardinality() + .isAtLeastOne()) && connectedTypes.a == astcdClass) { list.add(assocStruct.deepClone()); } } @@ -276,11 +277,21 @@ else if (assocStruct.getSide().equals(ClassSide.Right) && !assocStruct.getDirect */ public List getAllOtherAssocs(ASTCDType astcdClass, boolean isSource) { List list = new ArrayList<>(); - Set superTypes = CDDiffUtil.getAllSuperTypes(astcdClass, isSource ? srcCD - .getCDDefinition() : tgtCD.getCDDefinition()); + Set superTypes = CDDiffUtil.getAllSuperTypes(astcdClass); for (ASTCDType astcdClass1 : superTypes) { - list.addAll(getOtherAssocs(astcdClass1, isSource, false)); + list.addAll(getOtherAssocs(astcdClass1, isSource, false, false)); + } + + return list; + } + + public List getAllOtherAssocsWithBiDir(ASTCDType astcdClass, boolean isSource) { + List list = new ArrayList<>(); + Set superTypes = CDDiffUtil.getAllSuperTypes(astcdClass); + + for (ASTCDType astcdClass1 : superTypes) { + list.addAll(getOtherAssocs(astcdClass1, isSource, false, true)); } return list; @@ -288,11 +299,10 @@ public List getAllOtherAssocs(ASTCDType astcdClass, boolean isSourc public List getAllOtherAssocsSpecCase(ASTCDType astcdClass, boolean isSource) { List list = new ArrayList<>(); - Set superTypes = CDDiffUtil.getAllSuperTypes(astcdClass, isSource ? srcCD - .getCDDefinition() : tgtCD.getCDDefinition()); + Set superTypes = CDDiffUtil.getAllSuperTypes(astcdClass); for (ASTCDType astcdClass1 : superTypes) { - list.addAll(getOtherAssocs(astcdClass1, isSource, true)); + list.addAll(getOtherAssocs(astcdClass1, isSource, true, false)); } return list; @@ -652,7 +662,7 @@ public Optional allSubClassesAreTgtSrcTgt(AssocStruct matchedAssocStr for (ASTCDType subClass : subClassesTgt) { boolean contained = false; for (AssocStruct assocStruct : getAllOtherAssocs(subClass, false)) { - if (sameAssociationTypeSrcTgt(matchedAssocStruc, assocStruct)) { + if (sameAssociationTypeSrcTgt(matchedAssocStruc, assocStruct, true)) { contained = true; break; } @@ -684,13 +694,13 @@ public Optional allSubClassesHaveIt(AssocStruct association, ASTCDTyp for (AssocStruct assocStruct : assocList) { if (isSource) { - if (sameAssociationTypeSrcTgt(assocStruct, association)) { + if (sameAssociationTypeSrcTgt(assocStruct, association, true)) { isContained = true; break; } } else { - if (sameAssociationTypeSrcTgt(association, assocStruct)) { + if (sameAssociationTypeSrcTgt(association, assocStruct, true)) { isContained = true; break; } @@ -718,7 +728,7 @@ public Optional allSubClassesAreTargetTgtSrc(AssocStruct tgtAssoc, AS for (ASTCDType subClass : subClassesSrc) { boolean contained = false; for (AssocStruct assocStruct : getAllOtherAssocs(subClass, true)) { - if (sameAssociationTypeSrcTgt(assocStruct, tgtAssoc)) { + if (sameAssociationTypeSrcTgt(assocStruct, tgtAssoc, true)) { contained = true; break; } @@ -778,7 +788,7 @@ public boolean classHasAssociationSrcSrc(AssocStruct association, ASTCDType srcT */ public boolean classHasAssociationTgtSrc(AssocStruct tgtStruct, ASTCDType srcType) { for (AssocStruct assocStruct1 : srcMap.get(srcType)) { - if (sameAssociationTypeSrcTgt(assocStruct1, tgtStruct)) { + if (sameAssociationTypeSrcTgt(assocStruct1, tgtStruct, true)) { return true; } } @@ -803,7 +813,7 @@ public boolean classHasAssociationTgtSrcRev(AssocStruct tgtStruct, ASTCDType src */ public boolean classHasAssociationSrcTgt(AssocStruct assocStruct, ASTCDType tgtType) { for (AssocStruct assocStruct1 : tgtMap.get(tgtType)) { - if (sameAssociationTypeSrcTgt(assocStruct, assocStruct1)) { + if (sameAssociationTypeSrcTgt(assocStruct, assocStruct1, false)) { return true; } } @@ -835,7 +845,7 @@ public boolean classIsTarget(AssocStruct association, ASTCDType srcType) { */ public boolean classIsTgtSrcTgt(AssocStruct association, ASTCDType tgtType) { for (AssocStruct assocStruct : getAllOtherAssocsSpecCase(tgtType, false)) { - if (sameAssociationTypeSrcTgt(association, assocStruct)) { + if (sameAssociationTypeSrcTgt(association, assocStruct, true)) { return true; } } @@ -850,8 +860,8 @@ public boolean classIsTgtSrcTgt(AssocStruct association, ASTCDType tgtType) { * @return true, if an association has the same association type. */ public boolean classIsTargetTgtSrc(AssocStruct association, ASTCDType srcType) { - for (AssocStruct assocStruct : getAllOtherAssocs(srcType, true)) { - if (sameAssociationTypeSrcTgt(assocStruct, association)) { + for (AssocStruct assocStruct : getAllOtherAssocsWithBiDir(srcType, true)) { + if (sameAssociationTypeSrcTgt(assocStruct, association, true)) { return true; } } @@ -859,7 +869,7 @@ public boolean classIsTargetTgtSrc(AssocStruct association, ASTCDType srcType) { } public boolean classIsTargetTgtSrcRev(AssocStruct association, ASTCDType srcType) { - for (AssocStruct assocStruct : getAllOtherAssocs(srcType, true)) { + for (AssocStruct assocStruct : getAllOtherAssocsWithBiDir(srcType, true)) { if (sameAssociationTypeSrcTgtRev(assocStruct, association)) { return true; } @@ -1051,9 +1061,13 @@ private boolean compareAssociations(AssocStruct superAssoc, AssocStruct subAssoc * * @param srcAssocSub association from srcCD. * @param tgtAssocSuper association from tgtCD. + * @param srcCardContainedInSuper should the cardinalities of the source association be contained + * in the ones of the + * subassociation or the other way around * @return true, if the condition is fulfilled. */ - public boolean sameAssociationTypeSrcTgt(AssocStruct srcAssocSub, AssocStruct tgtAssocSuper) { + public boolean sameAssociationTypeSrcTgt(AssocStruct srcAssocSub, AssocStruct tgtAssocSuper, + boolean srcCardContainedInSuper) { boolean isLeftLeft = srcAssocSub.getSide().equals(ClassSide.Left) && tgtAssocSuper.getSide() .equals(ClassSide.Left); boolean isLeftRight = srcAssocSub.getSide().equals(ClassSide.Left) && tgtAssocSuper.getSide() @@ -1063,6 +1077,10 @@ public boolean sameAssociationTypeSrcTgt(AssocStruct srcAssocSub, AssocStruct tg boolean isRightLeft = srcAssocSub.getSide().equals(ClassSide.Right) && tgtAssocSuper.getSide() .equals(ClassSide.Left); + AssocStruct structWithSubCardinalities = srcCardContainedInSuper ? srcAssocSub : tgtAssocSuper; + AssocStruct structWithSuperCardinalities = srcCardContainedInSuper ? tgtAssocSuper + : srcAssocSub; + if (isLeftLeft || isRightRight) { return matchRoleNames(srcAssocSub.getAssociation().getLeft(), tgtAssocSuper.getAssociation() .getLeft()) && matchRoleNames(srcAssocSub.getAssociation().getRight(), tgtAssocSuper @@ -1072,13 +1090,16 @@ public boolean sameAssociationTypeSrcTgt(AssocStruct srcAssocSub, AssocStruct tg tgtCD).a, true) && compareTypes(getConnectedTypes(srcAssocSub .getAssociation(), srcCD).b, getConnectedTypes(tgtAssocSuper .getAssociation(), tgtCD).b, true) && isContainedIn(cardToEnum( - srcAssocSub.getAssociation().getLeft().getCDCardinality()), - cardToEnum(tgtAssocSuper.getAssociation().getLeft() - .getCDCardinality())) && isContainedIn(cardToEnum( - srcAssocSub.getAssociation().getRight() - .getCDCardinality()), cardToEnum(tgtAssocSuper - .getAssociation().getRight() - .getCDCardinality())); + structWithSubCardinalities.getAssociation().getLeft() + .getCDCardinality()), cardToEnum( + structWithSuperCardinalities.getAssociation() + .getLeft().getCDCardinality())) && isContainedIn( + cardToEnum(structWithSubCardinalities + .getAssociation().getRight() + .getCDCardinality()), cardToEnum( + structWithSuperCardinalities + .getAssociation().getRight() + .getCDCardinality())); } else if (isLeftRight || isRightLeft) { return matchRoleNames(srcAssocSub.getAssociation().getLeft(), tgtAssocSuper.getAssociation() @@ -1089,13 +1110,16 @@ else if (isLeftRight || isRightLeft) { tgtCD).b, true) && compareTypes(getConnectedTypes(srcAssocSub .getAssociation(), srcCD).b, getConnectedTypes(tgtAssocSuper .getAssociation(), tgtCD).a, true) && isContainedIn(cardToEnum( - srcAssocSub.getAssociation().getLeft().getCDCardinality()), - cardToEnum(tgtAssocSuper.getAssociation().getRight() - .getCDCardinality())) && isContainedIn(cardToEnum( - srcAssocSub.getAssociation().getRight() - .getCDCardinality()), cardToEnum(tgtAssocSuper - .getAssociation().getLeft() - .getCDCardinality())); + structWithSubCardinalities.getAssociation().getLeft() + .getCDCardinality()), cardToEnum( + structWithSuperCardinalities.getAssociation() + .getRight().getCDCardinality())) && isContainedIn( + cardToEnum(structWithSubCardinalities + .getAssociation().getRight() + .getCDCardinality()), cardToEnum( + structWithSuperCardinalities + .getAssociation().getLeft() + .getCDCardinality())); } return false; @@ -1120,11 +1144,11 @@ public boolean sameAssociationTypeSrcTgtRev(AssocStruct srcAssocSub, AssocStruct tgtCD).a, true) && compareTypes(getConnectedTypes(srcAssocSub .getAssociation(), srcCD).b, getConnectedTypes(tgtAssocSuper .getAssociation(), tgtCD).b, true) && isContainedIn(cardToEnum( - srcAssocSub.getAssociation().getLeft().getCDCardinality()), - cardToEnum(tgtAssocSuper.getAssociation().getLeft() + tgtAssocSuper.getAssociation().getLeft().getCDCardinality()), + cardToEnum(srcAssocSub.getAssociation().getLeft() .getCDCardinality())) && isContainedIn(cardToEnum( - srcAssocSub.getAssociation().getRight() - .getCDCardinality()), cardToEnum(tgtAssocSuper + tgtAssocSuper.getAssociation().getRight() + .getCDCardinality()), cardToEnum(srcAssocSub .getAssociation().getRight() .getCDCardinality())); } @@ -1137,11 +1161,11 @@ else if (isLeftLeft || isRightRight) { tgtCD).b, true) && compareTypes(getConnectedTypes(srcAssocSub .getAssociation(), srcCD).b, getConnectedTypes(tgtAssocSuper .getAssociation(), tgtCD).a, true) && isContainedIn(cardToEnum( - srcAssocSub.getAssociation().getLeft().getCDCardinality()), - cardToEnum(tgtAssocSuper.getAssociation().getRight() + tgtAssocSuper.getAssociation().getLeft().getCDCardinality()), + cardToEnum(srcAssocSub.getAssociation().getRight() .getCDCardinality())) && isContainedIn(cardToEnum( - srcAssocSub.getAssociation().getRight() - .getCDCardinality()), cardToEnum(tgtAssocSuper + tgtAssocSuper.getAssociation().getRight() + .getCDCardinality()), cardToEnum(srcAssocSub .getAssociation().getLeft() .getCDCardinality())); } @@ -1347,8 +1371,7 @@ private AssocDirection determineAssocDirection(ASTCDAssociation assoc, ClassSide private void inheritAssociations(ASTCDCompilationUnit compilationUnit, boolean isSource) { List types = getTypes(compilationUnit); for (ASTCDType astcdClass : types) { - Set superTypes = CDDiffUtil.getAllSuperTypes(astcdClass, compilationUnit - .getCDDefinition()); + Set superTypes = CDDiffUtil.getAllSuperTypes(astcdClass); superTypes.remove(astcdClass); for (ASTCDType superClass : superTypes) { @@ -1969,8 +1992,8 @@ public Optional getAssocStructByUnmod(ASTCDType astcdType, */ public boolean hasDiffSuper(ASTCDType astcdType) { Optional oldType = findMatchedTypeTgt(astcdType); - Set oldTypes = CDDiffUtil.getAllSuperTypes(oldType.get(), tgtCD.getCDDefinition()); - Set newTypes = CDDiffUtil.getAllSuperTypes(astcdType, srcCD.getCDDefinition()); + Set oldTypes = CDDiffUtil.getAllSuperTypes(oldType.get()); + Set newTypes = CDDiffUtil.getAllSuperTypes(astcdType); for (ASTCDType class1 : oldTypes) { boolean foundMatch = false; for (ASTCDType type2 : newTypes) { @@ -2148,7 +2171,7 @@ public List> srcAssocsExist(List asso } boolean foundMatch = false; for (AssocStruct assocStructTgt : tgtMap.get(tgtType)) { - if (sameAssociationTypeSrcTgt(assocStruct, assocStructTgt)) { // the given pair is a match + if (sameAssociationTypeSrcTgt(assocStruct, assocStructTgt, true)) { // the given pair is a match foundMatch = true; break; } @@ -2211,7 +2234,7 @@ public List> tgtAssocsExist(List asso for (AssocStruct assocStruct : assocStructs) { boolean foundMatch = false; for (AssocStruct assocStructSrc : srcMap.get(srcType)) { // 1:1 as srcAssocsExist - if (sameAssociationTypeSrcTgt(assocStructSrc, assocStruct)) { + if (sameAssociationTypeSrcTgt(assocStructSrc, assocStruct, true)) { foundMatch = true; break; } diff --git a/cddiff/src/main/java/de/monticore/cddiff/syndiff/CDSyntaxDiff.java b/cddiff/src/main/java/de/monticore/cddiff/syndiff/CDSyntaxDiff.java index d7e6d008f..0ae4e7d55 100644 --- a/cddiff/src/main/java/de/monticore/cddiff/syndiff/CDSyntaxDiff.java +++ b/cddiff/src/main/java/de/monticore/cddiff/syndiff/CDSyntaxDiff.java @@ -1,9 +1,6 @@ /* (c) https://github.com/MontiCore/monticore */ package de.monticore.cddiff.syndiff; -import static de.monticore.cddiff.ow2cw.CDInheritanceHelper.getAllSuper; -import static de.monticore.cddiff.syn2semdiff.odgen.Syn2SemDiffHelper.*; - import de.monticore.cd4code._symboltable.ICD4CodeArtifactScope; import de.monticore.cd4code.trafo.CD4CodeDirectCompositionTrafo; import de.monticore.cdassociation._ast.ASTCDAssociation; @@ -13,14 +10,38 @@ import de.monticore.cdbasis._ast.ASTCDCompilationUnit; import de.monticore.cdbasis._ast.ASTCDType; import de.monticore.cddiff.CDDiffUtil; -import de.monticore.cddiff.syn2semdiff.datastructures.*; +import de.monticore.cddiff.syn2semdiff.datastructures.AssocDiffStruct; +import de.monticore.cddiff.syn2semdiff.datastructures.AssocDirection; +import de.monticore.cddiff.syn2semdiff.datastructures.AssocMatching; +import de.monticore.cddiff.syn2semdiff.datastructures.AssocStruct; +import de.monticore.cddiff.syn2semdiff.datastructures.ClassSide; +import de.monticore.cddiff.syn2semdiff.datastructures.DeleteStruct; +import de.monticore.cddiff.syn2semdiff.datastructures.InheritanceDiff; +import de.monticore.cddiff.syn2semdiff.datastructures.MatchingStrategy; +import de.monticore.cddiff.syn2semdiff.datastructures.OverlappingAssocsDirect; +import de.monticore.cddiff.syn2semdiff.datastructures.TypeDiffStruct; import de.monticore.cddiff.syn2semdiff.odgen.Syn2SemDiffHelper; import de.monticore.cdinterfaceandenum._ast.ASTCDEnum; import de.monticore.cdinterfaceandenum._ast.ASTCDInterface; import edu.mit.csail.sdg.alloy4.Pair; -import java.util.*; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; import java.util.stream.Collectors; +import static de.monticore.cddiff.ow2cw.CDInheritanceHelper.getAllSuper; +import static de.monticore.cddiff.syn2semdiff.odgen.Syn2SemDiffHelper.areZeroAssocs; +import static de.monticore.cddiff.syn2semdiff.odgen.Syn2SemDiffHelper.getConflict; +import static de.monticore.cddiff.syn2semdiff.odgen.Syn2SemDiffHelper.getConnectedTypes; +import static de.monticore.cddiff.syn2semdiff.odgen.Syn2SemDiffHelper.isInConflict; +import static de.monticore.cddiff.syn2semdiff.odgen.Syn2SemDiffHelper.mergeAssocs; +import static de.monticore.cddiff.syn2semdiff.odgen.Syn2SemDiffHelper.setBiDirRoleName; + /** * This is the core class for semantic differencing. It contains the results of the syntactic * analysis as attributes. All changed types and associations are stored in lists. The class is used @@ -251,11 +272,10 @@ public ASTCDClass isSupClass(ASTCDClass astcdClass) { for (ASTCDClass classToCheck : classesToCheck) { for (ASTCDAttribute attribute : attributes) { if (!helper.isAttContainedInClass(attribute, classToCheck)) { - Set classes = CDDiffUtil.getAllSuperclasses(classToCheck, helper.getSrcCD() - .getCDDefinition().getCDClassesList()); + Set classes = CDDiffUtil.getAllSuperTypes(classToCheck); classes.remove(astcdClass); boolean isContained = false; - for (ASTCDClass superOfSub : classes) { + for (ASTCDType superOfSub : classes) { if (helper.isAttContainedInClass(attribute, superOfSub)) { isContained = true; break; @@ -329,7 +349,7 @@ public boolean isInheritanceDeleted(ASTCDType superClassTgt, ASTCDType subClassS for (AssocStruct tgtStruct : helper.getTgtMap().get(superClassTgt)) { if (!areZeroAssocs(tgtStruct, tgtStruct)) { for (AssocStruct srcAssoc : helper.getSrcMap().get(subClassSrc)) { - if (helper.sameAssociationTypeSrcTgt(srcAssoc, tgtStruct)) { + if (helper.sameAssociationTypeSrcTgt(srcAssoc, tgtStruct, true)) { isContained = true; } } @@ -344,7 +364,7 @@ public boolean isInheritanceDeleted(ASTCDType superClassTgt, ASTCDType subClassS for (AssocStruct otherStruct : helper.getAllOtherAssocs(superClassTgt, false)) { boolean isContained1 = false; for (AssocStruct srcStruct : helper.getAllOtherAssocs(subClassSrc, true)) { - if (helper.sameAssociationTypeSrcTgt(srcStruct, otherStruct)) { + if (helper.sameAssociationTypeSrcTgt(srcStruct, otherStruct, true)) { isContained1 = true; } } @@ -444,7 +464,7 @@ public boolean isInheritanceAdded(ASTCDType astcdClass, ASTCDType subClass) { for (AssocStruct newAssocs : helper.getSrcMap().get(astcdClass)) { for (AssocStruct srcStruct : helper.getTgtMap().get(helper.findMatchedTypeTgt(subClass) .get())) { - if (helper.sameAssociationTypeSrcTgt(newAssocs, srcStruct)) { + if (helper.sameAssociationTypeSrcTgt(newAssocs, srcStruct, true)) { isContained = true; break; } @@ -460,7 +480,7 @@ public boolean isInheritanceAdded(ASTCDType astcdClass, ASTCDType subClass) { boolean isContained1 = false; for (AssocStruct oldAssocs : helper.getAllOtherAssocs(helper.findMatchedTypeTgt(subClass) .get(), false)) { - if (helper.sameAssociationTypeSrcTgt(newAssocs, oldAssocs)) { + if (helper.sameAssociationTypeSrcTgt(newAssocs, oldAssocs, true)) { isContained1 = true; } } @@ -523,9 +543,8 @@ else if (!helper.getNotInstClassesTgt().contains(right) && sub.isPresent() && !h Optional sub = helper.allSubClassesHaveIt(assocStruct.get(), astcdClass, true); if (!astcdClass.getModifier().isAbstract() && matched.isPresent() && !helper .getNotInstClassesTgt().contains(astcdClass) && !helper.getNotInstClassesSrc() - .contains(matched.get()) && !(helper.classHasAssociationTgtSrc(assocStruct.get(), - matched.get()) || helper.classIsTargetTgtSrcRev(assocStruct.get(), matched - .get()))) { + .contains(matched.get()) && !helper.classHasAssociationTgtSrc(assocStruct.get(), + matched.get())) { isDeletedSrc = matched.get(); } else if (!helper.getNotInstClassesTgt().contains(astcdClass) && sub.isPresent() && !helper @@ -704,7 +723,10 @@ else if (helper.sameAssocStruct(association, superAssoc) || helper.sameAssocStru helper.deleteAssocsFromSubSrc(pair.getSuperAssoc(), getConnectedTypes(pair.getSuperAssoc() .getAssociation(), srcCD).a); } - helper.getSrcMap().remove(pair.getAstcdClass(), pair.getSuperAssoc()); + // Check if the association that we merged into the other one comes from a superclass - if that is the case, it gets removed from the subclass + if (pair.getSuperAssoc().isSuperAssoc()) { + helper.getSrcMap().remove(pair.getAstcdClass(), pair.getSuperAssoc()); + } } for (Pair pair : srcAssocsToDelete) { helper.deleteAssocsFromSrc(pair.a, pair.b); @@ -733,7 +755,10 @@ else if (helper.sameAssocStruct(association, superAssoc) || helper.sameAssocStru helper.deleteAssocFromSubTgt(pair.getSuperAssoc(), getConnectedTypes(pair.getSuperAssoc() .getAssociation(), tgtCD).a); } - helper.getTgtMap().remove(pair.getAstcdClass(), pair.getSuperAssoc()); + // Check if the association that we merged into the other one comes from a superclass - if that is the case, it gets removed from the subclass + if (pair.getSuperAssoc().isSuperAssoc()) { + helper.getTgtMap().remove(pair.getAstcdClass(), pair.getSuperAssoc()); + } } for (Pair pair : tgtAssocsToDelete) { helper.deleteAssocsFromTgt(pair.a, pair.b); diff --git a/cddiff/src/main/java/de/monticore/odvalidity/AssociationsMatcher.java b/cddiff/src/main/java/de/monticore/odvalidity/AssociationsMatcher.java index bf6141820..780e63649 100644 --- a/cddiff/src/main/java/de/monticore/odvalidity/AssociationsMatcher.java +++ b/cddiff/src/main/java/de/monticore/odvalidity/AssociationsMatcher.java @@ -65,7 +65,7 @@ public boolean checkAssociations(ASTODArtifact od, ASTCDCompilationUnit cd, } // for closed-world semantics each link in od must be an instance of an association in cd - if (Semantic.isClosedWorld(semantics)) { + if (SemanticsHelper.isClosedWorld(semantics)) { for (ASTODLink link : links) { if (cd.getCDDefinition().getCDAssociationsList().stream().noneMatch( assoc -> matchLinkAgainstAssociation(link, assoc))) { diff --git a/cddiff/src/main/java/de/monticore/odvalidity/ClassMatcher.java b/cddiff/src/main/java/de/monticore/odvalidity/ClassMatcher.java index 1b88d8a76..393eddbc4 100644 --- a/cddiff/src/main/java/de/monticore/odvalidity/ClassMatcher.java +++ b/cddiff/src/main/java/de/monticore/odvalidity/ClassMatcher.java @@ -3,10 +3,7 @@ import de.monticore.cd4code._symboltable.ICD4CodeArtifactScope; import de.monticore.cdassociation._ast.ASTCDAssociation; -import de.monticore.cdbasis._ast.ASTCDAttribute; -import de.monticore.cdbasis._ast.ASTCDClass; -import de.monticore.cdbasis._ast.ASTCDCompilationUnit; -import de.monticore.cdbasis._ast.ASTCDType; +import de.monticore.cdbasis._ast.*; import de.monticore.cddiff.alloycddiff.CDSemantics; import de.monticore.cddiff.ow2cw.CDInheritanceHelper; import de.monticore.cdinterfaceandenum._ast.ASTCDEnum; @@ -21,6 +18,7 @@ import de.monticore.types.mccollectiontypes._ast.ASTMCListType; import de.se_rwth.commons.logging.Log; import java.util.*; +import java.util.stream.Collectors; public class ClassMatcher { @@ -72,7 +70,7 @@ public boolean checkAllObjectsInClassDiagram(ASTODArtifact od, ASTCDCompilationU String objectType = obj.getMCObjectType().printType(); Optional optClass = getCDClassOfType(objectType); - if (Semantic.isClosedWorld(semantics) && optClass.isEmpty()) { + if (SemanticsHelper.isClosedWorld(semantics) && optClass.isEmpty()) { Log.println("[CONFLICT] Could not find class: " + objectType); return false; } @@ -83,20 +81,24 @@ else if (optClass.isPresent() && (optClass.get().getModifier().isAbstract() return false; } - if (semantics.equals(CDSemantics.STA_OPEN_WORLD)) { + if (SemanticsHelper.isSuperTypeAware(semantics)) { Optional> optSuper = STAObjectMatcher.getSuperSetFromStereotype(obj); if (optSuper.isPresent()) { for (String type : optSuper.get()) { if (!optSuper.get().containsAll(STAObjectMatcher.getSuperSet(type, scope))) { + Log.println("[CONFLICT]" + optSuper + "does not contain" + STAObjectMatcher + .getSuperSet(type, scope)); return false; } Optional optType = getCDClassOfType(type); if (optType.isPresent()) { if (optClass.isPresent() && !optType.equals(optClass) && CDInheritanceHelper .isSuperOf(objectType, type, scope)) { + Log.println("[CONFLICT]" + type + "is not instantiated by" + obj.getName()); return false; } - if (!isObjectValid4Class(obj, optType.get(), semantics)) { + // We check with STA_OPEN_WORLD to prevent a call to areObjectAttributesValidInClass + if (!isObjectValid4Class(obj, optType.get(), CDSemantics.STA_OPEN_WORLD)) { return false; } } @@ -112,7 +114,7 @@ else if (optClass.isPresent() && (optClass.get().getModifier().isAbstract() private boolean isInstanceOf(ASTODObject object, ASTCDType type) { // check the intanceof-stereotype iff semantics is STA open-world - if (Semantic.isSuperTypeAware(semantics)) { + if (SemanticsHelper.isSuperTypeAware(semantics)) { Optional> optSuper = STAObjectMatcher.getSuperSetFromStereotype(object); if (optSuper.isPresent()) { return optSuper.get().contains(type.getSymbol().getInternalQualifiedName()); @@ -158,7 +160,7 @@ && areAttributesSemanticallyEqual(odAttribute, cdAttribute))) { } } - if (Semantic.isClosedWorld(semantics)) { + if (SemanticsHelper.isClosedWorld(semantics)) { return areObjectAttributesValidInClass(obj.getODAttributeList(), superAttributes); } @@ -207,6 +209,8 @@ && areAttributesSemanticallyEqual(odAttr, cdAttr)) { if (!odAttrFoundInCD) { // If we didn't find a matching attribute in class then we check if it exists in the // associations + Log.println("[CONFLICT] Could not find: " + odAttr.getName() + " in class attributes " + + cdAttributes.stream().map(ASTCDAttributeTOP::getName).collect(Collectors.toSet())); ASTCDAssociation cdAssociation = getCDAssociationOfODObjectAttribute(odAttr); return cdAssociation != null; } @@ -451,7 +455,7 @@ private Optional getEnum(String enumName) { * @param value Enumeration value */ private boolean validateEnumValue(ASTCDEnum cdEnum, String value) { - if (Semantic.isClosedWorld(semantics)) { + if (SemanticsHelper.isClosedWorld(semantics)) { for (var cdEnumMember : cdEnum.getCDEnumConstantList()) { if (cdEnumMember.getName().equals(value)) { return true; diff --git a/cddiff/src/main/java/de/monticore/odvalidity/OD2CDMatcher.java b/cddiff/src/main/java/de/monticore/odvalidity/OD2CDMatcher.java index 226d0ff77..6ae42ba41 100644 --- a/cddiff/src/main/java/de/monticore/odvalidity/OD2CDMatcher.java +++ b/cddiff/src/main/java/de/monticore/odvalidity/OD2CDMatcher.java @@ -42,7 +42,7 @@ public boolean checkIfDiffWitness(CDSemantics semantics, File baseCDFile, File c public boolean checkIfDiffWitness(CDSemantics semantics, ASTCDCompilationUnit baseCD, ASTCDCompilationUnit compareCD, ASTODArtifact od) { - if (Semantic.isSuperTypeAware(semantics)) { + if (SemanticsHelper.isSuperTypeAware(semantics)) { return new STAObjectMatcher(this).isDiffWitness(semantics, baseCD, compareCD, od); } else { diff --git a/cddiff/src/main/java/de/monticore/odvalidity/STAObjectMatcher.java b/cddiff/src/main/java/de/monticore/odvalidity/STAObjectMatcher.java index 1fc6f7a2e..07bff30c4 100644 --- a/cddiff/src/main/java/de/monticore/odvalidity/STAObjectMatcher.java +++ b/cddiff/src/main/java/de/monticore/odvalidity/STAObjectMatcher.java @@ -67,7 +67,7 @@ public boolean isDiffWitness(CDSemantics semantic, ASTCDCompilationUnit baseCD, // iterate over all objects for (ASTODObject obj : objectList) { // for closed world semantics call hasObjectSameInheritance() - if (Semantic.isClosedWorld(semantic)) { + if (SemanticsHelper.isClosedWorld(semantic)) { if (!hasObjectSameInheritance(obj, baseScope, compScope)) { // object has not the same inheritance in both CDs // -> DiffWitness @@ -76,7 +76,7 @@ public boolean isDiffWitness(CDSemantics semantic, ASTCDCompilationUnit baseCD, } } // for open world semantics call checkInheritanceOpenWorld() - else if (Semantic.isOpenWorld(semantic)) { + else if (SemanticsHelper.isOpenWorld(semantic)) { if (!checkInheritanceOpenWorld(obj, baseScope, compScope, compCD)) { // inheritance contradicts that both CDs have the same open world semantics // -> DiffWitness diff --git a/cddiff/src/main/java/de/monticore/odvalidity/Semantic.java b/cddiff/src/main/java/de/monticore/odvalidity/SemanticsHelper.java similarity index 95% rename from cddiff/src/main/java/de/monticore/odvalidity/Semantic.java rename to cddiff/src/main/java/de/monticore/odvalidity/SemanticsHelper.java index 27fa5aa8e..6133dd7d3 100644 --- a/cddiff/src/main/java/de/monticore/odvalidity/Semantic.java +++ b/cddiff/src/main/java/de/monticore/odvalidity/SemanticsHelper.java @@ -3,7 +3,7 @@ import de.monticore.cddiff.alloycddiff.CDSemantics; -public class Semantic { +public class SemanticsHelper { public static boolean isOpenWorld(CDSemantics semantic) { return semantic == CDSemantics.SIMPLE_OPEN_WORLD || semantic == CDSemantics.STA_OPEN_WORLD; diff --git a/cddiff/src/test/java/de/monticore/cddiff/syndiff/AssertSynDiff.java b/cddiff/src/test/java/de/monticore/cddiff/syndiff/AssertSynDiff.java new file mode 100644 index 000000000..f0b02f0c4 --- /dev/null +++ b/cddiff/src/test/java/de/monticore/cddiff/syndiff/AssertSynDiff.java @@ -0,0 +1,139 @@ +/* (c) https://github.com/MontiCore/monticore */ +package de.monticore.cddiff.syndiff; + +import java.util.Collection; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.Map; +import java.util.function.Function; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class AssertSynDiff { + + CDSyntaxDiff diff; + Map> remainingFunctions = new HashMap<>(); + + public AssertSynDiff(CDSyntaxDiff diff) { + this.diff = diff; + remainingFunctions.put("assertAddedClasses", this::assertAddedClasses); + remainingFunctions.put("assertDeletedClasses", this::assertDeletedClasses); + remainingFunctions.put("assertMatchedClasses", this::assertMatchedClasses); + remainingFunctions.put("assertChangedTypes", this::assertChangedTypes); + remainingFunctions.put("assertAddedEnums", this::assertAddedEnums); + remainingFunctions.put("assertDeletedEnums", this::assertDeletedEnums); + remainingFunctions.put("assertMatchedEnums", this::assertMatchedEnums); + remainingFunctions.put("assertChangedAssocs", this::assertChangedAssocs); + remainingFunctions.put("assertAddedAssocs", this::assertAddedAssocs); + remainingFunctions.put("assertDeletedAssocs", this::assertDeletedAssocs); + remainingFunctions.put("assertMatchedAssocs", this::assertMatchedAssocs); + remainingFunctions.put("assertAddedInterfaces", this::assertAddedInterfaces); + remainingFunctions.put("assertDeletedInterfaces", this::assertDeletedInterfaces); + remainingFunctions.put("assertMatchedInterfaces", this::assertMatchedInterfaces); + } + + public AssertSynDiff assertAddedClasses(int expected) { + assertEquals(expected, diff.getAddedClasses().size(), "Expected " + expected + + " added classes, but found " + diff.getAddedClasses().size()); + remainingFunctions.remove("assertAddedClasses"); + return this; + } + + public AssertSynDiff assertDeletedClasses(int expected) { + assertEquals(expected, diff.getDeletedClasses().size(), "Expected " + expected + + " deleted classes, but found " + diff.getDeletedClasses().size()); + remainingFunctions.remove("assertDeletedClasses"); + return this; + } + + public AssertSynDiff assertMatchedClasses(int expected) { + assertEquals(expected, diff.getMatchedClasses().size(), "Expected " + expected + + " matched classes, but found " + diff.getMatchedClasses().size()); + remainingFunctions.remove("assertMatchedClasses"); + return this; + } + + public AssertSynDiff assertChangedTypes(int expected) { + assertEquals(expected, diff.getChangedTypes().size(), "Expected " + expected + + " changed types, but found " + diff.getChangedTypes().size()); + remainingFunctions.remove("assertChangedTypes"); + return this; + } + + public AssertSynDiff assertAddedEnums(int expected) { + assertEquals(expected, diff.getAddedEnums().size(), "Expected " + expected + + " added enums, but found " + diff.getAddedEnums().size()); + remainingFunctions.remove("assertAddedEnums"); + return this; + } + + public AssertSynDiff assertDeletedEnums(int expected) { + assertEquals(expected, diff.getDeletedEnums().size(), "Expected " + expected + + " deleted enums, but found " + diff.getDeletedEnums().size()); + remainingFunctions.remove("assertDeletedEnums"); + return this; + } + + public AssertSynDiff assertMatchedEnums(int expected) { + assertEquals(expected, diff.getMatchedEnums().size(), "Expected " + expected + + " matched enums, but found " + diff.getMatchedEnums().size()); + remainingFunctions.remove("assertMatchedEnums"); + return this; + } + + public AssertSynDiff assertChangedAssocs(int expected) { + assertEquals(expected, diff.getChangedAssocs().size(), "Expected " + expected + + " changed associations, but found " + diff.getChangedAssocs().size()); + remainingFunctions.remove("assertChangedAssocs"); + return this; + } + + public AssertSynDiff assertAddedAssocs(int expected) { + assertEquals(expected, diff.getAddedAssocs().size(), "Expected " + expected + + " added associations, but found " + diff.getAddedAssocs().size()); + remainingFunctions.remove("assertAddedAssocs"); + return this; + } + + public AssertSynDiff assertDeletedAssocs(int expected) { + assertEquals(expected, diff.getDeletedAssocs().size(), "Expected " + expected + + " deleted associations, but found " + diff.getDeletedAssocs().size()); + remainingFunctions.remove("assertDeletedAssocs"); + return this; + } + + public AssertSynDiff assertMatchedAssocs(int expected) { + assertEquals(expected, diff.getMatchedAssocs().size(), "Expected " + expected + + " matched associations, but found " + diff.getMatchedAssocs().size()); + remainingFunctions.remove("assertMatchedAssocs"); + return this; + } + + public AssertSynDiff assertAddedInterfaces(int expected) { + assertEquals(expected, diff.getAddedInterfaces().size(), "Expected " + expected + + " added interfaces, but found " + diff.getAddedInterfaces().size()); + remainingFunctions.remove("assertAddedInterfaces"); + return this; + } + + public AssertSynDiff assertDeletedInterfaces(int expected) { + assertEquals(expected, diff.getDeletedInterfaces().size(), "Expected " + expected + + " deleted interfaces, but found " + diff.getDeletedInterfaces().size()); + remainingFunctions.remove("assertDeletedInterfaces"); + return this; + } + + public AssertSynDiff assertMatchedInterfaces(int expected) { + assertEquals(expected, diff.getMatchedInterfaces().size(), "Expected " + expected + + " matched interfaces, but found " + diff.getMatchedInterfaces().size()); + remainingFunctions.remove("assertMatchedInterfaces"); + return this; + } + + public void assertRemainingEmpty() { + Collection> functionsToCall = new LinkedList<>( + remainingFunctions.values()); + functionsToCall.forEach(func -> func.apply(0)); + } + +} diff --git a/cddiff/src/test/java/de/monticore/cddiff/syndiff/AssocDiffTest.java b/cddiff/src/test/java/de/monticore/cddiff/syndiff/AssocDiffTest.java deleted file mode 100644 index be2611f9f..000000000 --- a/cddiff/src/test/java/de/monticore/cddiff/syndiff/AssocDiffTest.java +++ /dev/null @@ -1,108 +0,0 @@ -/* (c) https://github.com/MontiCore/monticore */ -package de.monticore.cddiff.syndiff; - -import static org.junit.jupiter.api.Assertions.fail; - -import de.monticore.cd4code.CD4CodeMill; -import de.monticore.cd4code._symboltable.CD4CodeSymbolTableCompleter; -import de.monticore.cdbasis._ast.ASTCDCompilationUnit; -import de.monticore.cddiff.CDDiffTestBasis; -import de.monticore.cddiff.syn2semdiff.Syn2SemDiff; -import de.monticore.odbasis._ast.ASTODArtifact; -import java.io.IOException; -import java.util.List; -import java.util.Optional; -import org.junit.jupiter.api.Test; - -public class AssocDiffTest extends CDDiffTestBasis { - - @Test - public void testCD5() { - ASTCDCompilationUnit compilationUnitNew = parseModel( - "src/test/resources/de/monticore/cddiff/syndiff/AssocDiff/AssocDeletedMerging/CD51.cd"); - ASTCDCompilationUnit compilationUnitOld = parseModel( - "src/test/resources/de/monticore/cddiff/syndiff/AssocDiff/AssocDeletedMerging/CD52.cd"); - - Syn2SemDiff syn2semdiff = new Syn2SemDiff(compilationUnitNew, compilationUnitOld); - List witnesses = syn2semdiff.generateODs(false); - - // todo: fix me - // Assertions.assertTrue(witnesses.isEmpty()); - } - - /*--------------------------------------------------------------------*/ - // Syntax Diff Tests - - public static final String dir = "src/test/resources/de/monticore/cddiff/syndiff/AssocDiff/"; - protected ASTCDCompilationUnit tgt; - protected ASTCDCompilationUnit src; - - @Test - public void testAssoc1() { - parseModels("Source1.cd", "Target1.cd"); - - CDSyntaxDiff synDiff = new CDSyntaxDiff(src, tgt, List.of()); - // System.out.println(synDiff.printDiff()); - } - - @Test - public void testAssoc2() { - parseModels("Source2.cd", "Target2.cd"); - - CDSyntaxDiff associationDiff = new CDSyntaxDiff(src, tgt, List.of()); - // System.out.println(associationDiff.printDiff()); - // System.out.println(associationDiff.getBaseDiff()); - // System.out.println(associationDiff.getMatchedAssocs()); - } - - @Test - public void testAssoc3() { - parseModels("Source3.cd", "Target3.cd"); - - CDSyntaxDiff syntaxDiff = new CDSyntaxDiff(src, tgt, List.of()); - // System.out.println(syntaxDiff.printSrcCD()); - // System.out.println(syntaxDiff.printTgtCD()); - // System.out.println(syntaxDiff.getBaseDiff()); - } - - @Test - public void testAssoc4() { - parseModels("Source4.cd", "Target4.cd"); - - CDSyntaxDiff syntaxDiff = new CDSyntaxDiff(src, tgt, List.of()); - System.out.println(syntaxDiff.getBaseDiff()); - } - - @Test - public void testAssoc5() { - parseModels("Source5.cd", "Target5.cd"); - CDSyntaxDiff syntaxDiff = new CDSyntaxDiff(src, tgt, List.of()); - System.out.println(syntaxDiff.getMatchedClasses()); - SyntaxDiffPrinter sb = new SyntaxDiffPrinter(src, tgt); - System.out.println(sb.printDiff()); - } - - public void parseModels(String concrete, String ref) { - try { - Optional src = CD4CodeMill.parser().parseCDCompilationUnit(dir - + concrete); - Optional tgt = CD4CodeMill.parser().parseCDCompilationUnit(dir + ref); - if (src.isPresent() && tgt.isPresent()) { - CD4CodeMill.scopesGenitorDelegator().createFromAST(src.get()); - CD4CodeMill.scopesGenitorDelegator().createFromAST(tgt.get()); - src.get().accept(new CD4CodeSymbolTableCompleter(src.get()).getTraverser()); - tgt.get().accept(new CD4CodeSymbolTableCompleter(tgt.get()).getTraverser()); - this.tgt = tgt.get(); - this.src = src.get(); - } - else { - fail("Could not parse CDs."); - } - - } - catch (IOException e) { - fail(e.getMessage()); - } - } - -} diff --git a/cddiff/src/test/java/de/monticore/cddiff/syndiff/Performance.java b/cddiff/src/test/java/de/monticore/cddiff/syndiff/Performance.java deleted file mode 100644 index c53d250fb..000000000 --- a/cddiff/src/test/java/de/monticore/cddiff/syndiff/Performance.java +++ /dev/null @@ -1,183 +0,0 @@ -/* (c) https://github.com/MontiCore/monticore */ -package de.monticore.cddiff.syndiff; - -import static org.junit.jupiter.api.Assertions.assertNotNull; - -import de.monticore.cdbasis._ast.ASTCDCompilationUnit; -import de.monticore.cddiff.CDDiff; -import de.monticore.cddiff.CDDiffTestBasis; -import de.monticore.cddiff.alloycddiff.CDSemantics; -import de.monticore.cddiff.ow2cw.ReductionTrafo; -import de.monticore.cddiff.syn2semdiff.Syn2SemDiff; -import de.monticore.odbasis._ast.ASTODArtifact; -import java.util.List; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; - -public class Performance extends CDDiffTestBasis { - - @Test - @Disabled - public void test() { - String path = "src/test/resources/validation/Performance/"; - - String filePath1; - String filePath2; - for (int i = 1; i <= 5; i++) { - filePath1 = path + 5 * i + "A.cd"; - filePath2 = path + 5 * i + "B.cd"; - System.out.println("******* Test for " + 5 * i + " *******"); - - CDSemantics cdSemantics = CDSemantics.SIMPLE_CLOSED_WORLD; - ASTCDCompilationUnit ast1_old = parseModel(filePath1); - ASTCDCompilationUnit ast2_old = parseModel(filePath2); - ASTCDCompilationUnit ast1_new = parseModel(filePath1); - ASTCDCompilationUnit ast2_new = parseModel(filePath2); - assertNotNull(ast1_old); - assertNotNull(ast2_old); - assertNotNull(ast1_new); - assertNotNull(ast2_new); - - // old method - long startTime_old = System.currentTimeMillis(); // start time - List ods_old = CDDiff.computeAlloySemDiff(ast1_old, ast2_old, 5, 1, - cdSemantics); - long endTime_old = System.currentTimeMillis(); // end time - // new method - long startTime_new2 = System.currentTimeMillis(); // start time - Syn2SemDiff syn2semdiff = new Syn2SemDiff(ast1_new, ast2_new, 1, 5, false); - List witnesses = syn2semdiff.generateODs(false); - long endTime_new2 = System.currentTimeMillis(); // end time - - System.out.println("old witness size: " + ods_old.size()); - System.out.println("Runtime of old method: " + (endTime_old - startTime_old) + "ms"); - System.out.println("new witness size: " + witnesses.size()); - System.out.println("Runtime of new method: " + (endTime_new2 - startTime_new2) + "ms"); - } - } - - @Test - @Disabled - public void test10() { - String path = "src/test/resources/validation/Performance/"; - - String filePath1; - String filePath2; - for (int i = 1; i <= 5; i++) { - filePath1 = path + 5 * i + "A.cd"; - filePath2 = path + 5 * i + "B.cd"; - System.out.println("******* Test for " + 5 * i + " *******"); - - CDSemantics cdSemantics = CDSemantics.SIMPLE_CLOSED_WORLD; - ASTCDCompilationUnit ast1_old = parseModel(filePath1); - ASTCDCompilationUnit ast2_old = parseModel(filePath2); - ASTCDCompilationUnit ast1_new = parseModel(filePath1); - ASTCDCompilationUnit ast2_new = parseModel(filePath2); - assertNotNull(ast1_old); - assertNotNull(ast2_old); - assertNotNull(ast1_new); - assertNotNull(ast2_new); - - // old method - long startTime_old = System.currentTimeMillis(); // start time - List ods_old = CDDiff.computeAlloySemDiff(ast1_old, ast2_old, 10, 5, - cdSemantics); - long endTime_old = System.currentTimeMillis(); // end time - // new method - long startTime_new2 = System.currentTimeMillis(); // start time - Syn2SemDiff syn2semdiff = new Syn2SemDiff(ast1_new, ast2_new, 5, 10, false); - List witnesses = syn2semdiff.generateODs(false); - long endTime_new2 = System.currentTimeMillis(); // end time - - System.out.println("old witness size: " + ods_old.size()); - System.out.println("Runtime of old method: " + (endTime_old - startTime_old) + "ms"); - System.out.println("new witness size: " + witnesses.size()); - System.out.println("Runtime of new method: " + (endTime_new2 - startTime_new2) + "ms"); - } - } - - @Test - @Disabled - public void test15() { - String path = "src/test/resources/validation/Performance/"; - - String filePath1; - String filePath2; - for (int i = 1; i <= 5; i++) { - filePath1 = path + 5 * i + "A.cd"; - filePath2 = path + 5 * i + "B.cd"; - System.out.println("******* Test for " + 5 * i + " *******"); - - CDSemantics cdSemantics = CDSemantics.SIMPLE_CLOSED_WORLD; - ASTCDCompilationUnit ast1_old = parseModel(filePath1); - ASTCDCompilationUnit ast2_old = parseModel(filePath2); - ASTCDCompilationUnit ast1_new = parseModel(filePath1); - ASTCDCompilationUnit ast2_new = parseModel(filePath2); - assertNotNull(ast1_old); - assertNotNull(ast2_old); - assertNotNull(ast1_new); - assertNotNull(ast2_new); - - // old method - long startTime_old = System.currentTimeMillis(); // start time - List ods_old = CDDiff.computeAlloySemDiff(ast1_old, ast2_old, 15, 5, - cdSemantics); - long endTime_old = System.currentTimeMillis(); // end time - // new method - long startTime_new2 = System.currentTimeMillis(); // start time - Syn2SemDiff syn2semdiff = new Syn2SemDiff(ast1_new, ast2_new, 5, 15, false); - List witnesses = syn2semdiff.generateODs(false); - long endTime_new2 = System.currentTimeMillis(); // end time - - System.out.println("old witness size: " + ods_old.size()); - System.out.println("Runtime of old method: " + (endTime_old - startTime_old) + "ms"); - System.out.println("new witness size: " + witnesses.size()); - System.out.println("Runtime of new method: " + (endTime_new2 - startTime_new2) + "ms"); - } - } - - @Test - @Disabled - public void testOpenW() { - String path = "src/test/resources/validation/Performance/"; - - String output = "./target/runtime-test/"; - - String filePath1; - String filePath2; - for (int i = 1; i <= 5; i++) { - filePath1 = path + 5 * i + "A.cd"; - filePath2 = path + 5 * i + "B.cd"; - System.out.println("******* Test for " + 5 * i + " *******"); - - CDSemantics cdSemantics = CDSemantics.STA_OPEN_WORLD; - ASTCDCompilationUnit ast1_old = parseModel(filePath1); - ASTCDCompilationUnit ast2_old = parseModel(filePath2); - ASTCDCompilationUnit ast1_new = parseModel(filePath1); - ASTCDCompilationUnit ast2_new = parseModel(filePath2); - assertNotNull(ast1_old); - assertNotNull(ast2_old); - assertNotNull(ast1_new); - assertNotNull(ast2_new); - - // old method - long startTime_old = System.currentTimeMillis(); // start time - List ods_old = CDDiff.computeAlloySemDiff(ast1_old, ast2_old, 15, 5, - CDSemantics.STA_OPEN_WORLD); - long endTime_old = System.currentTimeMillis(); // end time - // new method - long startTime_new2 = System.currentTimeMillis(); // start time - ReductionTrafo trafo = new ReductionTrafo(); - trafo.transform(ast1_new, ast2_new); - Syn2SemDiff syn2semdiff = new Syn2SemDiff(ast1_new, ast2_new, 5, 15, true); - List witnesses = syn2semdiff.generateODs(true); - long endTime_new2 = System.currentTimeMillis(); // end time - - System.out.println("old witness size: " + ods_old.size()); - System.out.println("Runtime of old method: " + (endTime_old - startTime_old) + "ms"); - System.out.println("new witness size: " + witnesses.size()); - System.out.println("Runtime of new method: " + (endTime_new2 - startTime_new2) + "ms"); - } - } - -} diff --git a/cddiff/src/test/java/de/monticore/cddiff/syndiff/PerformanceTest.java b/cddiff/src/test/java/de/monticore/cddiff/syndiff/PerformanceTest.java new file mode 100644 index 000000000..119987c8b --- /dev/null +++ b/cddiff/src/test/java/de/monticore/cddiff/syndiff/PerformanceTest.java @@ -0,0 +1,38 @@ +/* (c) https://github.com/MontiCore/monticore */ +package de.monticore.cddiff.syndiff; + +import de.monticore.cddiff.syn2semdiff.Syn2SemDiff; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.time.Duration; +import java.util.stream.Stream; + +public class PerformanceTest extends SynDiffTestBasis { + + @BeforeAll + public static void init() { + dir = "src/test/resources/de/monticore/cddiff/syndiff/Performance/"; + } + + public static Stream performanceData() { + return Stream.of(Arguments.of("5/CD1.cd", "5/CD2.cd", 1), Arguments.of("10/CD1.cd", "10/CD2.cd", + 1), Arguments.of("15/CD1.cd", "15/CD2.cd", 1), Arguments.of("20/CD1.cd", "20/CD2.cd", 1), + Arguments.of("25/CD1.cd", "25/CD2.cd", 1), Arguments.of("100/CD1.cd", "100/CD2.cd", 5), + Arguments.of("500/CD1.cd", "500/CD2.cd", 120)); + } + + @ParameterizedTest + @MethodSource("performanceData") + public void testPerformance(String srcPath, String tgtPath, int timeoutSec) { + parseModels(srcPath, tgtPath); + + Duration timeout = Duration.ofSeconds(timeoutSec); + Assertions.assertTimeout(timeout, () -> new Syn2SemDiff(src, tgt)); + + } + +} diff --git a/cddiff/src/test/java/de/monticore/cddiff/syndiff/Syn2SemDiffTest.java b/cddiff/src/test/java/de/monticore/cddiff/syndiff/Syn2SemDiffTest.java index 316569bd7..76ab97699 100644 --- a/cddiff/src/test/java/de/monticore/cddiff/syndiff/Syn2SemDiffTest.java +++ b/cddiff/src/test/java/de/monticore/cddiff/syndiff/Syn2SemDiffTest.java @@ -1,123 +1,250 @@ /* (c) https://github.com/MontiCore/monticore */ package de.monticore.cddiff.syndiff; -import static org.junit.jupiter.api.Assertions.*; - +import de.monticore.cd4analysis._prettyprint.CD4AnalysisFullPrettyPrinter; +import de.monticore.cd4code.CD4CodeMill; import de.monticore.cdbasis._ast.ASTCDCompilationUnit; -import de.monticore.cddiff.CDDiffTestBasis; import de.monticore.cddiff.alloycddiff.CDSemantics; +import de.monticore.cddiff.ow2cw.ReductionTrafo; import de.monticore.cddiff.syn2semdiff.Syn2SemDiff; import de.monticore.od4report._prettyprint.OD4ReportFullPrettyPrinter; import de.monticore.odbasis._ast.ASTODArtifact; import de.monticore.odvalidity.OD2CDMatcher; import de.monticore.prettyprint.IndentPrinter; -import de.se_rwth.commons.logging.Log; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.util.Collection; import java.util.List; -import org.junit.jupiter.api.Test; +import java.util.stream.Stream; + +import static de.monticore.cddiff.alloycddiff.CDSemantics.SIMPLE_CLOSED_WORLD; +import static de.monticore.cddiff.alloycddiff.CDSemantics.SIMPLE_OPEN_WORLD; +import static de.monticore.cddiff.alloycddiff.CDSemantics.STA_CLOSED_WORLD; +import static de.monticore.cddiff.alloycddiff.CDSemantics.STA_OPEN_WORLD; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; -public class Syn2SemDiffTest extends CDDiffTestBasis { +public class Syn2SemDiffTest extends SynDiffTestBasis { - @Test - public void testCD5() { - ASTCDCompilationUnit compilationUnitNew = parseModel( - "src/test/resources/de/monticore/cddiff/syndiff/AssocDiff/AssocDeletedMerging/CD51.cd"); - ASTCDCompilationUnit compilationUnitOld = parseModel( - "src/test/resources/de/monticore/cddiff/syndiff/AssocDiff/AssocDeletedMerging/CD52.cd"); - - Syn2SemDiff syn2semdiff = new Syn2SemDiff(compilationUnitNew, compilationUnitOld); - List witnesses = syn2semdiff.generateODs(false); - - assertTrue(witnesses.isEmpty()); + private static final String cddiffDir = "src/test/resources/de/monticore/cddiff/"; + private static final String validationDir = "src/test/resources/validation/"; + + public static Stream emptyWitnesses() { + return Stream.of(Arguments.of(cddiffDir, "syndiff/AssocDiff/AssocDeletedMerging/CD51.cd", + "syndiff/AssocDiff/AssocDeletedMerging/CD52.cd", false, false), Arguments.of(cddiffDir, + "syndiff/SyntaxDiff/MoveAttributes/CD11.cd", + "syndiff/SyntaxDiff/MoveAttributes/CD12.cd", false, false), Arguments.of(cddiffDir, + "syndiff/SyntaxDiff/MoveAttributes/CD12.cd", + "syndiff/SyntaxDiff/MoveAttributes/CD11.cd", false, false), Arguments.of(cddiffDir, + "syndiff/AssocDiff/AssocDeletedMerging/CD52.cd", + "syndiff/AssocDiff/AssocDeletedMerging/CD51.cd", false, true), Arguments.of( + cddiffDir, "syndiff/SyntaxDiff/MoveAttributes/CD11.cd", + "syndiff/SyntaxDiff/MoveAttributes/CD12.cd", false, true), Arguments.of( + cddiffDir, "syndiff/TypeDiff/ChangedAttribute/CD71.cd", + "syndiff/TypeDiff/ChangedAttribute/CD71.cd", false, false), Arguments + .of(cddiffDir, "syndiff/TypeDiff/ChangedAttribute/CD71.cd", + "syndiff/TypeDiff/ChangedAttribute/CD71.cd", false, true), + Arguments.of(cddiffDir, "syndiff/TypeDiff/RemovedAttributeNoDiff/CD21.cd", + "syndiff/TypeDiff/RemovedAttributeNoDiff/CD22.cd", false, false), Arguments.of( + cddiffDir, "syndiff/SyntaxDiff/MaCoCo_v2.cd", "syndiff/SyntaxDiff/MaCoCo_v1.cd", + false, false), Arguments.of(cddiffDir, "DigitalTwins/DigitalTwin2.cd", + "DigitalTwins/DigitalTwin3.cd", false, false), Arguments.of(cddiffDir, + "DigitalTwins/DigitalTwin3.cd", "DigitalTwins/DigitalTwin2.cd", false, + false), Arguments.of(cddiffDir, "Employees/Employees2.cd", + "Employees/Employees1.cd", true, true), Arguments.of(cddiffDir, + "Employees/Employees2.cd", "Employees/Employees1.cd", false, true), + Arguments.of(cddiffDir, "Employees/Employees8.cd", "Employees/Employees7.cd", true, true), + Arguments.of(validationDir, "cddiff/LibraryV3.cd", "cddiff/LibraryV2.cd", true, true), + Arguments.of(validationDir, "cddiff/LibraryV5.cd", "cddiff/LibraryV4.cd", true, true), + Arguments.of(validationDir, "cd4analysis/ManagementV2.cd", "cd4analysis/ManagementV1.cd", + true, true), Arguments.of(validationDir, "cd4analysis/MyCompanyV2.cd", + "cd4analysis/MyCompanyV1.cd", true, true), Arguments.of(validationDir, + "cd4analysis/MyExampleV2.cd", "cd4analysis/MyExampleV1.cd", true, true), + Arguments.of(validationDir, "cd4analysis/MyExampleV1.cd", "cd4analysis/MyExampleV2.cd", + true, true), Arguments.of(validationDir, "cd4analysis/ManagementV2.cd", + "cd4analysis/ManagementV1.cd", true, false), Arguments.of(validationDir, + "cd4analysis/MyExampleV2.cd", "cd4analysis/MyExampleV1.cd", true, false), + Arguments.of(validationDir, "cd4analysis/MyExampleV1.cd", "cd4analysis/MyExampleV2.cd", + true, false)); } - @Test - public void test11() { - ASTCDCompilationUnit compilationUnitNew = parseModel( - "src/test/resources/de/monticore/cddiff/syndiff/SyntaxDiff/MoveAttributes/CD11.cd"); - ASTCDCompilationUnit compilationUnitOld = parseModel( - "src/test/resources/de/monticore/cddiff/syndiff/SyntaxDiff/MoveAttributes/CD12.cd"); + @ParameterizedTest + @MethodSource("emptyWitnesses") + public void testEmptyWitnesses(String baseDir, String srcPath, String tgtPath, boolean staDiff, + boolean reduction) { + dir = baseDir; + parseModels(srcPath, tgtPath); - Syn2SemDiff syn2semdiff = new Syn2SemDiff(compilationUnitNew, compilationUnitOld); - List witnesses = syn2semdiff.generateODs(false); + if (reduction) { + ReductionTrafo trafo = new ReductionTrafo(); + trafo.transform(src, tgt); + System.out.println(CD4CodeMill.prettyPrint(src, false)); + } - assertTrue(witnesses.isEmpty()); - } - - @Test - public void test21() { - ASTCDCompilationUnit compilationUnitNew = parseModel( - "src/test/resources/de/monticore/cddiff/syndiff/SyntaxDiff/MoveAttributes/CD12.cd"); - ASTCDCompilationUnit compilationUnitOld = parseModel( - "src/test/resources/de/monticore/cddiff/syndiff/SyntaxDiff/MoveAttributes/CD11.cd"); + Syn2SemDiff syn2semdiff = new Syn2SemDiff(src, tgt); + List witnesses = syn2semdiff.generateODs(staDiff); - Syn2SemDiff syn2semdiff = new Syn2SemDiff(compilationUnitNew, compilationUnitOld); - List witnesses = syn2semdiff.generateODs(false); + System.out.println("size is: " + witnesses.size()); + for (ASTODArtifact od : witnesses) { + System.out.println(new OD2CDMatcher().checkIfDiffWitness(STA_CLOSED_WORLD, src, tgt, od)); + System.out.println(new OD4ReportFullPrettyPrinter(new IndentPrinter()).prettyprint(od)); + } assertTrue(witnesses.isEmpty()); } - @Test - public void test31() { - ASTCDCompilationUnit compilationUnitNew = parseModel( - "src/test/resources/de/monticore/cddiff/syndiff/SyntaxDiff/AddedDeletedAssocs/CD31.cd"); - ASTCDCompilationUnit compilationUnitOld = parseModel( - "src/test/resources/de/monticore/cddiff/syndiff/SyntaxDiff/AddedDeletedAssocs/CD32.cd"); + public static Stream witnesses() { + return Stream.of(Arguments.of(validationDir, "cddiff/LibraryV5.cd", "cddiff/LibraryV4.cd", + STA_CLOSED_WORLD, false), Arguments.of(cddiffDir, "Employees/Employees1.cd", + "Employees/Employees2.cd", SIMPLE_CLOSED_WORLD, true), Arguments.of(cddiffDir, + "syndiff/SyntaxDiff/AddedDeletedAssocs/CD31.cd", + "syndiff/SyntaxDiff/AddedDeletedAssocs/CD32.cd", SIMPLE_CLOSED_WORLD, false), + Arguments.of(cddiffDir, "syndiff/SyntaxDiff/MoveAttributes/CD12.cd", + "syndiff/SyntaxDiff/MoveAttributes/CD11.cd", SIMPLE_CLOSED_WORLD, true), Arguments.of( + cddiffDir, "syndiff/TypeDiff/DeletedAttribute/CD11.cd", + "syndiff/TypeDiff/DeletedAttribute/CD12.cd", SIMPLE_CLOSED_WORLD, false), Arguments + .of(cddiffDir, "syndiff/TypeDiff/DeletedAttribute/CD11.cd", + "syndiff/TypeDiff/DeletedAttribute/CD12.cd", SIMPLE_CLOSED_WORLD, true), + Arguments.of(cddiffDir, "syndiff/TypeDiff/RemovedAddedAttributeDiff/CD31.cd", + "syndiff/TypeDiff/RemovedAddedAttributeDiff/CD32.cd", SIMPLE_CLOSED_WORLD, false), + Arguments.of(cddiffDir, "syndiff/TypeDiff/RemovedAddedAttributeDiff/CD31.cd", + "syndiff/TypeDiff/RemovedAddedAttributeDiff/CD32.cd", SIMPLE_CLOSED_WORLD, true), + Arguments.of(cddiffDir, "syndiff/TypeDiff/RemovedAttributeNoDiff/CD21.cd", + "syndiff/TypeDiff/RemovedAttributeNoDiff/CD22.cd", SIMPLE_CLOSED_WORLD, true), Arguments + .of(cddiffDir, "syndiff/SyntaxDiff/MaCoCo_v1.cd", "syndiff/SyntaxDiff/MaCoCo_v2.cd", + SIMPLE_CLOSED_WORLD, false), Arguments.of(cddiffDir, + "syndiff/SyntaxDiff/SS1.cd", "syndiff/SyntaxDiff/SS2.cd", + SIMPLE_CLOSED_WORLD, false), Arguments.of(cddiffDir, + "DigitalTwins/DigitalTwin2.cd", "DigitalTwins/DigitalTwin1.cd", + SIMPLE_CLOSED_WORLD, false), Arguments.of(cddiffDir, + "DigitalTwins/DigitalTwin1.cd", "DigitalTwins/DigitalTwin2.cd", + SIMPLE_CLOSED_WORLD, true), Arguments.of(cddiffDir, + "DigitalTwins/DigitalTwin2.cd", "DigitalTwins/DigitalTwin3.cd", + SIMPLE_CLOSED_WORLD, true), Arguments.of(cddiffDir, + "DigitalTwins/DigitalTwin3.cd", + "DigitalTwins/DigitalTwin2.cd", SIMPLE_CLOSED_WORLD, true), + Arguments.of(cddiffDir, "DigitalTwins/DigitalTwin2.cd", "DigitalTwins/DigitalTwin1.cd", + SIMPLE_OPEN_WORLD, false), Arguments.of(cddiffDir, "DigitalTwins/DigitalTwin1.cd", + "DigitalTwins/DigitalTwin2.cd", SIMPLE_OPEN_WORLD, true), Arguments.of(cddiffDir, + "DigitalTwins/DigitalTwin2.cd", "DigitalTwins/DigitalTwin3.cd", + SIMPLE_OPEN_WORLD, true), Arguments.of(cddiffDir, + "DigitalTwins/DigitalTwin3.cd", "DigitalTwins/DigitalTwin2.cd", + SIMPLE_OPEN_WORLD, true), Arguments.of(cddiffDir, "Employees/Employees1.cd", + "Employees/Employees2.cd", SIMPLE_CLOSED_WORLD, false), Arguments.of( + cddiffDir, "Employees/Employees2.cd", "Employees/Employees1.cd", + SIMPLE_CLOSED_WORLD, false), Arguments.of(cddiffDir, + "Employees/Employees7.cd", "Employees/Employees8.cd", + STA_CLOSED_WORLD, true), Arguments.of(cddiffDir, + "Employees/Employees7.cd", "Employees/Employees8.cd", + STA_CLOSED_WORLD, false), Arguments.of(cddiffDir, + "Employees/Employees8.cd", "Employees/Employees7.cd", + STA_CLOSED_WORLD, false), Arguments.of(validationDir, + "cddiff/LibraryV2.cd", "cddiff/LibraryV3.cd", + STA_CLOSED_WORLD, true), Arguments.of(validationDir, + "cddiff/LibraryV4.cd", "cddiff/LibraryV5.cd", + STA_CLOSED_WORLD, true), Arguments.of( + validationDir, "cddiff/LibraryV3.cd", + "cddiff/LibraryV2.cd", STA_CLOSED_WORLD, + false), Arguments.of(validationDir, + "cddiff/LibraryV2.cd", + "cddiff/LibraryV3.cd", STA_CLOSED_WORLD, + false), Arguments.of(validationDir, + "cddiff/LibraryV4.cd", + "cddiff/LibraryV5.cd", + STA_CLOSED_WORLD, false), Arguments + .of(validationDir, + "cd4analysis/ManagementV1.cd", + "cd4analysis/ManagementV2.cd", + STA_CLOSED_WORLD, true), + Arguments.of(validationDir, "cd4analysis/MyCompanyV1.cd", "cd4analysis/MyCompanyV2.cd", + STA_CLOSED_WORLD, true), Arguments.of(validationDir, "cd4analysis/MyCompanyV2.cd", + "cd4analysis/MyCompanyV1.cd", STA_CLOSED_WORLD, false)); + } + + @ParameterizedTest + @MethodSource("witnesses") + public void testWitnesses(String baseDir, String srcPath, String tgtPath, CDSemantics semantics, + boolean reduction) { + dir = baseDir; + parseModels(srcPath, tgtPath); + + if (reduction) { + ReductionTrafo trafo = new ReductionTrafo(); + trafo.transform(src, tgt); + } - Syn2SemDiff syn2semdiff = new Syn2SemDiff(compilationUnitNew, compilationUnitOld); - List witnesses = syn2semdiff.generateODs(false); + Syn2SemDiff syn2semdiff = new Syn2SemDiff(src, tgt); + List witnesses = syn2semdiff.generateODs(semantics.equals(STA_CLOSED_WORLD) + || semantics.equals(STA_OPEN_WORLD)); assertFalse(witnesses.isEmpty()); - for (ASTODArtifact od : witnesses) { - if (!new OD2CDMatcher().checkIfDiffWitness(CDSemantics.SIMPLE_CLOSED_WORLD, - compilationUnitNew, compilationUnitOld, od)) { - Log.println(new OD4ReportFullPrettyPrinter(new IndentPrinter()).prettyprint(od)); - fail(); - } - } + checkDiffWitnesses(semantics, src, tgt, witnesses); } - @Test - public void testSimpleSem() { - ASTCDCompilationUnit compilationUnitNew = parseModel( - "src/test/resources/de/monticore/cddiff/syndiff/SyntaxDiff/SS1.cd"); - ASTCDCompilationUnit compilationUnitOld = parseModel( - "src/test/resources/de/monticore/cddiff/syndiff/SyntaxDiff/SS2.cd"); - - Syn2SemDiff syn2semdiff = new Syn2SemDiff(compilationUnitNew, compilationUnitOld); - List witnesses = syn2semdiff.generateODs(false); - for (ASTODArtifact od : witnesses) { - if (!new OD2CDMatcher().checkIfDiffWitness(CDSemantics.SIMPLE_CLOSED_WORLD, - compilationUnitNew, compilationUnitOld, od)) { - Log.println(new OD4ReportFullPrettyPrinter(new IndentPrinter()).prettyprint(od)); - fail(); - } - } + public static Stream witnessesReduction() { + return Stream.of(Arguments.of(cddiffDir, "Employees/Employees1.cd", "Employees/Employees2.cd"), + Arguments.of(validationDir, "Performance/5A.cd", "Performance/5B.cd"), Arguments.of( + validationDir, "Performance/10A.cd", "Performance/10B.cd"), Arguments.of(validationDir, + "Performance/15A.cd", "Performance/15B.cd"), Arguments.of(validationDir, + "Performance/20A.cd", "Performance/20B.cd"), Arguments.of(validationDir, + "Performance/25A.cd", "Performance/25B.cd"), Arguments.of(validationDir, + "cddiff/DEv2.cd", "cddiff/DEv1.cd"), Arguments.of(validationDir, + "cddiff/EAv2.cd", "cddiff/EAv1.cd"), Arguments.of(validationDir, + "cddiff/EMTv1.cd", "cddiff/EMTv2.cd"), Arguments.of( + validationDir, "cddiff/LibraryV2.cd", + "cddiff/LibraryV1.cd"), Arguments.of(validationDir, + "cddiff/LibraryV4.cd", "cddiff/LibraryV3.cd"), Arguments + .of(validationDir, "cd4analysis/MyLifeV2.cd", + "cd4analysis/MyLifeV1.cd"), Arguments.of( + validationDir, "cd4analysis/TeachingV2.cd", + "cd4analysis/TeachingV1.cd"), Arguments.of( + cddiffDir, "Employees/Employees7.cd", + "Employees/Employees8.cd"), Arguments + .of(cddiffDir, + "Employees/Employees7.cd", + "Employees/Employees8.cd"), + Arguments.of(cddiffDir, "DigitalTwins/DigitalTwin3.cd", "DigitalTwins/DigitalTwin2.cd")); } - @Test - public void testDT23() { - ASTCDCompilationUnit compilationUnitNew = parseModel( - "src/test/resources/de/monticore/cddiff/DigitalTwins/DigitalTwin2.cd"); - ASTCDCompilationUnit compilationUnitOld = parseModel( - "src/test/resources/de/monticore/cddiff/DigitalTwins/DigitalTwin3.cd"); - Syn2SemDiff syn2semdiff = new Syn2SemDiff(compilationUnitNew, compilationUnitOld); - List witnesses = syn2semdiff.generateODs(false); - assertTrue(witnesses.isEmpty()); + @ParameterizedTest + @MethodSource("witnessesReduction") + public void testWitnessesReduction(String baseDir, String srcPath, String tgtPath) { + dir = baseDir; + parseModels(srcPath, tgtPath); + + ASTCDCompilationUnit srcOriginal = src.deepClone(); + ASTCDCompilationUnit tgtOriginal = tgt.deepClone(); + + // reduction-based + ReductionTrafo trafo = new ReductionTrafo(); + trafo.transform(src, tgt); + + Syn2SemDiff syn2semdiff = new Syn2SemDiff(src, tgt); + List witnesses = syn2semdiff.generateODs(true); + + Assertions.assertFalse(witnesses.isEmpty()); + + checkDiffWitnesses(CDSemantics.STA_CLOSED_WORLD, src, tgt, witnesses); + + CD4CodeMill.scopesGenitorDelegator().createFromAST(srcOriginal); + CD4CodeMill.scopesGenitorDelegator().createFromAST(tgtOriginal); + checkDiffWitnesses(CDSemantics.STA_OPEN_WORLD, srcOriginal, tgtOriginal, witnesses); } - @Test - public void testDT32() { - ASTCDCompilationUnit compilationUnitNew = parseModel( - "src/test/resources/de/monticore/cddiff/DigitalTwins/DigitalTwin3.cd"); - ASTCDCompilationUnit compilationUnitOld = parseModel( - "src/test/resources/de/monticore/cddiff/DigitalTwins/DigitalTwin2.cd"); - Syn2SemDiff syn2semdiff = new Syn2SemDiff(compilationUnitNew, compilationUnitOld); - List witnesses = syn2semdiff.generateODs(false); + protected void checkDiffWitnesses(CDSemantics semantics, ASTCDCompilationUnit cd1, + ASTCDCompilationUnit cd2, Collection witnesses) { + System.out.println(new CD4AnalysisFullPrettyPrinter(new IndentPrinter()).prettyprint(cd1)); + System.out.println(new CD4AnalysisFullPrettyPrinter(new IndentPrinter()).prettyprint(cd2)); for (ASTODArtifact od : witnesses) { - System.out.println(new OD4ReportFullPrettyPrinter(new IndentPrinter()).prettyprint(od)); + if (!new OD2CDMatcher().checkIfDiffWitness(semantics, cd1, cd2, od)) { + System.out.println(new OD4ReportFullPrettyPrinter(new IndentPrinter()).prettyprint(od)); + Assertions.fail(); + } } - assertTrue(witnesses.isEmpty()); } } diff --git a/cddiff/src/test/java/de/monticore/cddiff/syndiff/Syn2SemDiffValidationTest.java b/cddiff/src/test/java/de/monticore/cddiff/syndiff/Syn2SemDiffValidationTest.java deleted file mode 100644 index 3890c9b26..000000000 --- a/cddiff/src/test/java/de/monticore/cddiff/syndiff/Syn2SemDiffValidationTest.java +++ /dev/null @@ -1,274 +0,0 @@ -/* (c) https://github.com/MontiCore/monticore */ -package de.monticore.cddiff.syndiff; - -import de.monticore.cd._symboltable.BuiltInTypes; -import de.monticore.cd4code.CD4CodeMill; -import de.monticore.cdbasis._ast.ASTCDCompilationUnit; -import de.monticore.cddiff.CDDiffUtil; -import de.monticore.cddiff.alloycddiff.CDSemantics; -import de.monticore.cddiff.ow2cw.ReductionTrafo; -import de.monticore.cddiff.syn2semdiff.Syn2SemDiff; -import de.monticore.od4report._prettyprint.OD4ReportFullPrettyPrinter; -import de.monticore.odbasis._ast.ASTODArtifact; -import de.monticore.odvalidity.OD2CDMatcher; -import de.monticore.prettyprint.IndentPrinter; -import de.se_rwth.commons.logging.Log; -import java.io.IOException; -import java.util.Collection; -import java.util.List; -import java.util.stream.Stream; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; - -public class Syn2SemDiffValidationTest { - - @BeforeEach - public void init() { - Log.init(); - CD4CodeMill.reset(); - CD4CodeMill.init(); - CD4CodeMill.globalScope().init(); - BuiltInTypes.addBuiltInTypes(CD4CodeMill.globalScope()); - } - - @Test - public void testEmployees1() { - try { - ASTCDCompilationUnit cd1 = CDDiffUtil.loadCD( - "src/test/resources/de/monticore/cddiff/Employees/Employees1.cd"); - ASTCDCompilationUnit cd2 = CDDiffUtil.loadCD( - "src/test/resources/de/monticore/cddiff/Employees/Employees2.cd"); - - Syn2SemDiff syn2semdiff = new Syn2SemDiff(cd1, cd2); - List witnesses = syn2semdiff.generateODs(false); - - Assertions.assertFalse(witnesses.isEmpty()); - - checkDiffWitnesses(CDSemantics.SIMPLE_CLOSED_WORLD, cd1, cd2, witnesses); - - } - catch (IOException e) { - Assertions.fail(e.getMessage()); - } - } - - @Test - public void testEmployees2() { - try { - ASTCDCompilationUnit cd1 = CDDiffUtil.loadCD( - "src/test/resources/de/monticore/cddiff/Employees/Employees2.cd"); - ASTCDCompilationUnit cd2 = CDDiffUtil.loadCD( - "src/test/resources/de/monticore/cddiff/Employees/Employees1.cd"); - - Syn2SemDiff syn2semdiff = new Syn2SemDiff(cd1, cd2); - List witnesses = syn2semdiff.generateODs(false); - - Assertions.assertFalse(witnesses.isEmpty()); - - checkDiffWitnesses(CDSemantics.SIMPLE_CLOSED_WORLD, cd1, cd2, witnesses); - - } - catch (IOException e) { - Assertions.fail(e.getMessage()); - } - } - - @Test - public void testOWEmployees() { - try { - ASTCDCompilationUnit cd1 = CDDiffUtil.loadCD( - "src/test/resources/de/monticore/cddiff/Employees/Employees2.cd"); - ASTCDCompilationUnit cd2 = CDDiffUtil.loadCD( - "src/test/resources/de/monticore/cddiff/Employees/Employees1.cd"); - - ReductionTrafo trafo = new ReductionTrafo(); - trafo.transform(cd1, cd2); - CDDiffUtil.saveDiffCDs2File(cd1, cd2, "target/generated/syn2semdiff-test/Employees"); - - Syn2SemDiff syn2semdiff = new Syn2SemDiff(cd1, cd2); - List witnesses = syn2semdiff.generateODs(true); - - Assertions.assertTrue(witnesses.isEmpty()); - - } - catch (IOException e) { - Assertions.fail(e.getMessage()); - } - } - - @Test - public void testEmployeesWithPackagesDiffEmpty() { - try { - ASTCDCompilationUnit cd1 = CDDiffUtil.loadCD( - "src/test/resources/de/monticore/cddiff/Employees/Employees8.cd"); - ASTCDCompilationUnit cd2 = CDDiffUtil.loadCD( - "src/test/resources/de/monticore/cddiff/Employees/Employees7.cd"); - - ReductionTrafo trafo = new ReductionTrafo(); - trafo.transform(cd1, cd2); - CDDiffUtil.saveDiffCDs2File(cd1, cd2, "target/generated/syn2semdiff-test/EmployeesEmpty"); - - Syn2SemDiff syn2semdiff = new Syn2SemDiff(cd1, cd2); - List witnesses = syn2semdiff.generateODs(true); - - Assertions.assertTrue(witnesses.isEmpty()); - - } - catch (IOException e) { - Assertions.fail(e.getMessage()); - } - } - - @Test - public void testEmployeesWithPackagesOWDiffPresent() { - try { - ASTCDCompilationUnit cd1 = CDDiffUtil.loadCD( - "src/test/resources/de/monticore/cddiff/Employees/Employees7.cd"); - ASTCDCompilationUnit cd2 = CDDiffUtil.loadCD( - "src/test/resources/de/monticore/cddiff/Employees/Employees8.cd"); - - ReductionTrafo trafo = new ReductionTrafo(); - trafo.transform(cd1, cd2); - CDDiffUtil.saveDiffCDs2File(cd1, cd2, "target/generated/syn2semdiff-test/EmployeesPresent"); - - Syn2SemDiff syn2semdiff = new Syn2SemDiff(cd1, cd2); - List witnesses = syn2semdiff.generateODs(true); - - Assertions.assertFalse(witnesses.isEmpty()); - - checkDiffWitnesses(CDSemantics.STA_CLOSED_WORLD, cd1, cd2, witnesses); - - } - catch (IOException e) { - Assertions.fail(e.getMessage()); - } - } - - @Test - public void testOWDigitalTwin1() { - try { - ASTCDCompilationUnit cd1 = CDDiffUtil.loadCD( - "src/test/resources/de/monticore/cddiff/DigitalTwins/DigitalTwin2.cd"); - ASTCDCompilationUnit cd2 = CDDiffUtil.loadCD( - "src/test/resources/de/monticore/cddiff/DigitalTwins/DigitalTwin1.cd"); - - ReductionTrafo trafo = new ReductionTrafo(); - trafo.transform(cd1, cd2); - CDDiffUtil.saveDiffCDs2File(cd1, cd2, "target/generated/syn2semdiff-test/DT2vsDT1"); - - Syn2SemDiff syn2semdiff = new Syn2SemDiff(cd1, cd2); - List witnesses = syn2semdiff.generateODs(true); - - Assertions.assertTrue(witnesses.isEmpty()); - - } - catch (IOException e) { - Assertions.fail(e.getMessage()); - } - } - - @Test - public void testOWDigitalTwin2() { - String path = "src/test/resources/de/monticore/cddiff/DigitalTwins/"; - String file1 = "DigitalTwin3.cd"; - String file2 = "DigitalTwin2.cd"; - checkReductionBasedDiff(path, file1, file2, true); - } - - @ParameterizedTest - @MethodSource("performanceSet") - public void testReductionBasedOWDiff(String file1, String file2) { - String path = "src/test/resources/validation/Performance/"; - checkReductionBasedDiff(path, file1, file2, true); - } - - @ParameterizedTest - @MethodSource("cddiffSet") - public void testReductionBasedOWDiff2(String file1, String file2, boolean diff) { - String path = "src/test/resources/validation/cddiff/"; - checkReductionBasedDiff(path, file1, file2, diff); - } - - @ParameterizedTest // Fixed test - @MethodSource("cd4analysisSet") - public void testReductionBasedOWDiff3(String file1, String file2, boolean diff) { - String path = "src/test/resources/validation/cd4analysis/"; - checkReductionBasedDiff(path, file1, file2, diff); - } - - protected void checkReductionBasedDiff(String path, String file1, String file2, boolean diff) { - try { - ASTCDCompilationUnit cd1 = CDDiffUtil.loadCD(path + file1); - ASTCDCompilationUnit cd2 = CDDiffUtil.loadCD(path + file2); - - ASTCDCompilationUnit original1 = cd1.deepClone(); - ASTCDCompilationUnit original2 = cd2.deepClone(); - - // reduction-based - ReductionTrafo trafo = new ReductionTrafo(); - trafo.transform(cd1, cd2); - - // print modified CDs - String dir1 = file1.replaceAll("\\.cd", ""); - String dir2 = file2.replaceAll("\\.cd", ""); - CDDiffUtil.saveDiffCDs2File(cd1, cd2, "target/generated/syn2semdiff-test/" + dir1 + "vs" - + dir2); - - Syn2SemDiff syn2semdiff = new Syn2SemDiff(cd1, cd2); - List witnesses = syn2semdiff.generateODs(true); - if (diff) { - Assertions.assertFalse(witnesses.isEmpty()); - } - else { - Assertions.assertTrue(witnesses.isEmpty()); - } - - checkDiffWitnesses(CDSemantics.STA_CLOSED_WORLD, cd1, cd2, witnesses); - - CD4CodeMill.scopesGenitorDelegator().createFromAST(original1); - CD4CodeMill.scopesGenitorDelegator().createFromAST(original2); - checkDiffWitnesses(CDSemantics.STA_OPEN_WORLD, original1, original2, witnesses); - - } - catch (IOException e) { - Assertions.fail(e.getMessage()); - } - } - - protected void checkDiffWitnesses(CDSemantics semantics, ASTCDCompilationUnit cd1, - ASTCDCompilationUnit cd2, Collection witnesses) { - for (ASTODArtifact od : witnesses) { - if (!new OD2CDMatcher().checkIfDiffWitness(semantics, cd1, cd2, od)) { - Log.println(new OD4ReportFullPrettyPrinter(new IndentPrinter()).prettyprint(od)); - Assertions.fail(); - } - } - } - - protected static Stream performanceSet() { - return Stream.of(Arguments.of("5A.cd", "5B.cd"), Arguments.of("10A.cd", "10B.cd"), Arguments.of( - "15A.cd", "15B.cd"), Arguments.of("20A.cd", "20B.cd"), Arguments.of("25A.cd", "25B.cd")); - } - - protected static Stream cddiffSet() { - return Stream.of(Arguments.of("DEv2.cd", "DEv1.cd", true), Arguments.of("EAv2.cd", "EAv1.cd", - true), Arguments.of("EMTv1.cd", "EMTv2.cd", true), Arguments.of("LibraryV2.cd", - "LibraryV1.cd", true), Arguments.of("LibraryV3.cd", "LibraryV2.cd", false), Arguments - .of("LibraryV4.cd", "LibraryV3.cd", true), Arguments.of("LibraryV5.cd", - "LibraryV4.cd", false)); - } - - protected static Stream cd4analysisSet() { - return Stream.of(Arguments.of("ManagementV2.cd", "ManagementV1.cd", false), Arguments.of( - "MyCompanyV2.cd", "MyCompanyV1.cd", false), Arguments.of("MyExampleV2.cd", "MyExampleV1.cd", - false), - // virtual associations should use qualified names - fixed - Arguments.of("MyLifeV2.cd", "MyLifeV1.cd", true), Arguments.of("TeachingV2.cd", - "TeachingV1.cd", true)); - } - -} diff --git a/cddiff/src/test/java/de/monticore/cddiff/syndiff/SynAssocDiffTest.java b/cddiff/src/test/java/de/monticore/cddiff/syndiff/SynAssocDiffTest.java new file mode 100644 index 000000000..167d77215 --- /dev/null +++ b/cddiff/src/test/java/de/monticore/cddiff/syndiff/SynAssocDiffTest.java @@ -0,0 +1,106 @@ +/* (c) https://github.com/MontiCore/monticore */ +package de.monticore.cddiff.syndiff; + +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class SynAssocDiffTest extends SynDiffTestBasis { + + @BeforeAll + public static void init() { + dir = "src/test/resources/de/monticore/cddiff/syndiff/AssocDiff/"; + } + + @Test + public void testAssoc1() { + parseModels("Source1.cd", "Target1.cd"); + + CDSyntaxDiff synDiff = new CDSyntaxDiff(src, tgt, List.of()); + + new AssertSynDiff(synDiff).assertAddedClasses(1).assertMatchedClasses(3).assertAddedAssocs(1) + .assertDeletedAssocs(1).assertChangedAssocs(1).assertMatchedAssocs(1) + .assertRemainingEmpty(); + + // Check that no other diffs exist + Map expectedDiffTypes = new HashMap<>(); + expectedDiffTypes.put(DiffTypes.CHANGED_ASSOCIATION_CARDINALITY, 1L); + expectedDiffTypes.put(DiffTypes.ADDED_CLASS, 1L); + expectedDiffTypes.put(DiffTypes.ADDED_ASSOCIATION, 1L); + expectedDiffTypes.put(DiffTypes.ADDED_INHERITANCE, 1L); + expectedDiffTypes.put(DiffTypes.DELETED_ASSOCIATION, 1L); + + assertEquals(expectedDiffTypes, getDiffTypesCount(synDiff)); + } + + @Test + public void testAssoc2() { + parseModels("Source2.cd", "Target2.cd"); + + CDSyntaxDiff synDiff = new CDSyntaxDiff(src, tgt, List.of()); + + new AssertSynDiff(synDiff).assertMatchedClasses(3).assertChangedAssocs(1).assertMatchedAssocs(1) + .assertRemainingEmpty(); + + Map expectedDiffTypes = new HashMap<>(); + expectedDiffTypes.put(DiffTypes.CHANGED_ASSOCIATION_CARDINALITY, 1L); + expectedDiffTypes.put(DiffTypes.CHANGED_ASSOCIATION_SOURCE_CLASS, 1L); + + assertEquals(expectedDiffTypes, getDiffTypesCount(synDiff)); + } + + @Test + public void testAssoc3() { + parseModels("Source3.cd", "Target3.cd"); + + CDSyntaxDiff synDiff = new CDSyntaxDiff(src, tgt, List.of()); + + new AssertSynDiff(synDiff).assertMatchedClasses(4).assertChangedTypes(2).assertChangedAssocs(3) + .assertMatchedAssocs(3).assertRemainingEmpty(); + + Map expectedDiffTypes = new HashMap<>(); + expectedDiffTypes.put(DiffTypes.CHANGED_ASSOCIATION_CARDINALITY, 3L); + expectedDiffTypes.put(DiffTypes.CHANGED_ASSOCIATION_DIRECTION, 1L); + expectedDiffTypes.put(DiffTypes.CHANGED_TYPE_EXTENDS, 1L); + expectedDiffTypes.put(DiffTypes.DELETED_INHERITANCE, 1L); + expectedDiffTypes.put(DiffTypes.CHANGED_CLASS_MODIFIER, 1L); + + assertEquals(expectedDiffTypes, getDiffTypesCount(synDiff)); + } + + @Test + public void testAssoc4() { + parseModels("Source4.cd", "Target4.cd"); + + CDSyntaxDiff synDiff = new CDSyntaxDiff(src, tgt, List.of()); + + new AssertSynDiff(synDiff).assertMatchedClasses(4).assertAddedAssocs(4).assertDeletedAssocs(4) + .assertRemainingEmpty(); + + Map expectedDiffTypes = new HashMap<>(); + expectedDiffTypes.put(DiffTypes.ADDED_ASSOCIATION, 1L); + expectedDiffTypes.put(DiffTypes.DELETED_ASSOCIATION, 1L); + + assertEquals(expectedDiffTypes, getDiffTypesCount(synDiff)); + } + + @Test + public void testAssoc5() { + parseModels("Source5.cd", "Target5.cd"); + CDSyntaxDiff synDiff = new CDSyntaxDiff(src, tgt, List.of()); + + new AssertSynDiff(synDiff).assertMatchedClasses(2).assertChangedAssocs(1).assertMatchedAssocs(1) + .assertRemainingEmpty(); + + Map expectedDiffTypes = new HashMap<>(); + expectedDiffTypes.put(DiffTypes.CHANGED_ASSOCIATION_CARDINALITY, 1L); + + assertEquals(expectedDiffTypes, getDiffTypesCount(synDiff)); + } + +} diff --git a/cddiff/src/test/java/de/monticore/cddiff/syndiff/MemberDiffTest.java b/cddiff/src/test/java/de/monticore/cddiff/syndiff/SynDiffTestBasis.java similarity index 52% rename from cddiff/src/test/java/de/monticore/cddiff/syndiff/MemberDiffTest.java rename to cddiff/src/test/java/de/monticore/cddiff/syndiff/SynDiffTestBasis.java index 4940d612c..571104305 100644 --- a/cddiff/src/test/java/de/monticore/cddiff/syndiff/MemberDiffTest.java +++ b/cddiff/src/test/java/de/monticore/cddiff/syndiff/SynDiffTestBasis.java @@ -1,49 +1,48 @@ /* (c) https://github.com/MontiCore/monticore */ package de.monticore.cddiff.syndiff; -import static org.junit.jupiter.api.Assertions.fail; - -import de.monticore.ast.ASTNode; +import de.monticore.cd._symboltable.BuiltInTypes; +import de.monticore.cd4analysis.trafo.CD4AnalysisAfterParseTrafo; import de.monticore.cd4code.CD4CodeMill; import de.monticore.cd4code._symboltable.CD4CodeSymbolTableCompleter; -import de.monticore.cdbasis._ast.ASTCDClass; import de.monticore.cdbasis._ast.ASTCDCompilationUnit; -import de.monticore.cddiff.CDDiffTestBasis; +import de.se_rwth.commons.logging.Log; +import de.se_rwth.commons.logging.LogStub; +import org.junit.jupiter.api.BeforeEach; + import java.io.IOException; +import java.util.Map; import java.util.Optional; -import org.junit.jupiter.api.Test; +import java.util.function.Function; +import java.util.stream.Collectors; + +import static org.junit.jupiter.api.Assertions.fail; -public class MemberDiffTest extends CDDiffTestBasis { +public abstract class SynDiffTestBasis { - /*--------------------------------------------------------------------*/ - // Syntax Diff Tests + @BeforeEach + public void setup() { + LogStub.init(); + Log.enableFailQuick(false); + CD4CodeMill.reset(); + CD4CodeMill.init(); + CD4CodeMill.globalScope().clear(); + CD4CodeMill.globalScope().init(); + BuiltInTypes.addBuiltInTypes(CD4CodeMill.globalScope()); + } - public static final String dir = "src/test/resources/de/monticore/cddiff/syndiff/MemberDiff/"; + public static String dir; protected ASTCDCompilationUnit tgt; protected ASTCDCompilationUnit src; - @Test - public void testMember1() { - parseModels("Source1.cd", "Target1.cd"); - - ASTCDClass cNew = CDTestHelper.getClass("A", src.getCDDefinition()); - ASTCDClass cOld = CDTestHelper.getClass("A", tgt.getCDDefinition()); - - ASTNode attributeNew = CDTestHelper.getAttribute(cNew, "a"); - ASTNode attributeOld = CDTestHelper.getAttribute(cOld, "a"); - - CDMemberDiff attrDiff = new CDMemberDiff(attributeNew, attributeOld); - System.out.println(attrDiff.printSrcMember()); - System.out.println(attrDiff.printTgtMember()); - System.out.println(attrDiff.getBaseDiff()); - } - public void parseModels(String concrete, String ref) { try { Optional src = CD4CodeMill.parser().parseCDCompilationUnit(dir + concrete); Optional tgt = CD4CodeMill.parser().parseCDCompilationUnit(dir + ref); if (src.isPresent() && tgt.isPresent()) { + (new CD4AnalysisAfterParseTrafo()).transform(src.get()); + (new CD4AnalysisAfterParseTrafo()).transform(tgt.get()); CD4CodeMill.scopesGenitorDelegator().createFromAST(src.get()); CD4CodeMill.scopesGenitorDelegator().createFromAST(tgt.get()); src.get().accept(new CD4CodeSymbolTableCompleter(src.get()).getTraverser()); @@ -52,7 +51,8 @@ public void parseModels(String concrete, String ref) { this.src = src.get(); } else { - fail("Could not parse CDs."); + fail(String.format("Parsing src: '%s', tgt: '%s'.", src.isPresent() ? "success" : "failure", + tgt.isPresent() ? "success" : "failure")); } } @@ -61,4 +61,9 @@ public void parseModels(String concrete, String ref) { } } + public Map getDiffTypesCount(CDSyntaxDiff synDiff) { + return synDiff.getBaseDiff().stream().collect(Collectors.groupingBy(Function.identity(), + Collectors.counting())); + } + } diff --git a/cddiff/src/test/java/de/monticore/cddiff/syndiff/SyntaxDiffTest.java b/cddiff/src/test/java/de/monticore/cddiff/syndiff/SyntaxDiffTest.java index f5bd785d4..5a2231dfb 100644 --- a/cddiff/src/test/java/de/monticore/cddiff/syndiff/SyntaxDiffTest.java +++ b/cddiff/src/test/java/de/monticore/cddiff/syndiff/SyntaxDiffTest.java @@ -1,189 +1,216 @@ /* (c) https://github.com/MontiCore/monticore */ package de.monticore.cddiff.syndiff; -import static org.junit.jupiter.api.Assertions.*; - +import de.monticore.ast.ASTNode; import de.monticore.cd4code.CD4CodeMill; +import de.monticore.cdbasis._ast.ASTCDClass; import de.monticore.cdbasis._ast.ASTCDCompilationUnit; import de.monticore.cdconformance.CDConfParameter; import de.monticore.cdconformance.CDConformanceChecker; -import de.monticore.cddiff.CDDiffTestBasis; import de.monticore.cddiff.CDDiffUtil; import de.monticore.cddiff.alloycddiff.CDSemantics; import de.monticore.cddiff.syn2semdiff.Syn2SemDiff; import de.monticore.odbasis._ast.ASTODArtifact; import de.monticore.odvalidity.OD2CDMatcher; +import de.se_rwth.commons.logging.Log; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + import java.io.IOException; +import java.util.HashMap; +import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Optional; import java.util.Set; -import de.se_rwth.commons.logging.Log; -import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; -public class SyntaxDiffTest extends CDDiffTestBasis { - - /*--------------------------------------------------------------------*/ - // Syntax Diff Tests +public class SyntaxDiffTest extends SynDiffTestBasis { - public static final String dir = "src/test/resources/de/monticore/cddiff/syndiff/SyntaxDiff/"; - protected ASTCDCompilationUnit tgt; - protected ASTCDCompilationUnit src; + @BeforeAll + public static void init() { + dir = "src/test/resources/de/monticore/cddiff/"; + } @Test - public void testDTs() { - ASTCDCompilationUnit compilationUnitNew = parseModel( - "src/test/resources/de/monticore/cddiff/DigitalTwins/DigitalTwin3.cd"); - ASTCDCompilationUnit compilationUnitOld = parseModel( - "src/test/resources/de/monticore/cddiff/DigitalTwins/DigitalTwin1.cd"); - - CDSyntaxDiff synDiff = new CDSyntaxDiff(compilationUnitNew, compilationUnitOld, List.of()); - assertEquals(4, synDiff.getAddedClasses().size()); - assertEquals(2, synDiff.getAddedAssocs().size()); + public void testMember1() { + parseModels("syndiff/MemberDiff/Source1.cd", "syndiff/MemberDiff/Target1.cd"); + + ASTCDClass cNew = CDTestHelper.getClass("A", src.getCDDefinition()); + ASTCDClass cOld = CDTestHelper.getClass("A", tgt.getCDDefinition()); + + Assertions.assertNotNull(cNew); + Assertions.assertNotNull(cOld); + + ASTNode attributeNew = CDTestHelper.getAttribute(cNew, "a"); + ASTNode attributeOld = CDTestHelper.getAttribute(cOld, "a"); + + CDMemberDiff attrDiff = new CDMemberDiff(attributeNew, attributeOld); + + assertEquals(new HashSet<>(attrDiff.getBaseDiff()), Set.of(DiffTypes.CHANGED_ATTRIBUTE_TYPE, + DiffTypes.CHANGED_ATTRIBUTE_MODIFIER)); } @Test - public void testSyntaxDiff1() { - parseModels("Source1.cd", "Target1.cd"); + public void testDTs() { + parseModels("DigitalTwins/DigitalTwin3.cd", "DigitalTwins/DigitalTwin1.cd"); CDSyntaxDiff synDiff = new CDSyntaxDiff(src, tgt, List.of()); - SyntaxDiffPrinter sb = new SyntaxDiffPrinter(synDiff); - Log.println(sb.printDiff()); - // check added / deleted classes - assertEquals(2, synDiff.getAddedClasses().size()); - assertEquals(2, synDiff.getDeletedClasses().size()); + new AssertSynDiff(synDiff).assertAddedClasses(4).assertMatchedClasses(4).assertAddedAssocs(2) + .assertChangedAssocs(3).assertMatchedAssocs(3).assertChangedTypes(2).assertRemainingEmpty(); - // check added / deleted enums - assertEquals(1, synDiff.getAddedEnums().size()); - assertEquals(1, synDiff.getDeletedEnums().size()); + Map expectedDiffTypes = new HashMap<>(); + expectedDiffTypes.put(DiffTypes.ADDED_CLASS, 1L); + expectedDiffTypes.put(DiffTypes.ADDED_ASSOCIATION, 1L); + expectedDiffTypes.put(DiffTypes.CHANGED_ASSOCIATION_TARGET_CLASS, 1L); + expectedDiffTypes.put(DiffTypes.CHANGED_ASSOCIATION_CARDINALITY, 2L); + expectedDiffTypes.put(DiffTypes.ADDED_INHERITANCE, 1L); + expectedDiffTypes.put(DiffTypes.CHANGED_TYPE_EXTENDS, 1L); + expectedDiffTypes.put(DiffTypes.CHANGED_CLASS_MODIFIER, 1L); - // check changed types - assertEquals(4, synDiff.getChangedTypes().size()); + assertEquals(expectedDiffTypes, getDiffTypesCount(synDiff)); + } + + @Test + public void testSyntaxDiff1() { + parseModels("syndiff/SyntaxDiff/Source1.cd", "syndiff/SyntaxDiff/Target1.cd"); - // check associations - assertEquals(2, synDiff.getChangedAssocs().size()); - assertEquals(2, synDiff.getAddedAssocs().size()); - assertEquals(2, synDiff.getDeletedAssocs().size()); + CDSyntaxDiff synDiff = new CDSyntaxDiff(src, tgt, List.of()); - // check no changes - assertTrue(synDiff.getAddedInterfaces().isEmpty()); - assertTrue(synDiff.getDeletedInterfaces().isEmpty()); + new AssertSynDiff(synDiff).assertAddedClasses(1).assertDeletedClasses(1).assertMatchedClasses(3) + .assertChangedTypes(5).assertAddedAssocs(2).assertDeletedAssocs(2).assertChangedAssocs(2) + .assertMatchedAssocs(2).assertAddedEnums(1).assertDeletedEnums(1).assertMatchedEnums(1) + .assertRemainingEmpty(); + + Map expectedDiffTypes = new HashMap<>(); + expectedDiffTypes.put(DiffTypes.DELETED_ASSOCIATION, 1L); + expectedDiffTypes.put(DiffTypes.DELETED_ENUM, 1L); + expectedDiffTypes.put(DiffTypes.DELETED_INHERITANCE, 1L); + expectedDiffTypes.put(DiffTypes.DELETED_ATTRIBUTE, 3L); + expectedDiffTypes.put(DiffTypes.DELETED_CLASS, 1L); + expectedDiffTypes.put(DiffTypes.DELETED_CONSTANT, 1L); + expectedDiffTypes.put(DiffTypes.ADDED_ASSOCIATION, 1L); + expectedDiffTypes.put(DiffTypes.ADDED_ENUM, 1L); + expectedDiffTypes.put(DiffTypes.ADDED_INHERITANCE, 1L); + expectedDiffTypes.put(DiffTypes.ADDED_ATTRIBUTE, 2L); + expectedDiffTypes.put(DiffTypes.ADDED_CLASS, 1L); + expectedDiffTypes.put(DiffTypes.ADDED_CONSTANT, 1L); + expectedDiffTypes.put(DiffTypes.CHANGED_ASSOCIATION_NAME, 1L); + expectedDiffTypes.put(DiffTypes.CHANGED_ASSOCIATION_CARDINALITY, 2L); + expectedDiffTypes.put(DiffTypes.CHANGED_ATTRIBUTE_TYPE, 1L); + expectedDiffTypes.put(DiffTypes.CHANGED_CLASS_NAME, 1L); + expectedDiffTypes.put(DiffTypes.CHANGED_CLASS_MODIFIER, 1L); + expectedDiffTypes.put(DiffTypes.INHERITED_ATTRIBUTE, 1L); + + assertEquals(expectedDiffTypes, getDiffTypesCount(synDiff)); } @Test public void testSyntaxDiff2() { - parseModels("Source2.cd", "Target2.cd"); + parseModels("syndiff/SyntaxDiff/Source2.cd", "syndiff/SyntaxDiff/Target2.cd"); CDSyntaxDiff synDiff = new CDSyntaxDiff(src, tgt, List.of()); - SyntaxDiffPrinter sb = new SyntaxDiffPrinter(synDiff); - Log.println(sb.printDiff()); - - // check changes - assertEquals(2, synDiff.getAddedClasses().size()); - assertEquals(2, synDiff.getDeletedClasses().size()); - - assertEquals(1, synDiff.getAddedEnums().size()); - assertEquals(1, synDiff.getDeletedEnums().size()); - - assertEquals(1, synDiff.getAddedAssocs().size()); - assertEquals(1, synDiff.getDeletedAssocs().size()); - // check no changes - assertTrue(synDiff.getAddedInterfaces().isEmpty()); - assertTrue(synDiff.getDeletedInterfaces().isEmpty()); - assertTrue(synDiff.getChangedTypes().isEmpty()); - assertTrue(synDiff.getChangedAssocs().isEmpty()); + new AssertSynDiff(synDiff).assertAddedClasses(2).assertDeletedClasses(2).assertMatchedClasses(2) + .assertAddedAssocs(1).assertDeletedAssocs(1).assertMatchedAssocs(1).assertAddedEnums(1) + .assertDeletedEnums(1).assertMatchedEnums(1).assertRemainingEmpty(); + + Map expectedDiffTypes = new HashMap<>(); + expectedDiffTypes.put(DiffTypes.ADDED_CLASS, 1L); + expectedDiffTypes.put(DiffTypes.ADDED_ASSOCIATION, 1L); + expectedDiffTypes.put(DiffTypes.ADDED_INHERITANCE, 1L); + expectedDiffTypes.put(DiffTypes.ADDED_ENUM, 1L); + expectedDiffTypes.put(DiffTypes.DELETED_CLASS, 1L); + expectedDiffTypes.put(DiffTypes.DELETED_ASSOCIATION, 1L); + expectedDiffTypes.put(DiffTypes.DELETED_INHERITANCE, 1L); + expectedDiffTypes.put(DiffTypes.DELETED_ENUM, 1L); + + assertEquals(expectedDiffTypes, getDiffTypesCount(synDiff)); } @Test public void testSyntaxDiff3() { - parseModels("TechStoreV2.cd", "TechStoreV1.cd"); + parseModels("syndiff/SyntaxDiff/TechStoreV2.cd", "syndiff/SyntaxDiff/TechStoreV1.cd"); CDSyntaxDiff synDiff = new CDSyntaxDiff(src, tgt, List.of()); - SyntaxDiffPrinter sb = new SyntaxDiffPrinter(synDiff); - Log.println(sb.printDiff()); - assertEquals(2, synDiff.getDeletedClasses().size()); - assertEquals(3, synDiff.getChangedTypes().size()); - - assertEquals(5, synDiff.getChangedAssocs().size()); - assertEquals(4, synDiff.getAddedAssocs().size()); - assertEquals(2, synDiff.getDeletedAssocs().size()); - - // check no changes - assertTrue(synDiff.getAddedClasses().isEmpty()); - assertTrue(synDiff.getAddedInterfaces().isEmpty()); - assertTrue(synDiff.getDeletedInterfaces().isEmpty()); - assertTrue(synDiff.getAddedEnums().isEmpty()); - assertTrue(synDiff.getDeletedEnums().isEmpty()); + new AssertSynDiff(synDiff).assertDeletedClasses(2).assertMatchedClasses(11).assertChangedTypes( + 3).assertAddedAssocs(4).assertDeletedAssocs(2).assertChangedAssocs(5).assertMatchedAssocs(6) + .assertMatchedEnums(1).assertRemainingEmpty(); + + Map expectedDiffTypes = new HashMap<>(); + expectedDiffTypes.put(DiffTypes.DELETED_ASSOCIATION, 1L); + expectedDiffTypes.put(DiffTypes.DELETED_INHERITANCE, 1L); + expectedDiffTypes.put(DiffTypes.DELETED_ATTRIBUTE, 1L); + expectedDiffTypes.put(DiffTypes.DELETED_CLASS, 1L); + expectedDiffTypes.put(DiffTypes.ADDED_ASSOCIATION, 1L); + expectedDiffTypes.put(DiffTypes.ADDED_ATTRIBUTE, 2L); + expectedDiffTypes.put(DiffTypes.CHANGED_ASSOCIATION_NAME, 3L); + expectedDiffTypes.put(DiffTypes.CHANGED_ASSOCIATION_ROLE, 3L); + expectedDiffTypes.put(DiffTypes.CHANGED_ASSOCIATION_CARDINALITY, 3L); + expectedDiffTypes.put(DiffTypes.CHANGED_ASSOCIATION_DIRECTION, 3L); + expectedDiffTypes.put(DiffTypes.CHANGED_ASSOCIATION_TARGET_CLASS, 1L); + expectedDiffTypes.put(DiffTypes.CHANGED_ASSOCIATION_CLASS, 2L); + expectedDiffTypes.put(DiffTypes.CHANGED_ATTRIBUTE_TYPE, 1L); + expectedDiffTypes.put(DiffTypes.CHANGED_CLASS_NAME, 1L); + + assertEquals(expectedDiffTypes, getDiffTypesCount(synDiff)); } @Test public void testSyntaxDiff4() { - parseModels("TechStoreV9.cd", "TechStoreV10.cd"); + parseModels("syndiff/SyntaxDiff/TechStoreV9.cd", "syndiff/SyntaxDiff/TechStoreV10.cd"); CDSyntaxDiff synDiff = new CDSyntaxDiff(src, tgt, List.of()); - SyntaxDiffPrinter sb = new SyntaxDiffPrinter(synDiff); - Log.println(sb.printDiff()); - // check changes - assertEquals(1, synDiff.getDeletedAssocs().size()); + new AssertSynDiff(synDiff).assertMatchedClasses(2).assertDeletedAssocs(1) + .assertRemainingEmpty(); - // check no changes - assertTrue(synDiff.getAddedClasses().isEmpty()); - assertTrue(synDiff.getAddedInterfaces().isEmpty()); - assertTrue(synDiff.getDeletedInterfaces().isEmpty()); - assertTrue(synDiff.getAddedEnums().isEmpty()); - assertTrue(synDiff.getDeletedEnums().isEmpty()); - assertTrue(synDiff.getChangedTypes().isEmpty()); - assertTrue(synDiff.getChangedAssocs().isEmpty()); - assertTrue(synDiff.getAddedAssocs().isEmpty()); + Map expectedDiffTypes = new HashMap<>(); + expectedDiffTypes.put(DiffTypes.DELETED_ASSOCIATION, 1L); + assertEquals(expectedDiffTypes, getDiffTypesCount(synDiff)); } @Test public void testSyntaxDiff5() { - parseModels("TechStoreV11.cd", "TechStoreV12.cd"); + parseModels("syndiff/SyntaxDiff/TechStoreV11.cd", "syndiff/SyntaxDiff/TechStoreV12.cd"); CDSyntaxDiff synDiff = new CDSyntaxDiff(src, tgt, List.of()); - SyntaxDiffPrinter sb = new SyntaxDiffPrinter(synDiff); - Log.println(sb.printDiff()); - // check changes - assertEquals(3, synDiff.getChangedTypes().size()); + new AssertSynDiff(synDiff).assertChangedTypes(3).assertMatchedClasses(3).assertRemainingEmpty(); - // check no changes - assertTrue(synDiff.getAddedClasses().isEmpty()); - assertTrue(synDiff.getAddedInterfaces().isEmpty()); - assertTrue(synDiff.getDeletedInterfaces().isEmpty()); - assertTrue(synDiff.getAddedEnums().isEmpty()); - assertTrue(synDiff.getDeletedEnums().isEmpty()); - assertTrue(synDiff.getChangedAssocs().isEmpty()); - assertTrue(synDiff.getAddedAssocs().isEmpty()); - assertTrue(synDiff.getDeletedAssocs().isEmpty()); + Map expectedDiffTypes = new HashMap<>(); + expectedDiffTypes.put(DiffTypes.ADDED_ATTRIBUTE, 1L); + expectedDiffTypes.put(DiffTypes.INHERITED_ATTRIBUTE, 2L); + + assertEquals(expectedDiffTypes, getDiffTypesCount(synDiff)); } @Test public void testMaCoCo() { CDDiffUtil.setUseJavaTypes(true); - parseModels("MaCoCo_v1.cd", "MaCoCo_v2.cd"); + parseMaCoCo("syndiff/SyntaxDiff/MaCoCo_v1.cd", "syndiff/SyntaxDiff/MaCoCo_v2.cd"); CDSyntaxDiff synDiff = new CDSyntaxDiff(src, tgt, List.of()); - SyntaxDiffPrinter sb = new SyntaxDiffPrinter(synDiff); - Log.println(sb.printDiff()); - assertEquals(1, synDiff.getAddedClasses().size()); - assertEquals(1, synDiff.getAddedEnums().size()); - assertEquals(1, synDiff.getAddedAssocs().size()); + new AssertSynDiff(synDiff).assertAddedClasses(1).assertAddedEnums(1).assertAddedAssocs(1) + .assertMatchedAssocs(91).assertMatchedClasses(94).assertMatchedEnums(45) + .assertRemainingEmpty(); - assertTrue(synDiff.getDeletedClasses().isEmpty()); - assertTrue(synDiff.getAddedInterfaces().isEmpty()); - assertTrue(synDiff.getDeletedInterfaces().isEmpty()); - assertTrue(synDiff.getDeletedEnums().isEmpty()); - assertTrue(synDiff.getChangedTypes().isEmpty()); - assertTrue(synDiff.getChangedAssocs().isEmpty()); - assertTrue(synDiff.getDeletedAssocs().isEmpty()); + Map expectedDiffTypes = new HashMap<>(); + expectedDiffTypes.put(DiffTypes.ADDED_CLASS, 1L); + expectedDiffTypes.put(DiffTypes.ADDED_ENUM, 1L); + expectedDiffTypes.put(DiffTypes.ADDED_ASSOCIATION, 1L); + expectedDiffTypes.put(DiffTypes.ADDED_INHERITANCE, 1L); + + assertEquals(expectedDiffTypes, getDiffTypesCount(synDiff)); // Conformance Checking without stereotype mapping constitutes a refinement check boolean conform = new CDConformanceChecker(Set.of(CDConfParameter.STEREOTYPE_MAPPING, @@ -202,19 +229,17 @@ public void testMaCoCo() { CDSemantics.SIMPLE_CLOSED_WORLD, src, tgt, od))); synDiff = new CDSyntaxDiff(tgt, src, List.of()); - sb = new SyntaxDiffPrinter(synDiff); - Log.println(sb.printDiff()); - assertEquals(1, synDiff.getDeletedClasses().size()); - assertEquals(1, synDiff.getDeletedEnums().size()); - assertEquals(1, synDiff.getDeletedAssocs().size()); + new AssertSynDiff(synDiff).assertDeletedClasses(1).assertDeletedEnums(1).assertDeletedAssocs(1) + .assertMatchedAssocs(91).assertMatchedClasses(94).assertMatchedEnums(45) + .assertRemainingEmpty(); - assertTrue(synDiff.getAddedClasses().isEmpty()); - assertTrue(synDiff.getAddedInterfaces().isEmpty()); - assertTrue(synDiff.getDeletedInterfaces().isEmpty()); - assertTrue(synDiff.getAddedEnums().isEmpty()); - assertTrue(synDiff.getChangedTypes().isEmpty()); - assertTrue(synDiff.getChangedAssocs().isEmpty()); - assertTrue(synDiff.getAddedAssocs().isEmpty()); + expectedDiffTypes = new HashMap<>(); + expectedDiffTypes.put(DiffTypes.DELETED_CLASS, 1L); + expectedDiffTypes.put(DiffTypes.DELETED_ENUM, 1L); + expectedDiffTypes.put(DiffTypes.DELETED_ASSOCIATION, 1L); + expectedDiffTypes.put(DiffTypes.DELETED_INHERITANCE, 1L); + + assertEquals(expectedDiffTypes, getDiffTypesCount(synDiff)); // Conformance Checking without stereotype mapping constitutes a refinement check conform = new CDConformanceChecker(Set.of(CDConfParameter.STEREOTYPE_MAPPING, @@ -234,7 +259,7 @@ public void testMaCoCo() { @Test public void testMaCoCo2() { CDDiffUtil.setUseJavaTypes(true); - parseModels("MaCoCo_Failing_1.cd", "MaCoCo_Failing_2.cd"); + parseMaCoCo("syndiff/SyntaxDiff/MaCoCo_Failing_1.cd", "syndiff/SyntaxDiff/MaCoCo_Failing_2.cd"); CDSyntaxDiff synDiff = new CDSyntaxDiff(src, tgt, List.of()); SyntaxDiffPrinter sb = new SyntaxDiffPrinter(synDiff); @@ -285,7 +310,7 @@ public void testMaCoCo2() { assertTrue(Log.getFindings().isEmpty()); } - public void parseModels(String concrete, String ref) { + public void parseMaCoCo(String concrete, String ref) { try { Optional src = CD4CodeMill.parser().parseCDCompilationUnit(dir + concrete); @@ -297,7 +322,8 @@ public void parseModels(String concrete, String ref) { this.src = src.get(); } else { - fail("Could not parse CDs."); + fail(String.format("Parsing src: '%s', tgt: '%s'.", src.isPresent() ? "success" : "failure", + tgt.isPresent() ? "success" : "failure")); } } diff --git a/cddiff/src/test/java/de/monticore/cddiff/syndiff/TypeDIffTest.java b/cddiff/src/test/java/de/monticore/cddiff/syndiff/TypeDIffTest.java deleted file mode 100644 index 4d2135ab9..000000000 --- a/cddiff/src/test/java/de/monticore/cddiff/syndiff/TypeDIffTest.java +++ /dev/null @@ -1,218 +0,0 @@ -/* (c) https://github.com/MontiCore/monticore */ -package de.monticore.cddiff.syndiff; - -import static org.junit.jupiter.api.Assertions.fail; - -import de.monticore.cd4code.CD4CodeMill; -import de.monticore.cd4code._prettyprint.CD4CodeFullPrettyPrinter; -import de.monticore.cd4code._symboltable.CD4CodeSymbolTableCompleter; -import de.monticore.cdbasis._ast.ASTCDClass; -import de.monticore.cdbasis._ast.ASTCDCompilationUnit; -import de.monticore.cddiff.CDDiffTestBasis; -import de.monticore.cddiff.CDDiffUtil; -import de.monticore.cddiff.alloycddiff.CDSemantics; -import de.monticore.cddiff.syn2semdiff.Syn2SemDiff; -import de.monticore.od4report._prettyprint.OD4ReportFullPrettyPrinter; -import de.monticore.odbasis._ast.ASTODArtifact; -import de.monticore.odvalidity.OD2CDMatcher; -import de.monticore.prettyprint.IndentPrinter; -import de.se_rwth.commons.logging.Log; -import java.io.IOException; -import java.util.List; -import java.util.Optional; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -public class TypeDIffTest extends CDDiffTestBasis { - - @Test - public void testCD2() { - - ASTCDCompilationUnit compilationUnitNew = parseModel( - "src/test/resources/de/monticore/cddiff/syndiff/TypeDiff/RemovedAttributeNoDiff/CD21.cd"); - ASTCDCompilationUnit compilationUnitOld = parseModel( - "src/test/resources/de/monticore/cddiff/syndiff/TypeDiff/RemovedAttributeNoDiff/CD22.cd"); - - Syn2SemDiff syn2semdiff = new Syn2SemDiff(compilationUnitNew, compilationUnitOld); - List witnesses = syn2semdiff.generateODs(false); - - Assertions.assertTrue(witnesses.isEmpty()); - } - - @Test - public void testCD1() { - - ASTCDCompilationUnit compilationUnitNew = parseModel( - "src/test/resources/de/monticore/cddiff/syndiff/TypeDiff/DeletedAttribute/CD11.cd"); - ASTCDCompilationUnit compilationUnitOld = parseModel( - "src/test/resources/de/monticore/cddiff/syndiff/TypeDiff/DeletedAttribute/CD12.cd"); - - Syn2SemDiff syn2semdiff = new Syn2SemDiff(compilationUnitNew, compilationUnitOld); - List witnesses = syn2semdiff.generateODs(false); - - Assertions.assertFalse(witnesses.isEmpty()); - - for (ASTODArtifact od : witnesses) { - if (!new OD2CDMatcher().checkIfDiffWitness(CDSemantics.SIMPLE_CLOSED_WORLD, - compilationUnitNew, compilationUnitOld, od)) { - Log.println(new OD4ReportFullPrettyPrinter(new IndentPrinter()).prettyprint(od)); - fail(); - } - } - } - - @Test - public void testCD3() { - ASTCDCompilationUnit compilationUnitNew = parseModel( - "src/test/resources/de/monticore/cddiff/syndiff/TypeDiff/RemovedAddedAttributeDiff/CD31.cd"); - ASTCDCompilationUnit compilationUnitOld = parseModel( - "src/test/resources/de/monticore/cddiff/syndiff/TypeDiff/RemovedAddedAttributeDiff/CD32.cd"); - - Syn2SemDiff syn2semdiff = new Syn2SemDiff(compilationUnitNew, compilationUnitOld); - List witnesses = syn2semdiff.generateODs(false); - - Assertions.assertFalse(witnesses.isEmpty()); - - for (ASTODArtifact od : witnesses) { - if (!new OD2CDMatcher().checkIfDiffWitness(CDSemantics.SIMPLE_CLOSED_WORLD, - compilationUnitNew, compilationUnitOld, od)) { - Log.println(new OD4ReportFullPrettyPrinter(new IndentPrinter()).prettyprint(od)); - fail(); - } - } - } - - @Test - public void testCD7() { - - ASTCDCompilationUnit compilationUnitNew = parseModel( - "src/test/resources/de/monticore/cddiff/syndiff/TypeDiff/ChangedAttribute/CD71.cd"); - ASTCDCompilationUnit compilationUnitOld = parseModel( - "src/test/resources/de/monticore/cddiff/syndiff/TypeDiff/ChangedAttribute/CD72.cd"); - - Syn2SemDiff syn2semdiff = new Syn2SemDiff(compilationUnitNew, compilationUnitOld); - List witnesses = syn2semdiff.generateODs(false); - - Assertions.assertFalse(witnesses.isEmpty()); - - for (ASTODArtifact od : witnesses) { - if (!new OD2CDMatcher().checkIfDiffWitness(CDSemantics.SIMPLE_CLOSED_WORLD, - compilationUnitNew, compilationUnitOld, od)) { - Log.println(new OD4ReportFullPrettyPrinter(new IndentPrinter()).prettyprint(od)); - fail(); - } - } - } - - /*--------------------------------------------------------------------*/ - // Syntax Diff Tests - - public static final String dir = "src/test/resources/de/monticore/cddiff/syndiff/TypeDiff/"; - protected ASTCDCompilationUnit tgt; - protected ASTCDCompilationUnit src; - - // Test for all kinds of changes in attributes - @Test - public void testType1() { - parseModels("Source1.cd", "Target1.cd"); - - CDDiffUtil.refreshSymbolTable(src); - CDDiffUtil.refreshSymbolTable(tgt); - - CDSyntaxDiff syntaxDiff = new CDSyntaxDiff(src, tgt, List.of()); - // System.out.println(syntaxDiff.printDiff()); - } - - // Tests for all kinds of changes in enum constants - @Test - public void testType2() { - parseModels("Source2.cd", "Target2.cd"); - CD4CodeFullPrettyPrinter pp = new CD4CodeFullPrettyPrinter(new IndentPrinter()); - ASTCDClass astcdClass11 = CDTestHelper.getClass("A", src.getCDDefinition()); - ASTCDClass astcdClass12 = CDTestHelper.getClass("A", tgt.getCDDefinition()); - ASTCDClass astcdClass21 = CDTestHelper.getClass("B", src.getCDDefinition()); - ASTCDClass astcdClass22 = CDTestHelper.getClass("B", tgt.getCDDefinition()); - CDDiffUtil.refreshSymbolTable(src); - CDDiffUtil.refreshSymbolTable(tgt); - - CDSyntaxDiff diff = new CDSyntaxDiff(src, tgt, List.of()); - CDTypeDiff typeDiff1 = new CDTypeDiff(astcdClass11, astcdClass12, tgt, src, diff.getHelper()); - CDTypeDiff typeDiff2 = new CDTypeDiff(astcdClass21, astcdClass22, tgt, src, diff.getHelper()); - - // System.out.println(diff.printOnlyAdded()); - - /*System.out.println(typeDiff1.printSrcCD()); - System.out.println(typeDiff2.printSrcCD()); - System.out.println("--------------------------------"); - System.out.println(typeDiff1.printTgtCD()); - System.out.println(typeDiff2.printTgtCD());*/ - } - - // Test for change of modifiers, extensions, and implementations - @Test - public void testType3() { - parseModels("Source3.cd", "Target3.cd"); - - ASTCDClass astcdClass11 = CDTestHelper.getClass("A", src.getCDDefinition()); - ASTCDClass astcdClass12 = CDTestHelper.getClass("A", tgt.getCDDefinition()); - ASTCDClass astcdClass21 = CDTestHelper.getClass("B", src.getCDDefinition()); - ASTCDClass astcdClass22 = CDTestHelper.getClass("B", tgt.getCDDefinition()); - ASTCDClass astcdClass31 = CDTestHelper.getClass("C", src.getCDDefinition()); - ASTCDClass astcdClass32 = CDTestHelper.getClass("C", tgt.getCDDefinition()); - - CDSyntaxDiff diff = new CDSyntaxDiff(src, tgt, List.of()); - - CDTypeDiff typeDiff1 = new CDTypeDiff(astcdClass11, astcdClass12, tgt, src, diff.getHelper()); - CDTypeDiff typeDiff2 = new CDTypeDiff(astcdClass21, astcdClass22, tgt, src, diff.getHelper()); - CDTypeDiff typeDiff3 = new CDTypeDiff(astcdClass31, astcdClass32, tgt, src, diff.getHelper()); - System.out.println(typeDiff1.printSrcCD()); - System.out.println(typeDiff2.printSrcCD()); - System.out.println(typeDiff3.printSrcCD()); - System.out.println("--------------------------------"); - System.out.println(typeDiff1.printTgtCD()); - System.out.println(typeDiff2.printTgtCD()); - System.out.println(typeDiff3.printTgtCD()); - System.out.println("--------------------------------"); - System.out.println(typeDiff1.getBaseDiff()); - System.out.println(typeDiff2.getBaseDiff()); - System.out.println(typeDiff3.getBaseDiff()); - } - - // Test for inherited attributes - @Test - public void testType4() { - parseModels("Source4.cd", "Target4.cd"); - - ASTCDClass astcdClass = CDTestHelper.getClass("A", src.getCDDefinition()); - ASTCDClass astcdClass1 = CDTestHelper.getClass("A", tgt.getCDDefinition()); - - CDSyntaxDiff diff = new CDSyntaxDiff(src, tgt, List.of()); - CDTypeDiff typeDiff = new CDTypeDiff(astcdClass, astcdClass1, tgt, src, diff.getHelper()); - System.out.println(typeDiff.printSrcCD()); - System.out.println(typeDiff.printTgtCD()); - } - - public void parseModels(String concrete, String ref) { - try { - Optional src = CD4CodeMill.parser().parseCDCompilationUnit(dir - + concrete); - Optional tgt = CD4CodeMill.parser().parseCDCompilationUnit(dir + ref); - if (src.isPresent() && tgt.isPresent()) { - CD4CodeMill.scopesGenitorDelegator().createFromAST(src.get()); - CD4CodeMill.scopesGenitorDelegator().createFromAST(tgt.get()); - src.get().accept(new CD4CodeSymbolTableCompleter(src.get()).getTraverser()); - tgt.get().accept(new CD4CodeSymbolTableCompleter(tgt.get()).getTraverser()); - this.tgt = tgt.get(); - this.src = src.get(); - } - else { - fail("Could not parse CDs."); - } - - } - catch (IOException e) { - fail(e.getMessage()); - } - } - -} diff --git a/cddiff/src/test/java/de/monticore/cddiff/syndiff/TypeDiffTest.java b/cddiff/src/test/java/de/monticore/cddiff/syndiff/TypeDiffTest.java new file mode 100644 index 000000000..74231bf39 --- /dev/null +++ b/cddiff/src/test/java/de/monticore/cddiff/syndiff/TypeDiffTest.java @@ -0,0 +1,108 @@ +/* (c) https://github.com/MontiCore/monticore */ +package de.monticore.cddiff.syndiff; + +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class TypeDiffTest extends SynDiffTestBasis { + + @BeforeAll + public static void init() { + dir = "src/test/resources/de/monticore/cddiff/syndiff/TypeDiff/"; + } + + // Test for all kinds of changes in attributes + @Test + public void testType1() { + parseModels("Source1.cd", "Target1.cd"); + + CDSyntaxDiff synDiff = new CDSyntaxDiff(src, tgt, List.of()); + + new AssertSynDiff(synDiff).assertMatchedClasses(3).assertMatchedEnums(1).assertChangedTypes(4) + .assertAddedClasses(1).assertDeletedClasses(1).assertAddedEnums(1).assertDeletedEnums(1) + .assertAddedAssocs(1).assertDeletedAssocs(2).assertRemainingEmpty(); + + Map expectedDiffTypes = new HashMap<>(); + expectedDiffTypes.put(DiffTypes.DELETED_ATTRIBUTE, 2L); + expectedDiffTypes.put(DiffTypes.INHERITED_ATTRIBUTE, 1L); + expectedDiffTypes.put(DiffTypes.ADDED_ATTRIBUTE, 1L); + expectedDiffTypes.put(DiffTypes.CHANGED_ATTRIBUTE_TYPE, 1L); + expectedDiffTypes.put(DiffTypes.CHANGED_ATTRIBUTE_MODIFIER, 1L); + expectedDiffTypes.put(DiffTypes.ADDED_CONSTANT, 1L); + expectedDiffTypes.put(DiffTypes.DELETED_CONSTANT, 1L); + expectedDiffTypes.put(DiffTypes.ADDED_CLASS, 1L); + expectedDiffTypes.put(DiffTypes.DELETED_CLASS, 1L); + expectedDiffTypes.put(DiffTypes.ADDED_ENUM, 1L); + expectedDiffTypes.put(DiffTypes.DELETED_ENUM, 1L); + expectedDiffTypes.put(DiffTypes.ADDED_ASSOCIATION, 1L); + expectedDiffTypes.put(DiffTypes.DELETED_ASSOCIATION, 1L); + expectedDiffTypes.put(DiffTypes.ADDED_INHERITANCE, 1L); + expectedDiffTypes.put(DiffTypes.DELETED_INHERITANCE, 1L); + + assertEquals(expectedDiffTypes, getDiffTypesCount(synDiff)); + } + + // Tests for all kinds of changes in enum constants + @Test + public void testType2() { + parseModels("Source2.cd", "Target2.cd"); + + CDSyntaxDiff synDiff = new CDSyntaxDiff(src, tgt, List.of()); + + new AssertSynDiff(synDiff).assertMatchedClasses(2).assertMatchedEnums(1).assertChangedTypes(2) + .assertAddedEnums(1).assertDeletedEnums(1).assertRemainingEmpty(); + + Map expectedDiffTypes = new HashMap<>(); + expectedDiffTypes.put(DiffTypes.DELETED_ATTRIBUTE, 1L); + expectedDiffTypes.put(DiffTypes.ADDED_ATTRIBUTE, 1L); + expectedDiffTypes.put(DiffTypes.CHANGED_ATTRIBUTE_TYPE, 1L); + expectedDiffTypes.put(DiffTypes.CHANGED_TYPE_EXTENDS, 1L); + expectedDiffTypes.put(DiffTypes.ADDED_ENUM, 1L); + expectedDiffTypes.put(DiffTypes.DELETED_ENUM, 1L); + expectedDiffTypes.put(DiffTypes.ADDED_INHERITANCE, 1L); + + assertEquals(expectedDiffTypes, getDiffTypesCount(synDiff)); + } + + // Test for change of modifiers, extensions, and implementations + @Test + public void testType3() { + parseModels("Source3.cd", "Target3.cd"); + + CDSyntaxDiff synDiff = new CDSyntaxDiff(src, tgt, List.of()); + + new AssertSynDiff(synDiff).assertMatchedClasses(5).assertChangedTypes(3).assertRemainingEmpty(); + + Map expectedDiffTypes = new HashMap<>(); + expectedDiffTypes.put(DiffTypes.CHANGED_CLASS_MODIFIER, 3L); + expectedDiffTypes.put(DiffTypes.CHANGED_TYPE_IMPLEMENTS, 2L); + expectedDiffTypes.put(DiffTypes.CHANGED_TYPE_EXTENDS, 1L); + expectedDiffTypes.put(DiffTypes.ADDED_INHERITANCE, 1L); + expectedDiffTypes.put(DiffTypes.DELETED_INHERITANCE, 1L); + + assertEquals(expectedDiffTypes, getDiffTypesCount(synDiff)); + } + + // Test for inherited attributes + @Test + public void testType4() { + parseModels("Source4.cd", "Target4.cd"); + + CDSyntaxDiff synDiff = new CDSyntaxDiff(src, tgt, List.of()); + + new AssertSynDiff(synDiff).assertMatchedClasses(3).assertChangedTypes(3).assertRemainingEmpty(); + + Map expectedDiffTypes = new HashMap<>(); + expectedDiffTypes.put(DiffTypes.DELETED_ATTRIBUTE, 2L); + expectedDiffTypes.put(DiffTypes.INHERITED_ATTRIBUTE, 1L); + + assertEquals(expectedDiffTypes, getDiffTypesCount(synDiff)); + } + +} diff --git a/cddiff/src/test/resources/de/monticore/cddiff/syndiff/Performance/100/CD1.cd b/cddiff/src/test/resources/de/monticore/cddiff/syndiff/Performance/100/CD1.cd new file mode 100644 index 000000000..831eab672 --- /dev/null +++ b/cddiff/src/test/resources/de/monticore/cddiff/syndiff/Performance/100/CD1.cd @@ -0,0 +1,588 @@ + +import java.lang.*; + +classdiagram CD1 { + + enum G1 {e11, e12, e13;} + + abstract class A1 { + String s; + } + + class B1 extends A1 { + E1 e; + } + + class C1 { + B1 b1; + } + + class D1 extends A1 { + String s; + } + + class E1 { + Double d; + } + + association [1] A1 <-> E1 [1..*]; + association [1..*] B1 -> C1 [0..1]; + association [1] C1 <-> D1 [1..*]; + association [*] E1 <- C1 [0..1]; + association [1] E1 -> D1 [1..*]; + + + enum G2 {e11, e12, e13;} + + abstract class A2 { + String s; + } + + class B2 extends A2 { + E2 e; + } + + class C2 { + B2 b2; + } + + class D2 extends A2 { + String s; + } + + class E2 { + Double d; + } + + association [1] A2 <-> E2 [1..*]; + association [1..*] B2 -> C2 [0..1]; + association [1] C2 <-> D2 [1..*]; + association [*] E2 <- C2 [0..1]; + association [1] E2 -> D2 [1..*]; + + + enum G3 {e11, e12, e13;} + + abstract class A3 { + String s; + } + + class B3 extends A3 { + E3 e; + } + + class C3 { + B3 b3; + } + + class D3 extends A3 { + String s; + } + + class E3 { + Double d; + } + + association [1] A3 <-> E3 [1..*]; + association [1..*] B3 -> C3 [0..1]; + association [1] C3 <-> D3 [1..*]; + association [*] E3 <- C3 [0..1]; + association [1] E3 -> D3 [1..*]; + + + enum G4 {e11, e12, e13;} + + abstract class A4 { + String s; + } + + class B4 extends A4 { + E4 e; + } + + class C4 { + B4 b4; + } + + class D4 extends A4 { + String s; + } + + class E4 { + Double d; + } + + association [1] A4 <-> E4 [1..*]; + association [1..*] B4 -> C4 [0..1]; + association [1] C4 <-> D4 [1..*]; + association [*] E4 <- C4 [0..1]; + association [1] E4 -> D4 [1..*]; + + + enum G5 {e11, e12, e13;} + + abstract class A5 { + String s; + } + + class B5 extends A5 { + E5 e; + } + + class C5 { + B5 b5; + } + + class D5 extends A5 { + String s; + } + + class E5 { + Double d; + } + + association [1] A5 <-> E5 [1..*]; + association [1..*] B5 -> C5 [0..1]; + association [1] C5 <-> D5 [1..*]; + association [*] E5 <- C5 [0..1]; + association [1] E5 -> D5 [1..*]; + + + enum G6 {e11, e12, e13;} + + abstract class A6 { + String s; + } + + class B6 extends A6 { + E6 e; + } + + class C6 { + B6 b6; + } + + class D6 extends A6 { + String s; + } + + class E6 { + Double d; + } + + association [1] A6 <-> E6 [1..*]; + association [1..*] B6 -> C6 [0..1]; + association [1] C6 <-> D6 [1..*]; + association [*] E6 <- C6 [0..1]; + association [1] E6 -> D6 [1..*]; + + + enum G7 {e11, e12, e13;} + + abstract class A7 { + String s; + } + + class B7 extends A7 { + E7 e; + } + + class C7 { + B7 b7; + } + + class D7 extends A7 { + String s; + } + + class E7 { + Double d; + } + + association [1] A7 <-> E7 [1..*]; + association [1..*] B7 -> C7 [0..1]; + association [1] C7 <-> D7 [1..*]; + association [*] E7 <- C7 [0..1]; + association [1] E7 -> D7 [1..*]; + + + enum G8 {e11, e12, e13;} + + abstract class A8 { + String s; + } + + class B8 extends A8 { + E8 e; + } + + class C8 { + B8 b8; + } + + class D8 extends A8 { + String s; + } + + class E8 { + Double d; + } + + association [1] A8 <-> E8 [1..*]; + association [1..*] B8 -> C8 [0..1]; + association [1] C8 <-> D8 [1..*]; + association [*] E8 <- C8 [0..1]; + association [1] E8 -> D8 [1..*]; + + + enum G9 {e11, e12, e13;} + + abstract class A9 { + String s; + } + + class B9 extends A9 { + E9 e; + } + + class C9 { + B9 b9; + } + + class D9 extends A9 { + String s; + } + + class E9 { + Double d; + } + + association [1] A9 <-> E9 [1..*]; + association [1..*] B9 -> C9 [0..1]; + association [1] C9 <-> D9 [1..*]; + association [*] E9 <- C9 [0..1]; + association [1] E9 -> D9 [1..*]; + + + enum G10 {e11, e12, e13;} + + abstract class A10 { + String s; + } + + class B10 extends A10 { + E10 e; + } + + class C10 { + B10 b10; + } + + class D10 extends A10 { + String s; + } + + class E10 { + Double d; + } + + association [1] A10 <-> E10 [1..*]; + association [1..*] B10 -> C10 [0..1]; + association [1] C10 <-> D10 [1..*]; + association [*] E10 <- C10 [0..1]; + association [1] E10 -> D10 [1..*]; + + + enum G11 {e11, e12, e13;} + + abstract class A11 { + String s; + } + + class B11 extends A11 { + E11 e; + } + + class C11 { + B11 b11; + } + + class D11 extends A11 { + String s; + } + + class E11 { + Double d; + } + + association [1] A11 <-> E11 [1..*]; + association [1..*] B11 -> C11 [0..1]; + association [1] C11 <-> D11 [1..*]; + association [*] E11 <- C11 [0..1]; + association [1] E11 -> D11 [1..*]; + + + enum G12 {e11, e12, e13;} + + abstract class A12 { + String s; + } + + class B12 extends A12 { + E12 e; + } + + class C12 { + B12 b12; + } + + class D12 extends A12 { + String s; + } + + class E12 { + Double d; + } + + association [1] A12 <-> E12 [1..*]; + association [1..*] B12 -> C12 [0..1]; + association [1] C12 <-> D12 [1..*]; + association [*] E12 <- C12 [0..1]; + association [1] E12 -> D12 [1..*]; + + + enum G13 {e11, e12, e13;} + + abstract class A13 { + String s; + } + + class B13 extends A13 { + E13 e; + } + + class C13 { + B13 b13; + } + + class D13 extends A13 { + String s; + } + + class E13 { + Double d; + } + + association [1] A13 <-> E13 [1..*]; + association [1..*] B13 -> C13 [0..1]; + association [1] C13 <-> D13 [1..*]; + association [*] E13 <- C13 [0..1]; + association [1] E13 -> D13 [1..*]; + + + enum G14 {e11, e12, e13;} + + abstract class A14 { + String s; + } + + class B14 extends A14 { + E14 e; + } + + class C14 { + B14 b14; + } + + class D14 extends A14 { + String s; + } + + class E14 { + Double d; + } + + association [1] A14 <-> E14 [1..*]; + association [1..*] B14 -> C14 [0..1]; + association [1] C14 <-> D14 [1..*]; + association [*] E14 <- C14 [0..1]; + association [1] E14 -> D14 [1..*]; + + + enum G15 {e11, e12, e13;} + + abstract class A15 { + String s; + } + + class B15 extends A15 { + E15 e; + } + + class C15 { + B15 b15; + } + + class D15 extends A15 { + String s; + } + + class E15 { + Double d; + } + + association [1] A15 <-> E15 [1..*]; + association [1..*] B15 -> C15 [0..1]; + association [1] C15 <-> D15 [1..*]; + association [*] E15 <- C15 [0..1]; + association [1] E15 -> D15 [1..*]; + + + enum G16 {e11, e12, e13;} + + abstract class A16 { + String s; + } + + class B16 extends A16 { + E16 e; + } + + class C16 { + B16 b16; + } + + class D16 extends A16 { + String s; + } + + class E16 { + Double d; + } + + association [1] A16 <-> E16 [1..*]; + association [1..*] B16 -> C16 [0..1]; + association [1] C16 <-> D16 [1..*]; + association [*] E16 <- C16 [0..1]; + association [1] E16 -> D16 [1..*]; + + + enum G17 {e11, e12, e13;} + + abstract class A17 { + String s; + } + + class B17 extends A17 { + E17 e; + } + + class C17 { + B17 b17; + } + + class D17 extends A17 { + String s; + } + + class E17 { + Double d; + } + + association [1] A17 <-> E17 [1..*]; + association [1..*] B17 -> C17 [0..1]; + association [1] C17 <-> D17 [1..*]; + association [*] E17 <- C17 [0..1]; + association [1] E17 -> D17 [1..*]; + + + enum G18 {e11, e12, e13;} + + abstract class A18 { + String s; + } + + class B18 extends A18 { + E18 e; + } + + class C18 { + B18 b18; + } + + class D18 extends A18 { + String s; + } + + class E18 { + Double d; + } + + association [1] A18 <-> E18 [1..*]; + association [1..*] B18 -> C18 [0..1]; + association [1] C18 <-> D18 [1..*]; + association [*] E18 <- C18 [0..1]; + association [1] E18 -> D18 [1..*]; + + + enum G19 {e11, e12, e13;} + + abstract class A19 { + String s; + } + + class B19 extends A19 { + E19 e; + } + + class C19 { + B19 b19; + } + + class D19 extends A19 { + String s; + } + + class E19 { + Double d; + } + + association [1] A19 <-> E19 [1..*]; + association [1..*] B19 -> C19 [0..1]; + association [1] C19 <-> D19 [1..*]; + association [*] E19 <- C19 [0..1]; + association [1] E19 -> D19 [1..*]; + + + enum G20 {e11, e12, e13;} + + abstract class A20 { + String s; + } + + class B20 extends A20 { + E20 e; + } + + class C20 { + B20 b20; + } + + class D20 extends A20 { + String s; + } + + class E20 { + Double d; + } + + association [1] A20 <-> E20 [1..*]; + association [1..*] B20 -> C20 [0..1]; + association [1] C20 <-> D20 [1..*]; + association [*] E20 <- C20 [0..1]; + association [1] E20 -> D20 [1..*]; + + + + +} diff --git a/cddiff/src/test/resources/de/monticore/cddiff/syndiff/Performance/100/CD2.cd b/cddiff/src/test/resources/de/monticore/cddiff/syndiff/Performance/100/CD2.cd new file mode 100644 index 000000000..cee820b94 --- /dev/null +++ b/cddiff/src/test/resources/de/monticore/cddiff/syndiff/Performance/100/CD2.cd @@ -0,0 +1,565 @@ + +import java.lang.*; + +classdiagram CD1 { + + enum G1 {F11, F12;} + + class B1 { + F1 e; + } + + class C1 { + B1 b1; + } + + class D1 extends C1 { + } + + class E1 { + Integer i; + } + + class F1 extends B1 { + Double d; + } + + association [1] F1 <-> E1 [1..*]; + association [*] B1 -> C1 [0..1]; + association [1] C1 <-> D1 [1]; + association [1..*] E1 <-> C1 [*]; + association [1] F1 <- D1 [1..*]; + + + enum G2 {F11, F12;} + + class B2 { + F2 e; + } + + class C2 { + B2 b2; + } + + class D2 extends C2 { + } + + class E2 { + Integer i; + } + + class F2 extends B2 { + Double d; + } + + association [1] F2 <-> E2 [1..*]; + association [*] B2 -> C2 [0..1]; + association [1] C2 <-> D2 [1]; + association [1..*] E2 <-> C2 [*]; + association [1] F2 <- D2 [1..*]; + + + enum G3 {F11, F12;} + + class B3 { + F3 e; + } + + class C3 { + B3 b3; + } + + class D3 extends C3 { + } + + class E3 { + Integer i; + } + + class F3 extends B3 { + Double d; + } + + association [1] F3 <-> E3 [1..*]; + association [*] B3 -> C3 [0..1]; + association [1] C3 <-> D3 [1]; + association [1..*] E3 <-> C3 [*]; + association [1] F3 <- D3 [1..*]; + + + enum G4 {F11, F12;} + + class B4 { + F4 e; + } + + class C4 { + B4 b4; + } + + class D4 extends C4 { + } + + class E4 { + Integer i; + } + + class F4 extends B4 { + Double d; + } + + association [1] F4 <-> E4 [1..*]; + association [*] B4 -> C4 [0..1]; + association [1] C4 <-> D4 [1]; + association [1..*] E4 <-> C4 [*]; + association [1] F4 <- D4 [1..*]; + + + enum G5 {F11, F12;} + + class B5 { + F5 e; + } + + class C5 { + B5 b5; + } + + class D5 extends C5 { + } + + class E5 { + Integer i; + } + + class F5 extends B5 { + Double d; + } + + association [1] F5 <-> E5 [1..*]; + association [*] B5 -> C5 [0..1]; + association [1] C5 <-> D5 [1]; + association [1..*] E5 <-> C5 [*]; + association [1] F5 <- D5 [1..*]; + + + enum G6 {F11, F12;} + + class B6 { + F6 e; + } + + class C6 { + B6 b6; + } + + class D6 extends C6 { + } + + class E6 { + Integer i; + } + + class F6 extends B6 { + Double d; + } + + association [1] F6 <-> E6 [1..*]; + association [*] B6 -> C6 [0..1]; + association [1] C6 <-> D6 [1]; + association [1..*] E6 <-> C6 [*]; + association [1] F6 <- D6 [1..*]; + + + enum G7 {F11, F12;} + + class B7 { + F7 e; + } + + class C7 { + B7 b7; + } + + class D7 extends C7 { + } + + class E7 { + Integer i; + } + + class F7 extends B7 { + Double d; + } + + association [1] F7 <-> E7 [1..*]; + association [*] B7 -> C7 [0..1]; + association [1] C7 <-> D7 [1]; + association [1..*] E7 <-> C7 [*]; + association [1] F7 <- D7 [1..*]; + + + enum G8 {F11, F12;} + + class B8 { + F8 e; + } + + class C8 { + B8 b8; + } + + class D8 extends C8 { + } + + class E8 { + Integer i; + } + + class F8 extends B8 { + Double d; + } + + association [1] F8 <-> E8 [1..*]; + association [*] B8 -> C8 [0..1]; + association [1] C8 <-> D8 [1]; + association [1..*] E8 <-> C8 [*]; + association [1] F8 <- D8 [1..*]; + + + enum G9 {F11, F12;} + + class B9 { + F9 e; + } + + class C9 { + B9 b9; + } + + class D9 extends C9 { + } + + class E9 { + Integer i; + } + + class F9 extends B9 { + Double d; + } + + association [1] F9 <-> E9 [1..*]; + association [*] B9 -> C9 [0..1]; + association [1] C9 <-> D9 [1]; + association [1..*] E9 <-> C9 [*]; + association [1] F9 <- D9 [1..*]; + + + enum G10 {F11, F12;} + + class B10 { + F10 e; + } + + class C10 { + B10 b10; + } + + class D10 extends C10 { + } + + class E10 { + Integer i; + } + + class F10 extends B10 { + Double d; + } + + association [1] F10 <-> E10 [1..*]; + association [*] B10 -> C10 [0..1]; + association [1] C10 <-> D10 [1]; + association [1..*] E10 <-> C10 [*]; + association [1] F10 <- D10 [1..*]; + + + enum G11 {F11, F12;} + + class B11 { + F11 e; + } + + class C11 { + B11 b11; + } + + class D11 extends C11 { + } + + class E11 { + Integer i; + } + + class F11 extends B11 { + Double d; + } + + association [1] F11 <-> E11 [1..*]; + association [*] B11 -> C11 [0..1]; + association [1] C11 <-> D11 [1]; + association [1..*] E11 <-> C11 [*]; + association [1] F11 <- D11 [1..*]; + + + enum G12 {F11, F12;} + + class B12 { + F12 e; + } + + class C12 { + B12 b12; + } + + class D12 extends C12 { + } + + class E12 { + Integer i; + } + + class F12 extends B12 { + Double d; + } + + association [1] F12 <-> E12 [1..*]; + association [*] B12 -> C12 [0..1]; + association [1] C12 <-> D12 [1]; + association [1..*] E12 <-> C12 [*]; + association [1] F12 <- D12 [1..*]; + + + enum G13 {F11, F12;} + + class B13 { + F13 e; + } + + class C13 { + B13 b13; + } + + class D13 extends C13 { + } + + class E13 { + Integer i; + } + + class F13 extends B13 { + Double d; + } + + association [1] F13 <-> E13 [1..*]; + association [*] B13 -> C13 [0..1]; + association [1] C13 <-> D13 [1]; + association [1..*] E13 <-> C13 [*]; + association [1] F13 <- D13 [1..*]; + + + enum G14 {F11, F12;} + + class B14 { + F14 e; + } + + class C14 { + B14 b14; + } + + class D14 extends C14 { + } + + class E14 { + Integer i; + } + + class F14 extends B14 { + Double d; + } + + association [1] F14 <-> E14 [1..*]; + association [*] B14 -> C14 [0..1]; + association [1] C14 <-> D14 [1]; + association [1..*] E14 <-> C14 [*]; + association [1] F14 <- D14 [1..*]; + + + enum G15 {F11, F12;} + + class B15 { + F15 e; + } + + class C15 { + B15 b15; + } + + class D15 extends C15 { + } + + class E15 { + Integer i; + } + + class F15 extends B15 { + Double d; + } + + association [1] F15 <-> E15 [1..*]; + association [*] B15 -> C15 [0..1]; + association [1] C15 <-> D15 [1]; + association [1..*] E15 <-> C15 [*]; + association [1] F15 <- D15 [1..*]; + + + enum G16 {F11, F12;} + + class B16 { + F16 e; + } + + class C16 { + B16 b16; + } + + class D16 extends C16 { + } + + class E16 { + Integer i; + } + + class F16 extends B16 { + Double d; + } + + association [1] F16 <-> E16 [1..*]; + association [*] B16 -> C16 [0..1]; + association [1] C16 <-> D16 [1]; + association [1..*] E16 <-> C16 [*]; + association [1] F16 <- D16 [1..*]; + + + enum G17 {F11, F12;} + + class B17 { + F17 e; + } + + class C17 { + B17 b17; + } + + class D17 extends C17 { + } + + class E17 { + Integer i; + } + + class F17 extends B17 { + Double d; + } + + association [1] F17 <-> E17 [1..*]; + association [*] B17 -> C17 [0..1]; + association [1] C17 <-> D17 [1]; + association [1..*] E17 <-> C17 [*]; + association [1] F17 <- D17 [1..*]; + + + enum G18 {F11, F12;} + + class B18 { + F18 e; + } + + class C18 { + B18 b18; + } + + class D18 extends C18 { + } + + class E18 { + Integer i; + } + + class F18 extends B18 { + Double d; + } + + association [1] F18 <-> E18 [1..*]; + association [*] B18 -> C18 [0..1]; + association [1] C18 <-> D18 [1]; + association [1..*] E18 <-> C18 [*]; + association [1] F18 <- D18 [1..*]; + + + enum G19 {F11, F12;} + + class B19 { + F19 e; + } + + class C19 { + B19 b19; + } + + class D19 extends C19 { + } + + class E19 { + Integer i; + } + + class F19 extends B19 { + Double d; + } + + association [1] F19 <-> E19 [1..*]; + association [*] B19 -> C19 [0..1]; + association [1] C19 <-> D19 [1]; + association [1..*] E19 <-> C19 [*]; + association [1] F19 <- D19 [1..*]; + + + enum G20 {F11, F12;} + + class B20 { + F20 e; + } + + class C20 { + B20 b20; + } + + class D20 extends C20 { + } + + class E20 { + Integer i; + } + + class F20 extends B20 { + Double d; + } + + association [1] F20 <-> E20 [1..*]; + association [*] B20 -> C20 [0..1]; + association [1] C20 <-> D20 [1]; + association [1..*] E20 <-> C20 [*]; + association [1] F20 <- D20 [1..*]; + +} diff --git a/cddiff/src/test/resources/de/monticore/cddiff/syndiff/Performance/500/CD1.cd b/cddiff/src/test/resources/de/monticore/cddiff/syndiff/Performance/500/CD1.cd new file mode 100644 index 000000000..a71bd52bd --- /dev/null +++ b/cddiff/src/test/resources/de/monticore/cddiff/syndiff/Performance/500/CD1.cd @@ -0,0 +1,2905 @@ + +import java.lang.*; + +classdiagram CD1 { + + enum G1 {e11, e12, e13;} + + abstract class A1 { + String s; + } + + class B1 extends A1 { + E1 e; + } + + class C1 { + B1 b1; + } + + class D1 extends A1 { + String s; + } + + class E1 { + Double d; + } + + association [1] A1 <-> E1 [1..*]; + association [1..*] B1 -> C1 [0..1]; + association [1] C1 <-> D1 [1..*]; + association [*] E1 <- C1 [0..1]; + association [1] E1 -> D1 [1..*]; + + + enum G2 {e11, e12, e13;} + + abstract class A2 { + String s; + } + + class B2 extends A2 { + E2 e; + } + + class C2 { + B2 b2; + } + + class D2 extends A2 { + String s; + } + + class E2 { + Double d; + } + + association [1] A2 <-> E2 [1..*]; + association [1..*] B2 -> C2 [0..1]; + association [1] C2 <-> D2 [1..*]; + association [*] E2 <- C2 [0..1]; + association [1] E2 -> D2 [1..*]; + + + enum G3 {e11, e12, e13;} + + abstract class A3 { + String s; + } + + class B3 extends A3 { + E3 e; + } + + class C3 { + B3 b3; + } + + class D3 extends A3 { + String s; + } + + class E3 { + Double d; + } + + association [1] A3 <-> E3 [1..*]; + association [1..*] B3 -> C3 [0..1]; + association [1] C3 <-> D3 [1..*]; + association [*] E3 <- C3 [0..1]; + association [1] E3 -> D3 [1..*]; + + + enum G4 {e11, e12, e13;} + + abstract class A4 { + String s; + } + + class B4 extends A4 { + E4 e; + } + + class C4 { + B4 b4; + } + + class D4 extends A4 { + String s; + } + + class E4 { + Double d; + } + + association [1] A4 <-> E4 [1..*]; + association [1..*] B4 -> C4 [0..1]; + association [1] C4 <-> D4 [1..*]; + association [*] E4 <- C4 [0..1]; + association [1] E4 -> D4 [1..*]; + + + enum G5 {e11, e12, e13;} + + abstract class A5 { + String s; + } + + class B5 extends A5 { + E5 e; + } + + class C5 { + B5 b5; + } + + class D5 extends A5 { + String s; + } + + class E5 { + Double d; + } + + association [1] A5 <-> E5 [1..*]; + association [1..*] B5 -> C5 [0..1]; + association [1] C5 <-> D5 [1..*]; + association [*] E5 <- C5 [0..1]; + association [1] E5 -> D5 [1..*]; + + + enum G6 {e11, e12, e13;} + + abstract class A6 { + String s; + } + + class B6 extends A6 { + E6 e; + } + + class C6 { + B6 b6; + } + + class D6 extends A6 { + String s; + } + + class E6 { + Double d; + } + + association [1] A6 <-> E6 [1..*]; + association [1..*] B6 -> C6 [0..1]; + association [1] C6 <-> D6 [1..*]; + association [*] E6 <- C6 [0..1]; + association [1] E6 -> D6 [1..*]; + + + enum G7 {e11, e12, e13;} + + abstract class A7 { + String s; + } + + class B7 extends A7 { + E7 e; + } + + class C7 { + B7 b7; + } + + class D7 extends A7 { + String s; + } + + class E7 { + Double d; + } + + association [1] A7 <-> E7 [1..*]; + association [1..*] B7 -> C7 [0..1]; + association [1] C7 <-> D7 [1..*]; + association [*] E7 <- C7 [0..1]; + association [1] E7 -> D7 [1..*]; + + + enum G8 {e11, e12, e13;} + + abstract class A8 { + String s; + } + + class B8 extends A8 { + E8 e; + } + + class C8 { + B8 b8; + } + + class D8 extends A8 { + String s; + } + + class E8 { + Double d; + } + + association [1] A8 <-> E8 [1..*]; + association [1..*] B8 -> C8 [0..1]; + association [1] C8 <-> D8 [1..*]; + association [*] E8 <- C8 [0..1]; + association [1] E8 -> D8 [1..*]; + + + enum G9 {e11, e12, e13;} + + abstract class A9 { + String s; + } + + class B9 extends A9 { + E9 e; + } + + class C9 { + B9 b9; + } + + class D9 extends A9 { + String s; + } + + class E9 { + Double d; + } + + association [1] A9 <-> E9 [1..*]; + association [1..*] B9 -> C9 [0..1]; + association [1] C9 <-> D9 [1..*]; + association [*] E9 <- C9 [0..1]; + association [1] E9 -> D9 [1..*]; + + + enum G10 {e11, e12, e13;} + + abstract class A10 { + String s; + } + + class B10 extends A10 { + E10 e; + } + + class C10 { + B10 b10; + } + + class D10 extends A10 { + String s; + } + + class E10 { + Double d; + } + + association [1] A10 <-> E10 [1..*]; + association [1..*] B10 -> C10 [0..1]; + association [1] C10 <-> D10 [1..*]; + association [*] E10 <- C10 [0..1]; + association [1] E10 -> D10 [1..*]; + + + enum G11 {e11, e12, e13;} + + abstract class A11 { + String s; + } + + class B11 extends A11 { + E11 e; + } + + class C11 { + B11 b11; + } + + class D11 extends A11 { + String s; + } + + class E11 { + Double d; + } + + association [1] A11 <-> E11 [1..*]; + association [1..*] B11 -> C11 [0..1]; + association [1] C11 <-> D11 [1..*]; + association [*] E11 <- C11 [0..1]; + association [1] E11 -> D11 [1..*]; + + + enum G12 {e11, e12, e13;} + + abstract class A12 { + String s; + } + + class B12 extends A12 { + E12 e; + } + + class C12 { + B12 b12; + } + + class D12 extends A12 { + String s; + } + + class E12 { + Double d; + } + + association [1] A12 <-> E12 [1..*]; + association [1..*] B12 -> C12 [0..1]; + association [1] C12 <-> D12 [1..*]; + association [*] E12 <- C12 [0..1]; + association [1] E12 -> D12 [1..*]; + + + enum G13 {e11, e12, e13;} + + abstract class A13 { + String s; + } + + class B13 extends A13 { + E13 e; + } + + class C13 { + B13 b13; + } + + class D13 extends A13 { + String s; + } + + class E13 { + Double d; + } + + association [1] A13 <-> E13 [1..*]; + association [1..*] B13 -> C13 [0..1]; + association [1] C13 <-> D13 [1..*]; + association [*] E13 <- C13 [0..1]; + association [1] E13 -> D13 [1..*]; + + + enum G14 {e11, e12, e13;} + + abstract class A14 { + String s; + } + + class B14 extends A14 { + E14 e; + } + + class C14 { + B14 b14; + } + + class D14 extends A14 { + String s; + } + + class E14 { + Double d; + } + + association [1] A14 <-> E14 [1..*]; + association [1..*] B14 -> C14 [0..1]; + association [1] C14 <-> D14 [1..*]; + association [*] E14 <- C14 [0..1]; + association [1] E14 -> D14 [1..*]; + + + enum G15 {e11, e12, e13;} + + abstract class A15 { + String s; + } + + class B15 extends A15 { + E15 e; + } + + class C15 { + B15 b15; + } + + class D15 extends A15 { + String s; + } + + class E15 { + Double d; + } + + association [1] A15 <-> E15 [1..*]; + association [1..*] B15 -> C15 [0..1]; + association [1] C15 <-> D15 [1..*]; + association [*] E15 <- C15 [0..1]; + association [1] E15 -> D15 [1..*]; + + + enum G16 {e11, e12, e13;} + + abstract class A16 { + String s; + } + + class B16 extends A16 { + E16 e; + } + + class C16 { + B16 b16; + } + + class D16 extends A16 { + String s; + } + + class E16 { + Double d; + } + + association [1] A16 <-> E16 [1..*]; + association [1..*] B16 -> C16 [0..1]; + association [1] C16 <-> D16 [1..*]; + association [*] E16 <- C16 [0..1]; + association [1] E16 -> D16 [1..*]; + + + enum G17 {e11, e12, e13;} + + abstract class A17 { + String s; + } + + class B17 extends A17 { + E17 e; + } + + class C17 { + B17 b17; + } + + class D17 extends A17 { + String s; + } + + class E17 { + Double d; + } + + association [1] A17 <-> E17 [1..*]; + association [1..*] B17 -> C17 [0..1]; + association [1] C17 <-> D17 [1..*]; + association [*] E17 <- C17 [0..1]; + association [1] E17 -> D17 [1..*]; + + + enum G18 {e11, e12, e13;} + + abstract class A18 { + String s; + } + + class B18 extends A18 { + E18 e; + } + + class C18 { + B18 b18; + } + + class D18 extends A18 { + String s; + } + + class E18 { + Double d; + } + + association [1] A18 <-> E18 [1..*]; + association [1..*] B18 -> C18 [0..1]; + association [1] C18 <-> D18 [1..*]; + association [*] E18 <- C18 [0..1]; + association [1] E18 -> D18 [1..*]; + + + enum G19 {e11, e12, e13;} + + abstract class A19 { + String s; + } + + class B19 extends A19 { + E19 e; + } + + class C19 { + B19 b19; + } + + class D19 extends A19 { + String s; + } + + class E19 { + Double d; + } + + association [1] A19 <-> E19 [1..*]; + association [1..*] B19 -> C19 [0..1]; + association [1] C19 <-> D19 [1..*]; + association [*] E19 <- C19 [0..1]; + association [1] E19 -> D19 [1..*]; + + + enum G20 {e11, e12, e13;} + + abstract class A20 { + String s; + } + + class B20 extends A20 { + E20 e; + } + + class C20 { + B20 b20; + } + + class D20 extends A20 { + String s; + } + + class E20 { + Double d; + } + + association [1] A20 <-> E20 [1..*]; + association [1..*] B20 -> C20 [0..1]; + association [1] C20 <-> D20 [1..*]; + association [*] E20 <- C20 [0..1]; + association [1] E20 -> D20 [1..*]; + + + enum G21 {e11, e12, e13;} + + abstract class A21 { + String s; + } + + class B21 extends A21 { + E21 e; + } + + class C21 { + B21 b21; + } + + class D21 extends A21 { + String s; + } + + class E21 { + Double d; + } + + association [1] A21 <-> E21 [1..*]; + association [1..*] B21 -> C21 [0..1]; + association [1] C21 <-> D21 [1..*]; + association [*] E21 <- C21 [0..1]; + association [1] E21 -> D21 [1..*]; + + + enum G22 {e11, e12, e13;} + + abstract class A22 { + String s; + } + + class B22 extends A22 { + E22 e; + } + + class C22 { + B22 b22; + } + + class D22 extends A22 { + String s; + } + + class E22 { + Double d; + } + + association [1] A22 <-> E22 [1..*]; + association [1..*] B22 -> C22 [0..1]; + association [1] C22 <-> D22 [1..*]; + association [*] E22 <- C22 [0..1]; + association [1] E22 -> D22 [1..*]; + + + enum G23 {e11, e12, e13;} + + abstract class A23 { + String s; + } + + class B23 extends A23 { + E23 e; + } + + class C23 { + B23 b23; + } + + class D23 extends A23 { + String s; + } + + class E23 { + Double d; + } + + association [1] A23 <-> E23 [1..*]; + association [1..*] B23 -> C23 [0..1]; + association [1] C23 <-> D23 [1..*]; + association [*] E23 <- C23 [0..1]; + association [1] E23 -> D23 [1..*]; + + + enum G24 {e11, e12, e13;} + + abstract class A24 { + String s; + } + + class B24 extends A24 { + E24 e; + } + + class C24 { + B24 b24; + } + + class D24 extends A24 { + String s; + } + + class E24 { + Double d; + } + + association [1] A24 <-> E24 [1..*]; + association [1..*] B24 -> C24 [0..1]; + association [1] C24 <-> D24 [1..*]; + association [*] E24 <- C24 [0..1]; + association [1] E24 -> D24 [1..*]; + + + enum G25 {e11, e12, e13;} + + abstract class A25 { + String s; + } + + class B25 extends A25 { + E25 e; + } + + class C25 { + B25 b25; + } + + class D25 extends A25 { + String s; + } + + class E25 { + Double d; + } + + association [1] A25 <-> E25 [1..*]; + association [1..*] B25 -> C25 [0..1]; + association [1] C25 <-> D25 [1..*]; + association [*] E25 <- C25 [0..1]; + association [1] E25 -> D25 [1..*]; + + + enum G26 {e11, e12, e13;} + + abstract class A26 { + String s; + } + + class B26 extends A26 { + E26 e; + } + + class C26 { + B26 b26; + } + + class D26 extends A26 { + String s; + } + + class E26 { + Double d; + } + + association [1] A26 <-> E26 [1..*]; + association [1..*] B26 -> C26 [0..1]; + association [1] C26 <-> D26 [1..*]; + association [*] E26 <- C26 [0..1]; + association [1] E26 -> D26 [1..*]; + + + enum G27 {e11, e12, e13;} + + abstract class A27 { + String s; + } + + class B27 extends A27 { + E27 e; + } + + class C27 { + B27 b27; + } + + class D27 extends A27 { + String s; + } + + class E27 { + Double d; + } + + association [1] A27 <-> E27 [1..*]; + association [1..*] B27 -> C27 [0..1]; + association [1] C27 <-> D27 [1..*]; + association [*] E27 <- C27 [0..1]; + association [1] E27 -> D27 [1..*]; + + + enum G28 {e11, e12, e13;} + + abstract class A28 { + String s; + } + + class B28 extends A28 { + E28 e; + } + + class C28 { + B28 b28; + } + + class D28 extends A28 { + String s; + } + + class E28 { + Double d; + } + + association [1] A28 <-> E28 [1..*]; + association [1..*] B28 -> C28 [0..1]; + association [1] C28 <-> D28 [1..*]; + association [*] E28 <- C28 [0..1]; + association [1] E28 -> D28 [1..*]; + + + enum G29 {e11, e12, e13;} + + abstract class A29 { + String s; + } + + class B29 extends A29 { + E29 e; + } + + class C29 { + B29 b29; + } + + class D29 extends A29 { + String s; + } + + class E29 { + Double d; + } + + association [1] A29 <-> E29 [1..*]; + association [1..*] B29 -> C29 [0..1]; + association [1] C29 <-> D29 [1..*]; + association [*] E29 <- C29 [0..1]; + association [1] E29 -> D29 [1..*]; + + + enum G30 {e11, e12, e13;} + + abstract class A30 { + String s; + } + + class B30 extends A30 { + E30 e; + } + + class C30 { + B30 b30; + } + + class D30 extends A30 { + String s; + } + + class E30 { + Double d; + } + + association [1] A30 <-> E30 [1..*]; + association [1..*] B30 -> C30 [0..1]; + association [1] C30 <-> D30 [1..*]; + association [*] E30 <- C30 [0..1]; + association [1] E30 -> D30 [1..*]; + + + enum G31 {e11, e12, e13;} + + abstract class A31 { + String s; + } + + class B31 extends A31 { + E31 e; + } + + class C31 { + B31 b31; + } + + class D31 extends A31 { + String s; + } + + class E31 { + Double d; + } + + association [1] A31 <-> E31 [1..*]; + association [1..*] B31 -> C31 [0..1]; + association [1] C31 <-> D31 [1..*]; + association [*] E31 <- C31 [0..1]; + association [1] E31 -> D31 [1..*]; + + + enum G32 {e11, e12, e13;} + + abstract class A32 { + String s; + } + + class B32 extends A32 { + E32 e; + } + + class C32 { + B32 b32; + } + + class D32 extends A32 { + String s; + } + + class E32 { + Double d; + } + + association [1] A32 <-> E32 [1..*]; + association [1..*] B32 -> C32 [0..1]; + association [1] C32 <-> D32 [1..*]; + association [*] E32 <- C32 [0..1]; + association [1] E32 -> D32 [1..*]; + + + enum G33 {e11, e12, e13;} + + abstract class A33 { + String s; + } + + class B33 extends A33 { + E33 e; + } + + class C33 { + B33 b33; + } + + class D33 extends A33 { + String s; + } + + class E33 { + Double d; + } + + association [1] A33 <-> E33 [1..*]; + association [1..*] B33 -> C33 [0..1]; + association [1] C33 <-> D33 [1..*]; + association [*] E33 <- C33 [0..1]; + association [1] E33 -> D33 [1..*]; + + + enum G34 {e11, e12, e13;} + + abstract class A34 { + String s; + } + + class B34 extends A34 { + E34 e; + } + + class C34 { + B34 b34; + } + + class D34 extends A34 { + String s; + } + + class E34 { + Double d; + } + + association [1] A34 <-> E34 [1..*]; + association [1..*] B34 -> C34 [0..1]; + association [1] C34 <-> D34 [1..*]; + association [*] E34 <- C34 [0..1]; + association [1] E34 -> D34 [1..*]; + + + enum G35 {e11, e12, e13;} + + abstract class A35 { + String s; + } + + class B35 extends A35 { + E35 e; + } + + class C35 { + B35 b35; + } + + class D35 extends A35 { + String s; + } + + class E35 { + Double d; + } + + association [1] A35 <-> E35 [1..*]; + association [1..*] B35 -> C35 [0..1]; + association [1] C35 <-> D35 [1..*]; + association [*] E35 <- C35 [0..1]; + association [1] E35 -> D35 [1..*]; + + + enum G36 {e11, e12, e13;} + + abstract class A36 { + String s; + } + + class B36 extends A36 { + E36 e; + } + + class C36 { + B36 b36; + } + + class D36 extends A36 { + String s; + } + + class E36 { + Double d; + } + + association [1] A36 <-> E36 [1..*]; + association [1..*] B36 -> C36 [0..1]; + association [1] C36 <-> D36 [1..*]; + association [*] E36 <- C36 [0..1]; + association [1] E36 -> D36 [1..*]; + + + enum G37 {e11, e12, e13;} + + abstract class A37 { + String s; + } + + class B37 extends A37 { + E37 e; + } + + class C37 { + B37 b37; + } + + class D37 extends A37 { + String s; + } + + class E37 { + Double d; + } + + association [1] A37 <-> E37 [1..*]; + association [1..*] B37 -> C37 [0..1]; + association [1] C37 <-> D37 [1..*]; + association [*] E37 <- C37 [0..1]; + association [1] E37 -> D37 [1..*]; + + + enum G38 {e11, e12, e13;} + + abstract class A38 { + String s; + } + + class B38 extends A38 { + E38 e; + } + + class C38 { + B38 b38; + } + + class D38 extends A38 { + String s; + } + + class E38 { + Double d; + } + + association [1] A38 <-> E38 [1..*]; + association [1..*] B38 -> C38 [0..1]; + association [1] C38 <-> D38 [1..*]; + association [*] E38 <- C38 [0..1]; + association [1] E38 -> D38 [1..*]; + + + enum G39 {e11, e12, e13;} + + abstract class A39 { + String s; + } + + class B39 extends A39 { + E39 e; + } + + class C39 { + B39 b39; + } + + class D39 extends A39 { + String s; + } + + class E39 { + Double d; + } + + association [1] A39 <-> E39 [1..*]; + association [1..*] B39 -> C39 [0..1]; + association [1] C39 <-> D39 [1..*]; + association [*] E39 <- C39 [0..1]; + association [1] E39 -> D39 [1..*]; + + + enum G40 {e11, e12, e13;} + + abstract class A40 { + String s; + } + + class B40 extends A40 { + E40 e; + } + + class C40 { + B40 b40; + } + + class D40 extends A40 { + String s; + } + + class E40 { + Double d; + } + + association [1] A40 <-> E40 [1..*]; + association [1..*] B40 -> C40 [0..1]; + association [1] C40 <-> D40 [1..*]; + association [*] E40 <- C40 [0..1]; + association [1] E40 -> D40 [1..*]; + + + enum G41 {e11, e12, e13;} + + abstract class A41 { + String s; + } + + class B41 extends A41 { + E41 e; + } + + class C41 { + B41 b41; + } + + class D41 extends A41 { + String s; + } + + class E41 { + Double d; + } + + association [1] A41 <-> E41 [1..*]; + association [1..*] B41 -> C41 [0..1]; + association [1] C41 <-> D41 [1..*]; + association [*] E41 <- C41 [0..1]; + association [1] E41 -> D41 [1..*]; + + + enum G42 {e11, e12, e13;} + + abstract class A42 { + String s; + } + + class B42 extends A42 { + E42 e; + } + + class C42 { + B42 b42; + } + + class D42 extends A42 { + String s; + } + + class E42 { + Double d; + } + + association [1] A42 <-> E42 [1..*]; + association [1..*] B42 -> C42 [0..1]; + association [1] C42 <-> D42 [1..*]; + association [*] E42 <- C42 [0..1]; + association [1] E42 -> D42 [1..*]; + + + enum G43 {e11, e12, e13;} + + abstract class A43 { + String s; + } + + class B43 extends A43 { + E43 e; + } + + class C43 { + B43 b43; + } + + class D43 extends A43 { + String s; + } + + class E43 { + Double d; + } + + association [1] A43 <-> E43 [1..*]; + association [1..*] B43 -> C43 [0..1]; + association [1] C43 <-> D43 [1..*]; + association [*] E43 <- C43 [0..1]; + association [1] E43 -> D43 [1..*]; + + + enum G44 {e11, e12, e13;} + + abstract class A44 { + String s; + } + + class B44 extends A44 { + E44 e; + } + + class C44 { + B44 b44; + } + + class D44 extends A44 { + String s; + } + + class E44 { + Double d; + } + + association [1] A44 <-> E44 [1..*]; + association [1..*] B44 -> C44 [0..1]; + association [1] C44 <-> D44 [1..*]; + association [*] E44 <- C44 [0..1]; + association [1] E44 -> D44 [1..*]; + + + enum G45 {e11, e12, e13;} + + abstract class A45 { + String s; + } + + class B45 extends A45 { + E45 e; + } + + class C45 { + B45 b45; + } + + class D45 extends A45 { + String s; + } + + class E45 { + Double d; + } + + association [1] A45 <-> E45 [1..*]; + association [1..*] B45 -> C45 [0..1]; + association [1] C45 <-> D45 [1..*]; + association [*] E45 <- C45 [0..1]; + association [1] E45 -> D45 [1..*]; + + + enum G46 {e11, e12, e13;} + + abstract class A46 { + String s; + } + + class B46 extends A46 { + E46 e; + } + + class C46 { + B46 b46; + } + + class D46 extends A46 { + String s; + } + + class E46 { + Double d; + } + + association [1] A46 <-> E46 [1..*]; + association [1..*] B46 -> C46 [0..1]; + association [1] C46 <-> D46 [1..*]; + association [*] E46 <- C46 [0..1]; + association [1] E46 -> D46 [1..*]; + + + enum G47 {e11, e12, e13;} + + abstract class A47 { + String s; + } + + class B47 extends A47 { + E47 e; + } + + class C47 { + B47 b47; + } + + class D47 extends A47 { + String s; + } + + class E47 { + Double d; + } + + association [1] A47 <-> E47 [1..*]; + association [1..*] B47 -> C47 [0..1]; + association [1] C47 <-> D47 [1..*]; + association [*] E47 <- C47 [0..1]; + association [1] E47 -> D47 [1..*]; + + + enum G48 {e11, e12, e13;} + + abstract class A48 { + String s; + } + + class B48 extends A48 { + E48 e; + } + + class C48 { + B48 b48; + } + + class D48 extends A48 { + String s; + } + + class E48 { + Double d; + } + + association [1] A48 <-> E48 [1..*]; + association [1..*] B48 -> C48 [0..1]; + association [1] C48 <-> D48 [1..*]; + association [*] E48 <- C48 [0..1]; + association [1] E48 -> D48 [1..*]; + + + enum G49 {e11, e12, e13;} + + abstract class A49 { + String s; + } + + class B49 extends A49 { + E49 e; + } + + class C49 { + B49 b49; + } + + class D49 extends A49 { + String s; + } + + class E49 { + Double d; + } + + association [1] A49 <-> E49 [1..*]; + association [1..*] B49 -> C49 [0..1]; + association [1] C49 <-> D49 [1..*]; + association [*] E49 <- C49 [0..1]; + association [1] E49 -> D49 [1..*]; + + + enum G50 {e11, e12, e13;} + + abstract class A50 { + String s; + } + + class B50 extends A50 { + E50 e; + } + + class C50 { + B50 b50; + } + + class D50 extends A50 { + String s; + } + + class E50 { + Double d; + } + + association [1] A50 <-> E50 [1..*]; + association [1..*] B50 -> C50 [0..1]; + association [1] C50 <-> D50 [1..*]; + association [*] E50 <- C50 [0..1]; + association [1] E50 -> D50 [1..*]; + + + enum G51 {e11, e12, e13;} + + abstract class A51 { + String s; + } + + class B51 extends A51 { + E51 e; + } + + class C51 { + B51 b51; + } + + class D51 extends A51 { + String s; + } + + class E51 { + Double d; + } + + association [1] A51 <-> E51 [1..*]; + association [1..*] B51 -> C51 [0..1]; + association [1] C51 <-> D51 [1..*]; + association [*] E51 <- C51 [0..1]; + association [1] E51 -> D51 [1..*]; + + + enum G52 {e11, e12, e13;} + + abstract class A52 { + String s; + } + + class B52 extends A52 { + E52 e; + } + + class C52 { + B52 b52; + } + + class D52 extends A52 { + String s; + } + + class E52 { + Double d; + } + + association [1] A52 <-> E52 [1..*]; + association [1..*] B52 -> C52 [0..1]; + association [1] C52 <-> D52 [1..*]; + association [*] E52 <- C52 [0..1]; + association [1] E52 -> D52 [1..*]; + + + enum G53 {e11, e12, e13;} + + abstract class A53 { + String s; + } + + class B53 extends A53 { + E53 e; + } + + class C53 { + B53 b53; + } + + class D53 extends A53 { + String s; + } + + class E53 { + Double d; + } + + association [1] A53 <-> E53 [1..*]; + association [1..*] B53 -> C53 [0..1]; + association [1] C53 <-> D53 [1..*]; + association [*] E53 <- C53 [0..1]; + association [1] E53 -> D53 [1..*]; + + + enum G54 {e11, e12, e13;} + + abstract class A54 { + String s; + } + + class B54 extends A54 { + E54 e; + } + + class C54 { + B54 b54; + } + + class D54 extends A54 { + String s; + } + + class E54 { + Double d; + } + + association [1] A54 <-> E54 [1..*]; + association [1..*] B54 -> C54 [0..1]; + association [1] C54 <-> D54 [1..*]; + association [*] E54 <- C54 [0..1]; + association [1] E54 -> D54 [1..*]; + + + enum G55 {e11, e12, e13;} + + abstract class A55 { + String s; + } + + class B55 extends A55 { + E55 e; + } + + class C55 { + B55 b55; + } + + class D55 extends A55 { + String s; + } + + class E55 { + Double d; + } + + association [1] A55 <-> E55 [1..*]; + association [1..*] B55 -> C55 [0..1]; + association [1] C55 <-> D55 [1..*]; + association [*] E55 <- C55 [0..1]; + association [1] E55 -> D55 [1..*]; + + + enum G56 {e11, e12, e13;} + + abstract class A56 { + String s; + } + + class B56 extends A56 { + E56 e; + } + + class C56 { + B56 b56; + } + + class D56 extends A56 { + String s; + } + + class E56 { + Double d; + } + + association [1] A56 <-> E56 [1..*]; + association [1..*] B56 -> C56 [0..1]; + association [1] C56 <-> D56 [1..*]; + association [*] E56 <- C56 [0..1]; + association [1] E56 -> D56 [1..*]; + + + enum G57 {e11, e12, e13;} + + abstract class A57 { + String s; + } + + class B57 extends A57 { + E57 e; + } + + class C57 { + B57 b57; + } + + class D57 extends A57 { + String s; + } + + class E57 { + Double d; + } + + association [1] A57 <-> E57 [1..*]; + association [1..*] B57 -> C57 [0..1]; + association [1] C57 <-> D57 [1..*]; + association [*] E57 <- C57 [0..1]; + association [1] E57 -> D57 [1..*]; + + + enum G58 {e11, e12, e13;} + + abstract class A58 { + String s; + } + + class B58 extends A58 { + E58 e; + } + + class C58 { + B58 b58; + } + + class D58 extends A58 { + String s; + } + + class E58 { + Double d; + } + + association [1] A58 <-> E58 [1..*]; + association [1..*] B58 -> C58 [0..1]; + association [1] C58 <-> D58 [1..*]; + association [*] E58 <- C58 [0..1]; + association [1] E58 -> D58 [1..*]; + + + enum G59 {e11, e12, e13;} + + abstract class A59 { + String s; + } + + class B59 extends A59 { + E59 e; + } + + class C59 { + B59 b59; + } + + class D59 extends A59 { + String s; + } + + class E59 { + Double d; + } + + association [1] A59 <-> E59 [1..*]; + association [1..*] B59 -> C59 [0..1]; + association [1] C59 <-> D59 [1..*]; + association [*] E59 <- C59 [0..1]; + association [1] E59 -> D59 [1..*]; + + + enum G60 {e11, e12, e13;} + + abstract class A60 { + String s; + } + + class B60 extends A60 { + E60 e; + } + + class C60 { + B60 b60; + } + + class D60 extends A60 { + String s; + } + + class E60 { + Double d; + } + + association [1] A60 <-> E60 [1..*]; + association [1..*] B60 -> C60 [0..1]; + association [1] C60 <-> D60 [1..*]; + association [*] E60 <- C60 [0..1]; + association [1] E60 -> D60 [1..*]; + + + enum G61 {e11, e12, e13;} + + abstract class A61 { + String s; + } + + class B61 extends A61 { + E61 e; + } + + class C61 { + B61 b61; + } + + class D61 extends A61 { + String s; + } + + class E61 { + Double d; + } + + association [1] A61 <-> E61 [1..*]; + association [1..*] B61 -> C61 [0..1]; + association [1] C61 <-> D61 [1..*]; + association [*] E61 <- C61 [0..1]; + association [1] E61 -> D61 [1..*]; + + + enum G62 {e11, e12, e13;} + + abstract class A62 { + String s; + } + + class B62 extends A62 { + E62 e; + } + + class C62 { + B62 b62; + } + + class D62 extends A62 { + String s; + } + + class E62 { + Double d; + } + + association [1] A62 <-> E62 [1..*]; + association [1..*] B62 -> C62 [0..1]; + association [1] C62 <-> D62 [1..*]; + association [*] E62 <- C62 [0..1]; + association [1] E62 -> D62 [1..*]; + + + enum G63 {e11, e12, e13;} + + abstract class A63 { + String s; + } + + class B63 extends A63 { + E63 e; + } + + class C63 { + B63 b63; + } + + class D63 extends A63 { + String s; + } + + class E63 { + Double d; + } + + association [1] A63 <-> E63 [1..*]; + association [1..*] B63 -> C63 [0..1]; + association [1] C63 <-> D63 [1..*]; + association [*] E63 <- C63 [0..1]; + association [1] E63 -> D63 [1..*]; + + + enum G64 {e11, e12, e13;} + + abstract class A64 { + String s; + } + + class B64 extends A64 { + E64 e; + } + + class C64 { + B64 b64; + } + + class D64 extends A64 { + String s; + } + + class E64 { + Double d; + } + + association [1] A64 <-> E64 [1..*]; + association [1..*] B64 -> C64 [0..1]; + association [1] C64 <-> D64 [1..*]; + association [*] E64 <- C64 [0..1]; + association [1] E64 -> D64 [1..*]; + + + enum G65 {e11, e12, e13;} + + abstract class A65 { + String s; + } + + class B65 extends A65 { + E65 e; + } + + class C65 { + B65 b65; + } + + class D65 extends A65 { + String s; + } + + class E65 { + Double d; + } + + association [1] A65 <-> E65 [1..*]; + association [1..*] B65 -> C65 [0..1]; + association [1] C65 <-> D65 [1..*]; + association [*] E65 <- C65 [0..1]; + association [1] E65 -> D65 [1..*]; + + + enum G66 {e11, e12, e13;} + + abstract class A66 { + String s; + } + + class B66 extends A66 { + E66 e; + } + + class C66 { + B66 b66; + } + + class D66 extends A66 { + String s; + } + + class E66 { + Double d; + } + + association [1] A66 <-> E66 [1..*]; + association [1..*] B66 -> C66 [0..1]; + association [1] C66 <-> D66 [1..*]; + association [*] E66 <- C66 [0..1]; + association [1] E66 -> D66 [1..*]; + + + enum G67 {e11, e12, e13;} + + abstract class A67 { + String s; + } + + class B67 extends A67 { + E67 e; + } + + class C67 { + B67 b67; + } + + class D67 extends A67 { + String s; + } + + class E67 { + Double d; + } + + association [1] A67 <-> E67 [1..*]; + association [1..*] B67 -> C67 [0..1]; + association [1] C67 <-> D67 [1..*]; + association [*] E67 <- C67 [0..1]; + association [1] E67 -> D67 [1..*]; + + + enum G68 {e11, e12, e13;} + + abstract class A68 { + String s; + } + + class B68 extends A68 { + E68 e; + } + + class C68 { + B68 b68; + } + + class D68 extends A68 { + String s; + } + + class E68 { + Double d; + } + + association [1] A68 <-> E68 [1..*]; + association [1..*] B68 -> C68 [0..1]; + association [1] C68 <-> D68 [1..*]; + association [*] E68 <- C68 [0..1]; + association [1] E68 -> D68 [1..*]; + + + enum G69 {e11, e12, e13;} + + abstract class A69 { + String s; + } + + class B69 extends A69 { + E69 e; + } + + class C69 { + B69 b69; + } + + class D69 extends A69 { + String s; + } + + class E69 { + Double d; + } + + association [1] A69 <-> E69 [1..*]; + association [1..*] B69 -> C69 [0..1]; + association [1] C69 <-> D69 [1..*]; + association [*] E69 <- C69 [0..1]; + association [1] E69 -> D69 [1..*]; + + + enum G70 {e11, e12, e13;} + + abstract class A70 { + String s; + } + + class B70 extends A70 { + E70 e; + } + + class C70 { + B70 b70; + } + + class D70 extends A70 { + String s; + } + + class E70 { + Double d; + } + + association [1] A70 <-> E70 [1..*]; + association [1..*] B70 -> C70 [0..1]; + association [1] C70 <-> D70 [1..*]; + association [*] E70 <- C70 [0..1]; + association [1] E70 -> D70 [1..*]; + + + enum G71 {e11, e12, e13;} + + abstract class A71 { + String s; + } + + class B71 extends A71 { + E71 e; + } + + class C71 { + B71 b71; + } + + class D71 extends A71 { + String s; + } + + class E71 { + Double d; + } + + association [1] A71 <-> E71 [1..*]; + association [1..*] B71 -> C71 [0..1]; + association [1] C71 <-> D71 [1..*]; + association [*] E71 <- C71 [0..1]; + association [1] E71 -> D71 [1..*]; + + + enum G72 {e11, e12, e13;} + + abstract class A72 { + String s; + } + + class B72 extends A72 { + E72 e; + } + + class C72 { + B72 b72; + } + + class D72 extends A72 { + String s; + } + + class E72 { + Double d; + } + + association [1] A72 <-> E72 [1..*]; + association [1..*] B72 -> C72 [0..1]; + association [1] C72 <-> D72 [1..*]; + association [*] E72 <- C72 [0..1]; + association [1] E72 -> D72 [1..*]; + + + enum G73 {e11, e12, e13;} + + abstract class A73 { + String s; + } + + class B73 extends A73 { + E73 e; + } + + class C73 { + B73 b73; + } + + class D73 extends A73 { + String s; + } + + class E73 { + Double d; + } + + association [1] A73 <-> E73 [1..*]; + association [1..*] B73 -> C73 [0..1]; + association [1] C73 <-> D73 [1..*]; + association [*] E73 <- C73 [0..1]; + association [1] E73 -> D73 [1..*]; + + + enum G74 {e11, e12, e13;} + + abstract class A74 { + String s; + } + + class B74 extends A74 { + E74 e; + } + + class C74 { + B74 b74; + } + + class D74 extends A74 { + String s; + } + + class E74 { + Double d; + } + + association [1] A74 <-> E74 [1..*]; + association [1..*] B74 -> C74 [0..1]; + association [1] C74 <-> D74 [1..*]; + association [*] E74 <- C74 [0..1]; + association [1] E74 -> D74 [1..*]; + + + enum G75 {e11, e12, e13;} + + abstract class A75 { + String s; + } + + class B75 extends A75 { + E75 e; + } + + class C75 { + B75 b75; + } + + class D75 extends A75 { + String s; + } + + class E75 { + Double d; + } + + association [1] A75 <-> E75 [1..*]; + association [1..*] B75 -> C75 [0..1]; + association [1] C75 <-> D75 [1..*]; + association [*] E75 <- C75 [0..1]; + association [1] E75 -> D75 [1..*]; + + + enum G76 {e11, e12, e13;} + + abstract class A76 { + String s; + } + + class B76 extends A76 { + E76 e; + } + + class C76 { + B76 b76; + } + + class D76 extends A76 { + String s; + } + + class E76 { + Double d; + } + + association [1] A76 <-> E76 [1..*]; + association [1..*] B76 -> C76 [0..1]; + association [1] C76 <-> D76 [1..*]; + association [*] E76 <- C76 [0..1]; + association [1] E76 -> D76 [1..*]; + + + enum G77 {e11, e12, e13;} + + abstract class A77 { + String s; + } + + class B77 extends A77 { + E77 e; + } + + class C77 { + B77 b77; + } + + class D77 extends A77 { + String s; + } + + class E77 { + Double d; + } + + association [1] A77 <-> E77 [1..*]; + association [1..*] B77 -> C77 [0..1]; + association [1] C77 <-> D77 [1..*]; + association [*] E77 <- C77 [0..1]; + association [1] E77 -> D77 [1..*]; + + + enum G78 {e11, e12, e13;} + + abstract class A78 { + String s; + } + + class B78 extends A78 { + E78 e; + } + + class C78 { + B78 b78; + } + + class D78 extends A78 { + String s; + } + + class E78 { + Double d; + } + + association [1] A78 <-> E78 [1..*]; + association [1..*] B78 -> C78 [0..1]; + association [1] C78 <-> D78 [1..*]; + association [*] E78 <- C78 [0..1]; + association [1] E78 -> D78 [1..*]; + + + enum G79 {e11, e12, e13;} + + abstract class A79 { + String s; + } + + class B79 extends A79 { + E79 e; + } + + class C79 { + B79 b79; + } + + class D79 extends A79 { + String s; + } + + class E79 { + Double d; + } + + association [1] A79 <-> E79 [1..*]; + association [1..*] B79 -> C79 [0..1]; + association [1] C79 <-> D79 [1..*]; + association [*] E79 <- C79 [0..1]; + association [1] E79 -> D79 [1..*]; + + + enum G80 {e11, e12, e13;} + + abstract class A80 { + String s; + } + + class B80 extends A80 { + E80 e; + } + + class C80 { + B80 b80; + } + + class D80 extends A80 { + String s; + } + + class E80 { + Double d; + } + + association [1] A80 <-> E80 [1..*]; + association [1..*] B80 -> C80 [0..1]; + association [1] C80 <-> D80 [1..*]; + association [*] E80 <- C80 [0..1]; + association [1] E80 -> D80 [1..*]; + + + enum G81 {e11, e12, e13;} + + abstract class A81 { + String s; + } + + class B81 extends A81 { + E81 e; + } + + class C81 { + B81 b81; + } + + class D81 extends A81 { + String s; + } + + class E81 { + Double d; + } + + association [1] A81 <-> E81 [1..*]; + association [1..*] B81 -> C81 [0..1]; + association [1] C81 <-> D81 [1..*]; + association [*] E81 <- C81 [0..1]; + association [1] E81 -> D81 [1..*]; + + + enum G82 {e11, e12, e13;} + + abstract class A82 { + String s; + } + + class B82 extends A82 { + E82 e; + } + + class C82 { + B82 b82; + } + + class D82 extends A82 { + String s; + } + + class E82 { + Double d; + } + + association [1] A82 <-> E82 [1..*]; + association [1..*] B82 -> C82 [0..1]; + association [1] C82 <-> D82 [1..*]; + association [*] E82 <- C82 [0..1]; + association [1] E82 -> D82 [1..*]; + + + enum G83 {e11, e12, e13;} + + abstract class A83 { + String s; + } + + class B83 extends A83 { + E83 e; + } + + class C83 { + B83 b83; + } + + class D83 extends A83 { + String s; + } + + class E83 { + Double d; + } + + association [1] A83 <-> E83 [1..*]; + association [1..*] B83 -> C83 [0..1]; + association [1] C83 <-> D83 [1..*]; + association [*] E83 <- C83 [0..1]; + association [1] E83 -> D83 [1..*]; + + + enum G84 {e11, e12, e13;} + + abstract class A84 { + String s; + } + + class B84 extends A84 { + E84 e; + } + + class C84 { + B84 b84; + } + + class D84 extends A84 { + String s; + } + + class E84 { + Double d; + } + + association [1] A84 <-> E84 [1..*]; + association [1..*] B84 -> C84 [0..1]; + association [1] C84 <-> D84 [1..*]; + association [*] E84 <- C84 [0..1]; + association [1] E84 -> D84 [1..*]; + + + enum G85 {e11, e12, e13;} + + abstract class A85 { + String s; + } + + class B85 extends A85 { + E85 e; + } + + class C85 { + B85 b85; + } + + class D85 extends A85 { + String s; + } + + class E85 { + Double d; + } + + association [1] A85 <-> E85 [1..*]; + association [1..*] B85 -> C85 [0..1]; + association [1] C85 <-> D85 [1..*]; + association [*] E85 <- C85 [0..1]; + association [1] E85 -> D85 [1..*]; + + + enum G86 {e11, e12, e13;} + + abstract class A86 { + String s; + } + + class B86 extends A86 { + E86 e; + } + + class C86 { + B86 b86; + } + + class D86 extends A86 { + String s; + } + + class E86 { + Double d; + } + + association [1] A86 <-> E86 [1..*]; + association [1..*] B86 -> C86 [0..1]; + association [1] C86 <-> D86 [1..*]; + association [*] E86 <- C86 [0..1]; + association [1] E86 -> D86 [1..*]; + + + enum G87 {e11, e12, e13;} + + abstract class A87 { + String s; + } + + class B87 extends A87 { + E87 e; + } + + class C87 { + B87 b87; + } + + class D87 extends A87 { + String s; + } + + class E87 { + Double d; + } + + association [1] A87 <-> E87 [1..*]; + association [1..*] B87 -> C87 [0..1]; + association [1] C87 <-> D87 [1..*]; + association [*] E87 <- C87 [0..1]; + association [1] E87 -> D87 [1..*]; + + + enum G88 {e11, e12, e13;} + + abstract class A88 { + String s; + } + + class B88 extends A88 { + E88 e; + } + + class C88 { + B88 b88; + } + + class D88 extends A88 { + String s; + } + + class E88 { + Double d; + } + + association [1] A88 <-> E88 [1..*]; + association [1..*] B88 -> C88 [0..1]; + association [1] C88 <-> D88 [1..*]; + association [*] E88 <- C88 [0..1]; + association [1] E88 -> D88 [1..*]; + + + enum G89 {e11, e12, e13;} + + abstract class A89 { + String s; + } + + class B89 extends A89 { + E89 e; + } + + class C89 { + B89 b89; + } + + class D89 extends A89 { + String s; + } + + class E89 { + Double d; + } + + association [1] A89 <-> E89 [1..*]; + association [1..*] B89 -> C89 [0..1]; + association [1] C89 <-> D89 [1..*]; + association [*] E89 <- C89 [0..1]; + association [1] E89 -> D89 [1..*]; + + + enum G90 {e11, e12, e13;} + + abstract class A90 { + String s; + } + + class B90 extends A90 { + E90 e; + } + + class C90 { + B90 b90; + } + + class D90 extends A90 { + String s; + } + + class E90 { + Double d; + } + + association [1] A90 <-> E90 [1..*]; + association [1..*] B90 -> C90 [0..1]; + association [1] C90 <-> D90 [1..*]; + association [*] E90 <- C90 [0..1]; + association [1] E90 -> D90 [1..*]; + + + enum G91 {e11, e12, e13;} + + abstract class A91 { + String s; + } + + class B91 extends A91 { + E91 e; + } + + class C91 { + B91 b91; + } + + class D91 extends A91 { + String s; + } + + class E91 { + Double d; + } + + association [1] A91 <-> E91 [1..*]; + association [1..*] B91 -> C91 [0..1]; + association [1] C91 <-> D91 [1..*]; + association [*] E91 <- C91 [0..1]; + association [1] E91 -> D91 [1..*]; + + + enum G92 {e11, e12, e13;} + + abstract class A92 { + String s; + } + + class B92 extends A92 { + E92 e; + } + + class C92 { + B92 b92; + } + + class D92 extends A92 { + String s; + } + + class E92 { + Double d; + } + + association [1] A92 <-> E92 [1..*]; + association [1..*] B92 -> C92 [0..1]; + association [1] C92 <-> D92 [1..*]; + association [*] E92 <- C92 [0..1]; + association [1] E92 -> D92 [1..*]; + + + enum G93 {e11, e12, e13;} + + abstract class A93 { + String s; + } + + class B93 extends A93 { + E93 e; + } + + class C93 { + B93 b93; + } + + class D93 extends A93 { + String s; + } + + class E93 { + Double d; + } + + association [1] A93 <-> E93 [1..*]; + association [1..*] B93 -> C93 [0..1]; + association [1] C93 <-> D93 [1..*]; + association [*] E93 <- C93 [0..1]; + association [1] E93 -> D93 [1..*]; + + + enum G94 {e11, e12, e13;} + + abstract class A94 { + String s; + } + + class B94 extends A94 { + E94 e; + } + + class C94 { + B94 b94; + } + + class D94 extends A94 { + String s; + } + + class E94 { + Double d; + } + + association [1] A94 <-> E94 [1..*]; + association [1..*] B94 -> C94 [0..1]; + association [1] C94 <-> D94 [1..*]; + association [*] E94 <- C94 [0..1]; + association [1] E94 -> D94 [1..*]; + + + enum G95 {e11, e12, e13;} + + abstract class A95 { + String s; + } + + class B95 extends A95 { + E95 e; + } + + class C95 { + B95 b95; + } + + class D95 extends A95 { + String s; + } + + class E95 { + Double d; + } + + association [1] A95 <-> E95 [1..*]; + association [1..*] B95 -> C95 [0..1]; + association [1] C95 <-> D95 [1..*]; + association [*] E95 <- C95 [0..1]; + association [1] E95 -> D95 [1..*]; + + + enum G96 {e11, e12, e13;} + + abstract class A96 { + String s; + } + + class B96 extends A96 { + E96 e; + } + + class C96 { + B96 b96; + } + + class D96 extends A96 { + String s; + } + + class E96 { + Double d; + } + + association [1] A96 <-> E96 [1..*]; + association [1..*] B96 -> C96 [0..1]; + association [1] C96 <-> D96 [1..*]; + association [*] E96 <- C96 [0..1]; + association [1] E96 -> D96 [1..*]; + + + enum G97 {e11, e12, e13;} + + abstract class A97 { + String s; + } + + class B97 extends A97 { + E97 e; + } + + class C97 { + B97 b97; + } + + class D97 extends A97 { + String s; + } + + class E97 { + Double d; + } + + association [1] A97 <-> E97 [1..*]; + association [1..*] B97 -> C97 [0..1]; + association [1] C97 <-> D97 [1..*]; + association [*] E97 <- C97 [0..1]; + association [1] E97 -> D97 [1..*]; + + + enum G98 {e11, e12, e13;} + + abstract class A98 { + String s; + } + + class B98 extends A98 { + E98 e; + } + + class C98 { + B98 b98; + } + + class D98 extends A98 { + String s; + } + + class E98 { + Double d; + } + + association [1] A98 <-> E98 [1..*]; + association [1..*] B98 -> C98 [0..1]; + association [1] C98 <-> D98 [1..*]; + association [*] E98 <- C98 [0..1]; + association [1] E98 -> D98 [1..*]; + + + enum G99 {e11, e12, e13;} + + abstract class A99 { + String s; + } + + class B99 extends A99 { + E99 e; + } + + class C99 { + B99 b99; + } + + class D99 extends A99 { + String s; + } + + class E99 { + Double d; + } + + association [1] A99 <-> E99 [1..*]; + association [1..*] B99 -> C99 [0..1]; + association [1] C99 <-> D99 [1..*]; + association [*] E99 <- C99 [0..1]; + association [1] E99 -> D99 [1..*]; + + + enum G100 {e11, e12, e13;} + + abstract class A100 { + String s; + } + + class B100 extends A100 { + E100 e; + } + + class C100 { + B100 b100; + } + + class D100 extends A100 { + String s; + } + + class E100 { + Double d; + } + + association [1] A100 <-> E100 [1..*]; + association [1..*] B100 -> C100 [0..1]; + association [1] C100 <-> D100 [1..*]; + association [*] E100 <- C100 [0..1]; + association [1] E100 -> D100 [1..*]; + +} diff --git a/cddiff/src/test/resources/de/monticore/cddiff/syndiff/Performance/500/CD2.cd b/cddiff/src/test/resources/de/monticore/cddiff/syndiff/Performance/500/CD2.cd new file mode 100644 index 000000000..2ef264269 --- /dev/null +++ b/cddiff/src/test/resources/de/monticore/cddiff/syndiff/Performance/500/CD2.cd @@ -0,0 +1,2805 @@ +import java.lang.*; + +classdiagram CD2 { + + enum G1 {F11, F12;} + + class B1 { + F1 e; + } + + class C1 { + B1 b1; + } + + class D1 extends C1 { + } + + class E1 { + Integer i; + } + + class F1 extends B1 { + Double d; + } + + association [1] F1 <-> E1 [1..*]; + association [*] B1 -> C1 [0..1]; + association [1] C1 <-> D1 [1]; + association [1..*] E1 <-> C1 [*]; + association [1] F1 <- D1 [1..*]; + + + enum G2 {F11, F12;} + + class B2 { + F2 e; + } + + class C2 { + B2 b2; + } + + class D2 extends C2 { + } + + class E2 { + Integer i; + } + + class F2 extends B2 { + Double d; + } + + association [1] F2 <-> E2 [1..*]; + association [*] B2 -> C2 [0..1]; + association [1] C2 <-> D2 [1]; + association [1..*] E2 <-> C2 [*]; + association [1] F2 <- D2 [1..*]; + + + enum G3 {F11, F12;} + + class B3 { + F3 e; + } + + class C3 { + B3 b3; + } + + class D3 extends C3 { + } + + class E3 { + Integer i; + } + + class F3 extends B3 { + Double d; + } + + association [1] F3 <-> E3 [1..*]; + association [*] B3 -> C3 [0..1]; + association [1] C3 <-> D3 [1]; + association [1..*] E3 <-> C3 [*]; + association [1] F3 <- D3 [1..*]; + + + enum G4 {F11, F12;} + + class B4 { + F4 e; + } + + class C4 { + B4 b4; + } + + class D4 extends C4 { + } + + class E4 { + Integer i; + } + + class F4 extends B4 { + Double d; + } + + association [1] F4 <-> E4 [1..*]; + association [*] B4 -> C4 [0..1]; + association [1] C4 <-> D4 [1]; + association [1..*] E4 <-> C4 [*]; + association [1] F4 <- D4 [1..*]; + + + enum G5 {F11, F12;} + + class B5 { + F5 e; + } + + class C5 { + B5 b5; + } + + class D5 extends C5 { + } + + class E5 { + Integer i; + } + + class F5 extends B5 { + Double d; + } + + association [1] F5 <-> E5 [1..*]; + association [*] B5 -> C5 [0..1]; + association [1] C5 <-> D5 [1]; + association [1..*] E5 <-> C5 [*]; + association [1] F5 <- D5 [1..*]; + + + enum G6 {F11, F12;} + + class B6 { + F6 e; + } + + class C6 { + B6 b6; + } + + class D6 extends C6 { + } + + class E6 { + Integer i; + } + + class F6 extends B6 { + Double d; + } + + association [1] F6 <-> E6 [1..*]; + association [*] B6 -> C6 [0..1]; + association [1] C6 <-> D6 [1]; + association [1..*] E6 <-> C6 [*]; + association [1] F6 <- D6 [1..*]; + + + enum G7 {F11, F12;} + + class B7 { + F7 e; + } + + class C7 { + B7 b7; + } + + class D7 extends C7 { + } + + class E7 { + Integer i; + } + + class F7 extends B7 { + Double d; + } + + association [1] F7 <-> E7 [1..*]; + association [*] B7 -> C7 [0..1]; + association [1] C7 <-> D7 [1]; + association [1..*] E7 <-> C7 [*]; + association [1] F7 <- D7 [1..*]; + + + enum G8 {F11, F12;} + + class B8 { + F8 e; + } + + class C8 { + B8 b8; + } + + class D8 extends C8 { + } + + class E8 { + Integer i; + } + + class F8 extends B8 { + Double d; + } + + association [1] F8 <-> E8 [1..*]; + association [*] B8 -> C8 [0..1]; + association [1] C8 <-> D8 [1]; + association [1..*] E8 <-> C8 [*]; + association [1] F8 <- D8 [1..*]; + + + enum G9 {F11, F12;} + + class B9 { + F9 e; + } + + class C9 { + B9 b9; + } + + class D9 extends C9 { + } + + class E9 { + Integer i; + } + + class F9 extends B9 { + Double d; + } + + association [1] F9 <-> E9 [1..*]; + association [*] B9 -> C9 [0..1]; + association [1] C9 <-> D9 [1]; + association [1..*] E9 <-> C9 [*]; + association [1] F9 <- D9 [1..*]; + + + enum G10 {F11, F12;} + + class B10 { + F10 e; + } + + class C10 { + B10 b10; + } + + class D10 extends C10 { + } + + class E10 { + Integer i; + } + + class F10 extends B10 { + Double d; + } + + association [1] F10 <-> E10 [1..*]; + association [*] B10 -> C10 [0..1]; + association [1] C10 <-> D10 [1]; + association [1..*] E10 <-> C10 [*]; + association [1] F10 <- D10 [1..*]; + + + enum G11 {F11, F12;} + + class B11 { + F11 e; + } + + class C11 { + B11 b11; + } + + class D11 extends C11 { + } + + class E11 { + Integer i; + } + + class F11 extends B11 { + Double d; + } + + association [1] F11 <-> E11 [1..*]; + association [*] B11 -> C11 [0..1]; + association [1] C11 <-> D11 [1]; + association [1..*] E11 <-> C11 [*]; + association [1] F11 <- D11 [1..*]; + + + enum G12 {F11, F12;} + + class B12 { + F12 e; + } + + class C12 { + B12 b12; + } + + class D12 extends C12 { + } + + class E12 { + Integer i; + } + + class F12 extends B12 { + Double d; + } + + association [1] F12 <-> E12 [1..*]; + association [*] B12 -> C12 [0..1]; + association [1] C12 <-> D12 [1]; + association [1..*] E12 <-> C12 [*]; + association [1] F12 <- D12 [1..*]; + + + enum G13 {F11, F12;} + + class B13 { + F13 e; + } + + class C13 { + B13 b13; + } + + class D13 extends C13 { + } + + class E13 { + Integer i; + } + + class F13 extends B13 { + Double d; + } + + association [1] F13 <-> E13 [1..*]; + association [*] B13 -> C13 [0..1]; + association [1] C13 <-> D13 [1]; + association [1..*] E13 <-> C13 [*]; + association [1] F13 <- D13 [1..*]; + + + enum G14 {F11, F12;} + + class B14 { + F14 e; + } + + class C14 { + B14 b14; + } + + class D14 extends C14 { + } + + class E14 { + Integer i; + } + + class F14 extends B14 { + Double d; + } + + association [1] F14 <-> E14 [1..*]; + association [*] B14 -> C14 [0..1]; + association [1] C14 <-> D14 [1]; + association [1..*] E14 <-> C14 [*]; + association [1] F14 <- D14 [1..*]; + + + enum G15 {F11, F12;} + + class B15 { + F15 e; + } + + class C15 { + B15 b15; + } + + class D15 extends C15 { + } + + class E15 { + Integer i; + } + + class F15 extends B15 { + Double d; + } + + association [1] F15 <-> E15 [1..*]; + association [*] B15 -> C15 [0..1]; + association [1] C15 <-> D15 [1]; + association [1..*] E15 <-> C15 [*]; + association [1] F15 <- D15 [1..*]; + + + enum G16 {F11, F12;} + + class B16 { + F16 e; + } + + class C16 { + B16 b16; + } + + class D16 extends C16 { + } + + class E16 { + Integer i; + } + + class F16 extends B16 { + Double d; + } + + association [1] F16 <-> E16 [1..*]; + association [*] B16 -> C16 [0..1]; + association [1] C16 <-> D16 [1]; + association [1..*] E16 <-> C16 [*]; + association [1] F16 <- D16 [1..*]; + + + enum G17 {F11, F12;} + + class B17 { + F17 e; + } + + class C17 { + B17 b17; + } + + class D17 extends C17 { + } + + class E17 { + Integer i; + } + + class F17 extends B17 { + Double d; + } + + association [1] F17 <-> E17 [1..*]; + association [*] B17 -> C17 [0..1]; + association [1] C17 <-> D17 [1]; + association [1..*] E17 <-> C17 [*]; + association [1] F17 <- D17 [1..*]; + + + enum G18 {F11, F12;} + + class B18 { + F18 e; + } + + class C18 { + B18 b18; + } + + class D18 extends C18 { + } + + class E18 { + Integer i; + } + + class F18 extends B18 { + Double d; + } + + association [1] F18 <-> E18 [1..*]; + association [*] B18 -> C18 [0..1]; + association [1] C18 <-> D18 [1]; + association [1..*] E18 <-> C18 [*]; + association [1] F18 <- D18 [1..*]; + + + enum G19 {F11, F12;} + + class B19 { + F19 e; + } + + class C19 { + B19 b19; + } + + class D19 extends C19 { + } + + class E19 { + Integer i; + } + + class F19 extends B19 { + Double d; + } + + association [1] F19 <-> E19 [1..*]; + association [*] B19 -> C19 [0..1]; + association [1] C19 <-> D19 [1]; + association [1..*] E19 <-> C19 [*]; + association [1] F19 <- D19 [1..*]; + + + enum G20 {F11, F12;} + + class B20 { + F20 e; + } + + class C20 { + B20 b20; + } + + class D20 extends C20 { + } + + class E20 { + Integer i; + } + + class F20 extends B20 { + Double d; + } + + association [1] F20 <-> E20 [1..*]; + association [*] B20 -> C20 [0..1]; + association [1] C20 <-> D20 [1]; + association [1..*] E20 <-> C20 [*]; + association [1] F20 <- D20 [1..*]; + + + enum G21 {F11, F12;} + + class B21 { + F21 e; + } + + class C21 { + B21 b21; + } + + class D21 extends C21 { + } + + class E21 { + Integer i; + } + + class F21 extends B21 { + Double d; + } + + association [1] F21 <-> E21 [1..*]; + association [*] B21 -> C21 [0..1]; + association [1] C21 <-> D21 [1]; + association [1..*] E21 <-> C21 [*]; + association [1] F21 <- D21 [1..*]; + + + enum G22 {F11, F12;} + + class B22 { + F22 e; + } + + class C22 { + B22 b22; + } + + class D22 extends C22 { + } + + class E22 { + Integer i; + } + + class F22 extends B22 { + Double d; + } + + association [1] F22 <-> E22 [1..*]; + association [*] B22 -> C22 [0..1]; + association [1] C22 <-> D22 [1]; + association [1..*] E22 <-> C22 [*]; + association [1] F22 <- D22 [1..*]; + + + enum G23 {F11, F12;} + + class B23 { + F23 e; + } + + class C23 { + B23 b23; + } + + class D23 extends C23 { + } + + class E23 { + Integer i; + } + + class F23 extends B23 { + Double d; + } + + association [1] F23 <-> E23 [1..*]; + association [*] B23 -> C23 [0..1]; + association [1] C23 <-> D23 [1]; + association [1..*] E23 <-> C23 [*]; + association [1] F23 <- D23 [1..*]; + + + enum G24 {F11, F12;} + + class B24 { + F24 e; + } + + class C24 { + B24 b24; + } + + class D24 extends C24 { + } + + class E24 { + Integer i; + } + + class F24 extends B24 { + Double d; + } + + association [1] F24 <-> E24 [1..*]; + association [*] B24 -> C24 [0..1]; + association [1] C24 <-> D24 [1]; + association [1..*] E24 <-> C24 [*]; + association [1] F24 <- D24 [1..*]; + + + enum G25 {F11, F12;} + + class B25 { + F25 e; + } + + class C25 { + B25 b25; + } + + class D25 extends C25 { + } + + class E25 { + Integer i; + } + + class F25 extends B25 { + Double d; + } + + association [1] F25 <-> E25 [1..*]; + association [*] B25 -> C25 [0..1]; + association [1] C25 <-> D25 [1]; + association [1..*] E25 <-> C25 [*]; + association [1] F25 <- D25 [1..*]; + + + enum G26 {F11, F12;} + + class B26 { + F26 e; + } + + class C26 { + B26 b26; + } + + class D26 extends C26 { + } + + class E26 { + Integer i; + } + + class F26 extends B26 { + Double d; + } + + association [1] F26 <-> E26 [1..*]; + association [*] B26 -> C26 [0..1]; + association [1] C26 <-> D26 [1]; + association [1..*] E26 <-> C26 [*]; + association [1] F26 <- D26 [1..*]; + + + enum G27 {F11, F12;} + + class B27 { + F27 e; + } + + class C27 { + B27 b27; + } + + class D27 extends C27 { + } + + class E27 { + Integer i; + } + + class F27 extends B27 { + Double d; + } + + association [1] F27 <-> E27 [1..*]; + association [*] B27 -> C27 [0..1]; + association [1] C27 <-> D27 [1]; + association [1..*] E27 <-> C27 [*]; + association [1] F27 <- D27 [1..*]; + + + enum G28 {F11, F12;} + + class B28 { + F28 e; + } + + class C28 { + B28 b28; + } + + class D28 extends C28 { + } + + class E28 { + Integer i; + } + + class F28 extends B28 { + Double d; + } + + association [1] F28 <-> E28 [1..*]; + association [*] B28 -> C28 [0..1]; + association [1] C28 <-> D28 [1]; + association [1..*] E28 <-> C28 [*]; + association [1] F28 <- D28 [1..*]; + + + enum G29 {F11, F12;} + + class B29 { + F29 e; + } + + class C29 { + B29 b29; + } + + class D29 extends C29 { + } + + class E29 { + Integer i; + } + + class F29 extends B29 { + Double d; + } + + association [1] F29 <-> E29 [1..*]; + association [*] B29 -> C29 [0..1]; + association [1] C29 <-> D29 [1]; + association [1..*] E29 <-> C29 [*]; + association [1] F29 <- D29 [1..*]; + + + enum G30 {F11, F12;} + + class B30 { + F30 e; + } + + class C30 { + B30 b30; + } + + class D30 extends C30 { + } + + class E30 { + Integer i; + } + + class F30 extends B30 { + Double d; + } + + association [1] F30 <-> E30 [1..*]; + association [*] B30 -> C30 [0..1]; + association [1] C30 <-> D30 [1]; + association [1..*] E30 <-> C30 [*]; + association [1] F30 <- D30 [1..*]; + + + enum G31 {F11, F12;} + + class B31 { + F31 e; + } + + class C31 { + B31 b31; + } + + class D31 extends C31 { + } + + class E31 { + Integer i; + } + + class F31 extends B31 { + Double d; + } + + association [1] F31 <-> E31 [1..*]; + association [*] B31 -> C31 [0..1]; + association [1] C31 <-> D31 [1]; + association [1..*] E31 <-> C31 [*]; + association [1] F31 <- D31 [1..*]; + + + enum G32 {F11, F12;} + + class B32 { + F32 e; + } + + class C32 { + B32 b32; + } + + class D32 extends C32 { + } + + class E32 { + Integer i; + } + + class F32 extends B32 { + Double d; + } + + association [1] F32 <-> E32 [1..*]; + association [*] B32 -> C32 [0..1]; + association [1] C32 <-> D32 [1]; + association [1..*] E32 <-> C32 [*]; + association [1] F32 <- D32 [1..*]; + + + enum G33 {F11, F12;} + + class B33 { + F33 e; + } + + class C33 { + B33 b33; + } + + class D33 extends C33 { + } + + class E33 { + Integer i; + } + + class F33 extends B33 { + Double d; + } + + association [1] F33 <-> E33 [1..*]; + association [*] B33 -> C33 [0..1]; + association [1] C33 <-> D33 [1]; + association [1..*] E33 <-> C33 [*]; + association [1] F33 <- D33 [1..*]; + + + enum G34 {F11, F12;} + + class B34 { + F34 e; + } + + class C34 { + B34 b34; + } + + class D34 extends C34 { + } + + class E34 { + Integer i; + } + + class F34 extends B34 { + Double d; + } + + association [1] F34 <-> E34 [1..*]; + association [*] B34 -> C34 [0..1]; + association [1] C34 <-> D34 [1]; + association [1..*] E34 <-> C34 [*]; + association [1] F34 <- D34 [1..*]; + + + enum G35 {F11, F12;} + + class B35 { + F35 e; + } + + class C35 { + B35 b35; + } + + class D35 extends C35 { + } + + class E35 { + Integer i; + } + + class F35 extends B35 { + Double d; + } + + association [1] F35 <-> E35 [1..*]; + association [*] B35 -> C35 [0..1]; + association [1] C35 <-> D35 [1]; + association [1..*] E35 <-> C35 [*]; + association [1] F35 <- D35 [1..*]; + + + enum G36 {F11, F12;} + + class B36 { + F36 e; + } + + class C36 { + B36 b36; + } + + class D36 extends C36 { + } + + class E36 { + Integer i; + } + + class F36 extends B36 { + Double d; + } + + association [1] F36 <-> E36 [1..*]; + association [*] B36 -> C36 [0..1]; + association [1] C36 <-> D36 [1]; + association [1..*] E36 <-> C36 [*]; + association [1] F36 <- D36 [1..*]; + + + enum G37 {F11, F12;} + + class B37 { + F37 e; + } + + class C37 { + B37 b37; + } + + class D37 extends C37 { + } + + class E37 { + Integer i; + } + + class F37 extends B37 { + Double d; + } + + association [1] F37 <-> E37 [1..*]; + association [*] B37 -> C37 [0..1]; + association [1] C37 <-> D37 [1]; + association [1..*] E37 <-> C37 [*]; + association [1] F37 <- D37 [1..*]; + + + enum G38 {F11, F12;} + + class B38 { + F38 e; + } + + class C38 { + B38 b38; + } + + class D38 extends C38 { + } + + class E38 { + Integer i; + } + + class F38 extends B38 { + Double d; + } + + association [1] F38 <-> E38 [1..*]; + association [*] B38 -> C38 [0..1]; + association [1] C38 <-> D38 [1]; + association [1..*] E38 <-> C38 [*]; + association [1] F38 <- D38 [1..*]; + + + enum G39 {F11, F12;} + + class B39 { + F39 e; + } + + class C39 { + B39 b39; + } + + class D39 extends C39 { + } + + class E39 { + Integer i; + } + + class F39 extends B39 { + Double d; + } + + association [1] F39 <-> E39 [1..*]; + association [*] B39 -> C39 [0..1]; + association [1] C39 <-> D39 [1]; + association [1..*] E39 <-> C39 [*]; + association [1] F39 <- D39 [1..*]; + + + enum G40 {F11, F12;} + + class B40 { + F40 e; + } + + class C40 { + B40 b40; + } + + class D40 extends C40 { + } + + class E40 { + Integer i; + } + + class F40 extends B40 { + Double d; + } + + association [1] F40 <-> E40 [1..*]; + association [*] B40 -> C40 [0..1]; + association [1] C40 <-> D40 [1]; + association [1..*] E40 <-> C40 [*]; + association [1] F40 <- D40 [1..*]; + + + enum G41 {F11, F12;} + + class B41 { + F41 e; + } + + class C41 { + B41 b41; + } + + class D41 extends C41 { + } + + class E41 { + Integer i; + } + + class F41 extends B41 { + Double d; + } + + association [1] F41 <-> E41 [1..*]; + association [*] B41 -> C41 [0..1]; + association [1] C41 <-> D41 [1]; + association [1..*] E41 <-> C41 [*]; + association [1] F41 <- D41 [1..*]; + + + enum G42 {F11, F12;} + + class B42 { + F42 e; + } + + class C42 { + B42 b42; + } + + class D42 extends C42 { + } + + class E42 { + Integer i; + } + + class F42 extends B42 { + Double d; + } + + association [1] F42 <-> E42 [1..*]; + association [*] B42 -> C42 [0..1]; + association [1] C42 <-> D42 [1]; + association [1..*] E42 <-> C42 [*]; + association [1] F42 <- D42 [1..*]; + + + enum G43 {F11, F12;} + + class B43 { + F43 e; + } + + class C43 { + B43 b43; + } + + class D43 extends C43 { + } + + class E43 { + Integer i; + } + + class F43 extends B43 { + Double d; + } + + association [1] F43 <-> E43 [1..*]; + association [*] B43 -> C43 [0..1]; + association [1] C43 <-> D43 [1]; + association [1..*] E43 <-> C43 [*]; + association [1] F43 <- D43 [1..*]; + + + enum G44 {F11, F12;} + + class B44 { + F44 e; + } + + class C44 { + B44 b44; + } + + class D44 extends C44 { + } + + class E44 { + Integer i; + } + + class F44 extends B44 { + Double d; + } + + association [1] F44 <-> E44 [1..*]; + association [*] B44 -> C44 [0..1]; + association [1] C44 <-> D44 [1]; + association [1..*] E44 <-> C44 [*]; + association [1] F44 <- D44 [1..*]; + + + enum G45 {F11, F12;} + + class B45 { + F45 e; + } + + class C45 { + B45 b45; + } + + class D45 extends C45 { + } + + class E45 { + Integer i; + } + + class F45 extends B45 { + Double d; + } + + association [1] F45 <-> E45 [1..*]; + association [*] B45 -> C45 [0..1]; + association [1] C45 <-> D45 [1]; + association [1..*] E45 <-> C45 [*]; + association [1] F45 <- D45 [1..*]; + + + enum G46 {F11, F12;} + + class B46 { + F46 e; + } + + class C46 { + B46 b46; + } + + class D46 extends C46 { + } + + class E46 { + Integer i; + } + + class F46 extends B46 { + Double d; + } + + association [1] F46 <-> E46 [1..*]; + association [*] B46 -> C46 [0..1]; + association [1] C46 <-> D46 [1]; + association [1..*] E46 <-> C46 [*]; + association [1] F46 <- D46 [1..*]; + + + enum G47 {F11, F12;} + + class B47 { + F47 e; + } + + class C47 { + B47 b47; + } + + class D47 extends C47 { + } + + class E47 { + Integer i; + } + + class F47 extends B47 { + Double d; + } + + association [1] F47 <-> E47 [1..*]; + association [*] B47 -> C47 [0..1]; + association [1] C47 <-> D47 [1]; + association [1..*] E47 <-> C47 [*]; + association [1] F47 <- D47 [1..*]; + + + enum G48 {F11, F12;} + + class B48 { + F48 e; + } + + class C48 { + B48 b48; + } + + class D48 extends C48 { + } + + class E48 { + Integer i; + } + + class F48 extends B48 { + Double d; + } + + association [1] F48 <-> E48 [1..*]; + association [*] B48 -> C48 [0..1]; + association [1] C48 <-> D48 [1]; + association [1..*] E48 <-> C48 [*]; + association [1] F48 <- D48 [1..*]; + + + enum G49 {F11, F12;} + + class B49 { + F49 e; + } + + class C49 { + B49 b49; + } + + class D49 extends C49 { + } + + class E49 { + Integer i; + } + + class F49 extends B49 { + Double d; + } + + association [1] F49 <-> E49 [1..*]; + association [*] B49 -> C49 [0..1]; + association [1] C49 <-> D49 [1]; + association [1..*] E49 <-> C49 [*]; + association [1] F49 <- D49 [1..*]; + + + enum G50 {F11, F12;} + + class B50 { + F50 e; + } + + class C50 { + B50 b50; + } + + class D50 extends C50 { + } + + class E50 { + Integer i; + } + + class F50 extends B50 { + Double d; + } + + association [1] F50 <-> E50 [1..*]; + association [*] B50 -> C50 [0..1]; + association [1] C50 <-> D50 [1]; + association [1..*] E50 <-> C50 [*]; + association [1] F50 <- D50 [1..*]; + + + enum G51 {F11, F12;} + + class B51 { + F51 e; + } + + class C51 { + B51 b51; + } + + class D51 extends C51 { + } + + class E51 { + Integer i; + } + + class F51 extends B51 { + Double d; + } + + association [1] F51 <-> E51 [1..*]; + association [*] B51 -> C51 [0..1]; + association [1] C51 <-> D51 [1]; + association [1..*] E51 <-> C51 [*]; + association [1] F51 <- D51 [1..*]; + + + enum G52 {F11, F12;} + + class B52 { + F52 e; + } + + class C52 { + B52 b52; + } + + class D52 extends C52 { + } + + class E52 { + Integer i; + } + + class F52 extends B52 { + Double d; + } + + association [1] F52 <-> E52 [1..*]; + association [*] B52 -> C52 [0..1]; + association [1] C52 <-> D52 [1]; + association [1..*] E52 <-> C52 [*]; + association [1] F52 <- D52 [1..*]; + + + enum G53 {F11, F12;} + + class B53 { + F53 e; + } + + class C53 { + B53 b53; + } + + class D53 extends C53 { + } + + class E53 { + Integer i; + } + + class F53 extends B53 { + Double d; + } + + association [1] F53 <-> E53 [1..*]; + association [*] B53 -> C53 [0..1]; + association [1] C53 <-> D53 [1]; + association [1..*] E53 <-> C53 [*]; + association [1] F53 <- D53 [1..*]; + + + enum G54 {F11, F12;} + + class B54 { + F54 e; + } + + class C54 { + B54 b54; + } + + class D54 extends C54 { + } + + class E54 { + Integer i; + } + + class F54 extends B54 { + Double d; + } + + association [1] F54 <-> E54 [1..*]; + association [*] B54 -> C54 [0..1]; + association [1] C54 <-> D54 [1]; + association [1..*] E54 <-> C54 [*]; + association [1] F54 <- D54 [1..*]; + + + enum G55 {F11, F12;} + + class B55 { + F55 e; + } + + class C55 { + B55 b55; + } + + class D55 extends C55 { + } + + class E55 { + Integer i; + } + + class F55 extends B55 { + Double d; + } + + association [1] F55 <-> E55 [1..*]; + association [*] B55 -> C55 [0..1]; + association [1] C55 <-> D55 [1]; + association [1..*] E55 <-> C55 [*]; + association [1] F55 <- D55 [1..*]; + + + enum G56 {F11, F12;} + + class B56 { + F56 e; + } + + class C56 { + B56 b56; + } + + class D56 extends C56 { + } + + class E56 { + Integer i; + } + + class F56 extends B56 { + Double d; + } + + association [1] F56 <-> E56 [1..*]; + association [*] B56 -> C56 [0..1]; + association [1] C56 <-> D56 [1]; + association [1..*] E56 <-> C56 [*]; + association [1] F56 <- D56 [1..*]; + + + enum G57 {F11, F12;} + + class B57 { + F57 e; + } + + class C57 { + B57 b57; + } + + class D57 extends C57 { + } + + class E57 { + Integer i; + } + + class F57 extends B57 { + Double d; + } + + association [1] F57 <-> E57 [1..*]; + association [*] B57 -> C57 [0..1]; + association [1] C57 <-> D57 [1]; + association [1..*] E57 <-> C57 [*]; + association [1] F57 <- D57 [1..*]; + + + enum G58 {F11, F12;} + + class B58 { + F58 e; + } + + class C58 { + B58 b58; + } + + class D58 extends C58 { + } + + class E58 { + Integer i; + } + + class F58 extends B58 { + Double d; + } + + association [1] F58 <-> E58 [1..*]; + association [*] B58 -> C58 [0..1]; + association [1] C58 <-> D58 [1]; + association [1..*] E58 <-> C58 [*]; + association [1] F58 <- D58 [1..*]; + + + enum G59 {F11, F12;} + + class B59 { + F59 e; + } + + class C59 { + B59 b59; + } + + class D59 extends C59 { + } + + class E59 { + Integer i; + } + + class F59 extends B59 { + Double d; + } + + association [1] F59 <-> E59 [1..*]; + association [*] B59 -> C59 [0..1]; + association [1] C59 <-> D59 [1]; + association [1..*] E59 <-> C59 [*]; + association [1] F59 <- D59 [1..*]; + + + enum G60 {F11, F12;} + + class B60 { + F60 e; + } + + class C60 { + B60 b60; + } + + class D60 extends C60 { + } + + class E60 { + Integer i; + } + + class F60 extends B60 { + Double d; + } + + association [1] F60 <-> E60 [1..*]; + association [*] B60 -> C60 [0..1]; + association [1] C60 <-> D60 [1]; + association [1..*] E60 <-> C60 [*]; + association [1] F60 <- D60 [1..*]; + + + enum G61 {F11, F12;} + + class B61 { + F61 e; + } + + class C61 { + B61 b61; + } + + class D61 extends C61 { + } + + class E61 { + Integer i; + } + + class F61 extends B61 { + Double d; + } + + association [1] F61 <-> E61 [1..*]; + association [*] B61 -> C61 [0..1]; + association [1] C61 <-> D61 [1]; + association [1..*] E61 <-> C61 [*]; + association [1] F61 <- D61 [1..*]; + + + enum G62 {F11, F12;} + + class B62 { + F62 e; + } + + class C62 { + B62 b62; + } + + class D62 extends C62 { + } + + class E62 { + Integer i; + } + + class F62 extends B62 { + Double d; + } + + association [1] F62 <-> E62 [1..*]; + association [*] B62 -> C62 [0..1]; + association [1] C62 <-> D62 [1]; + association [1..*] E62 <-> C62 [*]; + association [1] F62 <- D62 [1..*]; + + + enum G63 {F11, F12;} + + class B63 { + F63 e; + } + + class C63 { + B63 b63; + } + + class D63 extends C63 { + } + + class E63 { + Integer i; + } + + class F63 extends B63 { + Double d; + } + + association [1] F63 <-> E63 [1..*]; + association [*] B63 -> C63 [0..1]; + association [1] C63 <-> D63 [1]; + association [1..*] E63 <-> C63 [*]; + association [1] F63 <- D63 [1..*]; + + + enum G64 {F11, F12;} + + class B64 { + F64 e; + } + + class C64 { + B64 b64; + } + + class D64 extends C64 { + } + + class E64 { + Integer i; + } + + class F64 extends B64 { + Double d; + } + + association [1] F64 <-> E64 [1..*]; + association [*] B64 -> C64 [0..1]; + association [1] C64 <-> D64 [1]; + association [1..*] E64 <-> C64 [*]; + association [1] F64 <- D64 [1..*]; + + + enum G65 {F11, F12;} + + class B65 { + F65 e; + } + + class C65 { + B65 b65; + } + + class D65 extends C65 { + } + + class E65 { + Integer i; + } + + class F65 extends B65 { + Double d; + } + + association [1] F65 <-> E65 [1..*]; + association [*] B65 -> C65 [0..1]; + association [1] C65 <-> D65 [1]; + association [1..*] E65 <-> C65 [*]; + association [1] F65 <- D65 [1..*]; + + + enum G66 {F11, F12;} + + class B66 { + F66 e; + } + + class C66 { + B66 b66; + } + + class D66 extends C66 { + } + + class E66 { + Integer i; + } + + class F66 extends B66 { + Double d; + } + + association [1] F66 <-> E66 [1..*]; + association [*] B66 -> C66 [0..1]; + association [1] C66 <-> D66 [1]; + association [1..*] E66 <-> C66 [*]; + association [1] F66 <- D66 [1..*]; + + + enum G67 {F11, F12;} + + class B67 { + F67 e; + } + + class C67 { + B67 b67; + } + + class D67 extends C67 { + } + + class E67 { + Integer i; + } + + class F67 extends B67 { + Double d; + } + + association [1] F67 <-> E67 [1..*]; + association [*] B67 -> C67 [0..1]; + association [1] C67 <-> D67 [1]; + association [1..*] E67 <-> C67 [*]; + association [1] F67 <- D67 [1..*]; + + + enum G68 {F11, F12;} + + class B68 { + F68 e; + } + + class C68 { + B68 b68; + } + + class D68 extends C68 { + } + + class E68 { + Integer i; + } + + class F68 extends B68 { + Double d; + } + + association [1] F68 <-> E68 [1..*]; + association [*] B68 -> C68 [0..1]; + association [1] C68 <-> D68 [1]; + association [1..*] E68 <-> C68 [*]; + association [1] F68 <- D68 [1..*]; + + + enum G69 {F11, F12;} + + class B69 { + F69 e; + } + + class C69 { + B69 b69; + } + + class D69 extends C69 { + } + + class E69 { + Integer i; + } + + class F69 extends B69 { + Double d; + } + + association [1] F69 <-> E69 [1..*]; + association [*] B69 -> C69 [0..1]; + association [1] C69 <-> D69 [1]; + association [1..*] E69 <-> C69 [*]; + association [1] F69 <- D69 [1..*]; + + + enum G70 {F11, F12;} + + class B70 { + F70 e; + } + + class C70 { + B70 b70; + } + + class D70 extends C70 { + } + + class E70 { + Integer i; + } + + class F70 extends B70 { + Double d; + } + + association [1] F70 <-> E70 [1..*]; + association [*] B70 -> C70 [0..1]; + association [1] C70 <-> D70 [1]; + association [1..*] E70 <-> C70 [*]; + association [1] F70 <- D70 [1..*]; + + + enum G71 {F11, F12;} + + class B71 { + F71 e; + } + + class C71 { + B71 b71; + } + + class D71 extends C71 { + } + + class E71 { + Integer i; + } + + class F71 extends B71 { + Double d; + } + + association [1] F71 <-> E71 [1..*]; + association [*] B71 -> C71 [0..1]; + association [1] C71 <-> D71 [1]; + association [1..*] E71 <-> C71 [*]; + association [1] F71 <- D71 [1..*]; + + + enum G72 {F11, F12;} + + class B72 { + F72 e; + } + + class C72 { + B72 b72; + } + + class D72 extends C72 { + } + + class E72 { + Integer i; + } + + class F72 extends B72 { + Double d; + } + + association [1] F72 <-> E72 [1..*]; + association [*] B72 -> C72 [0..1]; + association [1] C72 <-> D72 [1]; + association [1..*] E72 <-> C72 [*]; + association [1] F72 <- D72 [1..*]; + + + enum G73 {F11, F12;} + + class B73 { + F73 e; + } + + class C73 { + B73 b73; + } + + class D73 extends C73 { + } + + class E73 { + Integer i; + } + + class F73 extends B73 { + Double d; + } + + association [1] F73 <-> E73 [1..*]; + association [*] B73 -> C73 [0..1]; + association [1] C73 <-> D73 [1]; + association [1..*] E73 <-> C73 [*]; + association [1] F73 <- D73 [1..*]; + + + enum G74 {F11, F12;} + + class B74 { + F74 e; + } + + class C74 { + B74 b74; + } + + class D74 extends C74 { + } + + class E74 { + Integer i; + } + + class F74 extends B74 { + Double d; + } + + association [1] F74 <-> E74 [1..*]; + association [*] B74 -> C74 [0..1]; + association [1] C74 <-> D74 [1]; + association [1..*] E74 <-> C74 [*]; + association [1] F74 <- D74 [1..*]; + + + enum G75 {F11, F12;} + + class B75 { + F75 e; + } + + class C75 { + B75 b75; + } + + class D75 extends C75 { + } + + class E75 { + Integer i; + } + + class F75 extends B75 { + Double d; + } + + association [1] F75 <-> E75 [1..*]; + association [*] B75 -> C75 [0..1]; + association [1] C75 <-> D75 [1]; + association [1..*] E75 <-> C75 [*]; + association [1] F75 <- D75 [1..*]; + + + enum G76 {F11, F12;} + + class B76 { + F76 e; + } + + class C76 { + B76 b76; + } + + class D76 extends C76 { + } + + class E76 { + Integer i; + } + + class F76 extends B76 { + Double d; + } + + association [1] F76 <-> E76 [1..*]; + association [*] B76 -> C76 [0..1]; + association [1] C76 <-> D76 [1]; + association [1..*] E76 <-> C76 [*]; + association [1] F76 <- D76 [1..*]; + + + enum G77 {F11, F12;} + + class B77 { + F77 e; + } + + class C77 { + B77 b77; + } + + class D77 extends C77 { + } + + class E77 { + Integer i; + } + + class F77 extends B77 { + Double d; + } + + association [1] F77 <-> E77 [1..*]; + association [*] B77 -> C77 [0..1]; + association [1] C77 <-> D77 [1]; + association [1..*] E77 <-> C77 [*]; + association [1] F77 <- D77 [1..*]; + + + enum G78 {F11, F12;} + + class B78 { + F78 e; + } + + class C78 { + B78 b78; + } + + class D78 extends C78 { + } + + class E78 { + Integer i; + } + + class F78 extends B78 { + Double d; + } + + association [1] F78 <-> E78 [1..*]; + association [*] B78 -> C78 [0..1]; + association [1] C78 <-> D78 [1]; + association [1..*] E78 <-> C78 [*]; + association [1] F78 <- D78 [1..*]; + + + enum G79 {F11, F12;} + + class B79 { + F79 e; + } + + class C79 { + B79 b79; + } + + class D79 extends C79 { + } + + class E79 { + Integer i; + } + + class F79 extends B79 { + Double d; + } + + association [1] F79 <-> E79 [1..*]; + association [*] B79 -> C79 [0..1]; + association [1] C79 <-> D79 [1]; + association [1..*] E79 <-> C79 [*]; + association [1] F79 <- D79 [1..*]; + + + enum G80 {F11, F12;} + + class B80 { + F80 e; + } + + class C80 { + B80 b80; + } + + class D80 extends C80 { + } + + class E80 { + Integer i; + } + + class F80 extends B80 { + Double d; + } + + association [1] F80 <-> E80 [1..*]; + association [*] B80 -> C80 [0..1]; + association [1] C80 <-> D80 [1]; + association [1..*] E80 <-> C80 [*]; + association [1] F80 <- D80 [1..*]; + + + enum G81 {F11, F12;} + + class B81 { + F81 e; + } + + class C81 { + B81 b81; + } + + class D81 extends C81 { + } + + class E81 { + Integer i; + } + + class F81 extends B81 { + Double d; + } + + association [1] F81 <-> E81 [1..*]; + association [*] B81 -> C81 [0..1]; + association [1] C81 <-> D81 [1]; + association [1..*] E81 <-> C81 [*]; + association [1] F81 <- D81 [1..*]; + + + enum G82 {F11, F12;} + + class B82 { + F82 e; + } + + class C82 { + B82 b82; + } + + class D82 extends C82 { + } + + class E82 { + Integer i; + } + + class F82 extends B82 { + Double d; + } + + association [1] F82 <-> E82 [1..*]; + association [*] B82 -> C82 [0..1]; + association [1] C82 <-> D82 [1]; + association [1..*] E82 <-> C82 [*]; + association [1] F82 <- D82 [1..*]; + + + enum G83 {F11, F12;} + + class B83 { + F83 e; + } + + class C83 { + B83 b83; + } + + class D83 extends C83 { + } + + class E83 { + Integer i; + } + + class F83 extends B83 { + Double d; + } + + association [1] F83 <-> E83 [1..*]; + association [*] B83 -> C83 [0..1]; + association [1] C83 <-> D83 [1]; + association [1..*] E83 <-> C83 [*]; + association [1] F83 <- D83 [1..*]; + + + enum G84 {F11, F12;} + + class B84 { + F84 e; + } + + class C84 { + B84 b84; + } + + class D84 extends C84 { + } + + class E84 { + Integer i; + } + + class F84 extends B84 { + Double d; + } + + association [1] F84 <-> E84 [1..*]; + association [*] B84 -> C84 [0..1]; + association [1] C84 <-> D84 [1]; + association [1..*] E84 <-> C84 [*]; + association [1] F84 <- D84 [1..*]; + + + enum G85 {F11, F12;} + + class B85 { + F85 e; + } + + class C85 { + B85 b85; + } + + class D85 extends C85 { + } + + class E85 { + Integer i; + } + + class F85 extends B85 { + Double d; + } + + association [1] F85 <-> E85 [1..*]; + association [*] B85 -> C85 [0..1]; + association [1] C85 <-> D85 [1]; + association [1..*] E85 <-> C85 [*]; + association [1] F85 <- D85 [1..*]; + + + enum G86 {F11, F12;} + + class B86 { + F86 e; + } + + class C86 { + B86 b86; + } + + class D86 extends C86 { + } + + class E86 { + Integer i; + } + + class F86 extends B86 { + Double d; + } + + association [1] F86 <-> E86 [1..*]; + association [*] B86 -> C86 [0..1]; + association [1] C86 <-> D86 [1]; + association [1..*] E86 <-> C86 [*]; + association [1] F86 <- D86 [1..*]; + + + enum G87 {F11, F12;} + + class B87 { + F87 e; + } + + class C87 { + B87 b87; + } + + class D87 extends C87 { + } + + class E87 { + Integer i; + } + + class F87 extends B87 { + Double d; + } + + association [1] F87 <-> E87 [1..*]; + association [*] B87 -> C87 [0..1]; + association [1] C87 <-> D87 [1]; + association [1..*] E87 <-> C87 [*]; + association [1] F87 <- D87 [1..*]; + + + enum G88 {F11, F12;} + + class B88 { + F88 e; + } + + class C88 { + B88 b88; + } + + class D88 extends C88 { + } + + class E88 { + Integer i; + } + + class F88 extends B88 { + Double d; + } + + association [1] F88 <-> E88 [1..*]; + association [*] B88 -> C88 [0..1]; + association [1] C88 <-> D88 [1]; + association [1..*] E88 <-> C88 [*]; + association [1] F88 <- D88 [1..*]; + + + enum G89 {F11, F12;} + + class B89 { + F89 e; + } + + class C89 { + B89 b89; + } + + class D89 extends C89 { + } + + class E89 { + Integer i; + } + + class F89 extends B89 { + Double d; + } + + association [1] F89 <-> E89 [1..*]; + association [*] B89 -> C89 [0..1]; + association [1] C89 <-> D89 [1]; + association [1..*] E89 <-> C89 [*]; + association [1] F89 <- D89 [1..*]; + + + enum G90 {F11, F12;} + + class B90 { + F90 e; + } + + class C90 { + B90 b90; + } + + class D90 extends C90 { + } + + class E90 { + Integer i; + } + + class F90 extends B90 { + Double d; + } + + association [1] F90 <-> E90 [1..*]; + association [*] B90 -> C90 [0..1]; + association [1] C90 <-> D90 [1]; + association [1..*] E90 <-> C90 [*]; + association [1] F90 <- D90 [1..*]; + + + enum G91 {F11, F12;} + + class B91 { + F91 e; + } + + class C91 { + B91 b91; + } + + class D91 extends C91 { + } + + class E91 { + Integer i; + } + + class F91 extends B91 { + Double d; + } + + association [1] F91 <-> E91 [1..*]; + association [*] B91 -> C91 [0..1]; + association [1] C91 <-> D91 [1]; + association [1..*] E91 <-> C91 [*]; + association [1] F91 <- D91 [1..*]; + + + enum G92 {F11, F12;} + + class B92 { + F92 e; + } + + class C92 { + B92 b92; + } + + class D92 extends C92 { + } + + class E92 { + Integer i; + } + + class F92 extends B92 { + Double d; + } + + association [1] F92 <-> E92 [1..*]; + association [*] B92 -> C92 [0..1]; + association [1] C92 <-> D92 [1]; + association [1..*] E92 <-> C92 [*]; + association [1] F92 <- D92 [1..*]; + + + enum G93 {F11, F12;} + + class B93 { + F93 e; + } + + class C93 { + B93 b93; + } + + class D93 extends C93 { + } + + class E93 { + Integer i; + } + + class F93 extends B93 { + Double d; + } + + association [1] F93 <-> E93 [1..*]; + association [*] B93 -> C93 [0..1]; + association [1] C93 <-> D93 [1]; + association [1..*] E93 <-> C93 [*]; + association [1] F93 <- D93 [1..*]; + + + enum G94 {F11, F12;} + + class B94 { + F94 e; + } + + class C94 { + B94 b94; + } + + class D94 extends C94 { + } + + class E94 { + Integer i; + } + + class F94 extends B94 { + Double d; + } + + association [1] F94 <-> E94 [1..*]; + association [*] B94 -> C94 [0..1]; + association [1] C94 <-> D94 [1]; + association [1..*] E94 <-> C94 [*]; + association [1] F94 <- D94 [1..*]; + + + enum G95 {F11, F12;} + + class B95 { + F95 e; + } + + class C95 { + B95 b95; + } + + class D95 extends C95 { + } + + class E95 { + Integer i; + } + + class F95 extends B95 { + Double d; + } + + association [1] F95 <-> E95 [1..*]; + association [*] B95 -> C95 [0..1]; + association [1] C95 <-> D95 [1]; + association [1..*] E95 <-> C95 [*]; + association [1] F95 <- D95 [1..*]; + + + enum G96 {F11, F12;} + + class B96 { + F96 e; + } + + class C96 { + B96 b96; + } + + class D96 extends C96 { + } + + class E96 { + Integer i; + } + + class F96 extends B96 { + Double d; + } + + association [1] F96 <-> E96 [1..*]; + association [*] B96 -> C96 [0..1]; + association [1] C96 <-> D96 [1]; + association [1..*] E96 <-> C96 [*]; + association [1] F96 <- D96 [1..*]; + + + enum G97 {F11, F12;} + + class B97 { + F97 e; + } + + class C97 { + B97 b97; + } + + class D97 extends C97 { + } + + class E97 { + Integer i; + } + + class F97 extends B97 { + Double d; + } + + association [1] F97 <-> E97 [1..*]; + association [*] B97 -> C97 [0..1]; + association [1] C97 <-> D97 [1]; + association [1..*] E97 <-> C97 [*]; + association [1] F97 <- D97 [1..*]; + + + enum G98 {F11, F12;} + + class B98 { + F98 e; + } + + class C98 { + B98 b98; + } + + class D98 extends C98 { + } + + class E98 { + Integer i; + } + + class F98 extends B98 { + Double d; + } + + association [1] F98 <-> E98 [1..*]; + association [*] B98 -> C98 [0..1]; + association [1] C98 <-> D98 [1]; + association [1..*] E98 <-> C98 [*]; + association [1] F98 <- D98 [1..*]; + + + enum G99 {F11, F12;} + + class B99 { + F99 e; + } + + class C99 { + B99 b99; + } + + class D99 extends C99 { + } + + class E99 { + Integer i; + } + + class F99 extends B99 { + Double d; + } + + association [1] F99 <-> E99 [1..*]; + association [*] B99 -> C99 [0..1]; + association [1] C99 <-> D99 [1]; + association [1..*] E99 <-> C99 [*]; + association [1] F99 <- D99 [1..*]; + + + enum G100 {F11, F12;} + + class B100 { + F100 e; + } + + class C100 { + B100 b100; + } + + class D100 extends C100 { + } + + class E100 { + Integer i; + } + + class F100 extends B100 { + Double d; + } + + association [1] F100 <-> E100 [1..*]; + association [*] B100 -> C100 [0..1]; + association [1] C100 <-> D100 [1]; + association [1..*] E100 <-> C100 [*]; + association [1] F100 <- D100 [1..*]; + +} + diff --git a/cddiff/src/test/resources/de/monticore/cddiff/syndiff/TypeDiff/Source1.cd b/cddiff/src/test/resources/de/monticore/cddiff/syndiff/TypeDiff/Source1.cd index ca592bf80..f603ead4d 100644 --- a/cddiff/src/test/resources/de/monticore/cddiff/syndiff/TypeDiff/Source1.cd +++ b/cddiff/src/test/resources/de/monticore/cddiff/syndiff/TypeDiff/Source1.cd @@ -6,6 +6,11 @@ classdiagram Source1 { class A { int a; String d; + / String der; + } + + class D extends A { + String i; } class C{ diff --git a/cddiff/src/test/resources/de/monticore/cddiff/syndiff/TypeDiff/Source2.cd b/cddiff/src/test/resources/de/monticore/cddiff/syndiff/TypeDiff/Source2.cd index 95b9f7327..86ce39472 100644 --- a/cddiff/src/test/resources/de/monticore/cddiff/syndiff/TypeDiff/Source2.cd +++ b/cddiff/src/test/resources/de/monticore/cddiff/syndiff/TypeDiff/Source2.cd @@ -2,6 +2,7 @@ import java.lang.String; classdiagram Source2 { enum EnumsCheck{e;} + enum AddedEnum{a,b;} class A extends B{ EnumsCheck e; diff --git a/cddiff/src/test/resources/de/monticore/cddiff/syndiff/TypeDiff/Target1.cd b/cddiff/src/test/resources/de/monticore/cddiff/syndiff/TypeDiff/Target1.cd index 2068ef360..6a6f072e7 100644 --- a/cddiff/src/test/resources/de/monticore/cddiff/syndiff/TypeDiff/Target1.cd +++ b/cddiff/src/test/resources/de/monticore/cddiff/syndiff/TypeDiff/Target1.cd @@ -5,10 +5,12 @@ classdiagram Target1 { enum MatchedEnum{k,l;} class A{ double a; + String i; String f; + String der; } - class D{} + class D extends A {} class K{ int j; diff --git a/cddiff/src/test/resources/de/monticore/cddiff/syndiff/TypeDiff/Target2.cd b/cddiff/src/test/resources/de/monticore/cddiff/syndiff/TypeDiff/Target2.cd index ee11d1375..0c4b5cd4c 100644 --- a/cddiff/src/test/resources/de/monticore/cddiff/syndiff/TypeDiff/Target2.cd +++ b/cddiff/src/test/resources/de/monticore/cddiff/syndiff/TypeDiff/Target2.cd @@ -2,6 +2,7 @@ import java.lang.String; classdiagram Target2 { enum EnumsCheck{e;} + enum DeletedEnum{c,d;} class A{ int a;