blob: b810d1a579cec9c6ff7062a91b740b22c663c84f [file] [log] [blame]
-- This is a very selective section of Pivot.ocl used to debug failures. It should be trivial and pass in real testing.
import 'platform:/resource/org.eclipse.ocl.pivot/model/Pivot.ecore'
--include 'platform:/resource/org.eclipse.ocl.pivot/model/Types.ocl'
package ocl
context ShadowExp
inv InitializesAllClassProperties: if type.oclIsKindOf(DataType) then Tuple{status:Boolean[1]=true, message:String[1]=''}.status else
let partProperties = ownedParts.referredProperty->asSet() in
let allProperties = type.oclAsType(Class)->closure(superClasses).ownedProperties->asSet() in
let classProperties = allProperties->reject(isDerived or isImplicit or isStatic or isTransient)->reject(name?.startsWith('ocl')) in
let requiredClassProperties = classProperties->reject(defaultValueString <> null)->reject(isVolatile or not isRequired)->reject(type.oclIsKindOf(CollectionType))->reject((opposite<>null) and opposite.isComposite) in
let extraProperties : Set(NamedElement[*|1]) = partProperties->excludingAll(classProperties) in
let missingProperties : Set(NamedElement[*|1]) = requiredClassProperties->excludingAll(partProperties) in
if extraProperties->notEmpty() then Tuple{status:Boolean[1]=false, message:String[1]=extraProperties->sortedBy(name)->iterate(p; acc:String='Unexpected initializers:'|acc +' ' + p.name)}.status
else if missingProperties->notEmpty() then Tuple{status:Boolean[1]=false, message:String[1]=missingProperties->sortedBy(name)->iterate(p; acc:String='Missing initializers:'|acc +' ' + p.name)}.status
else Tuple{status:Boolean[1]=true, message:String[1]=''}.status
endif endif endif
endpackage