/** * Copyright (c) 2012, 2013 itemis AG. * 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: * Mark Broerkens - initial API and implementation * */ package org.eclipse.rmf.tests.reqif10.serialization.uc003.tc18xx; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertNotNull; import static junit.framework.Assert.assertNull; import static junit.framework.Assert.assertTrue; import java.io.IOException; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EAttribute; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EcorePackage; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.emf.ecore.util.FeatureMap; import org.eclipse.emf.ecore.util.FeatureMap.Entry; import org.eclipse.rmf.reqif10.AttributeValueXHTML; import org.eclipse.rmf.reqif10.ReqIF; import org.eclipse.rmf.reqif10.SpecElementWithAttributes; import org.eclipse.rmf.reqif10.SpecHierarchy; import org.eclipse.rmf.reqif10.SpecObject; import org.eclipse.rmf.reqif10.Specification; import org.eclipse.rmf.reqif10.XhtmlContent; import org.eclipse.rmf.reqif10.xhtml.XhtmlPType; import org.eclipse.rmf.tests.reqif10.serialization.util.AbstractTestCase; import org.eclipse.rmf.tests.reqif10.serialization.util.CommonSystemAttributes; import org.junit.BeforeClass; import org.junit.Test; @SuppressWarnings("nls") public class TC18xxHISExchangeProcessTests extends AbstractTestCase implements CommonSystemAttributes { static final String TC1800_FILENAME = getWorkingFileName(getReferenceDataFileName("TC1800", false)); static final String TC1801_FILENAME = getWorkingFileName(getReferenceDataFileName("TC1801", false)); static final String TC1802_FILENAME = getWorkingFileName(getReferenceDataFileName("TC1802", false)); static final String TC1803_FILENAME = getWorkingFileName(getReferenceDataFileName("TC1803", false)); static ReqIF tc1800ReqIF = null; static ReqIF tc1801ReqIF = null; static ReqIF tc1802ReqIF = null; static ReqIF tc1803ReqIF = null; @BeforeClass public static void setupOnce() throws Exception { AbstractTestCase.setupOnce(); // ___ tc1800ReqIF = new TC1800HISExchangeProcessModelBuilder().getReqIF(); doSaveReqIFFile(tc1800ReqIF, TC1800_FILENAME); tc1800ReqIF = loadReqIFFile(TC1800_FILENAME); // Ensure all references to the old filename are gone tc1801ReqIF = new TC1801HISExchangeProcessModelBuilder(loadReqIFFile(TC1800_FILENAME)).getReqIF(); doSaveReqIFFile(tc1801ReqIF, TC1801_FILENAME); tc1801ReqIF = loadReqIFFile(TC1801_FILENAME); // Ensure all references to the old filename are gone tc1802ReqIF = new TC1802HISExchangeProcessModelBuilder(loadReqIFFile(TC1801_FILENAME)).getReqIF(); doSaveReqIFFile(tc1802ReqIF, TC1802_FILENAME); tc1802ReqIF = loadReqIFFile(TC1802_FILENAME); // Ensure all references to the old filename are gone tc1803ReqIF = new TC1803HISExchangeProcessModelBuilder(loadReqIFFile(TC1802_FILENAME)).getReqIF(); doSaveReqIFFile(tc1803ReqIF, TC1803_FILENAME); tc1803ReqIF = loadReqIFFile(TC1803_FILENAME); // Ensure all references to the old filename are gone } @Test public void testSchemaCompliance() throws Exception { validateAgainstSchema(TC1800_FILENAME); validateAgainstSchema(TC1801_FILENAME); validateAgainstSchema(TC1802_FILENAME); validateAgainstSchema(TC1803_FILENAME); } /** * Looks for the given {@link SpecObject} by {@link CommonSystemAttributes#REQIF_NAME}. Returns null if none is * found, and throws an {@link IllegalStateException} when more than one is found. */ SpecObject getSpecObjectByName(ReqIF reqif, String name) { return (SpecObject) getSpecElementByName(reqif.getCoreContent().getSpecObjects(), name); } /** * Looks for the given {@link Specification} by {@link CommonSystemAttributes#REQIF_NAME}. Returns null if none is * found, and throws an {@link IllegalStateException} when more than one is found. */ Specification getSpecificationByName(ReqIF reqif, String name) { return (Specification) getSpecElementByName(reqif.getCoreContent().getSpecifications(), name); } private SpecElementWithAttributes getSpecElementByName(EList<? extends SpecElementWithAttributes> list, String name) { SpecElementWithAttributes target = null; for (SpecElementWithAttributes specObject : list) { AttributeValueXHTML value = (AttributeValueXHTML) ReqIFUtil.getAttributeValueForLabel(specObject, REQIF_NAME); XhtmlContent content = value.getTheValue(); XhtmlPType p = (XhtmlPType) content.getXhtml(); EAttribute mixedAttribute = null; for (EAttribute eAttribute : p.eClass().getEAllAttributes()) { if ("mixed".equals(eAttribute.getName()) && EcorePackage.eINSTANCE.getEFeatureMapEntry() == eAttribute.getEAttributeType()) { mixedAttribute = eAttribute; break; } } FeatureMap featureMap = (FeatureMap) p.eGet(mixedAttribute); Entry entry = featureMap.get(0); if (name.equals(entry.getValue())) { if (target != null) { throw new IllegalStateException("More than one element with name " + name); } target = specObject; } } return target; } /** * Returns true if the given {@link SpecObject} resides in the Spec with the given name. */ SpecHierarchy findInSpec(String name, SpecObject specObject) { Specification spec = getSpecificationByName(ReqIFUtil.getReqIF(specObject), name); if (spec == null) { throw new NullPointerException("Spec does not exist: " + name); } for (SpecHierarchy specHierarchy : spec.getChildren()) { SpecObject so = specHierarchy.getObject(); if (EcoreUtil.equals(so, specObject)) { return specHierarchy; } } return null; } /** * Returns the object with the given name from all four files as an array. Elements may be null. */ SpecObject[] getObjectsByName(String name) { return new SpecObject[] { getSpecObjectByName(tc1800ReqIF, name), getSpecObjectByName(tc1801ReqIF, name), getSpecObjectByName(tc1802ReqIF, name), getSpecObjectByName(tc1803ReqIF, name) }; } @Test public void testObj01() throws Exception { SpecObject[] so = getObjectsByName("Obj-01"); for (int i = 0; i < so.length; i++) { assertNotNull(so[i]); for (int j = i + 1; j < so.length; j++) { assertTrue(EcoreUtil.equals(so[i], so[j])); } } } @Test public void testObj03() throws Exception { SpecObject[] so = getObjectsByName("Obj-03"); assertTrue(so[0].getLastChange().getTimeInMillis() < so[1].getLastChange().getTimeInMillis()); assertTrue(so[1].getLastChange().getTimeInMillis() < so[2].getLastChange().getTimeInMillis()); assertTrue(so[2].getLastChange().getTimeInMillis() < so[3].getLastChange().getTimeInMillis()); // Check values assertEquals("O3.A1 initial", ReqIFUtil.getTheValue(ReqIFUtil.getAttributeValueForLabel(so[0], "A1"))); assertEquals("O3.A2 initial", ReqIFUtil.getTheValue(ReqIFUtil.getAttributeValueForLabel(so[0], "A2"))); assertEquals("O3.A1 initial", ReqIFUtil.getTheValue(ReqIFUtil.getAttributeValueForLabel(so[1], "A1"))); assertEquals("O3.A2 once", ReqIFUtil.getTheValue(ReqIFUtil.getAttributeValueForLabel(so[1], "A2"))); assertEquals("O3.A1 once", ReqIFUtil.getTheValue(ReqIFUtil.getAttributeValueForLabel(so[2], "A1"))); assertEquals("O3.A2 once", ReqIFUtil.getTheValue(ReqIFUtil.getAttributeValueForLabel(so[2], "A2"))); assertEquals("O3.A1 once", ReqIFUtil.getTheValue(ReqIFUtil.getAttributeValueForLabel(so[3], "A1"))); assertEquals("O3.A2 twice", ReqIFUtil.getTheValue(ReqIFUtil.getAttributeValueForLabel(so[3], "A2"))); } @Test public void testObj04() throws Exception { SpecObject[] so = getObjectsByName("Obj-04"); assertNull(so[0]); for (int i = 1; i < so.length; i++) { assertNotNull(so[i]); for (int j = i + 1; j < so.length; j++) { assertTrue("i=" + i + ", j=" + j, EcoreUtil.equals(so[i], so[j])); } } } @Test public void testObj05() throws Exception { SpecObject[] so = getObjectsByName("Obj-05"); assertNull(so[0]); assertNull(so[1]); assertNull(so[2]); assertEquals("no change", ReqIFUtil.getTheValue(ReqIFUtil.getAttributeValueForLabel(so[3], "A1"))); assertEquals("no change", ReqIFUtil.getTheValue(ReqIFUtil.getAttributeValueForLabel(so[3], "A2"))); } @Test public void testObj06() throws Exception { SpecObject[] so = getObjectsByName("Obj-06"); assertEquals("no change", ReqIFUtil.getTheValue(ReqIFUtil.getAttributeValueForLabel(so[0], "A1"))); assertEquals("no change", ReqIFUtil.getTheValue(ReqIFUtil.getAttributeValueForLabel(so[0], "A2"))); assertNull(so[1]); assertNull(so[2]); assertNull(so[3]); } @Test public void testObj07() throws Exception { SpecObject[] so = getObjectsByName("Obj-07"); assertNull(so[3]); for (int i = 0; i < 3; i++) { assertNotNull(so[i]); for (int j = i + 1; j < 3; j++) { assertTrue("i=" + i + ", j=" + j, EcoreUtil.equals(so[i], so[j])); } } } @Test public void testObj08() throws Exception { SpecObject[] so = getObjectsByName("Obj-08"); for (int i = 0; i < so.length; i++) { assertNotNull(so[i]); for (int j = i + 1; j < so.length; j++) { assertTrue("i=" + i + ", j=" + j, EcoreUtil.equals(so[i], so[j])); } } SpecHierarchy sh0 = findInSpec("Spec1", so[0]); assertNotNull(sh0); assertNull(findInSpec("Spec2", so[0])); for (int i = 1; i < 4; i++) { assertNull(findInSpec("Spec1", so[i])); SpecHierarchy shx = findInSpec("Spec2", so[i]); assertNotNull(shx); assertTrue(sh0.getLastChange().getTimeInMillis() < shx.getLastChange().getTimeInMillis()); } } @Test public void testObj09() throws Exception { SpecObject[] so = getObjectsByName("Obj-09"); for (int i = 0; i < so.length; i++) { assertNotNull(so[i]); for (int j = i + 1; j < so.length; j++) { assertTrue("i=" + i + ", j=" + j, EcoreUtil.equals(so[i], so[j])); } } for (int i = 0; i < 3; i++) { assertNotNull(findInSpec("Spec1", so[i])); assertNull(findInSpec("Spec2", so[i])); } assertNull(findInSpec("Spec1", so[3])); assertNotNull(findInSpec("Spec2", so[3])); } protected static void doSaveReqIFFile(EObject reqif, String fileName) throws IOException { URI emfURI = createEMFURI(fileName); Resource resource = getXMLPersistenceMappingResourceSet().createResource(emfURI); resource.getContents().add(reqif); resource.save(getSaveOptions()); } }