-- @atlcompiler emftvm -- @nsURI UML2=http://www.eclipse.org/uml2/3.0.0/UML -- $Id$ -- Performs a number of tests on generated compatibility reports query UML2TestCompatibilityReport = ( let elements : Set(UML2!"uml::Element") = UML2!"uml::Element".allInstances() in UML2!"uml::Model".allInstances()->forAll(m|m.hasCRProfile).debug('Model.hasCRProfile') and UML2!"uml::TypedElement".allInstances()->forAll(t|t.hasType).debug('TypedElement.hasType') and elements->select(e|e.isMissing)->forAll(e|e.ownerIsMissingOrIncompatible).debug('<> Element.ownerIsMissingOrIncompatible') ).debug('UML2CompatibilityReport test'); -- ====================================================================== -- helper attributes begin -- ====================================================================== -- ------------------------ printName ----------------------------------- helper context UML2!"uml::NamedElement" def : printName : String = let qn : String = self.qualifiedName in if qn.oclIsUndefined() then let owner : UML2!"uml::NamedElement" = self.namespace in if owner.oclIsUndefined() then '' else owner.printName + '::' endif else qn endif; -- ------------------------ debugIfFalse -------------------------------- helper context Boolean def : debugIfFalse(message : String) : Boolean = if self then self else self.debug(message) endif; -- ------------------------ hasCRProfile -------------------------------- helper context UML2!"uml::Model" def : hasCRProfile : Boolean = (not self.getAppliedProfile('CompatibilityReport').oclIsUndefined()) .debugIfFalse('CompatibilityReport profile applied to ' + self.printName); -- ------------------------ hasType ------------------------------------- helper context UML2!"uml::TypedElement" def : hasType : Boolean = (not self.type.oclIsUndefined()) .debugIfFalse('TypedElement ' + self.printName + ' has type'); -- ------------------------ isMissing ----------------------------------- helper context UML2!"uml::Element" def : isMissing : Boolean = (not self.getAppliedStereotype('CompatibilityReport::Missing').oclIsUndefined()); -- ------------------------ isIncompatible ------------------------------ helper context UML2!"uml::Element" def : isIncompatible : Boolean = (not self.getAppliedStereotype('CompatibilityReport::Incompatible').oclIsUndefined()); -- ------------------------ parentIsMissingOrIncompatible ---------------------------------- helper context UML2!"uml::Element" def : ownerIsMissingOrIncompatible : Boolean = let owner : UML2!"uml::Element" = self.owner in if owner.oclIsUndefined() or owner.oclIsKindOf(UML2!"uml::Model") then true else (if owner.isMissing then true else owner.isIncompatible endif) .debugIfFalse('owner of ' + self.printName + ' is missing or incompatible') endif; -- ------------------------ hasMissing ---------------------------------- helper context UML2!"uml::NamedElement" def : hasMissing : Boolean = self.namedElementHasMissing .debug(self.printName + ' has nested missing elements'); helper context UML2!"uml::Classifier" def : hasMissing : Boolean = if self.namedElementHasMissing then true else self.general->exists(g|g.isOrHasMissing) endif .debug(self.printName + ' has nested missing elements'); helper context UML2!"uml::NamedElement" def : namedElementHasMissing : Boolean = self.ownedElement->exists(o| if o.oclIsKindOf(UML2!"uml::NamedElement") then o.isOrHasMissing else true endif); -- ------------------------ cruft --------------------------------------- helper context UML2!"uml::NamedElement" def : isOrHasMissing : Boolean = if self.isMissing then true .debug(self.printName + ' is missing') else if self.isReferred then true else self.hasMissing endif endif; --helper context UML2!"uml::Element" def : hasNoNestedElements : Boolean = -- true; -- no nested packages, classes, interfaces, datatypes, attributes, operations possible -- --helper context UML2!"uml::Package" def : hasNoNestedElements : Boolean = -- self.packagedElement->isEmpty(); -- --helper context UML2!"uml::Class" def : hasNoNestedElements : Boolean = -- if self.hasNoFeatures then -- self.nestedClassifier->isEmpty() -- else false endif; -- --helper context UML2!"uml::Interface" def : hasNoNestedElements : Boolean = -- if self.hasNoFeatures then -- self.nestedClassifier->isEmpty() -- else false endif; -- --helper context UML2!"uml::Classifier" def : hasNoNestedElements : Boolean = -- self.hasNoFeatures; helper context UML2!"uml::Classifier" def : hasNoFeatures : Boolean = self.feature->isEmpty(); helper context UML2!"uml::Element" def : isReferred : Boolean = false; helper context UML2!"uml::Classifier" def : isReferred : Boolean = UML2!"uml::Element".allInstances() ->exists(e| if e.isMissing then e.refersToType(self) else false endif) .debug(self.printName + ' is referred'); helper context UML2!"uml::Element" def : hasReferredTypes : Boolean = false; helper context UML2!"uml::Package" def : hasReferredTypes : Boolean = self.packagedElement ->exists(e|e.isReferred or e.hasReferredTypes); helper context UML2!"uml::Class" def : hasReferredTypes : Boolean = self.nestedClassifier ->exists(e|e.isReferred); helper context UML2!"uml::Interface" def : hasReferredTypes : Boolean = self.nestedClassifier ->exists(e|e.isReferred); -- ====================================================================== -- helper attributes end -- ====================================================================== -- ====================================================================== -- helper methods begin -- ====================================================================== -- ------------------------ refersToType -------------------------------- helper context UML2!"uml::Element" def : refersToType(type : UML2!"uml::Type") : Boolean = false; helper context UML2!"uml::Property" def : refersToType(type : UML2!"uml::Type") : Boolean = self.type=type; helper context UML2!"uml::Parameter" def : refersToType(type : UML2!"uml::Type") : Boolean = self.type=type; helper context UML2!"uml::Generalization" def : refersToType(type : UML2!"uml::Type") : Boolean = self.general=type; helper context UML2!"uml::InterfaceRealization" def : refersToType(type : UML2!"uml::Type") : Boolean = self.contract=type; -- ====================================================================== -- helper methods end -- ======================================================================