Issues with OCL Constraints
Multiple issues with OCL constraints:
- [x] Fix and test implementation
- [x] Update specification
- [ ] Split into separate issues?
In detail:
- DataInstanceOrArgumentsOrItemsInDataElementUse - if a reference to structured or collection data instance is used as the data element, it should not be necessary to provide arguments or items.
```
and not (self.dataElement.oclIsKindOf(StructuredDataType) and self.argument->isEmpty())
and not (self.dataElement.oclIsKindOf(CollectionDataType) and self.item->isEmpty())
```
Shall be instead:
```
and (self.dataElement.oclIsKindOf(StructuredDataInstance) or not (self.resolveDataType().oclIsKindOf(StructuredDataType) and self.argument->isEmpty()))
and (self.dataElement.oclIsKindOf(CollectionDataInstance) or not (self.resolveDataType().oclIsKindOf(CollectionDataType) and self.item->isEmpty()))
```
- GuardType: allow for data types extending boolean (use conforms to instead)
```
self.guard ->forAll(g | g.expression.resolveDataType().name = 'Boolean')
```
Shall be instead
```
self.guard ->forAll(g | g.expression.resolveDataType().conformsTo('Boolean'))
```
- BoundedGuard: Incorrect constraint (there is only one block, its guard shall be empty instead)
```
self.block->forAll(b | b.guard.oclIsUndefined())
```
Shall be instead
```
self.block.guard->isEmpty()
```
- ConditionalFirstGuard: Incorrect constraint (minimum number of guard expressions)
```
self.block->size() > 1 or self.block->first().guard->size() > 1
```
Shall be instead
```
self.block->size() > 1 or self.block->first().guard->size() > 0
```
issue