added test for languageinheritance, first steps towards generation of abstract languages

This commit is contained in:
sefftinge 2008-07-08 08:09:56 +00:00
parent 9a90cf75bf
commit bab3003ab2
12 changed files with 157 additions and 42 deletions

View file

@ -14,6 +14,8 @@ import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.xtext.dummy.DummyLanguage;
import org.eclipse.xtext.grammarinheritance.AbstractTestLanguage;
import org.eclipse.xtext.grammarinheritance.ConcreteTestLanguage;
import org.eclipse.xtext.metamodelreferencing.tests.MetamodelRefTest;
import org.eclipse.xtext.parsetree.reconstr.ComplexReconstrTest;
import org.eclipse.xtext.parsetree.reconstr.SimpleReconstrTest;
@ -34,10 +36,11 @@ public class GenerateAllTestGrammars {
private static String path = "./src-gen";
private static Log log = LogFactory.getLog(GenerateAllTestGrammars.class);
public final static Class<?>[] testclasses = new Class[] { XtextGrammarTest.class, MetamodelRefTest.class,
public final static Class<?>[] testclasses = new Class[] { AbstractTestLanguage.class,ConcreteTestLanguage.class,XtextGrammarTest.class, MetamodelRefTest.class,
DummyLanguage.class, TestLanguage.class, SimpleReconstrTest.class, ComplexReconstrTest.class,
LexerLanguage.class, SimpleExpressions.class, ActionTestLanguage.class, OptionalEmptyLanguage.class,
ReferenceGrammar.class, LookaheadLanguage.class };// MultiGenMMTest.
ReferenceGrammar.class, LookaheadLanguage.class
};// MultiGenMMTest.
// class
public static void main(String[] args) throws Exception {

View file

@ -0,0 +1,5 @@
package org.eclipse.xtext.grammarinheritance;
public class AbstractTestLanguage {
}

View file

@ -0,0 +1,12 @@
abstract language org.eclipse.xtext.grammarinheritance.AbstractTestLanguage
import "classpath:/org/eclipse/xtext/grammarinheritance/ametamodel.ecore" as mm
InheritedParserRule returns mm::Element :
'element' name=ID;
lexing:
REAL returns ecore::EDouble : "RULE_INT '.' RULE_INT";
ID : "('^')?('a'..'z'|'A'..'Z'|'ö'|'ä'|'ü'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')*";

View file

@ -0,0 +1,5 @@
package org.eclipse.xtext.grammarinheritance;
public class ConcreteTestLanguage {
}

View file

@ -0,0 +1,7 @@
language org.eclipse.xtext.grammarinheritance.ConcreteTestLanguage extends org.eclipse.xtext.grammarinheritance.AbstractTestLanguage
generate foo "http://holla"
ConcreteParserRule :
'model' magicNumber=REAL ':' (elements+=InheritedParserRule)*;

View file

@ -0,0 +1,113 @@
package org.eclipse.xtext.grammarinheritance;
import java.util.List;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.xtext.Grammar;
import org.eclipse.xtext.GrammarUtil;
import org.eclipse.xtext.LexerRule;
import org.eclipse.xtext.ReferencedMetamodel;
import org.eclipse.xtext.XtextStandaloneSetup;
import org.eclipse.xtext.parsetree.SyntaxError;
import org.eclipse.xtext.resource.XtextResource;
import org.eclipse.xtext.resource.XtextResourceSet;
import org.eclipse.xtext.tests.AbstractGeneratorTest;
import org.eclipse.xtext.xtextutil.AbstractType;
import org.eclipse.xtext.xtextutil.ComplexType;
import org.eclipse.xtext.xtextutil.Feature;
import org.eclipse.xtext.xtextutil.MetaModel;
import org.eclipse.xtext.xtextutil.XtextutilPackage;
public class ToEcoreTrafoTest extends AbstractGeneratorTest {
@Override
protected void setUp() throws Exception {
super.setUp();
with(XtextStandaloneSetup.class);
XtextutilPackage.eINSTANCE.getAbstractType();
}
@SuppressWarnings("unchecked")
public void testAbstractLanguageToMetamodel() throws Exception {
XtextResource r = getResource("classpath:/"+AbstractTestLanguage.class.getName().replace('.', '/')+".xtext");
Grammar element = (Grammar) r.getParseResult().getRootASTElement();
if (!r.getParseResult().getParseErrors().isEmpty()) {
List<SyntaxError> errors = r.getParseResult().getParseErrors();
for (SyntaxError syntaxError : errors) {
System.out.println(syntaxError.getMessage()+" - "+syntaxError.getNode().getLine());
}
fail();
}
List<LexerRule> lexerRules = GrammarUtil.allLexerRules(element);
assertEquals(9, lexerRules.size());
for (LexerRule lexerRule : lexerRules) {
System.out.println(lexerRule.getName());
}
List<MetaModel> mms = (List<MetaModel>) invokeWithXtend("getAllMetaModels(this)", element);
assertNotNull(mms);
assertEquals(2,mms.size());
for (MetaModel metaModel : mms) {
assertNotNull(metaModel.getDeclaration());
assertNotNull(((ReferencedMetamodel)metaModel.getDeclaration()).getUri());
}
}
@SuppressWarnings("unchecked")
public void testConcreteLanguageToMetamodel() throws Exception {
XtextResource r = getResource("classpath:/"+ConcreteTestLanguage.class.getName().replace('.', '/')+".xtext");
Grammar element = (Grammar) r.getParseResult().getRootASTElement();
List<LexerRule> lexerRules = GrammarUtil.allLexerRules(element);
assertEquals(9, lexerRules.size());
for (LexerRule lexerRule : lexerRules) {
System.out.println(lexerRule.getName());
}
GrammarUtil.getReturnTypeName(GrammarUtil.findRuleForName(element, "REAL"));
List<MetaModel> mms = (List<MetaModel>) invokeWithXtend("getAllMetaModels(this)", element);
assertNotNull(mms);
assertEquals(3,mms.size());
for (MetaModel metaModel : mms) {
assertNotNull(metaModel.getDeclaration());
EList<AbstractType> types = metaModel.getTypes();
for (AbstractType abstractType : types) {
assertNotNull(abstractType);
if (abstractType instanceof ComplexType) {
ComplexType ct = (ComplexType) abstractType;
EList<Feature> features = ct.getFeatures();
for (Feature feature : features) {
assertNotNull(feature);
assertNotNull(feature.getName(), feature.getType());
}
}
}
}
}
@SuppressWarnings("unchecked")
public void testConcreteLanguageToMetamodel1() throws Exception {
try {
XtextResource r = getResource("classpath:/"+ConcreteTestLanguage.class.getName().replace('.', '/')+".xtext");
EObject element = r.getParseResult().getRootASTElement();
List<EPackage> mms = (List<EPackage>) invokeWithXtend("getGeneratedEPackages(this)", element);
assertNotNull(mms);
assertEquals(1,mms.size());
} catch (Exception e) {
e.printStackTrace();
}
}
private XtextResource getResource(String uri) {
XtextResourceSet set = new XtextResourceSet();
XtextResource r = (XtextResource) set.getResource(URI.createURI(uri),true);
return r;
}
@Override
protected String[] importedExtensions() {
return new String[]{
"org::eclipse::xtext::XtextUtil",
"org::eclipse::xtext::xtext2ecore::Xtext2Ecore"
};
}
}

View file

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<ecore:EPackage xmi:version="2.0"
xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="ametamodel"
nsURI="http://www.eclipse.org/xtext/tests/grammarinheritance" nsPrefix="ametamodel">
<eClassifiers xsi:type="ecore:EClass" name="AType">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
</eClassifiers>
</ecore:EPackage>

View file

@ -1,5 +0,0 @@
package org.eclipse.xtext.inheritance;
public class AbstractBaseLanguage {
}

View file

@ -1,14 +0,0 @@
/*******************************************************************************
* Copyright (c) 2008 itemis AG (http://www.itemis.eu) and others.
* 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
*
*******************************************************************************/
abstract language org.eclipse.xtext.inheritance.AbstractBaseLanguage
lexing :
MY_SPECIAL1 : "'special1'";
MY_SPECIAL2 returns ecore::EJavaObject: "'special2'";

View file

@ -1,5 +0,0 @@
package org.eclipse.xtext.inheritance;
public class ConcreteSubLanguage {
}

View file

@ -1,15 +0,0 @@
/*******************************************************************************
* Copyright (c) 2008 itemis AG (http://www.itemis.eu) and others.
* 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
*
*******************************************************************************/
language org.eclipse.xtext.inheritance.ConcreteSubLanguage extends org.eclipse.xtext.inheritance.AbstractBaseLanguage
Model : s1=MY_SPECIAL1 s2=MY_SPECIAL2 s3=MY_SPECIAL3;
lexing:
MY_SPECIAL3 : "'special3'";

View file

@ -60,7 +60,7 @@ public class TestBootstrapModel extends AbstractGeneratorTest {
MetaModel xtext = (MetaModel) invokeWithXtend("select(e|e.alias()==null).first()", result);
MetaModel ecore = (MetaModel) invokeWithXtend("select(e|e.alias()=='ecore').first()", result);
assertEquals(15,xtext.getTypes().size());
assertEquals(3,ecore.getTypes().size());
assertEquals(2,ecore.getTypes().size());
for(AbstractType t : xtext.getTypes()) {
System.out.println(t.getName()+" {");