blob: f40c17588eaa696a191892cd7005c2a9234132ce [file] [log] [blame]
/*****************************************************************************
* Copyright (c) 2019 CEA LIST, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
*
*****************************************************************************/
package org.eclipse.papyrus.sysml16.tests.requirements;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.papyrus.sysml16.requirements.Requirement;
import org.eclipse.papyrus.sysml16.requirements.RequirementsPackage;
import org.eclipse.papyrus.sysml16.requirements.TestCase;
import org.eclipse.papyrus.sysml16.util.SysMLResource;
import org.eclipse.uml2.uml.Abstraction;
import org.eclipse.uml2.uml.Class;
import org.eclipse.uml2.uml.Model;
import org.eclipse.uml2.uml.NamedElement;
import org.eclipse.uml2.uml.Operation;
import org.eclipse.uml2.uml.Realization;
import org.eclipse.uml2.uml.UMLFactory;
import org.eclipse.uml2.uml.util.UMLUtil.StereotypeApplicationHelper;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
/**
* A test case for the model object '<em><b>Requirement</b></em>'.
*
* <p>
* The following features are tested:
* <ul>
* <li>{@link org.eclipse.papyrus.sysml16.requirements.Requirement#getDerived() <em>Derived</em>}</li>
* <li>{@link org.eclipse.papyrus.sysml16.requirements.Requirement#getDerivedFrom() <em>Derived From</em>}</li>
* <li>{@link org.eclipse.papyrus.sysml16.requirements.Requirement#getSatéisfiedBy() <em>Satisfied By</em>}</li>
* <li>{@link org.eclipse.papyrus.sysml16.requirements.Requirement#getRefinedBy() <em>Refined By</em>}</li>
* <li>{@link org.eclipse.papyrus.sysml16.requirements.Requirement#getTracedTo() <em>Traced To</em>}</li>
* <li>{@link org.eclipse.papyrus.sysml16.requirements.Requirement#getVerifiedBy() <em>Verified By</em>}</li>
* <li>{@link org.eclipse.papyrus.sysml16.requirements.Requirement#getMaster() <em>Master</em>}</li>
* </ul>
* </p>
*
*
*/
public class RequirementTest {
private Requirement defaultReq = null;
private Class copy = null;
private Requirement copyReq = null;
private Requirement masterReq = null;
private Class derived1 = null;
private Class derived2 = null;
private Requirement derive1Req = null;
private Requirement derive2Req = null;
private Requirement derived1Req = null;
private Requirement derived2Req = null;
private Class satisfyingNE1 = null;
private Class satisfyingNE2 = null;
private Requirement satisfiedReq = null;
private Class refiningNE1 = null;
private Class refiningNE2 = null;
private Requirement refinedReq = null;
private Class traced1 = null;
private Class traced2 = null;
private Requirement traceReq = null;
private Requirement verifiedReq = null;
private TestCase testCase1 = null;
private NamedElement verifierNamedElement = null;
private TestCase testCase2 = null;
/**
* @see junit.framework.TestCase#setUp()
*/
@Before
public void setUp() {
// Prepare test
Model model = SysMLResource.createSysMLModel(new ResourceSetImpl());
Assert.assertFalse("the SysML profile must be applied.", model.getAppliedProfiles().isEmpty()); //$NON-NLS-1$
// Create classes & interface
Class defaultClass = model.createOwnedClass("defaultClass", false); //$NON-NLS-1$
// Add Requirement stereotypes
defaultReq = (Requirement) StereotypeApplicationHelper.getInstance(null).applyStereotype(defaultClass, RequirementsPackage.eINSTANCE.getRequirement(), null);
// ////////////////////////////////////////////////////////////////////
// Prepare getMaster test elements
// ////////////////////////////////////////////////////////////////////
Class master = model.createOwnedClass("master", false); //$NON-NLS-1$
masterReq = (Requirement) StereotypeApplicationHelper.getInstance(null).applyStereotype(master, RequirementsPackage.eINSTANCE.getRequirement(), null);
copy = model.createOwnedClass("copy", false); //$NON-NLS-1$
copyReq = (Requirement) StereotypeApplicationHelper.getInstance(null).applyStereotype(copy, RequirementsPackage.eINSTANCE.getRequirement(), null);
// Add "copy" (Abstraction) between master and copy
// copy -> master
Abstraction copy2Master = UMLFactory.eINSTANCE.createAbstraction();
copy2Master.getClients().add(copy);
copy2Master.getSuppliers().add(master);
model.getPackagedElements().add(copy2Master);
StereotypeApplicationHelper.getInstance(null).applyStereotype(copy2Master, RequirementsPackage.eINSTANCE.getCopy(), null);
// ////////////////////////////////////////////////////////////////////
// ////////////////////////////////////////////////////////////////////
// Prepare getDerived / getDerivedFrom test elements
// ////////////////////////////////////////////////////////////////////
Class derive1 = model.createOwnedClass("d1", false); //$NON-NLS-1$
derive1Req = (Requirement) StereotypeApplicationHelper.getInstance(null).applyStereotype(derive1, RequirementsPackage.eINSTANCE.getRequirement(), null);
Class derive2 = model.createOwnedClass("d2", false); //$NON-NLS-1$
derive2Req = (Requirement) StereotypeApplicationHelper.getInstance(null).applyStereotype(derive2, RequirementsPackage.eINSTANCE.getRequirement(), null);
derived1 = model.createOwnedClass("dd1", false); //$NON-NLS-1$
derived1Req = (Requirement) StereotypeApplicationHelper.getInstance(null).applyStereotype(derived1, RequirementsPackage.eINSTANCE.getRequirement(), null);
derived2 = model.createOwnedClass("dd2", false); //$NON-NLS-1$
derived2Req = (Requirement) StereotypeApplicationHelper.getInstance(null).applyStereotype(derived2, RequirementsPackage.eINSTANCE.getRequirement(), null);
// Add "DeriveReqt" (Abstraction) between derive and derived
// derived1 -> derive1, derive2
// derived2 -> derive2
Abstraction d11 = UMLFactory.eINSTANCE.createAbstraction();
d11.getClients().add(derived1);
d11.getSuppliers().add(derive1);
model.getPackagedElements().add(d11);
StereotypeApplicationHelper.getInstance(null).applyStereotype(d11, RequirementsPackage.eINSTANCE.getDeriveReqt(), null);
Abstraction d12 = UMLFactory.eINSTANCE.createAbstraction();
d12.getClients().add(derived1);
d12.getSuppliers().add(derive2);
model.getPackagedElements().add(d12);
StereotypeApplicationHelper.getInstance(null).applyStereotype(d12, RequirementsPackage.eINSTANCE.getDeriveReqt(), null);
Abstraction d22 = UMLFactory.eINSTANCE.createAbstraction();
d22.getClients().add(derived2);
d22.getSuppliers().add(derive2);
model.getPackagedElements().add(d22);
StereotypeApplicationHelper.getInstance(null).applyStereotype(d22, RequirementsPackage.eINSTANCE.getDeriveReqt(), null);
// ////////////////////////////////////////////////////////////////////
// ////////////////////////////////////////////////////////////////////
// Prepare getSatisfiedBy test elements
// ////////////////////////////////////////////////////////////////////
Class satisfied = model.createOwnedClass("satisfied", false); //$NON-NLS-1$
satisfiedReq = (Requirement) StereotypeApplicationHelper.getInstance(null).applyStereotype(satisfied, RequirementsPackage.eINSTANCE.getRequirement(), null);
satisfyingNE1 = model.createOwnedClass("sNE1", false); //$NON-NLS-1$
satisfyingNE2 = model.createOwnedClass("sNE2", false); //$NON-NLS-1$
// Add "Satisfy" (Realization) between satisfyingNE(s) and satisfied
// requirement
// satisfyingNE1, satisfyingNE2 -> satisfied
Realization ne12S1 = UMLFactory.eINSTANCE.createRealization();
ne12S1.getClients().add(satisfyingNE1);
ne12S1.getSuppliers().add(satisfied);
model.getPackagedElements().add(ne12S1);
StereotypeApplicationHelper.getInstance(null).applyStereotype(ne12S1, RequirementsPackage.eINSTANCE.getSatisfy(), null);
Realization ne22S1 = UMLFactory.eINSTANCE.createRealization();
ne22S1.getClients().add(satisfyingNE2);
ne22S1.getSuppliers().add(satisfied);
model.getPackagedElements().add(ne22S1);
StereotypeApplicationHelper.getInstance(null).applyStereotype(ne22S1, RequirementsPackage.eINSTANCE.getSatisfy(), null);
// ////////////////////////////////////////////////////////////////////
// ////////////////////////////////////////////////////////////////////
// Prepare getRefinedBy test elements
// ////////////////////////////////////////////////////////////////////
Class refined = model.createOwnedClass("refined", false); //$NON-NLS-1$
refinedReq = (Requirement) StereotypeApplicationHelper.getInstance(null).applyStereotype(refined, RequirementsPackage.eINSTANCE.getRequirement(), null);
refiningNE1 = model.createOwnedClass("rNE1", false); //$NON-NLS-1$
refiningNE2 = model.createOwnedClass("rNE2", false); //$NON-NLS-1$
// Add "Refine" (Abstraction) between refiningNE(s) and refined
// requirement
// refiningNE1, refiningNE2 -> refined
Abstraction rne12S1 = UMLFactory.eINSTANCE.createAbstraction();
rne12S1.getClients().add(refiningNE1);
rne12S1.getSuppliers().add(refined);
model.getPackagedElements().add(rne12S1);
StereotypeApplicationHelper.getInstance(null).applyStereotype(rne12S1, RequirementsPackage.eINSTANCE.getRefine(), null);
Abstraction rne22S1 = UMLFactory.eINSTANCE.createAbstraction();
rne22S1.getClients().add(refiningNE2);
rne22S1.getSuppliers().add(refined);
model.getPackagedElements().add(rne22S1);
StereotypeApplicationHelper.getInstance(null).applyStereotype(rne22S1, RequirementsPackage.eINSTANCE.getRefine(), null);
// ////////////////////////////////////////////////////////////////////
// ////////////////////////////////////////////////////////////////////
// Prepare getTracedTo test elements
// ////////////////////////////////////////////////////////////////////
traced1 = model.createOwnedClass("traced1", false); //$NON-NLS-1$
StereotypeApplicationHelper.getInstance(null).applyStereotype(traced1, RequirementsPackage.eINSTANCE.getRequirement(), null);
traced2 = model.createOwnedClass("traced2", false); //$NON-NLS-1$
StereotypeApplicationHelper.getInstance(null).applyStereotype(traced2, RequirementsPackage.eINSTANCE.getRequirement(), null);
Class trace = model.createOwnedClass("trace", false); //$NON-NLS-1$
traceReq = (Requirement) StereotypeApplicationHelper.getInstance(null).applyStereotype(trace, RequirementsPackage.eINSTANCE.getRequirement(), null);
// Add "Trace" (Abstraction)
// [traced1, traced2] -> trace
Abstraction t11 = UMLFactory.eINSTANCE.createAbstraction();
t11.getClients().add(traced1);
t11.getSuppliers().add(trace);
model.getPackagedElements().add(t11);
StereotypeApplicationHelper.getInstance(null).applyStereotype(t11, RequirementsPackage.eINSTANCE.getTrace(), null);
Abstraction t12 = UMLFactory.eINSTANCE.createAbstraction();
t12.getClients().add(traced2);
t12.getSuppliers().add(trace);
model.getPackagedElements().add(t12);
StereotypeApplicationHelper.getInstance(null).applyStereotype(t12, RequirementsPackage.eINSTANCE.getTrace(), null);
// ////////////////////////////////////////////////////////////////////
// ////////////////////////////////////////////////////////////////////
// Prepare getVerifiedBy test elements
// ////////////////////////////////////////////////////////////////////
verifierNamedElement = model.createOwnedClass("verifierNamedElement", false); //$NON-NLS-1$
Class verified = model.createOwnedClass("verified", false); //$NON-NLS-1$
verifiedReq = (Requirement) StereotypeApplicationHelper.getInstance(null).applyStereotype(verified, RequirementsPackage.eINSTANCE.getRequirement(), null);
Class testClass = model.createOwnedClass("testClass", false); //$NON-NLS-1$
Operation op1 = testClass.createOwnedOperation("op1", null, null, null); //$NON-NLS-1$
Operation op2 = testClass.createOwnedOperation("op2", null, null, null); //$NON-NLS-1$
testCase1 = (TestCase) StereotypeApplicationHelper.getInstance(null).applyStereotype(op1, RequirementsPackage.eINSTANCE.getTestCase(), null);
testCase2 = (TestCase) StereotypeApplicationHelper.getInstance(null).applyStereotype(op2, RequirementsPackage.eINSTANCE.getTestCase(), null);
// Add "Verify" (Abstraction)
// testCase1, testCase2 -> verified
Abstraction t12V = UMLFactory.eINSTANCE.createAbstraction();
t12V.getClients().add(op1);
t12V.getSuppliers().add(verified);
model.getPackagedElements().add(t12V);
StereotypeApplicationHelper.getInstance(null).applyStereotype(t12V, RequirementsPackage.eINSTANCE.getVerify(), null);
Abstraction t22V = UMLFactory.eINSTANCE.createAbstraction();
t22V.getClients().add(op2);
t22V.getSuppliers().add(verified);
model.getPackagedElements().add(t22V);
StereotypeApplicationHelper.getInstance(null).applyStereotype(t22V, RequirementsPackage.eINSTANCE.getVerify(), null);
// Add "Verify" (Abstraction)
// verifierNamedElement -> verified
Abstraction t32V = UMLFactory.eINSTANCE.createAbstraction();
t32V.getClients().add(verifierNamedElement);
t32V.getSuppliers().add(verified);
model.getPackagedElements().add(t32V);
StereotypeApplicationHelper.getInstance(null).applyStereotype(t32V, RequirementsPackage.eINSTANCE.getVerify(), null);
// ////////////////////////////////////////////////////////////////////
}
/**
* Tests the '{@link org.eclipse.papyrus.sysml16.requirements.Requirement#getDerived()
* <em>Derived</em>}' feature getter.
*
* @see org.eclipse.papyrus.sysml16.requirements.Requirement#getDerived()
*/
@Test
public void testGetDerived() {
Assert.assertTrue("Isolated requirement : default_req.getDerived() = []", defaultReq.getDerived().isEmpty()); //$NON-NLS-1$
Assert.assertTrue("Verifies : derive1_req.getDerived() = [derived1_req]", derive1Req.getDerived().contains(derived1Req)); //$NON-NLS-1$
Assert.assertTrue("Verifies : derive2_req.getDerived() = [derived1_req, derived2_req]", derive2Req.getDerived().contains(derived1Req)); //$NON-NLS-1$
Assert.assertTrue("Verifies : derive2_req.getDerived() = [derived1_req, derived2_req]", derive2Req.getDerived().contains(derived2Req)); //$NON-NLS-1$
}
/**
* Tests the '{@link org.eclipse.papyrus.sysml16.requirements.Requirement#getDerivedFrom()
* <em>Derived From</em>}' feature getter.
*
* @see org.eclipse.papyrus.sysml16.requirements.Requirement#getDerivedFrom()
*/
@Test
public void testGetDerivedFrom() {
Assert.assertTrue("Isolated requirement : default_req.getDerivedFrom() = []", defaultReq.getDerivedFrom().isEmpty()); //$NON-NLS-1$
Assert.assertTrue("Verifies : derived2_req.getDerivedFrom() = [derive2_req]", derived2Req.getDerivedFrom().contains(derive2Req)); //$NON-NLS-1$
Assert.assertTrue("Verifies : derived1_req.getDerivedFrom() = [derive1_req, derive2_req]", derived1Req.getDerivedFrom().contains(derive1Req)); //$NON-NLS-1$
Assert.assertTrue("Verifies : derived1_req.getDerivedFrom() = [derive1_req, derive2_req]", derived1Req.getDerivedFrom().contains(derive2Req)); //$NON-NLS-1$
}
/**
* Tests the '{@link org.eclipse.papyrus.sysml16.requirements.Requirement#getMaster()
* <em>Master</em>}' feature getter.
*
* @see org.eclipse.papyrus.sysml16.requirements.Requirement#getMaster()
*/
@Test
public void testGetMaster() {
Assert.assertTrue("Isolated requirement : default_req.getMaster() need to be empty", defaultReq.getMaster().isEmpty()); //$NON-NLS-1$
Assert.assertEquals("Try retrieving Master from Copy requirement", masterReq, copyReq.getMaster().get(0)); //$NON-NLS-1$
}
/**
* Tests the '{@link org.eclipse.papyrus.sysml16.requirements.Requirement#getRefinedBy()
* <em>Refined By</em>}' feature getter.
*
* @see org.eclipse.papyrus.sysml16.requirements.Requirement#getRefinedBy()
*/
@Test
public void testGetRefinedBy() {
Assert.assertTrue("Isolated requirement : default_req.getRefinedBy() = []", defaultReq.getRefinedBy().isEmpty()); //$NON-NLS-1$
Assert.assertTrue("Verifies : refined_req.getRefinedBy() = [refiningNE1, refiningNE2]", refinedReq.getRefinedBy().contains(refiningNE1)); //$NON-NLS-1$
Assert.assertTrue("Verifies : refined_req.getRefinedBy() = [refiningNE1, refiningNE2]", refinedReq.getRefinedBy().contains(refiningNE2)); //$NON-NLS-1$
}
/**
* Tests the '{@link org.eclipse.papyrus.sysml16.requirements.Requirement#getSatisfiedBy()
* <em>Satisfied By</em>}' feature getter.
*
* @see org.eclipse.papyrus.sysml16.requirements.Requirement#getSatisfiedBy()
*/
@Test
public void testGetSatisfiedBy() {
Assert.assertTrue("Isolated requirement : default_req.getSatisfiedBy() = []", defaultReq.getSatisfiedBy().isEmpty()); //$NON-NLS-1$
Assert.assertTrue("Verifies : satisfied_req.getSatisfiedBy() = [satisfyingNE1, satisfyingNE2]", satisfiedReq.getSatisfiedBy().contains(satisfyingNE1)); //$NON-NLS-1$
Assert.assertTrue("Verifies : satisfied_req.getSatisfiedBy() = [satisfyingNE1, satisfyingNE2]", satisfiedReq.getSatisfiedBy().contains(satisfyingNE2)); //$NON-NLS-1$
}
/**
* Tests the '{@link org.eclipse.papyrus.sysml16.requirements.Requirement#getTracedTo()
* <em>Traced To</em>}' feature getter.
*
* @see org.eclipse.papyrus.sysml16.requirements.Requirement#getTracedTo()
*/
@Test
public void testGetTracedTo() {
Assert.assertTrue("Isolated requirement : default_req.getTracedTo = []", defaultReq.getTracedTo().isEmpty()); //$NON-NLS-1$
// DeriveReqt / Verify / Copy inherits from Trace
Assert.assertFalse("Test getter through Copy (should not be taken into account see bug #352563)", masterReq.getTracedTo().contains(copy)); //$NON-NLS-1$
// Test getter through DeriveReqt (tracedTo = Clients)
Assert.assertFalse("derived1 -> [derive1_req, derive2_req] (should not be taken into account see bug #352563)", derive1Req.getTracedTo().contains(derived1)); //$NON-NLS-1$
Assert.assertFalse("derived1 -> [derive1_req, derive2_req] (should not be taken into account see bug #352563)", derive2Req.getTracedTo().contains(derived1)); //$NON-NLS-1$
Assert.assertFalse("derived2 -> [derive2_req] (should not be taken into account see bug #352563)", derive2Req.getTracedTo().contains(derived2)); //$NON-NLS-1$
// Should not happen...
// Direct test
Assert.assertTrue("Test getter through Verify (should not be taken into account see bug #352563)", traceReq.getTracedTo().contains(traced1)); //$NON-NLS-1$
Assert.assertTrue("Test getter through Verify (should not be taken into account see bug #352563)", traceReq.getTracedTo().contains(traced2)); //$NON-NLS-1$
}
/**
* Tests the '{@link org.eclipse.papyrus.sysml16.requirements.Requirement#getVerifiedBy()
* <em>Verified By</em>}' feature getter.
*
* @see org.eclipse.papyrus.sysml16.requirements.Requirement#getVerifiedBy()
*/
@Test
public void testGetVerifiedBy() {
Assert.assertTrue("Isolated requirement : default_req.getVerifiedBy() = []", defaultReq.getVerifiedBy().isEmpty()); //$NON-NLS-1$
Assert.assertTrue("Test getVerifiedBy getter for [testCase1, testCase2, verifierNamedElement] -> verified_req", verifiedReq.getVerifiedBy().contains(testCase1.getBase_Operation())); //$NON-NLS-1$
Assert.assertTrue("Test getVerifiedBy getter for [testCase1, testCase2, verifierNamedElement] -> verified_req", verifiedReq.getVerifiedBy().contains(testCase2.getBase_Operation())); //$NON-NLS-1$
Assert.assertTrue("Test getVerifiedBy getter for [testCase1, testCase2, verifierNamedElement] -> verified_req", verifiedReq.getVerifiedBy().contains(verifierNamedElement)); //$NON-NLS-1$
}
/**
* Verify that derived attribute is read only (Not present in the official SysML 1.6, hop fully will in SysML 1.5)
* This is required to have a working copy paste in Papyrus
*/
@Test(expected = IllegalArgumentException.class)
public void testReadOnlyDerived() {
EReference derivedEReference = RequirementsPackage.eINSTANCE.getAbstractRequirement_Derived();
defaultReq.eSet(derivedEReference, ""); //$NON-NLS-1$
}
}