blob: 21bdd9674b599baa59b75be8baef22988a09024f [file] [log] [blame]
/**
* <copyright>
*
* Copyright (c) 2008 E.D.Willink and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* E.D.Willink - initial API and implementation
*
* </copyright>
*
* $Id: QVTRelationValidationTest.java,v 1.3 2009/01/27 21:24:09 ewillink Exp $
*/
package org.eclipse.qvt.declarative.test.emof.qvtrelation;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.ocl.ecore.LetExp;
import org.eclipse.ocl.ecore.OCLExpression;
import org.eclipse.ocl.ecore.Variable;
import org.eclipse.qvt.declarative.ecore.QVTBase.Domain;
import org.eclipse.qvt.declarative.ecore.QVTBase.Pattern;
import org.eclipse.qvt.declarative.ecore.QVTBase.Predicate;
import org.eclipse.qvt.declarative.ecore.QVTBase.Rule;
import org.eclipse.qvt.declarative.ecore.QVTBase.TypedModel;
import org.eclipse.qvt.declarative.ecore.QVTBase.impl.DomainImpl;
import org.eclipse.qvt.declarative.ecore.QVTBase.impl.RuleImpl;
import org.eclipse.qvt.declarative.ecore.QVTBase.operations.QVTBaseMessages;
import org.eclipse.qvt.declarative.ecore.QVTBase.util.QVTBaseValidator;
import org.eclipse.qvt.declarative.ecore.QVTRelation.DomainPattern;
import org.eclipse.qvt.declarative.ecore.QVTRelation.Key;
import org.eclipse.qvt.declarative.ecore.QVTRelation.OppositePropertyCallExp;
import org.eclipse.qvt.declarative.ecore.QVTRelation.QVTRelationPackage;
import org.eclipse.qvt.declarative.ecore.QVTRelation.Relation;
import org.eclipse.qvt.declarative.ecore.QVTRelation.RelationCallExp;
import org.eclipse.qvt.declarative.ecore.QVTRelation.RelationDomain;
import org.eclipse.qvt.declarative.ecore.QVTRelation.RelationalTransformation;
import org.eclipse.qvt.declarative.ecore.QVTRelation.operations.QVTRelationMessages;
import org.eclipse.qvt.declarative.ecore.QVTRelation.util.QVTRelationValidator;
import org.eclipse.qvt.declarative.ecore.QVTTemplate.ObjectTemplateExp;
import org.eclipse.qvt.declarative.ecore.operations.EcoreMessages;
import org.eclipse.qvt.declarative.ecore.operations.EcoreValidatorWithOperations;
import org.eclipse.qvt.declarative.parser.utils.ProblemLog;
import org.eclipse.qvt.declarative.test.TestQVTBase.TestTransformation;
public class QVTRelationValidationTest extends AbstractQVTRelationValidationTest
{
protected void checkPatternTypesAreDeclared(EReference relationFeature, String message) {
RelationalTransformation transformation = createRelationalTransformation(resource, "TestTransformation");
TypedModel typedModel1 = createTypedModel(transformation, "TestTypedModel1", EcorePackage.eINSTANCE);
TypedModel typedModel2 = createTypedModel(transformation, "TestTypedModel2", EcorePackage.eINSTANCE);
Relation relation = createRelation(transformation, "TestRelation");
RelationDomain domain1 = createRelationDomain(relation, "TestDomain1", typedModel1, "RootVariable1", getStringType());
createDomainPattern(domain1);
RelationDomain domain2 = createRelationDomain(relation, "TestDomain2", typedModel2, "RootVariable2", getStringType());
createDomainPattern(domain2);
Variable relationVariable = createVariable(relation.getVariable(), "TestRelationVariable", getBooleanType());
Pattern pattern = createPattern(null);
relation.eSet(relationFeature, pattern);
Predicate predicate2 = createPredicate(pattern.getPredicate());
OCLExpression varExpression2 = createVariableExp(relationVariable);
EClass badType = QVTRelationPackage.Literals.RELATION;
LetExp conditionExpression2 = createLetExp("TestLetVar", badType, varExpression2);
pattern.getBindsTo().add(relationVariable);
Variable letVariable = (Variable) conditionExpression2.getVariable();
predicate2.setConditionExpression(conditionExpression2);
//
ProblemLog expectedProblems = new ProblemLog();
expectedProblems.expectValidatorError(QVTRelationValidator.INSTANCE, message,
getQualifiedNameOf(badType),
getQualifiedNameOf(letVariable),
getQualifiedNameOf(relation));
validationTest(expectedProblems);
}
protected void checkPatternVariablesAreDefined(EReference relationFeature, String message) {
RelationalTransformation transformation = createRelationalTransformation(resource, "TestTransformation");
TypedModel typedModel1 = createTypedModel(transformation, "TestTypedModel1", EcorePackage.eINSTANCE);
TypedModel typedModel2 = createTypedModel(transformation, "TestTypedModel2", EcorePackage.eINSTANCE);
Relation relation = createRelation(transformation, "TestRelation");
RelationDomain domain1 = createRelationDomain(relation, "TestDomain1", typedModel1, "RootVariable1", getStringType());
createDomainPattern(domain1);
RelationDomain domain2 = createRelationDomain(relation, "TestDomain2", typedModel2, "RootVariable2", getStringType());
createDomainPattern(domain2);
RelationalTransformation anotherTransformation = createRelationalTransformation(resource, "AnotherTestTransformation");
TypedModel anotherTypedModel1 = createTypedModel(anotherTransformation, "AnotherTestTypedModel1", EcorePackage.eINSTANCE);
TypedModel anotherTypedModel2 = createTypedModel(anotherTransformation, "AnotherTestTypedModel2", EcorePackage.eINSTANCE);
Relation anotherRelation = createRelation(anotherTransformation, "AnotherTestRelation");
RelationDomain anotherDomain1 = createRelationDomain(anotherRelation, "AnotherTestDomain1", anotherTypedModel1, "AnotherRootVariable1", getBooleanType());
createDomainPattern(anotherDomain1);
RelationDomain anotherDomain2 = createRelationDomain(anotherRelation, "AnotherTestDomain2", anotherTypedModel2, "AnotherRootVariable2", getBooleanType());
createDomainPattern(anotherDomain2);
// Variable relationVariable = createVariable(relation.getVariable(), "TestRelationVariable", getBooleanType());
Variable anotherRelationVariable = createVariable(anotherRelation.getVariable(), "AnotherTestRelationVariable", getBooleanType());
Pattern pattern = createPattern(null);
relation.eSet(relationFeature, pattern);
Predicate predicate2 = createPredicate(pattern.getPredicate());
OCLExpression varExpression2 = createVariableExp(anotherRelationVariable);
LetExp conditionExpression2 = createLetExp("TestLetVar", getBooleanType(), varExpression2);
Variable letVariable = (Variable) conditionExpression2.getVariable();
predicate2.setConditionExpression(conditionExpression2);
pattern.getBindsTo().add(anotherRelationVariable);
Predicate predicate1 = createPredicate(pattern.getPredicate());
OCLExpression conditionExpression1 = createVariableExp(letVariable);
predicate1.setConditionExpression(conditionExpression1);
//
ProblemLog expectedProblems = new ProblemLog();
expectedProblems.expectValidatorError(QVTRelationValidator.INSTANCE, message,
getQualifiedNameOf(anotherRelationVariable),
getQualifiedNameOf(relation));
expectedProblems.expectValidatorError(QVTRelationValidator.INSTANCE, message,
getQualifiedNameOf(letVariable),
getQualifiedNameOf(relation));
validationTest(expectedProblems);
}
public void testDomainPattern_EveryVariableIsDefinedByRelation() {
RelationalTransformation transformation = createRelationalTransformation(resource, "TestTransformation");
TypedModel typedModel1 = createTypedModel(transformation, "TestTypedModel1", EcorePackage.eINSTANCE);
TypedModel typedModel2 = createTypedModel(transformation, "TestTypedModel2", EcorePackage.eINSTANCE);
Relation relation = createRelation(transformation, "TestRelation");
RelationDomain domain1 = createRelationDomain(relation, "TestDomain1", typedModel1, "RootVariable1", getStringType());
createDomainPattern(domain1);
RelationDomain domain2 = createRelationDomain(relation, "TestDomain2", typedModel2, "RootVariable2", getStringType());
DomainPattern domainPattern2 = createDomainPattern(domain2);
RelationalTransformation anotherTransformation = createRelationalTransformation(resource, "AnotherTestTransformation");
TypedModel anotherTypedModel1 = createTypedModel(anotherTransformation, "AnotherTestTypedModel1", EcorePackage.eINSTANCE);
TypedModel anotherTypedModel2 = createTypedModel(anotherTransformation, "AnotherTestTypedModel2", EcorePackage.eINSTANCE);
Relation anotherRelation = createRelation(anotherTransformation, "AnotherTestRelation");
RelationDomain anotherDomain1 = createRelationDomain(anotherRelation, "AnotherTestDomain1", anotherTypedModel1, "AnotherRootVariable1", getBooleanType());
createDomainPattern(anotherDomain1);
RelationDomain anotherDomain2 = createRelationDomain(anotherRelation, "AnotherTestDomain2", anotherTypedModel2, "AnotherRootVariable2", getBooleanType());
createDomainPattern(anotherDomain2);
//
validationTest(new ProblemLog());
//
Variable rootVariable = anotherDomain2.getRootVariable();
domainPattern2.getBindsTo().add(rootVariable);
//
ProblemLog expectedProblems = new ProblemLog();
expectedProblems.expectValidatorError(QVTRelationValidator.INSTANCE,
QVTRelationMessages._UI_DomainPattern_VariableIsNotDefinedByRelation,
getQualifiedNameOf(rootVariable),
getQualifiedNameOf(relation));
validationTest(expectedProblems);
}
public void testDomainPattern_RootTemplateExpressionIsBoundToRootVariable() {
RelationalTransformation transformation = createRelationalTransformation(resource, "TestTransformation");
TypedModel typedModel1 = createTypedModel(transformation, "TestTypedModel1", EcorePackage.eINSTANCE);
TypedModel typedModel2 = createTypedModel(transformation, "TestTypedModel2", EcorePackage.eINSTANCE);
Relation relation = createRelation(transformation, "TestRelation");
Variable variable = createVariable(relation.getVariable(), "TestVariable", getStringType());
RelationDomain domain1 = createRelationDomain(relation, "TestDomain1", typedModel1, "RootVariable1", getStringType());
createDomainPattern(domain1);
RelationDomain domain2 = createRelationDomain(relation, "TestDomain2", typedModel2, "RootVariable2", getStringType());
DomainPattern pattern = createDomainPattern(domain2);
ObjectTemplateExp templateExp = createObjectTemplateExp(variable, EcorePackage.Literals.EDATA_TYPE);
pattern.setTemplateExpression(templateExp);
Variable rootVariable = domain2.getRootVariable();
pattern.getBindsTo().add(rootVariable);
pattern.getBindsTo().add(variable);
//
ProblemLog expectedProblems = new ProblemLog();
expectedProblems.expectValidatorError(QVTRelationValidator.INSTANCE,
QVTRelationMessages._UI_DomainPattern_RootTemplateExpressionIsNotBoundToRootVariable,
getQualifiedNameOf(rootVariable),
getQualifiedNameOf(variable));
validationTest(expectedProblems);
}
public void testDomainPattern_RootTemplateExpressionTypeIsRootVariableType() {
RelationalTransformation transformation = createRelationalTransformation(resource, "TestTransformation");
TypedModel typedModel1 = createTypedModel(transformation, "TestTypedModel1", EcorePackage.eINSTANCE);
TypedModel typedModel2 = createTypedModel(transformation, "TestTypedModel2", EcorePackage.eINSTANCE);
Relation relation = createRelation(transformation, "TestRelation");
createVariable(relation.getVariable(), "TestVariable", getStringType());
RelationDomain domain1 = createRelationDomain(relation, "TestDomain1", typedModel1, "RootVariable1", getStringType());
createDomainPattern(domain1);
RelationDomain domain2 = createRelationDomain(relation, "TestDomain2", typedModel2, "RootVariable2", getStringType());
DomainPattern pattern = createDomainPattern(domain2);
Variable rootVariable = domain2.getRootVariable();
ObjectTemplateExp templateExp = createObjectTemplateExp(rootVariable, EcorePackage.Literals.EDATA_TYPE);
templateExp.setEType(EcorePackage.Literals.EDATA_TYPE);
pattern.setTemplateExpression(templateExp);
pattern.getBindsTo().add(rootVariable);
//
ProblemLog expectedProblems = new ProblemLog();
expectedProblems.expectValidatorError(QVTRelationValidator.INSTANCE,
QVTRelationMessages._UI_DomainPattern_RootTemplateExpressionTypeIsNotRootVariableType,
getQualifiedNameOf(getStringType()),
getQualifiedNameOf(rootVariable),
getQualifiedNameOf(EcorePackage.Literals.EDATA_TYPE));
validationTest(expectedProblems);
}
public void testKey_IdentifiesTypeIsNonNull() {
RelationalTransformation transformation = createRelationalTransformation(resource, "TestTransformation");
Key key = createKey(transformation, null, EcorePackage.Literals.ENAMED_ELEMENT__NAME);
ProblemLog expectedProblems = new ProblemLog();
expectedProblems.expectValidatorError(EcoreValidatorWithOperations.INSTANCE,
EcoreMessages._UI_RequiredFeatureMustBeSet_diagnostic,
QVTRelationPackage.Literals.KEY__IDENTIFIES.getName(),
getQualifiedNameOf(key));
validationTest(expectedProblems);
}
public void testKey_AtLeastOnePart() {
RelationalTransformation transformation = createRelationalTransformation(resource, "TestTransformation");
createTypedModel(transformation, "ecore", EcorePackage.eINSTANCE);
Key key = createKey(transformation, EcorePackage.Literals.ENAMED_ELEMENT);
ProblemLog expectedProblems = new ProblemLog();
expectedProblems.expectValidatorError(QVTRelationValidator.INSTANCE,
QVTRelationMessages._UI_Key_NoParts,
getQualifiedNameOf(key));
validationTest(expectedProblems);
}
public void testKey_IdentifiesTypeIsDeclaredByTransformation() {
RelationalTransformation transformation = createRelationalTransformation(resource, "TestTransformation");
EClass identifies = EcorePackage.Literals.EOPERATION;
createKey(transformation, identifies, EcorePackage.Literals.ENAMED_ELEMENT__NAME);
ProblemLog expectedProblems = new ProblemLog();
expectedProblems.expectValidatorError(QVTRelationValidator.INSTANCE,
QVTRelationMessages._UI_Key_IdentifiesTypeIsNotDeclaredByTransformation,
getQualifiedNameOf(identifies),
getQualifiedNameOf(transformation));
validationTest(expectedProblems);
}
public void testKey_EveryPartIsDeclaredByIdentifies() {
RelationalTransformation transformation = createRelationalTransformation(resource, "TestTransformation");
createTypedModel(transformation, "ecore", EcorePackage.eINSTANCE);
EReference part = EcorePackage.Literals.EFACTORY__EPACKAGE;
EClass identifies = EcorePackage.Literals.EOPERATION;
Key key = createKey(transformation, identifies, part);
ProblemLog expectedProblems = new ProblemLog();
expectedProblems.expectValidatorError(QVTRelationValidator.INSTANCE,
QVTRelationMessages._UI_Key_PartIsNotDeclaredByIdentifies,
getQualifiedNameOf(part),
getQualifiedNameOf(key),
getQualifiedNameOf(identifies));
validationTest(expectedProblems);
}
public void testKey_EveryOppositePartReferencesIdentifies() {
RelationalTransformation transformation = createRelationalTransformation(resource, "TestTransformation");
createTypedModel(transformation, "ecore", EcorePackage.eINSTANCE);
EReference oppositePart = EcorePackage.Literals.EFACTORY__EPACKAGE;
EClass identifies = EcorePackage.Literals.EOPERATION;
Key key = createKey(transformation, identifies);
key.getOppositePart().add(oppositePart);
ProblemLog expectedProblems = new ProblemLog();
expectedProblems.expectValidatorError(QVTRelationValidator.INSTANCE,
QVTRelationMessages._UI_Key_OppositePartDoesNotReferenceIdentifies,
getQualifiedNameOf(oppositePart),
getQualifiedNameOf(key),
getQualifiedNameOf(identifies));
validationTest(expectedProblems);
}
public void testRelation_EveryDomainIsARelationDomain() {
RelationalTransformation transformation = createRelationalTransformation(resource, "TestTransformation");
TypedModel typedModel1 = createTypedModel(transformation, "TestTypedModel1", EcorePackage.eINSTANCE);
TypedModel typedModel2 = createTypedModel(transformation, "TestTypedModel2", EcorePackage.eINSTANCE);
Relation relation = createRelation(transformation, "TestRelation");
RelationDomain domain1 = createRelationDomain(relation, "TestDomain1", typedModel1, "RootVariable1", getStringType());
createDomainPattern(domain1);
Domain domain2 = new DomainImpl() {};
domain2.setName("TestDomain2");
domain2.setTypedModel(typedModel2);
domain2.setIsCheckable(true);
domain2.setIsEnforceable(true);
relation.getDomain().add(domain2);
//
ProblemLog expectedProblems = new ProblemLog();
expectedProblems.expectValidatorError(QVTRelationValidator.INSTANCE,
QVTRelationMessages._UI_Relation_DomainIsNotARelationDomain,
getQualifiedNameOf(domain2));
validationTest(expectedProblems);
}
public void testOppositePropertyCallExp_PropertyIsReference() {
TestTransformation transformation = createTestTransformation(resource.getContents(), "TestTransformation");
EAttribute property = EcorePackage.Literals.ETYPED_ELEMENT__LOWER_BOUND;
OppositePropertyCallExp oppositePropertyCallExp = createOppositePropertyCallExp(null, property);
transformation.getContents().add(oppositePropertyCallExp);
//
ProblemLog expectedProblems = new ProblemLog();
expectedProblems.expectValidatorError(QVTRelationValidator.INSTANCE,
QVTRelationMessages._UI_OppositePropertyCallExp_PropertyIsNotAReference,
getQualifiedNameOf(property));
validationTest(expectedProblems);
}
public void testOppositePropertyCallExp_PropertyIsUnidirectional() {
TestTransformation transformation = createTestTransformation(resource.getContents(), "TestTransformation");
EReference property = EcorePackage.Literals.EOPERATION__EPARAMETERS;
OppositePropertyCallExp oppositePropertyCallExp = createOppositePropertyCallExp(null, property);
transformation.getContents().add(oppositePropertyCallExp);
//
ProblemLog expectedProblems = new ProblemLog();
expectedProblems.expectValidatorError(QVTRelationValidator.INSTANCE,
QVTRelationMessages._UI_OppositePropertyCallExp_PropertyIsNotUnidirectional,
getQualifiedNameOf(property));
validationTest(expectedProblems);
}
public void testRelation_AtLeastTwoDomains() {
RelationalTransformation transformation = createRelationalTransformation(resource, "TestTransformation");
TypedModel typedModel1 = createTypedModel(transformation, "TestTypedModel1", EcorePackage.eINSTANCE);
Relation relation = createRelation(transformation, "TestRelation");
RelationDomain domain = createRelationDomain(relation, "TestDomain", typedModel1, "RootVariable1", getStringType());
createDomainPattern(domain);
//
ProblemLog expectedProblems = new ProblemLog();
expectedProblems.expectValidatorError(QVTRelationValidator.INSTANCE,
QVTRelationMessages._UI_Relation_LessThanTwoDomains,
getQualifiedNameOf(relation));
validationTest(expectedProblems);
}
public void testRelation_NonTopLevelIsNotInvokedWarning() {
}
public void testRelation_RelationImplsAreUniqueWarning() {
}
public void testRelation_DomainTypedModelsMatchModelParameters() {
RelationalTransformation transformation = createRelationalTransformation(resource, "TestTransformation");
TypedModel typedModel1 = createTypedModel(transformation, "TestTypedModel1", EcorePackage.eINSTANCE);
TypedModel typedModel2 = createTypedModel(transformation, "TestTypedModel2", EcorePackage.eINSTANCE);
TypedModel typedModel3 = createTypedModel(transformation, "TestTypedModel3", EcorePackage.eINSTANCE);
Relation relation = createRelation(transformation, "TestRelation");
RelationDomain domain1 = createRelationDomain(relation, "TestDomain1", typedModel1, "RootVariable1", getStringType());
createDomainPattern(domain1);
RelationDomain domain2 = createRelationDomain(relation, "TestDomain2", typedModel2, "RootVariable2", getStringType());
createDomainPattern(domain2);
//
ProblemLog expectedProblems1 = new ProblemLog();
expectedProblems1.expectValidatorError(QVTRelationValidator.INSTANCE,
QVTRelationMessages._UI_Relation_DomainTypedModelsDoNotMatchModelParameters,
"2",
getQualifiedNameOf(relation),
"3");
validationTest(expectedProblems1);
//
RelationDomain domain3 = createRelationDomain(relation, "TestDomain3", typedModel1, "RootVariable3", getStringType());
createDomainPattern(domain3);
//
ProblemLog expectedProblems2 = new ProblemLog();
expectedProblems2.expectValidatorError(QVTRelationValidator.INSTANCE,
QVTRelationMessages._UI_Relation_DomainTypedModelIsNotModelParameter,
getQualifiedNameOf(domain3),
getQualifiedNameOf(typedModel3));
validationTest(expectedProblems2);
//
domain3.setTypedModel(typedModel3);
//
validationTest(new ProblemLog());
}
public void testRelation_VariablesAreUnique() {
RelationalTransformation transformation = createRelationalTransformation(resource, "TestTransformation");
TypedModel typedModel1 = createTypedModel(transformation, "TestTypedModel1", EcorePackage.eINSTANCE);
TypedModel typedModel2 = createTypedModel(transformation, "TestTypedModel2", EcorePackage.eINSTANCE);
Relation relation = createRelation(transformation, "TestRelation");
EClass type = EcorePackage.Literals.ENAMED_ELEMENT;
RelationDomain domain1 = createRelationDomain(relation, "TestDomain1", typedModel1, "RootVariable1", type);
createDomainPattern(domain1);
RelationDomain domain2 = createRelationDomain(relation, "TestDomain2", typedModel2, "RootVariable2", type);
createDomainPattern(domain2);
String name = "Variable1";
Variable var1 = createVariable(relation.getVariable(), name, type);
Variable var2 = createVariable(relation.getVariable(), name, type);
//
ProblemLog expectedProblems = new ProblemLog();
expectedProblems.expectValidatorError(QVTRelationValidator.INSTANCE,
QVTRelationMessages._UI_Relation_VariableNameIsNotUnique,
name,
getQualifiedNameOf(var1),
getQualifiedNameOf(var2));
validationTest(expectedProblems);
}
public void testRelation_WhenTypesAreDeclaredByRelation() {
EReference relationFeature = QVTRelationPackage.Literals.RELATION__WHEN;
String message = QVTRelationMessages._UI_Relation_WhenTypeIsNotDeclaredByRelation;
checkPatternTypesAreDeclared(relationFeature, message);
}
public void testRelation_WhenVariablesAreDefinedByRelation() {
EReference relationFeature = QVTRelationPackage.Literals.RELATION__WHEN;
String message = QVTRelationMessages._UI_Relation_WhenVariableIsNotDefinedByRelation;
checkPatternVariablesAreDefined(relationFeature, message);
}
public void testRelation_WhereTypesAreDeclaredByRelation() {
EReference relationFeature = QVTRelationPackage.Literals.RELATION__WHERE;
String message = QVTRelationMessages._UI_Relation_WhereTypeIsNotDeclaredByRelation;
checkPatternTypesAreDeclared(relationFeature, message);
}
public void testRelation_WhereVariablesAreDefinedByRelation() {
EReference relationFeature = QVTRelationPackage.Literals.RELATION__WHERE;
String message = QVTRelationMessages._UI_Relation_WhereVariableIsNotDefinedByRelation;
checkPatternVariablesAreDefined(relationFeature, message);
}
public void testRelationCallExp_PatternExists() {
RelationalTransformation transformation = createRelationalTransformation(resource, "TestTransformation");
TypedModel typedModel1 = createTypedModel(transformation, "TestTypedModel1", EcorePackage.eINSTANCE);
TypedModel typedModel2 = createTypedModel(transformation, "TestTypedModel2", EcorePackage.eINSTANCE);
Relation relation = createRelation(transformation, "TestRelation");
RelationDomain domain1 = createRelationDomain(relation, "TestDomain1", typedModel1, "RootVariable1", getStringType());
createDomainPattern(domain1);
RelationDomain domain2 = createRelationDomain(relation, "TestDomain2", typedModel2, "RootVariable2", getStringType());
createDomainPattern(domain2);
RelationCallExp relationCallExp = createRelationCallExp(relation, createStringLiteralExp("a"), createStringLiteralExp("b"));
resource.getContents().add(relationCallExp);
//
ProblemLog expectedProblems = new ProblemLog();
expectedProblems.expectValidatorError(QVTRelationValidator.INSTANCE,
QVTRelationMessages._UI_RelationCallExp_PatternDoesNotExist,
getQualifiedNameOf(relationCallExp));
validationTest(expectedProblems);
}
public void testRelationCallExp_RelationExists() {
RelationalTransformation transformation = createRelationalTransformation(resource, "TestTransformation");
TypedModel typedModel1 = createTypedModel(transformation, "TestTypedModel1", EcorePackage.eINSTANCE);
TypedModel typedModel2 = createTypedModel(transformation, "TestTypedModel2", EcorePackage.eINSTANCE);
Relation relation = createRelation(transformation, "TestRelation");
RelationDomain domain1 = createRelationDomain(relation, "TestDomain1", typedModel1, "RootVariable1", getStringType());
createDomainPattern(domain1);
RelationDomain domain2 = createRelationDomain(relation, "TestDomain2", typedModel2, "RootVariable2", getStringType());
createDomainPattern(domain2);
RelationCallExp relationCallExp = createRelationCallExp(relation, createStringLiteralExp("a"), createStringLiteralExp("b"));
Pattern pattern = createPattern(null);
Predicate predicate = createPredicate(pattern.getPredicate());
predicate.setConditionExpression(relationCallExp);
resource.getContents().add(pattern);
//
ProblemLog expectedProblems = new ProblemLog();
expectedProblems.expectValidatorError(QVTRelationValidator.INSTANCE,
QVTRelationMessages._UI_RelationCallExp_RelationDoesNotExist,
getQualifiedNameOf(relationCallExp));
validationTest(expectedProblems);
}
public void testRelationCallExp_InvokedFromWhenOrWhereClause() {
RelationalTransformation transformation = createRelationalTransformation(resource, "TestTransformation");
TypedModel typedModel1 = createTypedModel(transformation, "TestTypedModel1", EcorePackage.eINSTANCE);
TypedModel typedModel2 = createTypedModel(transformation, "TestTypedModel2", EcorePackage.eINSTANCE);
Relation relation = createRelation(transformation, "TestRelation");
RelationDomain domain1 = createRelationDomain(relation, "TestDomain1", typedModel1, "RootVariable1", getStringType());
createDomainPattern(domain1);
RelationDomain domain2 = createRelationDomain(relation, "TestDomain2", typedModel2, "RootVariable2", getStringType());
DomainPattern pattern = createDomainPattern(domain2);
ObjectTemplateExp templateExp = createObjectTemplateExp(domain2.getRootVariable(), EcorePackage.Literals.EDATA_TYPE);
pattern.setTemplateExpression(templateExp);
pattern.getBindsTo().add(domain2.getRootVariable());
RelationCallExp relationCallExp = createRelationCallExp(relation, createStringLiteralExp("a"), createStringLiteralExp("b"));
createPropertyTemplateItem(templateExp, EcorePackage.Literals.EDATA_TYPE__SERIALIZABLE, relationCallExp);
//
ProblemLog expectedProblems = new ProblemLog();
expectedProblems.expectValidatorError(QVTRelationValidator.INSTANCE,
QVTRelationMessages._UI_RelationCallExp_NotInvokedFromWhenOrWhereClause,
getQualifiedNameOf(relationCallExp));
validationTest(expectedProblems);
}
public void testRelationCallExp_ReferredRelationDeclaredByTransformation() {
RelationalTransformation transformation = createRelationalTransformation(resource, "TestTransformation");
TypedModel typedModel1 = createTypedModel(transformation, "TestTypedModel1", EcorePackage.eINSTANCE);
TypedModel typedModel2 = createTypedModel(transformation, "TestTypedModel2", EcorePackage.eINSTANCE);
Relation relation = createRelation(transformation, "TestRelation");
RelationDomain domain1 = createRelationDomain(relation, "TestDomain1", typedModel1, "RootVariable1", getStringType());
createDomainPattern(domain1);
RelationDomain domain2 = createRelationDomain(relation, "TestDomain2", typedModel2, "RootVariable2", getStringType());
createDomainPattern(domain2);
RelationalTransformation anotherTransformation = createRelationalTransformation(resource, "AnotherTestTransformation");
TypedModel anotherTypedModel1 = createTypedModel(anotherTransformation, "AnotherTestTypedModel1", EcorePackage.eINSTANCE);
TypedModel anotherTypedModel2 = createTypedModel(anotherTransformation, "AnotherTestTypedModel2", EcorePackage.eINSTANCE);
Relation anotherRelation = createRelation(anotherTransformation, "AnotherTestRelation");
RelationDomain anotherDomain1 = createRelationDomain(anotherRelation, "AnotherTestDomain1", anotherTypedModel1, "AnotherRootVariable1", getStringType());
createDomainPattern(anotherDomain1);
RelationDomain anotherDomain2 = createRelationDomain(anotherRelation, "AnotherTestDomain2", anotherTypedModel2, "AnotherRootVariable2", getBooleanType());
createDomainPattern(anotherDomain2);
Pattern pattern = createPattern(null);
Predicate predicate = createPredicate(pattern.getPredicate());
RelationCallExp relationCallExp = createRelationCallExp(anotherRelation, createStringLiteralExp("a"), createBooleanLiteralExp(true));
predicate.setConditionExpression(relationCallExp);
relation.setWhen(pattern);
//
ProblemLog expectedProblems = new ProblemLog();
expectedProblems.expectValidatorError(QVTRelationValidator.INSTANCE,
QVTRelationMessages._UI_RelationCallExp_ReferredRelationIsNotDeclaredByTransformation,
getQualifiedNameOf(anotherRelation),
getQualifiedNameOf(transformation));
validationTest(expectedProblems);
}
public void testRelationCallExp_ReferredRelationArgumentNumberMatches() {
RelationalTransformation transformation = createRelationalTransformation(resource, "TestTransformation");
TypedModel typedModel1 = createTypedModel(transformation, "TestTypedModel1", EcorePackage.eINSTANCE);
TypedModel typedModel2 = createTypedModel(transformation, "TestTypedModel2", EcorePackage.eINSTANCE);
Relation relation = createRelation(transformation, "TestRelation");
RelationDomain domain1 = createRelationDomain(relation, "TestDomain1", typedModel1, "RootVariable1", getStringType());
createDomainPattern(domain1);
RelationDomain domain2 = createRelationDomain(relation, "TestDomain2", typedModel2, "RootVariable2", getStringType());
createDomainPattern(domain2);
Pattern pattern = createPattern(null);
Predicate predicate = createPredicate(pattern.getPredicate());
RelationCallExp relationCallExp = createRelationCallExp(relation, createStringLiteralExp("a"), createStringLiteralExp("b"), createStringLiteralExp("c"));
predicate.setConditionExpression(relationCallExp);
relation.setWhen(pattern);
//
ProblemLog expectedProblems = new ProblemLog();
expectedProblems.expectValidatorError(QVTRelationValidator.INSTANCE,
QVTRelationMessages._UI_RelationCallExp_ReferredRelationArgumentNumberDoesNotMatch,
String.valueOf(3),
String.valueOf(2),
getQualifiedNameOf(relationCallExp));
validationTest(expectedProblems);
}
public void testRelationCallExp_EveryWhenReferredRelationArgumentTypeMatches() {
RelationalTransformation transformation = createRelationalTransformation(resource, "TestTransformation");
TypedModel typedModel1 = createTypedModel(transformation, "TestTypedModel1", EcorePackage.eINSTANCE);
TypedModel typedModel2 = createTypedModel(transformation, "TestTypedModel2", EcorePackage.eINSTANCE);
Relation relation = createRelation(transformation, "TestRelation");
EClass baseType = EcorePackage.Literals.ENAMED_ELEMENT;
EClass derivedType = EcorePackage.Literals.EDATA_TYPE;
RelationDomain domain1 = createRelationDomain(relation, "TestDomain1", typedModel1, "RootVariable1", derivedType);
createDomainPattern(domain1);
RelationDomain domain2 = createRelationDomain(relation, "TestDomain2", typedModel2, "RootVariable2", baseType);
createDomainPattern(domain2);
Pattern pattern = createPattern(null);
Predicate predicate = createPredicate(pattern.getPredicate());
Variable var1 = createVariable(relation.getVariable(), "Variable1", baseType);
Variable var2 = createVariable(relation.getVariable(), "Variable2", derivedType);
RelationCallExp relationCallExp = createRelationCallExp(relation, createVariableExp(var1), createVariableExp(var2));
predicate.setConditionExpression(relationCallExp);
pattern.getBindsTo().add(var1);
pattern.getBindsTo().add(var2);
relation.setWhen(pattern);
//
ProblemLog expectedProblems = new ProblemLog();
expectedProblems.expectValidatorError(QVTRelationValidator.INSTANCE,
QVTRelationMessages._UI_RelationCallExp_WhenReferredRelationArgumentTypeDoesNotMatch,
getQualifiedNameOf(baseType),
getQualifiedNameOf(derivedType),
getQualifiedNameOf(domain1));
// expectedProblems.expectValidatorError(QVTRelationValidator.INSTANCE,
// QVTRelationMessages._UI_RelationCallExp_WhenReferredRelationArgumentTypeDoesNotMatch,
// getQualifiedNameOf(derivedType),
// getQualifiedNameOf(baseType),
// getQualifiedNameOf(domain2));
validationTest(expectedProblems);
}
public void testRelationCallExp_EveryWhereReferredRelationArgumentTypeIsMatchableWarning() {
RelationalTransformation transformation = createRelationalTransformation(resource, "TestTransformation");
TypedModel typedModel1 = createTypedModel(transformation, "TestTypedModel1", EcorePackage.eINSTANCE);
TypedModel typedModel2 = createTypedModel(transformation, "TestTypedModel2", EcorePackage.eINSTANCE);
TypedModel typedModel3 = createTypedModel(transformation, "TestTypedModel3", EcorePackage.eINSTANCE);
Relation relation = createRelation(transformation, "TestRelation");
EClass baseType = EcorePackage.Literals.ENAMED_ELEMENT;
EClass derivedType = EcorePackage.Literals.EDATA_TYPE;
EClass orthogonalType = EcorePackage.Literals.EFACTORY;
RelationDomain domain1 = createRelationDomain(relation, "TestDomain1", typedModel1, "RootVariable1", derivedType);
createDomainPattern(domain1);
RelationDomain domain2 = createRelationDomain(relation, "TestDomain2", typedModel2, "RootVariable2", baseType);
createDomainPattern(domain2);
RelationDomain domain3 = createRelationDomain(relation, "TestDomain3", typedModel3, "RootVariable3", derivedType);
createDomainPattern(domain3);
Pattern pattern = createPattern(null);
Predicate predicate = createPredicate(pattern.getPredicate());
Variable var1 = createVariable(relation.getVariable(), "Variable1", baseType);
Variable var2 = createVariable(relation.getVariable(), "Variable2", derivedType);
Variable var3 = createVariable(relation.getVariable(), "Variable3", orthogonalType);
RelationCallExp relationCallExp = createRelationCallExp(relation, createVariableExp(var1), createVariableExp(var2), createVariableExp(var3));
predicate.setConditionExpression(relationCallExp);
pattern.getBindsTo().add(var1);
pattern.getBindsTo().add(var2);
pattern.getBindsTo().add(var3);
relation.setWhere(pattern);
//
ProblemLog expectedProblems = new ProblemLog();
expectedProblems.expectValidatorWarning(QVTRelationValidator.INSTANCE,
QVTRelationMessages._UI_RelationCallExp_WhereReferredRelationArgumentTypeIsNotMatchableWarning,
getQualifiedNameOf(orthogonalType),
getQualifiedNameOf(derivedType),
getQualifiedNameOf(domain3));
validationTest(expectedProblems);
}
public void testRelationCallExp_TypeIsBoolean() {
RelationalTransformation transformation = createRelationalTransformation(resource, "TestTransformation");
TypedModel typedModel1 = createTypedModel(transformation, "TestTypedModel1", EcorePackage.eINSTANCE);
TypedModel typedModel2 = createTypedModel(transformation, "TestTypedModel2", EcorePackage.eINSTANCE);
Relation relation = createRelation(transformation, "TestRelation");
RelationDomain domain1 = createRelationDomain(relation, "TestDomain1", typedModel1, "RootVariable1", getStringType());
createDomainPattern(domain1);
RelationDomain domain2 = createRelationDomain(relation, "TestDomain2", typedModel2, "RootVariable2", getStringType());
createDomainPattern(domain2);
RelationCallExp relationCallExp = createRelationCallExp(relation, createStringLiteralExp("a"), createStringLiteralExp("b"));
Pattern pattern = createPattern(null);
relation.setWhen(pattern);
Predicate predicate = createPredicate(pattern.getPredicate());
predicate.setConditionExpression(relationCallExp);
relationCallExp.setType(getStringType());
//
ProblemLog expectedProblems = new ProblemLog();
expectedProblems.expectValidatorError(QVTRelationValidator.INSTANCE,
QVTRelationMessages._UI_RelationCallExp_TypeIsNotBoolean,
getQualifiedNameOf(relationCallExp));
expectedProblems.expectValidatorError(QVTBaseValidator.INSTANCE,
QVTBaseMessages._UI_Predicate_ConditionExpressionIsNotBoolean,
getQualifiedNameOf(predicate));
validationTest(expectedProblems);
//
relationCallExp.setType(getBooleanType());
//
validationTest(new ProblemLog());
}
public void testRelationDomain_RootVariableIsDefinedByRelation() {
RelationalTransformation transformation = createRelationalTransformation(resource, "TestTransformation");
TypedModel typedModel1 = createTypedModel(transformation, "TestTypedModel1", EcorePackage.eINSTANCE);
TypedModel typedModel2 = createTypedModel(transformation, "TestTypedModel2", EcorePackage.eINSTANCE);
Relation relation = createRelation(transformation, "TestRelation");
RelationDomain domain1 = createRelationDomain(relation, "TestDomain1", typedModel1, "RootVariable1", getStringType());
createDomainPattern(domain1);
RelationDomain domain2 = createRelationDomain(relation, "TestDomain2", typedModel2, "RootVariable2", getStringType());
createDomainPattern(domain2);
RelationalTransformation anotherTransformation = createRelationalTransformation(resource, "AnotherTestTransformation");
TypedModel anotherTypedModel1 = createTypedModel(anotherTransformation, "AnotherTestTypedModel1", EcorePackage.eINSTANCE);
TypedModel anotherTypedModel2 = createTypedModel(anotherTransformation, "AnotherTestTypedModel2", EcorePackage.eINSTANCE);
Relation anotherRelation = createRelation(anotherTransformation, "AnotherTestRelation");
RelationDomain anotherDomain1 = createRelationDomain(anotherRelation, "AnotherTestDomain1", anotherTypedModel1, "AnotherRootVariable1", getBooleanType());
createDomainPattern(anotherDomain1);
RelationDomain anotherDomain2 = createRelationDomain(anotherRelation, "AnotherTestDomain2", anotherTypedModel2, "AnotherRootVariable2", getBooleanType());
createDomainPattern(anotherDomain2);
//
validationTest(new ProblemLog());
//
Variable rootVariable = anotherDomain2.getRootVariable();
domain2.setRootVariable(rootVariable);
//
ProblemLog expectedProblems = new ProblemLog();
expectedProblems.expectValidatorError(QVTBaseValidator.INSTANCE,
QVTRelationMessages._UI_RelationDomain_RootVariableIsNotDefinedByRelation,
getQualifiedNameOf(rootVariable),
getQualifiedNameOf(relation));
validationTest(expectedProblems);
}
/**
* Validates the RootVariableTypeIsDeclaredByDomainTypedModel constraint of '<em>Relation Domain</em>'.
*/
public void testRelationDomain_RootVariableTypeIsDeclaredByDomainTypedModel() {
RelationalTransformation transformation = createRelationalTransformation(resource, "TestTransformation");
TypedModel typedModel1 = createTypedModel(transformation, "TestTypedModel1", EcorePackage.eINSTANCE);
TypedModel typedModel2 = createTypedModel(transformation, "TestTypedModel2", EcorePackage.eINSTANCE);
Relation relation = createRelation(transformation, "TestRelation");
RelationDomain domain1 = createRelationDomain(relation, "TestDomain1", typedModel1, "RootVariable1", getStringType());
createDomainPattern(domain1);
RelationDomain domain2 = createRelationDomain(relation, "TestDomain2", typedModel2, "RootVariable2", getStringType());
createDomainPattern(domain2);
//
validationTest(new ProblemLog());
//
Variable rootVariable = domain2.getRootVariable();
EClass badType = QVTRelationPackage.Literals.RELATION;
rootVariable.setEType(badType);
//
ProblemLog expectedProblems = new ProblemLog();
expectedProblems.expectValidatorError(QVTBaseValidator.INSTANCE,
QVTRelationMessages._UI_RelationDomain_RootVariableTypeIsNotDeclaredByDomainTypedModel,
getQualifiedNameOf(badType),
getQualifiedNameOf(rootVariable),
getQualifiedNameOf(domain2));
validationTest(expectedProblems);
}
public void testRelationDomain_EveryEnforceableVariableIsMatchedOrAssigned() {
// TODO test the constraint
}
public void testRelationDomainAssignment_VariableDefinedByRelation() {
RelationalTransformation transformation = createRelationalTransformation(resource, "TestTransformation");
TypedModel typedModel1 = createTypedModel(transformation, "TestTypedModel1", EcorePackage.eINSTANCE);
TypedModel typedModel2 = createTypedModel(transformation, "TestTypedModel2", EcorePackage.eINSTANCE);
Relation relation = createRelation(transformation, "TestRelation");
RelationDomain domain1 = createRelationDomain(relation, "TestDomain1", typedModel1, "RootVariable1", getStringType());
createDomainPattern(domain1);
RelationDomain domain2 = createRelationDomain(relation, "TestDomain2", typedModel2, "RootVariable2", getStringType());
createDomainPattern(domain2);
RelationalTransformation anotherTransformation = createRelationalTransformation(resource, "AnotherTestTransformation");
TypedModel anotherTypedModel1 = createTypedModel(anotherTransformation, "AnotherTestTypedModel1", EcorePackage.eINSTANCE);
TypedModel anotherTypedModel2 = createTypedModel(anotherTransformation, "AnotherTestTypedModel2", EcorePackage.eINSTANCE);
Relation anotherRelation = createRelation(anotherTransformation, "AnotherTestRelation");
RelationDomain anotherDomain1 = createRelationDomain(anotherRelation, "AnotherTestDomain1", anotherTypedModel1, "AnotherRootVariable1", getBooleanType());
createDomainPattern(anotherDomain1);
RelationDomain anotherDomain2 = createRelationDomain(anotherRelation, "AnotherTestDomain2", anotherTypedModel2, "AnotherRootVariable2", getBooleanType());
createDomainPattern(anotherDomain2);
Variable anotherRootVariable = anotherDomain2.getRootVariable();
createRelationDomainAssignment(domain1, anotherRootVariable, createBooleanLiteralExp(false));
//
ProblemLog expectedProblems = new ProblemLog();
expectedProblems.expectValidatorError(QVTRelationValidator.INSTANCE,
QVTRelationMessages._UI_RelationDomainAssignment_VariableIsNotDefinedByRelation,
getQualifiedNameOf(anotherRootVariable),
getQualifiedNameOf(relation));
validationTest(expectedProblems);
}
public void testRelationDomainAssignment_VariableTypeMatchesValueType() {
RelationalTransformation transformation = createRelationalTransformation(resource, "TestTransformation");
TypedModel typedModel1 = createTypedModel(transformation, "TestTypedModel1", EcorePackage.eINSTANCE);
TypedModel typedModel2 = createTypedModel(transformation, "TestTypedModel2", EcorePackage.eINSTANCE);
Relation relation = createRelation(transformation, "TestRelation");
RelationDomain domain1 = createRelationDomain(relation, "TestDomain1", typedModel1, "RootVariable1", getStringType());
createDomainPattern(domain1);
RelationDomain domain2 = createRelationDomain(relation, "TestDomain2", typedModel2, "RootVariable2", getStringType());
createDomainPattern(domain2);
Variable rootVariable = domain2.getRootVariable();
createRelationDomainAssignment(domain1, rootVariable, createBooleanLiteralExp(true));
//
ProblemLog expectedProblems = new ProblemLog();
expectedProblems.expectValidatorError(QVTRelationValidator.INSTANCE,
QVTRelationMessages._UI_RelationDomainAssignment_VariableTypeMatchesValueType,
getQualifiedNameOf(getStringType()),
getQualifiedNameOf(rootVariable),
getQualifiedNameOf(getBooleanType()));
validationTest(expectedProblems);
}
public void testRelationImplementation_InDirectionOfIsDefinedByTransformation() {
// TODO test the constraint
// _UI_RelationImplementation_DirectionIsNotDefinedByTransformation
}
public void testRelationImplementation_EveryParameterTypeMatchesDomainRootVariableType() {
// TODO test the constraint
}
public void testRelationalTransformation_KeysAreDistinct() {
RelationalTransformation transformation = createRelationalTransformation(resource, "TestTransformation");
createTypedModel(transformation, "ecore", EcorePackage.eINSTANCE);
Key key1 = createKey(transformation, EcorePackage.Literals.ENAMED_ELEMENT, EcorePackage.Literals.ENAMED_ELEMENT__NAME);
createKey(transformation, EcorePackage.Literals.EOPERATION, EcorePackage.Literals.ENAMED_ELEMENT__NAME);
//
validationTest(new ProblemLog());
//
createKey(transformation, EcorePackage.Literals.ENAMED_ELEMENT, EcorePackage.Literals.ENAMED_ELEMENT__NAME);
//
ProblemLog expectedProblems = new ProblemLog();
expectedProblems.expectValidatorError(QVTRelationValidator.INSTANCE,
QVTRelationMessages._UI_RelationalTransformation_KeyIsNotUnique,
getQualifiedNameOf(key1.getIdentifies()));
validationTest(expectedProblems);
}
// public void testRelationalTransformation_UniqueClassifierNames() {
// }
public void testRelationalTransformation_EveryRuleIsARelation() {
RelationalTransformation transformation = createRelationalTransformation(resource, "TestTransformation");
Rule rule = new RuleImpl() {};
rule.setName("TestRule");
transformation.getRule().add(rule);
//
ProblemLog expectedProblems = new ProblemLog();
expectedProblems.expectValidatorError(QVTRelationValidator.INSTANCE,
QVTRelationMessages._UI_RelationalTransformation_RuleIsNotARelation,
getQualifiedNameOf(rule));
validationTest(expectedProblems);
}
}