blob: 965b86c840a7a62097848e5701ec93251ffaa962 [file] [log] [blame]
/**
* Copyright (c) 2011-2012 Eclipse contributors 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
*/
package org.eclipse.emf.test.ecore.xcore;
import com.google.common.collect.Iterables;
import com.google.inject.Inject;
import java.util.Iterator;
import org.eclipse.emf.codegen.ecore.genmodel.GenBase;
import org.eclipse.emf.codegen.ecore.genmodel.GenClassifier;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.ecore.xcore.XAnnotation;
import org.eclipse.emf.ecore.xcore.XAnnotationDirective;
import org.eclipse.emf.ecore.xcore.XAttribute;
import org.eclipse.emf.ecore.xcore.XClass;
import org.eclipse.emf.ecore.xcore.XClassifier;
import org.eclipse.emf.ecore.xcore.XGenericType;
import org.eclipse.emf.ecore.xcore.XMember;
import org.eclipse.emf.ecore.xcore.XOperation;
import org.eclipse.emf.ecore.xcore.XPackage;
import org.eclipse.emf.ecore.xcore.XReference;
import org.eclipse.emf.ecore.xcore.XcoreExtensions;
import org.eclipse.xtend2.lib.StringConcatenation;
import org.eclipse.xtext.resource.XtextResource;
import org.eclipse.xtext.testing.InjectWith;
import org.eclipse.xtext.testing.XtextRunner;
import org.eclipse.xtext.testing.util.ParseHelper;
import org.eclipse.xtext.testing.validation.ValidationTestHelper;
import org.eclipse.xtext.xbase.lib.Exceptions;
import org.eclipse.xtext.xbase.lib.Extension;
import org.eclipse.xtext.xbase.lib.IterableExtensions;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
@RunWith(XtextRunner.class)
@InjectWith(XcoreStandaloneInjectorProvider.class)
@SuppressWarnings("all")
public class ParsingTest {
@Inject
private ParseHelper<XPackage> parser;
@Inject
@Extension
private XcoreExtensions exts;
@Inject
@Extension
private ValidationTestHelper vth;
@Test
public void parseSimpleFile() {
try {
final XPackage parse = this.parser.parse("package foo");
Assert.assertEquals("foo", parse.getName());
} catch (Throwable _e) {
throw Exceptions.sneakyThrow(_e);
}
}
@Test
public void testJvmTypes() {
try {
StringConcatenation _builder = new StringConcatenation();
_builder.append("package foo ");
_builder.newLine();
_builder.append("class A ");
_builder.newLine();
_builder.append("{ ");
_builder.newLine();
_builder.append("\t");
_builder.append("refers A a");
_builder.newLine();
_builder.append("} ");
_builder.newLine();
final XPackage pack = this.parser.parse(_builder);
EcoreUtil.resolveAll(pack.eResource());
this.vth.assertNoErrors(pack);
} catch (Throwable _e) {
throw Exceptions.sneakyThrow(_e);
}
}
@Test
public void testSuperTypeLinking_1() {
try {
StringConcatenation _builder = new StringConcatenation();
_builder.append("package foo ");
_builder.newLine();
_builder.append("class A {} ");
_builder.newLine();
_builder.append("class B extends A {}");
_builder.newLine();
final XPackage pack = this.parser.parse(_builder);
XClassifier _get = pack.getClassifiers().get(1);
final XClass clazz = ((XClass) _get);
Assert.assertEquals("A", this.exts.getGenClass(IterableExtensions.<XGenericType>head(clazz.getSuperTypes())).getName());
} catch (Throwable _e) {
throw Exceptions.sneakyThrow(_e);
}
}
@Test
public void testSuperTypeLinking_2() {
try {
StringConcatenation _builder = new StringConcatenation();
_builder.append("package foo ");
_builder.newLine();
_builder.append("class A {} ");
_builder.newLine();
_builder.append("class B extends foo.A {}");
_builder.newLine();
final XPackage pack = this.parser.parse(_builder);
XClassifier _get = pack.getClassifiers().get(1);
final XClass clazz = ((XClass) _get);
Assert.assertEquals("A", this.exts.getGenClass(IterableExtensions.<XGenericType>head(clazz.getSuperTypes())).getName());
} catch (Throwable _e) {
throw Exceptions.sneakyThrow(_e);
}
}
@Test
public void testReferenceToAnnotation() {
try {
StringConcatenation _builder = new StringConcatenation();
_builder.append("package foo ");
_builder.newLine();
_builder.append("annotation \'foo/bar\' as foo");
_builder.newLine();
_builder.append("@foo(holla=\'bar\')");
_builder.newLine();
_builder.append("class A {} ");
_builder.newLine();
final XPackage pack = this.parser.parse(_builder);
XClassifier _get = pack.getClassifiers().get(0);
final XClass clazz = ((XClass) _get);
Assert.assertEquals(IterableExtensions.<XAnnotationDirective>head(pack.getAnnotationDirectives()), IterableExtensions.<XAnnotation>head(clazz.getAnnotations()).getSource());
} catch (Throwable _e) {
throw Exceptions.sneakyThrow(_e);
}
}
@Test
public void testReferenceToOpposite() {
try {
StringConcatenation _builder = new StringConcatenation();
_builder.append("package foo");
_builder.newLine();
_builder.append("class X");
_builder.newLine();
_builder.append("{");
_builder.newLine();
_builder.append("\t");
_builder.append("refers X x opposite y ");
_builder.newLine();
_builder.append("\t");
_builder.append("refers X y opposite x");
_builder.newLine();
_builder.append("\t");
_builder.append("op void foo() {");
_builder.newLine();
_builder.append("\t\t");
_builder.append("val X x = null");
_builder.newLine();
_builder.append("\t");
_builder.append("}");
_builder.newLine();
_builder.append("}");
_builder.newLine();
final String text = _builder.toString();
final XPackage pack = this.parser.parse(text);
{
XClassifier _get = pack.getClassifiers().get(0);
final XClass clazz = ((XClass) _get);
final Iterator<XReference> refs = Iterables.<XReference>filter(clazz.getMembers(), XReference.class).iterator();
XReference refX = refs.next();
XReference refY = refs.next();
Assert.assertEquals(refY.getName(), refX.getOpposite().getName());
Assert.assertEquals(refX.getName(), refY.getOpposite().getName());
}
Resource _eResource = pack.eResource();
final XtextResource resource = ((XtextResource) _eResource);
final int elements = resource.getContents().size();
resource.update(0, text.length(), text);
{
EObject _get = resource.getContents().get(0);
XClassifier _get_1 = ((XPackage) _get).getClassifiers().get(0);
final XClass clazz = ((XClass) _get_1);
final Iterator<XReference> refs = Iterables.<XReference>filter(clazz.getMembers(), XReference.class).iterator();
XReference refX = refs.next();
XReference refY = refs.next();
Assert.assertEquals(refY.getName(), refX.getOpposite().getName());
Assert.assertEquals(refX.getName(), refY.getOpposite().getName());
Assert.assertEquals(elements, resource.getContents().size());
}
resource.reparse(text);
{
EObject _get = resource.getContents().get(0);
XClassifier _get_1 = ((XPackage) _get).getClassifiers().get(0);
final XClass clazz = ((XClass) _get_1);
final Iterator<XReference> refs = Iterables.<XReference>filter(clazz.getMembers(), XReference.class).iterator();
XReference refX = refs.next();
XReference refY = refs.next();
Assert.assertEquals(refY.getName(), refX.getOpposite().getName());
Assert.assertEquals(refX.getName(), refY.getOpposite().getName());
Assert.assertEquals(elements, resource.getContents().size());
}
} catch (Throwable _e) {
throw Exceptions.sneakyThrow(_e);
}
}
@Test
public void operationReturnsVoid() {
try {
StringConcatenation _builder = new StringConcatenation();
_builder.append("package foo");
_builder.newLine();
_builder.append("class Bar {");
_builder.newLine();
_builder.append("\t");
_builder.append("op void operation() {}");
_builder.newLine();
_builder.append("}");
_builder.newLine();
final XPackage pack = this.parser.parse(_builder);
XClassifier _head = IterableExtensions.<XClassifier>head(pack.getClassifiers());
final XClass clazz = ((XClass) _head);
XMember _head_1 = IterableExtensions.<XMember>head(clazz.getMembers());
final XOperation operation = ((XOperation) _head_1);
Assert.assertTrue(clazz.eResource().getErrors().isEmpty());
Assert.assertNull(operation.getType());
} catch (Throwable _e) {
throw Exceptions.sneakyThrow(_e);
}
}
@Test
public void referenceMayNotBeVoid() {
try {
StringConcatenation _builder = new StringConcatenation();
_builder.append("package foo");
_builder.newLine();
_builder.append("class Bar {");
_builder.newLine();
_builder.append("\t");
_builder.append("refers void referenceName");
_builder.newLine();
_builder.append("}");
_builder.newLine();
final XPackage pack = this.parser.parse(_builder);
String _string = pack.eResource().getErrors().toString();
int _size = pack.eResource().getErrors().size();
boolean _lessEqualsThan = (1 <= _size);
Assert.assertTrue(_string, _lessEqualsThan);
} catch (Throwable _e) {
throw Exceptions.sneakyThrow(_e);
}
}
@Test
public void stringResolvesToEString() {
try {
StringConcatenation _builder = new StringConcatenation();
_builder.append("package foo");
_builder.newLine();
_builder.append("class Bar {");
_builder.newLine();
_builder.append("\t");
_builder.append("String value");
_builder.newLine();
_builder.append("}");
_builder.newLine();
final XPackage pack = this.parser.parse(_builder);
XClassifier _head = IterableExtensions.<XClassifier>head(pack.getClassifiers());
final XClass clazz = ((XClass) _head);
XMember _head_1 = IterableExtensions.<XMember>head(clazz.getMembers());
final XAttribute attribute = ((XAttribute) _head_1);
GenBase _type = attribute.getType().getType();
Assert.assertTrue((_type instanceof GenClassifier));
GenBase _type_1 = attribute.getType().getType();
Assert.assertEquals("EString", ((GenClassifier) _type_1).getName());
} catch (Throwable _e) {
throw Exceptions.sneakyThrow(_e);
}
}
@Test
public void testEcoreDataTypeAliases() {
try {
StringConcatenation _builder = new StringConcatenation();
_builder.append("package foo ");
_builder.newLine();
_builder.append("class A ");
_builder.newLine();
_builder.append("{ ");
_builder.newLine();
_builder.append("\t");
_builder.append("java.math.BigDecimal _bigDecimal");
_builder.newLine();
_builder.append("\t");
_builder.append("java.math.BigInteger _bigInteger");
_builder.newLine();
_builder.append("\t");
_builder.append("boolean _boolean");
_builder.newLine();
_builder.append("\t");
_builder.append("Boolean _Boolean");
_builder.newLine();
_builder.append("\t");
_builder.append("byte _byte");
_builder.newLine();
_builder.append("\t");
_builder.append("Byte _Byte");
_builder.newLine();
_builder.append("\t");
_builder.append("char _char");
_builder.newLine();
_builder.append("\t");
_builder.append("Character _Character");
_builder.newLine();
_builder.append("\t");
_builder.append("java.util.Date _date");
_builder.newLine();
_builder.append("\t");
_builder.append("double _double");
_builder.newLine();
_builder.append("\t");
_builder.append("Double _Double");
_builder.newLine();
_builder.append("\t");
_builder.append("float _float");
_builder.newLine();
_builder.append("\t");
_builder.append("Float _Float");
_builder.newLine();
_builder.append("\t");
_builder.append("int _int");
_builder.newLine();
_builder.append("\t");
_builder.append("Integer _Integer");
_builder.newLine();
_builder.append("\t");
_builder.append("Class _class");
_builder.newLine();
_builder.append("\t");
_builder.append("Object _object");
_builder.newLine();
_builder.append("\t");
_builder.append("long _long");
_builder.newLine();
_builder.append("\t");
_builder.append("Long _Long");
_builder.newLine();
_builder.append("\t");
_builder.append("short _short");
_builder.newLine();
_builder.append("\t");
_builder.append("Short _Short");
_builder.newLine();
_builder.append("\t");
_builder.append("String _String");
_builder.newLine();
_builder.append("} ");
_builder.newLine();
final XPackage pack = this.parser.parse(_builder);
EcoreUtil.resolveAll(pack.eResource());
this.vth.assertNoErrors(pack);
} catch (Throwable _e) {
throw Exceptions.sneakyThrow(_e);
}
}
@Test
public void testEnumMembersAvailable() {
try {
StringConcatenation _builder = new StringConcatenation();
_builder.append("@GenModel(complianceLevel=\"6.0\")");
_builder.newLine();
_builder.append("package p ");
_builder.newLine();
_builder.append("class A ");
_builder.newLine();
_builder.append("{ ");
_builder.newLine();
_builder.append("\t");
_builder.append("op void m() {");
_builder.newLine();
_builder.append("\t\t");
_builder.append("if (E.ONE != E.TWO && E.ONE_VALUE != E.TWO_VALUE) {");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("var E e = E.valueOf(\'\')");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("var E[] all = E.values()");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("all = E.VALUES");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("e = E.get(1)");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("e = E.get(\'\')");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("e = E.getByName(\'\')");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("var String s = E.ONE.name()");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("s = E.ONE.getName()");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("var int i = E.ONE.value");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("s = E.ONE.literal");
_builder.newLine();
_builder.append("\t\t");
_builder.append("}");
_builder.newLine();
_builder.append("\t");
_builder.append("}");
_builder.newLine();
_builder.append("}");
_builder.newLine();
_builder.append("enum E {");
_builder.newLine();
_builder.append("\t");
_builder.append("one = 1");
_builder.newLine();
_builder.append("\t");
_builder.append("two = 2");
_builder.newLine();
_builder.append("}");
_builder.newLine();
final XPackage pack = this.parser.parse(_builder);
EcoreUtil.resolveAll(pack.eResource());
this.vth.assertNoErrors(pack);
} catch (Throwable _e) {
throw Exceptions.sneakyThrow(_e);
}
}
}