blob: 1314531c569bc12059cbd347465822845beb9ed4 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010, 2022 Willink Transformations 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:
* E.D.Willink - initial API and implementation
*******************************************************************************/
package org.eclipse.ocl.examples.test.xtext;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.emf.common.util.TreeIterator;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EModelElement;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.ocl.examples.xtext.tests.XtextTestCase;
import org.eclipse.ocl.pivot.internal.ecore.Ecore2Moniker;
import org.eclipse.ocl.pivot.utilities.OCL;
import org.eclipse.ocl.pivot.utilities.PivotConstants;
import org.eclipse.ocl.pivot.utilities.XMIUtil;
import org.eclipse.ocl.xtext.base.utilities.BaseCSResource;
import org.eclipse.ocl.xtext.oclstdlib.scoping.JavaClassScope;
/**
* Tests.
*/
public class MonikerTests extends XtextTestCase
{
/**
* Check that all CS elements that should have monikers do, and that
* there are no duplicates. Return a map of moniker to CS.
*
public Map<String, MonikeredElementCS> checkCSMonikers(Resource csResource) {
Map<String, MonikeredElementCS> monikerMap = new HashMap<String, MonikeredElementCS>();
for (TreeIterator<EObject> tit = csResource.getAllContents(); tit.hasNext(); ) {
ElementCS csElement = (ElementCS) tit.next();
if (csElement instanceof MonikeredElementCS) {
MonikeredElementCS csMonikeredElement = (MonikeredElementCS) csElement;
if (hasUniqueMoniker(csMonikeredElement)) {
String moniker = CS2Moniker.toString(csMonikeredElement);
ElementCS oldElement = monikerMap.get(moniker);
if (oldElement != null) {
fail("Duplicate moniker " + moniker + " for " + csElement.eClass().getName());
}
monikerMap.put(moniker, csMonikeredElement);
// System.out.println(csMonikeredElement.eClass().getName() + " : " + moniker);
// String signature = Ecore2Moniker.toSignature(eElement);
// System.out.println(eObject.eClass().getName() + " : " + signature);
}
}
}
return monikerMap;
} */
/**
* Check that ever monikered CS element references the same pivot element as
* the CS element that defines the moniker.
*
public void checkCShasPivots(Resource csResource, Map<String, ModelElementCS> csMonikerMap) {
for (TreeIterator<EObject> tit = csResource.getAllContents(); tit.hasNext(); ) {
EObject eObject = tit.next();
if (eObject instanceof ModelElementCS) {
ModelElementCS csElement = (ModelElementCS) eObject;
if (hasCorrespondingPivot(csElement)) {
String moniker = CS2Moniker.toString(csElement);
ModelElementCS oldElement = csMonikerMap.get(moniker);
Element oldPivot = oldElement != null ? oldElement.getPivot() : null;
Element newPivot = csElement.getPivot();
if (isValidPivot(oldPivot) && isValidPivot(newPivot)) {
assertEquals("Inconsistent pivot for " + moniker, newPivot, oldPivot);
}
}
}
}
} */
/**
* Check that the pivot moniker for the pivot of every monikered CS element
* is the same as the CS moniker.
*
public void checkCSandPivotMonikers(Map<String, MonikeredElementCS> csMonikerMap) {
/ List<String> csMonikers = new ArrayList<String>(csMonikerMap.keySet());
Collections.sort(csMonikers);
for (String csMoniker : csMonikers) {
MonikeredElementCS csElement = csMonikerMap.get(csMoniker);
if (hasCorrespondingPivot(csElement)) {
// System.out.println(csElement.eClass().getName() + " : " + csMoniker);
MonikeredElement pivot = (MonikeredElement) csElement.getPivot();
String pivotMoniker = pivot.getMoniker();
assertEquals("Pivot moniker for CS:", csMoniker, pivotMoniker);
}
else {
// System.out.println("[" + csElement.eClass().getName() + "] : " + csMoniker);
}
}
} */
/**
* Check that all pivot elements that should have monikers do, and that
* there are no duplicates. Return a map of moniker to pivot.
*
public Map<String, MonikeredElement> checkPivotMonikers(ResourceSet asResourceSet) {
Map<String, MonikeredElement> monikerMap = new HashMap<String, MonikeredElement>();
for (Resource asResource : asResourceSet.getResources()) {
for (TreeIterator<EObject> tit = asResource.getAllContents(); tit.hasNext(); ) {
EObject eObject = tit.next();
if (eObject instanceof MonikeredElement) {
MonikeredElement pivotElement = (MonikeredElement) eObject;
if (hasCorrespondingCS(pivotElement)) {
String moniker = pivotElement.getMoniker();
MonikeredElement oldElement = monikerMap.get(moniker);
if (oldElement != null) {
fail("Duplicate moniker " + moniker + " for " + pivotElement.eClass().getName());
}
monikerMap.put(moniker, pivotElement);
// System.out.println(eObject.eClass().getName() + " : " + moniker);
// String signature = Ecore2Moniker.toSignature(eElement);
// System.out.println(eObject.eClass().getName() + " : " + signature);
}
}
}
}
return monikerMap;
} */
@SuppressWarnings("null")
public void doMonikerTestEcore(@NonNull URI inputURI) throws IOException {
OCL ocl = OCL.newInstance(getProjectMap());
//
// Load the Ecore resource and check for load failures and proxy resolution
//
Resource ecoreResource = ocl.getResourceSet().getResource(inputURI, true);
assertNoResourceErrors("Load failed", ecoreResource);
assertNoUnresolvedProxies("Unresolved proxies", ecoreResource);
//
// Create and check Ecore monikers for uniqueness
//
Map<String, EModelElement> monikerMap = new HashMap<String, EModelElement>();
for (TreeIterator<EObject> tit = ecoreResource.getAllContents(); tit.hasNext(); ) {
EObject eObject = tit.next();
if (eObject instanceof EModelElement) {
EModelElement eElement = (EModelElement) eObject;
String moniker = Ecore2Moniker.toString(eElement);
EModelElement oldElement = monikerMap.get(moniker);
if (oldElement != null) {
fail("Duplicate moniker " + moniker + " for " + eElement.eClass().getName());
}
monikerMap.put(moniker, eElement);
// System.out.println(eObject.eClass().getName() + " : " + moniker);
// String signature = Ecore2Moniker.toSignature(eElement);
// System.out.println(eObject.eClass().getName() + " : " + signature);
}
}
ocl.dispose();
}
@SuppressWarnings("null")
public void doMonikerTestOCLstdlib(@NonNull URI inputURI) throws IOException {
OCL ocl = OCL.newInstance(getProjectMap());
//
// Load the CS resource and check for load failures
//
String pivotName = inputURI.trimFileExtension().lastSegment() + PivotConstants.DOT_OCL_AS_FILE_EXTENSION;
URI pivotURI = getTestFileURI(pivotName);
BaseCSResource csResource = (BaseCSResource) ocl.getResourceSet().createResource(inputURI);
JavaClassScope.getAdapter(csResource, getClass().getClassLoader());
csResource.load(null);;
assertNoResourceErrors("Load failed", csResource);
assertNoUnresolvedProxies("Unresolved proxies", csResource);
assertNoValidationErrors("CS validation problems", csResource);
//
// Get the pivot resource and check for load failures
//
Resource asResource = csResource.getASResource();
assertNoValidationErrors("Pivot validation problems", asResource);
asResource.setURI(pivotURI);
asResource.save(XMIUtil.createSaveOptions());
//
// Check CS-Pivot moniker consistency
//
// Map<String, MonikeredElementCS> csMonikerMap = checkCSMonikers(csResource);
// checkCShasPivots(csResource, csMonikerMap);
// checkCSandPivotMonikers(csMonikerMap);
// MetamodelManager metamodelManager = adapter.getMetamodelManager();
// Map<String, MonikeredElement> pivotMonikerMap = checkPivotMonikers(metamodelManager.getPivotResourceSet());
/* {
StringBuilder s = null;
for (String m : csMonikerMap.keySet()) {
if (!pivotMonikerMap.containsKey(m)) {
MonikeredElementCS csElement = csMonikerMap.get(m);
if (hasCorrespondingPivot(csElement)) {
if (s == null) {
s = new StringBuilder();
}
s.append("\n " + m);
}
}
}
if (s != null) {
fail("Extra CS monikers" + s.toString());
}
}
{
StringBuilder s = null;
for (String m : pivotMonikerMap.keySet()) {
if (!csMonikerMap.containsKey(m)) {
MonikeredElement pivotElement = pivotMonikerMap.get(m);
if (hasCorrespondingCS(pivotElement)) {
if (s == null) {
s = new StringBuilder();
}
s.append("\n " + pivotElement.eClass().getName() + " : " + m);
}
}
}
if (s != null) {
fail("Extra Pivot monikers" + s.toString());
}
} */
// assertEquals(csMonikerMap.size(), pivotMonikerMap.size());
ocl.dispose();
}
public void testMoniker_Ecore_ecore() throws IOException, InterruptedException {
doMonikerTestEcore(getTestModelURI("models/ecore/Ecore.ecore")); // Diverse declarations
}
public void testMoniker_OCL_ecore() throws IOException, InterruptedException {
doMonikerTestEcore(getTestModelURI("models/ecore/OCL.ecore")); // Diverse generics
}
public void testMoniker_OCLEcore_ecore() throws IOException, InterruptedException {
doMonikerTestEcore(getTestModelURI("models/ecore/OCLEcore.ecore"));
}
// public void testMoniker_midi_oclstdlib() throws IOException, InterruptedException {
// BaseScopeProvider.LOOKUP.setState(true);
// Abstract2Moniker.TRACE_MONIKERS.setState(true);
// doMonikerTestOCLstdlib("midi");
// }
// public void testMoniker_mini_oclstdlib() throws IOException, InterruptedException {
// BaseScopeProvider.LOOKUP.setState(true);
// doMonikerTestOCLstdlib("mini");
// }
public void testMoniker_oclstdlib_oclstdlib() throws IOException, InterruptedException {
// BaseScopeProvider.LOOKUP.setState(true);
// Abstract2Moniker.TRACE_MONIKERS.setState(true);
doMonikerTestOCLstdlib(getTestModelURI("models/oclstdlib/oclstdlib.oclstdlib"));
}
// public void testMoniker_OCL_2_3_oclstdlib() throws IOException, InterruptedException {
// BaseScopeProvider.LOOKUP.setState(true);
// doMonikerTestOCLstdlib("OCL-2.3x");
// }
}