blob: 6503cb96a4c045e88e45ed374b6e93c032b8dd0d [file] [log] [blame]
/**
* Copyright (c) 2019 THALES GLOBAL SERVICES.
* 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:
* Thales - initial API and implementation
*/
package org.eclipse.emf.test.core.ecore;
import static org.junit.Assert.assertTrue;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.EStructuralFeature.Setting;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.ecore.util.ECrossReferenceAdapter;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl;
import org.eclipse.emf.test.common.TestUtil;
import org.eclipse.emf.test.core.AllSuites;
import org.eclipse.emf.test.core.xrefsopposite.A;
import org.eclipse.emf.test.core.xrefsopposite.APkg;
import org.eclipse.emf.test.core.xrefsopposite.XRefsOppositePackage;
import org.eclipse.emf.test.core.xrefsopposite.impl.AImpl;
import org.eclipse.emf.test.core.xrefsopposite.impl.APkgImpl;
import org.eclipse.emf.test.core.xrefsopposite.impl.XRefsOppositeFactoryImpl;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
/**
* This class ensures that ECrossReferenceAdapter.getInverseReferences(object, feature) is properly working
*/
public class ECrossReferenceAdapterByFeatureTest
{
private ECrossReferenceAdapter fixture;
private HashMap<EStructuralFeature, Integer> countByFeature = new HashMap<EStructuralFeature, Integer>();
public int count(EStructuralFeature feature) {
if (countByFeature.containsKey(feature)) {
return countByFeature.get(feature);
}
return 0;
}
public void increment(EStructuralFeature feature) {
if (!countByFeature.containsKey(feature)) {
countByFeature.put(feature, Integer.valueOf(0));
}
countByFeature.put(feature, countByFeature.get(feature) + 1);
}
public void resetCounter() {
countByFeature.clear();
}
@Test
public void testCrossReferenceByFeature()
{
Resource resource = loadXRefsInstance();
APkg apkg = (APkg)resource.getEObject("apkg");
A a0 = (A)resource.getEObject("a0");
A a1 = (A)resource.getEObject("a1");
A a2 = (A)resource.getEObject("a2");
resetCounter();
//check that getInverseReferences(obj) will access to all navigable references opposites
assertInverse(a1, XRefsOppositePackage.Literals.A__REF1, a0);
assertTrue(count(XRefsOppositePackage.Literals.A__OREF1) == 1);
assertTrue(count(XRefsOppositePackage.Literals.A__OREF2) == 1);
assertTrue(count(XRefsOppositePackage.Literals.A__REF3) == 0);
resetCounter();
//check that getInverseReferences(obj, feature) access only to the expected feature
assertInverseFeature(a1, XRefsOppositePackage.Literals.A__REF1, a0);
assertTrue(count(XRefsOppositePackage.Literals.A__OREF1) == 1);
assertTrue(count(XRefsOppositePackage.Literals.A__OREF2) == 0);
assertTrue(count(XRefsOppositePackage.Literals.A__REF3) == 0);
assertTrue(count(XRefsOppositePackage.Literals.A__OWNING_APKG) == 0);
resetCounter();
//check non navigable references access only to the crossReferencer inner map
assertInverseFeature(a1, XRefsOppositePackage.Literals.A__REF3, a2);
assertTrue(count(XRefsOppositePackage.Literals.A__OREF1) == 0);
assertTrue(count(XRefsOppositePackage.Literals.A__OREF2) == 0);
assertTrue(count(XRefsOppositePackage.Literals.A__REF3) == 0);
assertTrue(count(XRefsOppositePackage.Literals.A__OWNING_APKG) == 0);
resetCounter();
//check containment feature doens't access to others references
assertInverseFeature(apkg, XRefsOppositePackage.Literals.A__OWNING_APKG, a0, a1, a2);
assertTrue(count(XRefsOppositePackage.Literals.A__OREF1) == 0);
assertTrue(count(XRefsOppositePackage.Literals.A__OREF2) == 0);
assertTrue(count(XRefsOppositePackage.Literals.A__REF3) == 0);
assertTrue(count(XRefsOppositePackage.Literals.A__OWNING_APKG) == 3);
}
/**
* Returns whether the getInverseReferences(object, feature) returns the expected results
*/
private void assertInverseFeature(EObject object, EReference feature, EObject ... expectedResults)
{
Collection<Setting> settings = fixture.getInverseReferences(object, feature, true);
assertTrue(!settings.isEmpty());
for (EStructuralFeature.Setting setting : settings)
{
assertTrue(setting.getEStructuralFeature() == feature);
assertTrue(Arrays.asList(expectedResults).contains(setting.getEObject()));
}
}
/**
* Returns whether the getInverseReferences(object) returns the expected results
*/
private void assertInverse(A object, EReference feature, EObject ... expectedResults)
{
Collection<Setting> settings = fixture.getInverseReferences(object, true);
assertTrue(!settings.isEmpty());
for (EStructuralFeature.Setting setting : settings)
{
if (feature == setting.getEStructuralFeature())
{
assertTrue(setting.getEStructuralFeature() == feature);
assertTrue(Arrays.asList(expectedResults).contains(setting.getEObject()));
}
}
}
//
// Test framework
//
@Before
public void setUp()
{
// Create a fresh new instance the same as the parameter.
fixture = new ECrossReferenceAdapter();
}
@After
public void tearDown()
{
fixture = null;
}
private Resource loadXRefsInstance()
{
ResourceSet rset = new ResourceSetImpl();
rset.getResourceFactoryRegistry().getExtensionToFactoryMap().put("xmi", new XMIResourceFactoryImpl());
rset.getPackageRegistry().put(XRefsOppositePackage.eNS_URI, XRefsOppositePackage.eINSTANCE);
XRefsOppositePackage.eINSTANCE.setEFactoryInstance(new XRefsOppositeFactoryImpl() {
@Override
public APkg createAPkg()
{
return new APkgImpl() {
};
}
@Override
public A createA()
{
return new AImpl() {
@Override
public Setting eSetting(EStructuralFeature eFeature)
{
increment(eFeature);
return super.eSetting(eFeature);
}
@Override
public Object eGet(EStructuralFeature eFeature, boolean resolve)
{
increment(eFeature);
return super.eGet(eFeature, resolve);
}
};
}
});
Resource resource = rset.getResource(URI.createFileURI(TestUtil.getPluginDirectory(AllSuites.PLUGIN_ID) + "/data/xrefsopposite.xmi"), true);
resource.eAdapters().add(fixture);
EcoreUtil.resolveAll(resource);
return resource;
}
}