blob: 9d2a36c2f0e237105ae815713d456dcf0af5c2c6 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2018 IBM Corporation, Zeligsoft Inc., and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v20.html
*
* Contributors:
* IBM - Initial API and implementation
* Zeligsoft - Bug 241426
*******************************************************************************/
package org.eclipse.ocl.ecore.tests;
import java.util.Collections;
import java.util.Map;
import org.eclipse.emf.common.util.Diagnostic;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EParameter;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.util.Diagnostician;
import org.eclipse.emf.ecore.util.EcoreValidator;
import org.eclipse.ocl.Environment;
import org.eclipse.ocl.ecore.CollectionType;
import org.eclipse.ocl.ecore.EcoreFactory;
import org.eclipse.ocl.expressions.Variable;
import org.eclipse.ocl.types.util.TypesValidator;
/**
* Tests the generated validator constraints for the Types package.
*
* @author Christian W. Damus (cdamus)
*/
@SuppressWarnings("nls")
public class TypesValidatorTest extends AbstractTestSuite {
private final EcoreFactory factory = EcoreFactory.eINSTANCE;
public void test_CollectionType_checkCollectionTypeName() {
CollectionType type = factory.createCollectionType();
type.setElementType(fruit);
assertOK(type, TypesValidator.COLLECTION_TYPE__COLLECTION_TYPE_NAME);
type.setName("Collection(Integer)");
assertProblem(type, TypesValidator.COLLECTION_TYPE__COLLECTION_TYPE_NAME);
type.setName("Sequence(Fruit)");
assertProblem(type, TypesValidator.COLLECTION_TYPE__COLLECTION_TYPE_NAME);
assertOK(getOCLStandardLibrary().getCollection(), TypesValidator.COLLECTION_TYPE__COLLECTION_TYPE_NAME);
}
public void test_BagType_checkCollectionTypeName() {
CollectionType type = factory.createBagType();
type.setElementType(fruit);
assertOK(type, TypesValidator.BAG_TYPE__COLLECTION_TYPE_NAME);
type.setName("Bag(Integer)");
assertProblem(type, TypesValidator.BAG_TYPE__COLLECTION_TYPE_NAME);
type.setName("Collection(Fruit)");
assertProblem(type, TypesValidator.BAG_TYPE__COLLECTION_TYPE_NAME);
assertOK(getOCLStandardLibrary().getBag(), TypesValidator.BAG_TYPE__COLLECTION_TYPE_NAME);
}
public void test_SetType_checkCollectionTypeName() {
CollectionType type = factory.createSetType();
type.setElementType(fruit);
assertOK(type, TypesValidator.SET_TYPE__COLLECTION_TYPE_NAME);
type.setName("Set(Integer)");
assertProblem(type, TypesValidator.SET_TYPE__COLLECTION_TYPE_NAME);
type.setName("Collection(Fruit)");
assertProblem(type, TypesValidator.SET_TYPE__COLLECTION_TYPE_NAME);
assertOK(getOCLStandardLibrary().getSet(), TypesValidator.SET_TYPE__COLLECTION_TYPE_NAME);
}
public void test_SequenceType_checkCollectionTypeName() {
CollectionType type = factory.createSequenceType();
type.setElementType(fruit);
assertOK(type, TypesValidator.SEQUENCE_TYPE__COLLECTION_TYPE_NAME);
type.setName("Sequence(Integer)");
assertProblem(type, TypesValidator.SEQUENCE_TYPE__COLLECTION_TYPE_NAME);
type.setName("Collection(Fruit)");
assertProblem(type, TypesValidator.SEQUENCE_TYPE__COLLECTION_TYPE_NAME);
assertOK(getOCLStandardLibrary().getSequence(), TypesValidator.SEQUENCE_TYPE__COLLECTION_TYPE_NAME);
}
public void test_OrderedSetType_checkCollectionTypeName() {
CollectionType type = factory.createOrderedSetType();
type.setElementType(fruit);
assertOK(type, TypesValidator.ORDERED_SET_TYPE__COLLECTION_TYPE_NAME);
type.setName("OrderedSet(Integer)");
assertProblem(type, TypesValidator.ORDERED_SET_TYPE__COLLECTION_TYPE_NAME);
type.setName("Collection(Fruit)");
assertProblem(type, TypesValidator.ORDERED_SET_TYPE__COLLECTION_TYPE_NAME);
assertOK(getOCLStandardLibrary().getOrderedSet(), TypesValidator.ORDERED_SET_TYPE__COLLECTION_TYPE_NAME);
}
/**
* Test that the default name of the collection type of an empty collection
* shows <tt>OclVoid</tt> as the element type.
*/
public void test_emptyCollectionType_196972() {
// load our test resource
URI uri = getTestModelURI("/model/VoidCollectionTypes.ecore");
Resource res = resourceSet.getResource(uri, true);
EPackage epackage = (EPackage) res.getContents().get(0);
// this one is ill-named
CollectionType setType = (CollectionType) epackage.getEClassifier("Set(T)");
assertSame(getOCLStandardLibrary().getOclVoid(), setType.getElementType());
assertProblem(setType, TypesValidator.SET_TYPE__COLLECTION_TYPE_NAME);
// this one is well-named
CollectionType bagType = (CollectionType) epackage.getEClassifier("Bag(OclVoid)");
assertSame(getOCLStandardLibrary().getOclVoid(), bagType.getElementType());
assertOK(setType, TypesValidator.BAG_TYPE__COLLECTION_TYPE_NAME);
// create a new void collection type
CollectionType collectionType = factory.createCollectionType();
collectionType.setElementType(getOCLStandardLibrary().getOclVoid());
assertOK(collectionType, TypesValidator.COLLECTION_TYPE__COLLECTION_TYPE_NAME);
setType = factory.createSetType();
setType.setElementType(getOCLStandardLibrary().getOclVoid());
assertOK(setType, TypesValidator.SET_TYPE__COLLECTION_TYPE_NAME);
CollectionType orderedSetType = factory.createOrderedSetType();
orderedSetType.setElementType(getOCLStandardLibrary().getOclVoid());
assertOK(orderedSetType, TypesValidator.ORDERED_SET_TYPE__COLLECTION_TYPE_NAME);
bagType = factory.createBagType();
bagType.setElementType(getOCLStandardLibrary().getOclVoid());
assertOK(bagType, TypesValidator.BAG_TYPE__COLLECTION_TYPE_NAME);
CollectionType sequenceType = factory.createSequenceType();
sequenceType.setElementType(getOCLStandardLibrary().getOclVoid());
assertOK(sequenceType, TypesValidator.SEQUENCE_TYPE__COLLECTION_TYPE_NAME);
}
/**
* Tests that the well-formed name constraint from Ecore is
* disinherited for OCL types.
*/
public void test_wellFormedName() {
// collection types don't have Ecore-ish names
assertWellFormedName(oclFactory.createCollectionType(fruit));
assertWellFormedName(oclFactory.createSetType(fruit));
assertWellFormedName(oclFactory.createOrderedSetType(fruit));
assertWellFormedName(oclFactory.createBagType(fruit));
assertWellFormedName(oclFactory.createSequenceType(fruit));
// neither do some other demand-created types
Variable<EClassifier, EParameter> v = oclFactory.createVariable();
v.setName("a");
v.setType(fruit);
assertWellFormedName(oclFactory.createTupleType(Collections
.singletonList(v)));
assertWellFormedName(oclFactory.createOperationMessageType(fruit_ripen));
assertWellFormedName(oclFactory.createTypeType(fruit));
}
private void assertWellFormedName(EObject type) {
assertOK(type, EcoreValidator.WELL_FORMED_NAME,
EcoreValidator.DIAGNOSTIC_SOURCE);
}
/**
* Tests that the well-formed instance type name constraint from Ecore is
* disinherited for OCL types.
*/
public void test_wellFormedInstanceTypeName_241426() {
assertWellFormedInstanceTypeName(oclFactory.createCollectionType(fruit));
assertWellFormedInstanceTypeName(oclFactory.createSetType(fruit));
assertWellFormedInstanceTypeName(oclFactory.createOrderedSetType(fruit));
assertWellFormedInstanceTypeName(oclFactory.createBagType(fruit));
assertWellFormedInstanceTypeName(oclFactory.createSequenceType(fruit));
// neither do some other demand-created types
Variable<EClassifier, EParameter> v = oclFactory.createVariable();
v.setName("a");
v.setType(fruit);
assertWellFormedInstanceTypeName(oclFactory.createTupleType(Collections
.singletonList(v)));
assertWellFormedInstanceTypeName(oclFactory.createOperationMessageType(fruit_ripen));
assertWellFormedInstanceTypeName(oclFactory.createTypeType(fruit));
}
private void assertWellFormedInstanceTypeName(EObject type) {
assertOK(type, EcoreValidator.WELL_FORMED_INSTANCE_TYPE_NAME,
EcoreValidator.DIAGNOSTIC_SOURCE);
}
//
// Fixture methods
//
protected Diagnostic validate(EObject target) {
Map<Object, Object> ctx = new java.util.HashMap<Object, Object>();
ctx.put(Environment.class, ocl.getEnvironment());
return Diagnostician.INSTANCE.validate(target, ctx);
}
protected void assertProblem(EObject target, int code) {
assertProblem(validate(target), target, code);
}
protected void assertProblem(Diagnostic diagnostic, EObject target, int code) {
Diagnostic problem = findProblem(diagnostic, target, code);
assertNotNull("Problem not found", problem);
debugPrintln("Found expected problem: " + problem.getMessage());
}
protected Diagnostic findProblem(Diagnostic diagnostic, EObject target,
int code, String source) {
if (source.equals(diagnostic
.getSource())
&& (diagnostic.getSeverity() != Diagnostic.OK)
&& diagnostic.getData().contains(target)
&& (diagnostic.getCode() == code)) {
return diagnostic;
}
for (Diagnostic child : diagnostic.getChildren()) {
Diagnostic result = findProblem(child, target, code, source);
if (result != null) {
return result;
}
}
return null;
}
protected Diagnostic findProblem(Diagnostic diagnostic, EObject target, int code) {
return findProblem(diagnostic, target, code, TypesValidator.DIAGNOSTIC_SOURCE);
}
protected Diagnostic findProblem(Diagnostic diagnostic, EObject target) {
if (TypesValidator.DIAGNOSTIC_SOURCE.equals(diagnostic
.getSource())
&& (diagnostic.getSeverity() != Diagnostic.OK)
&& diagnostic.getData().contains(target)) {
return diagnostic;
}
for (Diagnostic child : diagnostic.getChildren()) {
Diagnostic result = findProblem(child, target);
if (result != null) {
return result;
}
}
return null;
}
protected void assertOK(EObject target, int code) {
assertOK(validate(target), target, code);
}
protected void assertOK(EObject target, int code, String source) {
assertOK(validate(target), target, code, source);
}
protected void assertOK(Diagnostic diagnostic, EObject target, int code) {
assertNull("Problem found", findProblem(diagnostic, target, code));
}
protected void assertOK(Diagnostic diagnostic, EObject target, int code,
String source) {
assertNull(
"Problem found", findProblem(diagnostic, target, code, source));
}
protected void assertOK(EObject target) {
assertOK(validate(target), target);
}
protected void assertOK(Diagnostic diagnostic, EObject target) {
assertNull("Problem found", findProblem(diagnostic, target));
}
}