Next patch from Heiko: Validation of output

see https://bugs.eclipse.org/bugs/attachment.cgi?id=113883
This commit is contained in:
jkohnlein 2008-09-30 15:50:35 +00:00 committed by sefftinge
parent c7ac0b4446
commit 39a52ff3d5
3 changed files with 106 additions and 5 deletions

View file

@ -68,4 +68,19 @@ public class EcoreUtil2Tests extends TestCase {
assertSame(b, EcoreUtil2.getCompatibleType(b, d));
assertSame(a, EcoreUtil2.getCompatibleType(d, e));
}
public void testGetAllSuperTypesWithCycle() {
EClass a = createEClass("a");
EClass b = createEClass("b");
b.getESuperTypes().add(a);
a.getESuperTypes().add(b);
// inconsistent and quasi-unpredictable in complex scenarios due to caching
assertTrue(a.getEAllSuperTypes().contains(a));
assertFalse(b.getEAllSuperTypes().contains(b));
// always stable
assertTrue(EcoreUtil2.getAllSuperTypes(a).contains(a));
assertTrue(EcoreUtil2.getAllSuperTypes(b).contains(b));
}
}

View file

@ -8,14 +8,20 @@
*******************************************************************************/
package org.eclipse.xtext.resource.metamodel;
import static org.easymock.EasyMock.anyObject;
import static org.easymock.EasyMock.createMock;
import static org.easymock.EasyMock.same;
import junit.framework.TestCase;
import org.easymock.EasyMock;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EDataType;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EcoreFactory;
import org.eclipse.xtext.resource.metamodel.EClassifierInfo.EClassInfo;
import org.eclipse.xtext.resource.metamodel.ErrorAcceptor.ErrorCode;
/**
* @author Heiko Behrens - Initial contribution and API
@ -27,10 +33,23 @@ public class TypeHierarchyHelperTests extends TestCase {
private EClassifierInfos infos = new EClassifierInfos();
private EDataType INT = EcoreFactory.eINSTANCE.createEDataType();
private EDataType STRING = EcoreFactory.eINSTANCE.createEDataType();
private ErrorAcceptor errorAcceptorMock;
@Override
protected void setUp() throws Exception {
super.setUp();
errorAcceptorMock = createMock(ErrorAcceptor.class);
}
private void liftUpFeatures() throws Exception {
helper = new TypeHierarchyHelper(infos);
initializeHelper();
helper.liftUpFeaturesRecursively();
EasyMock.verify(errorAcceptorMock);
}
private void initializeHelper() {
EasyMock.replay(errorAcceptorMock);
helper = new TypeHierarchyHelper(infos, errorAcceptorMock);
}
private EClassInfo addClass(String name, boolean isGenerated) {
@ -204,7 +223,7 @@ public class TypeHierarchyHelperTests extends TestCase {
public void testDublicateDerivedFeature() throws Exception {
EClassInfo a = addClass("a");
EClassInfo b = addClass("b");
EClassInfo c = addClass("b");
EClassInfo c = addClass("c");
b.addSupertype(a);
c.addSupertype(b);
addAttribute(a, INT, "f");
@ -214,12 +233,49 @@ public class TypeHierarchyHelperTests extends TestCase {
assertEquals(0, b.getEClass().getEStructuralFeatures().size());
assertEquals(1, c.getEClass().getEStructuralFeatures().size());
helper = new TypeHierarchyHelper(infos);
initializeHelper();
helper.removeDuplicateDerivedFeatures();
assertEquals(1, a.getEClass().getEStructuralFeatures().size());
assertEquals(0, b.getEClass().getEStructuralFeatures().size());
assertEquals(0, c.getEClass().getEStructuralFeatures().size());
}
public void testCylceInTypeHierarchy() throws Exception {
EClassInfo a = addClass("a");
EClassInfo b = addClass("b");
EClassInfo c = addClass("c");
EClassInfo d = addClass("d");
a.addSupertype(c);
b.addSupertype(a);
c.addSupertype(b);
d.addSupertype(a);
errorAcceptorMock.acceptError(same(ErrorCode.TypeWithCycleInHierarchy), (String) anyObject(),
(EObject) anyObject());
EasyMock.expectLastCall().times(3);
initializeHelper();
helper.detectEClassesWithCyclesInTypeHierachy();
EasyMock.verify(errorAcceptorMock);
}
public void testDuplicateFeatures01() throws Exception {
EClassInfo a = addClass("a");
EClassInfo b = addClass("b");
b.addSupertype(a);
addAttribute(a, INT, "f1");
addAttribute(a, STRING, "f2");
addAttribute(b, INT, "f2");
errorAcceptorMock.acceptError(same(ErrorCode.MoreThanOneFeatureWithSameName), (String) anyObject(),
(EObject) anyObject());
initializeHelper();
helper.detectDuplicatedFeatures();
EasyMock.verify(errorAcceptorMock);
}
}

View file

@ -15,6 +15,7 @@ import static org.easymock.EasyMock.verify;
import java.util.List;
import org.easymock.EasyMock;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
@ -377,7 +378,6 @@ public class Xtext2EcoreTransformerTests extends AbstractGeneratorTest {
assertSame(type, item.getESuperTypes().get(0));
assertEquals(1, thing.getESuperTypes().size());
assertSame(type, thing.getESuperTypes().get(0));
}
public void testAssignedRuleCall() throws Exception {
@ -442,7 +442,6 @@ public class Xtext2EcoreTransformerTests extends AbstractGeneratorTest {
assertEquals(4, ruleA.getEReferences().size());
assertReferenceConfiguration(ruleA, 0, "refA1", "TypeB", true, 0, 1);
// TODO should be common compatible type according to #248430
assertReferenceConfiguration(ruleA, 1, "refA2", "TypeB", true, 0, 1);
assertReferenceConfiguration(ruleA, 2, "refA3", "TypeB", true, 0, -1);
assertReferenceConfiguration(ruleA, 3, "refA4", "TypeB", true, 0, 1);
@ -656,6 +655,37 @@ public class Xtext2EcoreTransformerTests extends AbstractGeneratorTest {
assertNotNull(ruleA);
assertEquals(1, ruleA.getEAttributes().size());
assertAttributeConfiguration(ruleA, 0, "featureA", "EString");
}
public void testCycleInTypeHierarchy() throws Exception {
String grammar = "language test generate test 'http://test'";
grammar += " RuleA: RuleB;";
grammar += " RuleB: RuleC;";
grammar += " RuleC: RuleA;";
grammar += " RuleD: RuleA;";
errorAcceptorMock.acceptError(same(ErrorCode.TypeWithCycleInHierarchy), (String) anyObject(),
(EObject) anyObject());
EasyMock.expectLastCall().times(3);
EPackage ePackage = getEPackageFromGrammar(grammar);
assertEquals(4, ePackage.getEClassifiers().size());
EClass ruleA = (EClass) ePackage.getEClassifier("RuleA");
assertNotNull(ruleA);
EClass ruleB = (EClass) ePackage.getEClassifier("RuleB");
assertNotNull(ruleB);
EClass ruleC = (EClass) ePackage.getEClassifier("RuleC");
assertNotNull(ruleC);
EClass ruleD = (EClass) ePackage.getEClassifier("RuleD");
assertNotNull(ruleD);
assertEquals(2, ruleA.getESuperTypes().size());
assertSame(ruleC, ruleA.getESuperTypes().get(0));
assertSame(ruleD, ruleA.getESuperTypes().get(1));
assertEquals(1, ruleB.getESuperTypes().size());
assertSame(ruleA, ruleB.getESuperTypes().get(0));
assertEquals(1, ruleC.getESuperTypes().size());
assertSame(ruleB, ruleC.getESuperTypes().get(0));
assertEquals(0, ruleD.getESuperTypes().size());
}
}