/* * Copyright (C) 2011 by Claas Wilke (claas.wilke@tu-dresden.de) This file is part of * the Meta Model Architecture of Dresden OCL. Dresden OCL * is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free * Software Foundation, either version 3 of the License, or (at your option) any * later version. Dresden OCL is distributed in the hope that it * will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser * General Public License for more details. You should have received a copy of * the GNU Lesser General Public License along with Dresden OCL. If * not, see <http://www.gnu.org/licenses/>. */ package org.dresdenocl.metamodels.test.tests; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import org.apache.log4j.Logger; import org.eclipse.emf.common.util.EList; import org.eclipse.osgi.util.NLS; import org.junit.BeforeClass; import org.junit.Test; import org.dresdenocl.essentialocl.EssentialOclPlugin; import org.dresdenocl.metamodels.test.MetaModelTestPlugin; import org.dresdenocl.metamodels.test.MetaModelTestServices; import org.dresdenocl.metamodels.test.msg.MetaModelTestSuiteMessages; import org.dresdenocl.model.IModel; import org.dresdenocl.model.metamodel.IMetamodel; import org.dresdenocl.pivotmodel.Operation; import org.dresdenocl.pivotmodel.Parameter; import org.dresdenocl.pivotmodel.PrimitiveType; import org.dresdenocl.pivotmodel.Type; /** * <p> * This class provides test cases to test the {@link PrimitiveType} * implementation/adaptation of a {@link IMetamodel}. * </p> * * @author Claas Wilke * */ public class TestOperation { /** The {@link Logger} for this class. */ private static final Logger LOGGER = MetaModelTestPlugin .getLogger(TestOperation.class); /** A {@link Type} of the current {@link IModel} under test. */ private static Type testTypeClass1; /** A {@link Type} of the current {@link IModel} under test. */ private static Type testOperationAndParameterClass; /** An {@link Operation} of the current {@link IModel} under test. */ private static Operation operation1; /** An {@link Operation} of the current {@link IModel} under test. */ private static Operation operation2; /** An {@link Operation} of the current {@link IModel} under test. */ private static Operation outputParameterOperation; /** An {@link Operation} of the current {@link IModel} under test. */ private static Operation staticOperation; /** An {@link Operation} of the current {@link IModel} under test. */ private static Operation multipleOperation; /** An {@link Operation} of the current {@link IModel} under test. */ private static Operation orderedMultipleOperation; /** An {@link Operation} of the current {@link IModel} under test. */ private static Operation unorderedMultipleOperation; /** An {@link Operation} of the current {@link IModel} under test. */ private static Operation uniqueMultipleOperation; /** An {@link Operation} of the current {@link IModel} under test. */ private static Operation nonuniqueMultipleOperation; /** * <p> * Loads some elements from the current {@link IModel} under test required * for the tests contained in this Class. * </p> */ @BeforeClass public static void setUp() { if (!MetaModelTestServices.supportsNoOperations) { testTypeClass1 = MetaModelTestServices .getInstance() .getTypeUnderTest( MetaModelTestServices.TYPE_QUALIFIED_NAME_TESTTYPECLASS1); testOperationAndParameterClass = MetaModelTestServices .getInstance() .getTypeUnderTest( MetaModelTestServices.TYPE_QUALIFIED_NAME_TESTOPERATIONANDPARAMETERCLASS); /* Find some operations in the class. */ for (Operation anOperation : testOperationAndParameterClass .getOwnedOperation()) { if (anOperation .getName() .equals(MetaModelTestServices.OPERATION_NAME_OPERATIONWITHOUTPARAMETERS)) { operation1 = anOperation; } // no else. if (anOperation .getName() .equals(MetaModelTestServices.OPERATION_NAME_VOIDOPERATIONWITHPARAMETER)) { operation2 = anOperation; } // no else. if (anOperation .getName() .equals(MetaModelTestServices.OPERATION_NAME_OUTPUTPARAMETEROPERATION)) { outputParameterOperation = anOperation; } // no else. if (anOperation.getName().equals( MetaModelTestServices.OPERATION_NAME_STATICOPERATION)) { staticOperation = anOperation; } // no else. if (anOperation.getName().equals( MetaModelTestServices.OPERATION_NAME_MULTIPLEOPERATION)) { multipleOperation = anOperation; } // no else. if (anOperation .getName() .equals(MetaModelTestServices.OPERATION_NAME_ORDEREDMULTIPLEOPERATION)) { orderedMultipleOperation = anOperation; } // no else. if (anOperation .getName() .equals(MetaModelTestServices.OPERATION_NAME_UNORDEREDMULTIPLEOPERATION)) { unorderedMultipleOperation = anOperation; } // no else. if (anOperation .getName() .equals(MetaModelTestServices.OPERATION_NAME_UNIQUEMULTIPLEOPERATION)) { uniqueMultipleOperation = anOperation; } // no else. if (anOperation .getName() .equals(MetaModelTestServices.OPERATION_NAME_NONUNIQUEMULTIPLEOPERATION)) { nonuniqueMultipleOperation = anOperation; } // no else. } // end for. if (outputParameterOperation == null) { /* Eventually send a warning to the logger. */ if (LOGGER.isInfoEnabled()) { String msg; msg = NLS .bind(MetaModelTestSuiteMessages.MetaModelTestSuite_OperationNotFoundInModel, MetaModelTestServices.OPERATION_NAME_OUTPUTPARAMETEROPERATION, "Operation.getOutputParameter()"); msg += " " + NLS.bind( MetaModelTestSuiteMessages.MetaModelTestSuite_CurrentlyTestedMetaModel, MetaModelTestServices.getInstance() .getMetaModelUnderTestID()); LOGGER.warn(msg); } } // no else. if (staticOperation == null) { /* Eventually send a warning to the logger. */ if (LOGGER.isInfoEnabled()) { String msg; msg = NLS .bind(MetaModelTestSuiteMessages.MetaModelTestSuite_OperationNotFoundInModel, MetaModelTestServices.OPERATION_NAME_STATICOPERATION, "Operation.isStatic()"); msg += " " + NLS.bind( MetaModelTestSuiteMessages.MetaModelTestSuite_CurrentlyTestedMetaModel, MetaModelTestServices.getInstance() .getMetaModelUnderTestID()); LOGGER.warn(msg); } // no else. } // no else. } // no else. } /** * <p> * A test case testing the operation {@link Operation#getGenericType()}. * </p> */ @Test public void testGetGenericType1() { if (!MetaModelTestServices.supportsNoOperations) { String msg; msg = "The adaptation of Operation.getGenericType() seems to be wrong. "; msg = "The Operation " + operation1.getQualifiedName(); msg += " should not return a generic Type."; /* The operation must not have a generic type. */ assertNull(msg, operation1.getGenericType()); } // no else. } /** * <p> * A test case testing the operation {@link Operation#getInputParameter()}. * </p> */ @Test public void testGetInputParameter1() { if (!MetaModelTestServices.supportsNoOperations) { String msg; msg = "The adaptation of Operation.getInputParameter() seems to be wrong."; /* The operation must have no input parameters. */ assertEquals(msg, 0, operation1.getInputParameter().size()); } // no else. } /** * <p> * A test case testing the operation {@link Operation#getInputParameter()}. * </p> */ @Test public void testGetInputParameter2() { if (!MetaModelTestServices.supportsNoOperations) { String msg; msg = "The adaptation of Operation.getInputParameter() seems to be wrong."; /* The operation must have no input parameters. */ assertEquals(msg, 1, operation2.getInputParameter().size()); } // no else. } /** * <p> * A test case testing the operation {@link Operation#getInputParameter()}. * </p> */ @Test public void testGetInputParameter3() { if (!MetaModelTestServices.supportsNoOperations) { String msg = "The adaptation of Operation.getInputParameter() seems to be wrong. Result should be an EList."; assertTrue(msg, operation1.getInputParameter() instanceof EList); } // no else. } /** * <p> * A test case testing the operation {@link Operation#getName()}. * </p> */ @Test public void testGetName1() { if (!MetaModelTestServices.supportsNoOperations) { String msg; msg = "The adaptation of Operation.getName() seems to be wrong."; /* The operation must have been found by the given name. */ assertEquals( msg, MetaModelTestServices.OPERATION_NAME_OPERATIONWITHOUTPARAMETERS, operation1.getName()); } // no else. } /** * <p> * A test case testing the operation {@link Operation#getOutputParameter()}. * </p> */ @Test public void testGetOutputParameter1() { if (!MetaModelTestServices.supportsNoOperations) { String msg; msg = "The adaptation of Operation.getOutputParameter() seems to be wrong."; /* The operation must have no output parameters. */ assertEquals(msg, 0, operation1.getOutputParameter().size()); } // no else. } /** * <p> * A test case testing the operation {@link Operation#getOutputParameter()}. * </p> */ @Test public void testGetOutputParameter2() { if (!MetaModelTestServices.supportsNoOperations) { String msg; msg = "The adaptation of Operation.getOutputParameter() seems to be wrong."; /* The operation must have no output parameters. */ assertEquals(msg, 0, operation2.getOutputParameter().size()); } // no else. } /** * <p> * A test case testing the operation {@link Operation#getOutputParameter()}. * </p> */ @Test public void testGetOutputParameter3() { /* * Only execute this test, if the current IModel under test contains * Operations with output parameters. */ if (outputParameterOperation != null) { String msg; msg = "The adaptation of Operation.getOutputParameter() seems to be wrong."; /* The operation must have one output parameters. */ assertEquals(msg, 1, outputParameterOperation.getOutputParameter() .size()); } } /** * <p> * A test case testing the operation {@link Operation#getOutputParameter()}. * </p> */ @Test public void testGetOutputParameter4() { if (!MetaModelTestServices.supportsNoOperations) { String msg = "The adaptation of Operation.getOutputParameter() seems to be wrong. Result should be an EList."; assertTrue(msg, operation1.getOutputParameter() instanceof EList); } } /** * <p> * A test case testing the operation {@link Operation#getOwnedParameter()}. * </p> */ @Test public void testGetOwnedParameter1() { if (!MetaModelTestServices.supportsNoOperations) { String msg; msg = "The adaptation of Operation.getOwnedParameter() seems to be wrong."; /* The operation must have one owned parameters. */ assertEquals(msg, 1, operation1.getOwnedParameter().size()); } // no else. } /** * <p> * A test case testing the operation {@link Operation#getOwnedParameter()}. * </p> */ @Test public void testGetOwnedParameter2() { if (!MetaModelTestServices.supportsNoOperations) { String msg; msg = "The adaptation of Operation.getOwnedParameter() seems to be wrong."; /* * The operation must have one or two owned parameters depending on * the decision, whether or not the return parameter is null or * void. */ if (operation2.getReturnParameter() == null) { assertEquals(msg, 1, operation2.getOwnedParameter().size()); } else { assertEquals(msg, 2, operation2.getOwnedParameter().size()); } } // no else. } /** * <p> * A test case testing the operation {@link Operation#getOwnedParameter()}. * </p> */ @Test public void testGetOwnedParameter3() { /* * Only execute this test, if the current IModel under test contains * Operations with output parameters. */ if (outputParameterOperation != null) { String msg; msg = "The adaptation of Operation.getOwnedParameter() seems to be wrong."; /* The operation must have one owned parameters. */ assertEquals(msg, 2, outputParameterOperation.getOwnedParameter() .size()); } } /** * <p> * A test case testing the operation {@link Operation#getOwnedParameter()}. * </p> */ @Test public void testGetOwnedParameter4() { if (!MetaModelTestServices.supportsNoOperations) { String msg = "The adaptation of Operation.getOwnedParameter() seems to be wrong. Result should be an EList."; assertTrue(msg, operation1.getOwnedParameter() instanceof EList); } } /** * <p> * A test case testing the operation * {@link Operation#getOwnedTypeParameter()} . * </p> */ @Test public void testGetOwnedTypeParameter1() { if (!MetaModelTestServices.supportsNoOperations) { String msg; msg = "The adaptation of Operation.getOwnedTypeParameter() seems to be wrong. "; msg += "The Operation " + operation1.getQualifiedName(); msg += " should not have Type Parameters."; /* The operation must have no type parameters. */ assertEquals(msg, 0, operation1.getOwnedTypeParameter().size()); } // no else. } /** * <p> * A test case testing the operation * {@link Operation#getOwnedTypeParameter()} . * </p> */ @Test public void testGetOwnedTypeParameter2() { if (!MetaModelTestServices.supportsNoOperations) { String msg; msg = "The adaptation of Operation.getOwnedTypeParameter() seems to be wrong. "; msg += "Result should be an EList."; assertTrue(msg, operation1.getOwnedTypeParameter() instanceof EList); } // no else. } /** * <p> * A test case testing the operation {@link Operation#getReturnParameter()}. * </p> */ @Test public void testGetReturnParameter1() { if (!MetaModelTestServices.supportsNoOperations) { String msg; msg = "The adaptation of Operation.getReturnParameter() seems to be wrong."; assertNotNull(msg, operation1.getReturnParameter()); /* The operation must have class1 as return parameter type. */ assertEquals(msg, testTypeClass1, operation1.getReturnParameter() .getType()); } // no else. } /** * <p> * A test case testing the operation {@link Operation#getReturnParameter()}. * </p> */ @Test public void testGetReturnParameter2() { if (!MetaModelTestServices.supportsNoOperations) { String msg; Parameter returnParameter; Type returnType; msg = "The adaptation of Operation.getReturnParameter() seems to be wrong. "; msg += "The return type must be of the PrimitiveTypeKind.VOID."; returnParameter = operation2.getReturnParameter(); /* The operation must have a return parameter. */ assertNotNull(msg, returnParameter); returnType = returnParameter.getType(); /* The return Type must be primitive. */ assertEquals(msg, returnType, EssentialOclPlugin .getOclLibraryProvider().getOclLibrary().getOclVoid()); } // no else. } /** * <p> * A test case testing the operation {@link Operation#getOwner()}. * </p> */ @Test public void testGetOwner1() { if (!MetaModelTestServices.supportsNoOperations) { String msg; msg = "The adaptation of Operation.getOwner() seems to be wrong."; /* The operation must be owned by the type its belongs to. */ assertEquals(msg, testOperationAndParameterClass, operation1.getOwner()); } // no else. } /** * <p> * A test case testing the operation {@link Operation#getOwningType()}. * </p> */ @Test public void testGetOwningType1() { if (!MetaModelTestServices.supportsNoOperations) { String msg; msg = "The adaptation of Operation.getOwningType() seems to be wrong."; /* The operation must be owned by the type its belongs to. */ assertEquals(msg, testOperationAndParameterClass, operation1.getOwningType()); } // no else. } /** * <p> * A test case testing the operation {@link Operation#getQualifiedName()}. * </p> */ @Test public void testGetQualifiedName1() { if (!MetaModelTestServices.supportsNoOperations) { String msg; msg = "The adaptation of Operation.getQualifiedName() seems to be wrong."; /* The operation must have been found by the given name. */ assertEquals( msg, MetaModelTestServices.OPERATION_QUALIFIED_NAME_OPERATIONWITHOUTPARAMETERS, operation1.getQualifiedName()); } // no else. } /** * <p> * A test case testing the operation {@link Operation#getQualifiedName()}. * </p> */ @Test public void testGetQualifiedName2() { if (!MetaModelTestServices.supportsNoOperations) { String msg; msg = "The adaptation of Operation.getQualifiedName() seems to be wrong "; msg += "for Operations with input Parameters."; /* The operation must have been found by the given name. */ assertEquals( msg, MetaModelTestServices.OPERATION_QUALIFIED_NAME_VOIDOPERATIONWITHPARAMETER, operation2.getQualifiedName()); } // no else. } /** * <p> * A test case testing the operation * {@link Operation#getSignatureParameter()} . * </p> */ @Test public void testGetSignatureParameter1() { if (!MetaModelTestServices.supportsNoOperations) { String msg; msg = "The adaptation of Operation.getSignatureParameter() seems to be wrong."; /* The operation must not have any signature parameters. */ assertEquals(msg, 0, operation1.getSignatureParameter().size()); } // no else. } /** * <p> * A test case testing the operation * {@link Operation#getSignatureParameter()} . * </p> */ @Test public void testGetSignatureParameter2() { if (!MetaModelTestServices.supportsNoOperations) { String msg; msg = "The adaptation of Operation.getSignatureParameter() seems to be wrong."; /* The operation must have one signature parameters. */ assertEquals(msg, 1, operation2.getSignatureParameter().size()); } // no else. } /** * <p> * A test case testing the operation * {@link Operation#getSignatureParameter()} . * </p> */ @Test public void testGetSignatureParameter3() { /* * Only execute this test, if the current IModel under test contains * Operations with output parameters. */ if (outputParameterOperation != null) { String msg; msg = "The adaptation of Operation.getSignatureParameter() seems to be wrong."; /* The operation must have one signature parameters. */ assertEquals(msg, 1, outputParameterOperation .getSignatureParameter().size()); } } /** * <p> * A test case testing the operation * {@link Operation#getSignatureParameter()} . * </p> */ @Test public void testGetSignatureParameter4() { if (!MetaModelTestServices.supportsNoOperations) { String msg = "The adaptation of Operation.getSignatureParameter() seems to be wrong. Result should be an EList."; assertTrue(msg, operation1.getSignatureParameter() instanceof EList); } } /** * <p> * A test case testing the operation {@link Operation#getType()}. * </p> */ @Test public void testGetType01() { if (!MetaModelTestServices.supportsNoOperations) { String msg; msg = "The adaptation of Operation.getType() seems to be wrong."; /* The operation must have the same type as in the model. */ assertEquals(msg, testTypeClass1, operation1.getType()); } // no else. } /** * <p> * A test case testing the operation {@link Operation#getType()}. * </p> */ @Test public void testGetType02() { if (!MetaModelTestServices.supportsNoOperations) { String msg; Type type; msg = "The adaptation of Operation.getType() seems to be wrong."; msg += " Type must be OclVoid."; type = operation2.getType(); /* The type must not be null. */ assertNotNull(msg, type); assertEquals(msg, type, EssentialOclPlugin.getOclLibraryProvider() .getOclLibrary().getOclVoid()); } // no else. } /** * <p> * A test case testing the operation {@link Operation#getType()}. * </p> */ @Test public void testGetType03() { /* * Only execute this test case if the current model under test supports * static operations. */ if (staticOperation != null) { String msg; msg = "The adaptation of Operation.getType() seems to be wrong."; /* The operation must have the same type as in the model. */ assertEquals(msg, testTypeClass1, staticOperation.getType()); } // no else. } /** * <p> * A test case testing the operation {@link Operation#getType()}. * </p> */ @Test public void testGetType04() { if (multipleOperation != null) { String msg; msg = "The adaptation of Operation.getType() for " + "'TestOperationAndParameterClass.multipleOperation(TestTypeClass1)' seems to be wrong."; /* The operation must be multiple. */ assertEquals(msg, EssentialOclPlugin.getOclLibraryProvider() .getOclLibrary().getCollectionType(testTypeClass1), multipleOperation.getType()); } // no else. } /** * <p> * A test case testing the operation {@link Operation#getType()}. * </p> */ @Test public void testGetType05() { if (!MetaModelTestServices.supportsNoOperations) { String msg; msg = "The adaptation of Operation.getType() for " + "'TestOperationAndParameterClass.orderedMultipleOperation(TestTypeClass1)' seems to be wrong."; /* The operation must be multiple. */ assertEquals(msg, EssentialOclPlugin.getOclLibraryProvider() .getOclLibrary().getSequenceType(testTypeClass1), orderedMultipleOperation.getType()); } // no else. } /** * <p> * A test case testing the operation {@link Operation#isOrdered()}. * </p> */ @Test public void testGetType06() { if (unorderedMultipleOperation != null) { String msg; msg = "The adaptation of Operation.getType() for " + "'unorderedMultipleOperation(TestTypeClass1)' seems to be wrong."; /* The operation must be multiple. */ assertEquals(msg, EssentialOclPlugin.getOclLibraryProvider() .getOclLibrary().getSetType(testTypeClass1), unorderedMultipleOperation.getType()); } else { LOGGER.warn("Operation 'unorderedMultipleOperation' was not found. Probably, type adaptation of Operations has not been tested completely."); } } /** * <p> * A test case testing the operation {@link Operation#getType()}. * </p> */ @Test public void testGetType07() { if (!MetaModelTestServices.supportsNoOperations) { String msg; msg = "The adaptation of Operation.getType() for " + "'uniqueMultipleOperation(TestTypeClass1)' seems to be wrong."; /* The operation must be multiple. */ assertEquals(msg, EssentialOclPlugin.getOclLibraryProvider() .getOclLibrary().getSetType(testTypeClass1), uniqueMultipleOperation.getType()); } // no else. } /** * <p> * A test case testing the operation {@link Operation#getType()}. * </p> */ @Test public void testGetType08() { if (unorderedMultipleOperation != null) { String msg; msg = "The adaptation of Operation.getType() for " + "'nonuniqueMultipleOperation(TestTypeClass1)' seems to be wrong."; /* The operation must be multiple. */ assertEquals(msg, EssentialOclPlugin.getOclLibraryProvider() .getOclLibrary().getBagType(testTypeClass1), nonuniqueMultipleOperation.getType()); } else { LOGGER.warn("Operation 'nonuniqueMultipleOperation' was not found. Probably, type adaptation of Operations has not been tested completely."); } } /** * <p> * A test case testing the operation {@link Operation#isStatic()}. * </p> */ @Test public void testIsStatic1() { if (!MetaModelTestServices.supportsNoOperations) { String msg; msg = "The adaptation of Operation.isStatic() seems to be wrong."; /* The operation must not be static. */ assertFalse(msg, operation1.isStatic()); } // no else. } /** * <p> * A test case testing the operation {@link Operation#isStatic()}. * </p> */ @Test public void testIsStatic2() { /* * Only execute this test, if static Operations are in the current * IModel under test. */ if (staticOperation != null) { String msg; msg = "The adaptation of Operation.isStatic() seems to be wrong."; /* The operation must not be static. */ assertTrue(msg, staticOperation.isStatic()); } // no else. } }