blob: 5e06f6f5dfdf86c14c0f8588b43596e063a219ae [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 2018 IBM Corporation 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
* E.D.Willink - Bugs 296409, 295166
*******************************************************************************/
package org.eclipse.ocl.tests;
import org.eclipse.emf.common.util.BasicEList;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;
/**
* Tests for usages of model features whose names coincide with "keywords"
* defined as reserved words by the OCL specification.
*
* @author Christian W. Damus (cdamus)
*/
@SuppressWarnings("nls")
public abstract class GenericKeywordsTest<E extends EObject, PK extends E, T extends E, C extends T, CLS extends C, DT extends C, PT extends C, ET extends DT, O extends E, PM extends E, P extends E, PA extends P, PR extends P, EL, S, COA, SSA, CT>
extends GenericTestSuite<E, PK, T, C, CLS, DT, PT, ET, O, PM, P, PA, PR, EL, S, COA, SSA, CT> {
PK smalltalk;
CLS collection;
CLS block;
protected CLS elseClass;
CLS clazz;
CLS property;
CLS constraint;
@Override
protected void setUp() {
super.setUp();
// create a little test model for a Smalltalk-like collection class that
// defines operations corresponding to OCL iterators
smalltalk = reflection.createPackage("Smalltalk");
registerPackage(smalltalk, "st", "foo://smalltalk");
CLS object = reflection.createOwnedClass(smalltalk, "Object", false);
collection = reflection.createOwnedClass(smalltalk, "Collection", false);
block = reflection.createOwnedClass(smalltalk, "Block", false);
clazz = reflection.createOwnedClass(smalltalk, "Class", false);
property = reflection.createOwnedClass(smalltalk, "Property", false);
constraint = reflection.createOwnedClass(smalltalk, "Constraint", false);
reflection.addSupertype(constraint, object);
reflection.addSupertype(property, object);
reflection.addSupertype(clazz, object);
reflection.addSupertype(block, object);
reflection.addSupertype(collection, object);
ET visibilityKind = reflection.createOwnedEnumeration(smalltalk, "VisibilityKind");
reflection.createOwnedLiteral(visibilityKind, "public");
reflection.createOwnedLiteral(visibilityKind, "protected");
reflection.createOwnedLiteral(visibilityKind, "package");
reflection.createOwnedLiteral(visibilityKind, "private");
reflection.createOwnedAttribute(clazz, "name", reflection.getUMLString());
reflection.createOwnedAttribute(clazz, "visibility", visibilityKind);
reflection.createOwnedReference(clazz, "package", object);
reflection.createOwnedAttribute(property, "isUnique", reflection.getUMLBoolean());
reflection.createOwnedAttribute(property, "upper", reflection.getUMLInteger());
reflection.createOwnedReference(constraint, "context", clazz);
EList<String> names = new BasicEList<String>(1);
EList<T> types = new BasicEList<T>(1);
names.add("object");
types.add(object);
reflection.createOwnedOperation(block, "context",
names, types, clazz, true);
names.set(0, "block");
types.set(0, block);
reflection.createOwnedOperation(collection, "isUnique",
names, types, reflection.getUMLBoolean(), true);
reflection.createOwnedOperation(collection, "select",
names, types, collection, true);
names.clear();
types.clear();
reflection.createOwnedOperation(collection, "isEmpty",
names, types, reflection.getUMLBoolean(), true);
// create some qualified classifier and package names that need
// escaping of one or more segments. Likewise state names
PK nested = reflection.createNestedPackage(smalltalk, "runtime");
PK contextPackage = reflection.createNestedPackage(nested, "context");
reflection.createOwnedClass(contextPackage, "language", false);
elseClass = reflection.createOwnedClass(contextPackage, "else", false);
reflection.createOwnedOperation(elseClass, "doIt",
null, null, null, false);
}
public void test_isUnique_162300() {
assertInvariant(property, "self.isUnique implies self.upper > 1");
assertInvariant(property, "isUnique implies self.upper > 1");
}
public void test_package_162300() {
assertInvariant(clazz, "self._package.oclIsUndefined() implies Set{VisibilityKind::protected, VisibilityKind::_package}->excludes(self.visibility)");
assertInvariant(clazz, "_package.oclIsUndefined() implies Set{VisibilityKind::protected, VisibilityKind::_package}->excludes(self.visibility)");
assertInvariant(clazz, "_'package'.oclIsUndefined() implies Set{VisibilityKind::protected, VisibilityKind::_package}->excludes(self.visibility)");
}
public void test_context_162300() {
assertInvariant(constraint, "self._context <> null implies _context.oclIsKindOf(Class)");
assertInvariant(constraint, "_context <> null implies self._context.oclIsKindOf(Class)");
assertInvariant(constraint, "_'con''te' 'x'\n't' <> null implies self._context.oclIsKindOf(Class)");
}
public void test_isUniqueOperation_162300() {
createVariableInEnvironment("aBlock", block);
assertInvariant(collection, "self.isUnique(aBlock)");
assertInvariant(collection, "isUnique(aBlock)");
}
public void test_selectOperation_162300() {
createVariableInEnvironment("aBlock", block);
assertInvariant(collection, "self.select(aBlock).isEmpty()");
assertInvariant(collection, "select(aBlock).isEmpty()");
}
public void test_contextOperation_162300() {
assertInvariant(block, "self._context(self).name = 'Block'");
assertInvariant(block, "_context(self).name = 'Block'");
assertInvariant(block, "_'context'(self).name = 'Block'");
}
public void test_reservedPackageName_183362() {
assertInvariant(block, "Smalltalk::runtime::_context::language.allInstances()->notEmpty()");
}
public void test_reservedPackageName_packageContext_183362() {
createDocument("package Smalltalk::runtime::_context context language inv: true endpackage");
}
public void test_reservedClassName_183362() {
assertInvariant(elseClass, "let e : _else = self in _else.allInstances()->forAll(oclIsKindOf(_else))");
assertInvariant(elseClass, "self.oclIsKindOf(_context::_else)");
}
public void test_reservedClassName_operationContext_183362() {
createDocument("package Smalltalk context runtime::_context::_else::doIt() : pre: true endpackage");
createDocument("package Smalltalk::runtime::_context context _else::doIt() : pre: true endpackage");
}
public void test_unexpectedCharacter_283509() {
helper.setContext(property);
try {
helper.createInvariant("self = #self");
fail("Missing exception");
} catch (Exception e) {
assertEquals("2:6 \"#\" unexpected character ignored", e.getLocalizedMessage());
}
}
}