mirror of
https://github.com/sigmasternchen/xtext-core
synced 2025-03-16 16:58:56 +00:00
Next patch from Heiko: Validation of output
see https://bugs.eclipse.org/bugs/attachment.cgi?id=113883
This commit is contained in:
parent
c7ac0b4446
commit
39a52ff3d5
3 changed files with 106 additions and 5 deletions
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue