blob: 5f9052d11d0591710266e1aac27725aaf7e48781 [file] [log] [blame]
/**
* Copyright (c) 2009, 2018 Obeo 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:
* Obeo - initial API and implementation
* Axel Uhl (SAP AG) - Bug 342644
*/
package org.eclipse.ocl.tests;
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Set;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.ocl.EvaluationVisitor;
import org.eclipse.ocl.expressions.OCLExpression;
/**
* This framework can be used to ease the testing of the evaluation visitor
* implementation.
*
* @author Laurent Goubet (lgoubet)
*/
@SuppressWarnings("nls")
public abstract class GenericEvaluationTestSuite<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> {
/**
* Instance of the invalid type. This is a shortcut for
*
* <pre>
* ocl.getEnvironment().getOCLStandardLibrary().getInvalid()
* </pre>
*/
protected Object invalidObject;
/** This is the visitor that will be tested by the underlying tests. */
protected EvaluationVisitor<PK, C, O, P, EL, PM, S, COA, SSA, CT, CLS, E> visitor;
/**
* Creates a query given the expression that is to be evaluated, then
* asserts its result contains all elements included in
* <code>expectedResult</code>.
*
* @param expectedResult
* Collection with which the query's result is to be compared.
* @param expression
* Expression that is to be evaluated. Note that we'll use
* {@link EClass} as this expression's context.
*/
@SuppressWarnings("unchecked")
protected void assertResultContainsAll(Collection<Object> expectedResult, String expression) {
OCLExpression<C> query = createQuery(getContext(), expression);
Object result = visitor.visitExpression(query);
assertTrue(expectedResult.getClass().isInstance(result));
assertSame(expectedResult.size(), ((Collection<Object>) result).size());
assertTrue(((Collection<Object>) result).containsAll(expectedResult));
}
@SuppressWarnings("unchecked")
protected CLS getContext() {
return (CLS) getMetaclass(denormalize("%Package"));
}
/**
* Creates a query given the expression that is to be evaluated, then
* asserts its result contains all elements included in
* <code>expectedResult</code>.
*
* @param expectedResultExpression
* Expression which is to be evaluated to determine the expected
* result.
* @param expression
* Expression that is to be evaluated. Note that we'll use
* {@link EClass} as this expression's context.
*/
@SuppressWarnings("unchecked")
protected void assertResultContainsAll(String expectedResultExpression, String expression) {
OCLExpression<C> expectedResultQuery = createQuery(
getContext(), expectedResultExpression);
Object result = visitor.visitExpression(expectedResultQuery);
assertTrue(result instanceof Collection<?>);
assertResultContainsAll((Collection<Object>) result, expression);
}
/**
* Creates a query given the expression that is to be evaluated, then
* asserts its result is equal to the given <code>expectedResult</code>.
* <p>
* If either the expected result or the expression result is a double, we'll
* compare the two with a margin of 0.001.
* </p>
*
* @param expectedResult
* Object with which the query's result is to be compared.
* @param expression
* Expression that is to be evaluated. Note that we'll use
* {@link EClass} as this expression's context.
*/
@SuppressWarnings("unchecked")
protected void assertResult(Object expectedResult, String expression) {
OCLExpression<C> query = createQuery(getContext(), expression);
Object result = visitor.visitExpression(query);
if (expectedResult instanceof Double && result instanceof Double) {
assertEquals(((Double) expectedResult).doubleValue(),
((Double) result).doubleValue(), 0.001d);
} else if (expectedResult instanceof LinkedHashSet<?>) {
/*
* Set is represented as HashSet but may also be emptySet,
* OrderedSet as LinkedHashSet. Java does not check for the ordering
* when calling equals, we'll then statically check for the instance
* type. Bag and Sequence do not present the same issue because of
* the implementation of BagImpl#equals().
*/
assertTrue(result instanceof LinkedHashSet<?>);
assertSame(((LinkedHashSet<?>) result).size(),
((LinkedHashSet<?>) expectedResult).size());
final Iterator<Object> resultIterator = ((LinkedHashSet<Object>) result)
.iterator();
final Iterator<Object> expectedResultIterator = ((LinkedHashSet<Object>) expectedResult)
.iterator();
while (resultIterator.hasNext()) {
assertEquals(resultIterator.next(), expectedResultIterator
.next());
}
} else if (expectedResult instanceof Set<?>) {
assertTrue(result instanceof Set<?> && !(result instanceof LinkedHashSet<?>));
assertEquals(expectedResult, result);
} else if (expectedResult instanceof Collection<?>) {
assertTrue(expectedResult.getClass().isInstance(result));
assertEquals(expectedResult, result);
} else {
assertEquals(expectedResult, result);
}
}
/**
* This will evaluate the given OCL expression and assert its result is
* equal to {@link Boolean#TRUE}.
*
* @param expression
* Expression that is to be evaluated. Note that we'll use
* {@link EClass} as this expression's context.
*/
protected void assertResultTrue(String expression) {
assertResult(Boolean.TRUE, expression);
}
/**
* This will evaluate the given OCL expression and assert its result is
* equal to {@link Boolean#FALSE}.
*
* @param expression
* Expression that is to be evaluated. Note that we'll use
* {@link EClass} as this expression's context.
*/
protected void assertResultFalse(String expression) {
assertResult(Boolean.FALSE, expression);
}
/**
* This will evaluate the given OCL expression and assert its result is
* equal to the OCL library's invalid Object.
*
* @param expression
* Expression that is to be evaluated. Note that we'll use
* {@link EClass} as this expression's context.
*/
protected void assertResultInvalid(String expression) {
assertResult(invalidObject, expression);
}
/**
* Creates a query given the expression that is to be evaluated, then
* asserts its result is equal to the evaluation of the given
* <code>expectedResultExpression</code>.
* <p>
* If either the expected result or the expression result is a double, we'll
* compare the two with a margin of 0.001.
* </p>
*
* @param expectedResult
* Object with which the query's result is to be compared.
* @param expression
* Expression that is to be evaluated. Note that we'll use
* {@link EClass} as this expression's context.
*/
protected void assertExpressionResults(String expectedResultExpression, String expression) {
OCLExpression<C> expectedResultQuery = createQuery(
getContext(), expectedResultExpression);
Object result = visitor.visitExpression(expectedResultQuery);
assertResult(result, expression);
}
/**
* {@inheritDoc}
*
* @see org.eclipse.ocl.ecore.tests.AbstractTestSuite#setUp()
*/
@Override
protected void setUp() {
super.setUp();
visitor = ocl.getEnvironment().getFactory().createEvaluationVisitor(ocl.getEnvironment(), ocl.getEvaluationEnvironment(), ocl.getExtentMap());
invalidObject = ocl.getEnvironment().getOCLStandardLibrary()
.getInvalid();
}
}