package org.example.smalljava.tests; import com.google.inject.Inject; import java.util.ArrayList; import java.util.List; import org.eclipse.emf.common.util.EList; import org.eclipse.xtend2.lib.StringConcatenation; import org.eclipse.xtext.junit4.InjectWith; import org.eclipse.xtext.junit4.XtextRunner; import org.eclipse.xtext.junit4.util.ParseHelper; import org.eclipse.xtext.xbase.lib.Conversions; import org.eclipse.xtext.xbase.lib.Exceptions; import org.eclipse.xtext.xbase.lib.Extension; import org.eclipse.xtext.xbase.lib.Functions.Function1; import org.eclipse.xtext.xbase.lib.IterableExtensions; import org.eclipse.xtext.xbase.lib.ListExtensions; import org.eclipse.xtext.xbase.lib.ObjectExtensions; import org.eclipse.xtext.xbase.lib.Procedures.Procedure1; import org.example.smalljava.SmallJavaInjectorProvider; import org.example.smalljava.smallJava.SJClass; import org.example.smalljava.smallJava.SJMethod; import org.example.smalljava.smallJava.SJMethodBody; import org.example.smalljava.smallJava.SJProgram; import org.example.smalljava.smallJava.SJReturn; import org.example.smalljava.smallJava.SJStatement; import org.example.smalljava.util.SmallJavaModelUtil; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; @RunWith(XtextRunner.class) @InjectWith(SmallJavaInjectorProvider.class) @SuppressWarnings("all") public class SmallJavaModelUtilTest { @Inject @Extension private ParseHelper<SJProgram> _parseHelper; @Test public void testValidHierarchy() { try { StringConcatenation _builder = new StringConcatenation(); _builder.append("class C {}"); _builder.newLine(); _builder.newLine(); _builder.append("class D extends C {}"); _builder.newLine(); _builder.newLine(); _builder.append("class E extends D {}"); SJProgram _parse = this._parseHelper.parse(_builder); EList<SJClass> _classes = _parse.getClasses(); final Procedure1<EList<SJClass>> _function = new Procedure1<EList<SJClass>>() { @Override public void apply(final EList<SJClass> it) { SJClass _get = it.get(0); SmallJavaModelUtilTest.this.assertHierarchy(_get, ""); SJClass _get_1 = it.get(1); SmallJavaModelUtilTest.this.assertHierarchy(_get_1, "C"); SJClass _get_2 = it.get(2); SmallJavaModelUtilTest.this.assertHierarchy(_get_2, "D, C"); } }; ObjectExtensions.<EList<SJClass>>operator_doubleArrow(_classes, _function); } catch (Throwable _e) { throw Exceptions.sneakyThrow(_e); } } @Test public void testCyclicHierarchy() { try { StringConcatenation _builder = new StringConcatenation(); _builder.append("class C extends E {}"); _builder.newLine(); _builder.newLine(); _builder.append("class D extends C {}"); _builder.newLine(); _builder.newLine(); _builder.append("class E extends D {}"); SJProgram _parse = this._parseHelper.parse(_builder); EList<SJClass> _classes = _parse.getClasses(); final Procedure1<EList<SJClass>> _function = new Procedure1<EList<SJClass>>() { @Override public void apply(final EList<SJClass> it) { SJClass _get = it.get(0); SmallJavaModelUtilTest.this.assertHierarchy(_get, "E, D, C"); SJClass _get_1 = it.get(1); SmallJavaModelUtilTest.this.assertHierarchy(_get_1, "C, E, D"); SJClass _get_2 = it.get(2); SmallJavaModelUtilTest.this.assertHierarchy(_get_2, "D, C, E"); } }; ObjectExtensions.<EList<SJClass>>operator_doubleArrow(_classes, _function); } catch (Throwable _e) { throw Exceptions.sneakyThrow(_e); } } @Test public void testReturnStatement() { try { StringConcatenation _builder = new StringConcatenation(); _builder.append("class C {"); _builder.newLine(); _builder.append("\t"); _builder.append("C m() {"); _builder.newLine(); _builder.append("\t\t"); _builder.append("this.m();"); _builder.newLine(); _builder.append("\t\t"); _builder.append("return null;"); _builder.newLine(); _builder.append("\t\t"); _builder.append("this.m();"); _builder.newLine(); _builder.append("\t"); _builder.append("}"); _builder.newLine(); _builder.append("}"); _builder.newLine(); SJProgram _parse = this._parseHelper.parse(_builder); EList<SJClass> _classes = _parse.getClasses(); SJClass _head = IterableExtensions.<SJClass>head(_classes); Iterable<SJMethod> _methods = SmallJavaModelUtil.methods(_head); SJMethod _head_1 = IterableExtensions.<SJMethod>head(_methods); final Procedure1<SJMethod> _function = new Procedure1<SJMethod>() { @Override public void apply(final SJMethod it) { SJMethodBody _body = it.getBody(); EList<SJStatement> _statements = _body.getStatements(); SJStatement _get = _statements.get(1); SJReturn _returnStatement = SmallJavaModelUtil.returnStatement(it); Assert.assertSame(_get, _returnStatement); } }; ObjectExtensions.<SJMethod>operator_doubleArrow(_head_1, _function); } catch (Throwable _e) { throw Exceptions.sneakyThrow(_e); } } @Test public void testMethodAsStringWithType() { try { StringConcatenation _builder = new StringConcatenation(); _builder.append("class A {}"); _builder.newLine(); _builder.append("class B {}"); _builder.newLine(); _builder.append("class C {"); _builder.newLine(); _builder.append("\t"); _builder.append("A m() { return null; }"); _builder.newLine(); _builder.append("\t"); _builder.append("A n(B b, C c) { return null; }"); _builder.newLine(); _builder.append("\t"); _builder.append("A p(Foo b, C c) { return null; }"); _builder.newLine(); _builder.append("}"); _builder.newLine(); SJProgram _parse = this._parseHelper.parse(_builder); EList<SJClass> _classes = _parse.getClasses(); SJClass _last = IterableExtensions.<SJClass>last(_classes); Iterable<SJMethod> _methods = SmallJavaModelUtil.methods(_last); final Procedure1<Iterable<SJMethod>> _function = new Procedure1<Iterable<SJMethod>>() { @Override public void apply(final Iterable<SJMethod> it) { SJMethod _get = ((SJMethod[])Conversions.unwrapArray(it, SJMethod.class))[0]; String _memberAsStringWithType = SmallJavaModelUtil.memberAsStringWithType(_get); Assert.assertEquals("m() : A", _memberAsStringWithType); SJMethod _get_1 = ((SJMethod[])Conversions.unwrapArray(it, SJMethod.class))[1]; String _memberAsStringWithType_1 = SmallJavaModelUtil.memberAsStringWithType(_get_1); Assert.assertEquals("n(B, C) : A", _memberAsStringWithType_1); SJMethod _get_2 = ((SJMethod[])Conversions.unwrapArray(it, SJMethod.class))[2]; String _memberAsStringWithType_2 = SmallJavaModelUtil.memberAsStringWithType(_get_2); Assert.assertEquals("p(null, C) : A", _memberAsStringWithType_2); } }; ObjectExtensions.<Iterable<SJMethod>>operator_doubleArrow(_methods, _function); } catch (Throwable _e) { throw Exceptions.sneakyThrow(_e); } } private void assertHierarchy(final SJClass c, final CharSequence expected) { String _string = expected.toString(); ArrayList<SJClass> _classHierarchy = SmallJavaModelUtil.classHierarchy(c); final Function1<SJClass, String> _function = new Function1<SJClass, String>() { @Override public String apply(final SJClass it) { return it.getName(); } }; List<String> _map = ListExtensions.<SJClass, String>map(_classHierarchy, _function); String _join = IterableExtensions.join(_map, ", "); Assert.assertEquals(_string, _join); } }