package org.example.smalljava.tests;
import com.google.inject.Inject;
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.junit4.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.eclipse.xtext.xbase.lib.ObjectExtensions;
import org.eclipse.xtext.xbase.lib.Procedures.Procedure1;
import org.example.smalljava.SmallJavaInjectorProvider;
import org.example.smalljava.smallJava.SJAccessLevel;
import org.example.smalljava.smallJava.SJAssignment;
import org.example.smalljava.smallJava.SJClass;
import org.example.smalljava.smallJava.SJExpression;
import org.example.smalljava.smallJava.SJIfBlock;
import org.example.smalljava.smallJava.SJIfStatement;
import org.example.smalljava.smallJava.SJMember;
import org.example.smalljava.smallJava.SJMemberSelection;
import org.example.smalljava.smallJava.SJMethod;
import org.example.smalljava.smallJava.SJMethodBody;
import org.example.smalljava.smallJava.SJNew;
import org.example.smalljava.smallJava.SJNull;
import org.example.smalljava.smallJava.SJProgram;
import org.example.smalljava.smallJava.SJReturn;
import org.example.smalljava.smallJava.SJStatement;
import org.example.smalljava.smallJava.SJSymbol;
import org.example.smalljava.smallJava.SJSymbolRef;
import org.example.smalljava.smallJava.SJThis;
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 SmallJavaParserTest {
@Inject
@Extension
private ParseHelper<SJProgram> _parseHelper;
@Inject
@Extension
private ValidationTestHelper _validationTestHelper;
@Test
public void testClass() {
try {
StringConcatenation _builder = new StringConcatenation();
_builder.append("class C { }");
SJProgram _parse = this._parseHelper.parse(_builder);
this._validationTestHelper.assertNoErrors(_parse);
} catch (Throwable _e) {
throw Exceptions.sneakyThrow(_e);
}
}
@Test
public void testClassWithSuperclass() {
try {
StringConcatenation _builder = new StringConcatenation();
_builder.append("class C { } class D extends C { }");
SJProgram _parse = this._parseHelper.parse(_builder);
this._validationTestHelper.assertNoErrors(_parse);
} catch (Throwable _e) {
throw Exceptions.sneakyThrow(_e);
}
}
@Test
public void testClassWithFieldsAndMethods() {
try {
StringConcatenation _builder = new StringConcatenation();
_builder.append("class C { } ");
_builder.newLine();
_builder.newLine();
_builder.append("class D extends C {");
_builder.newLine();
_builder.append("\t");
_builder.append("C c;");
_builder.newLine();
_builder.append("\t");
_builder.append("C m(C p1, D p2) { return null; }");
_builder.newLine();
_builder.append("}");
SJProgram _parse = this._parseHelper.parse(_builder);
this._validationTestHelper.assertNoErrors(_parse);
} catch (Throwable _e) {
throw Exceptions.sneakyThrow(_e);
}
}
@Test
public void testVariableDecl() {
try {
StringConcatenation _builder = new StringConcatenation();
_builder.append("class C { } ");
_builder.newLine();
_builder.newLine();
_builder.append("class D extends C {");
_builder.newLine();
_builder.append("\t");
_builder.append("C m(C p1, D p2) { ");
_builder.newLine();
_builder.append("\t\t");
_builder.append("D d = null;");
_builder.newLine();
_builder.append("\t\t");
_builder.append("return d;");
_builder.newLine();
_builder.append("\t");
_builder.append("}");
_builder.newLine();
_builder.append("}");
SJProgram _parse = this._parseHelper.parse(_builder);
this._validationTestHelper.assertNoErrors(_parse);
} catch (Throwable _e) {
throw Exceptions.sneakyThrow(_e);
}
}
@Test
public void testMethodInvocation() {
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("C c = this.m();");
_builder.newLine();
_builder.append("\t\t");
_builder.append("return this.m();");
_builder.newLine();
_builder.append("\t");
_builder.append("}");
_builder.newLine();
_builder.append("}");
_builder.newLine();
SJProgram _parse = this._parseHelper.parse(_builder);
this.assertReturnExpressionOfType(_parse, SJMemberSelection.class);
} catch (Throwable _e) {
throw Exceptions.sneakyThrow(_e);
}
}
@Test
public void testFieldSelection() {
try {
StringConcatenation _builder = new StringConcatenation();
_builder.append("class C {");
_builder.newLine();
_builder.append("\t");
_builder.append("C f;");
_builder.newLine();
_builder.append("\t");
_builder.append("C m() {");
_builder.newLine();
_builder.append("\t\t");
_builder.append("C c = this.f;");
_builder.newLine();
_builder.append("\t\t");
_builder.append("return this.f;");
_builder.newLine();
_builder.append("\t");
_builder.append("}");
_builder.newLine();
_builder.append("}");
_builder.newLine();
SJProgram _parse = this._parseHelper.parse(_builder);
this.assertReturnExpressionOfType(_parse, SJMemberSelection.class);
} catch (Throwable _e) {
throw Exceptions.sneakyThrow(_e);
}
}
@Test
public void testVisibility() {
try {
StringConcatenation _builder = new StringConcatenation();
_builder.append("class C { } ");
_builder.newLine();
_builder.newLine();
_builder.append("class D extends C {");
_builder.newLine();
_builder.append("\t");
_builder.append("C c1;");
_builder.newLine();
_builder.append("\t");
_builder.append("public C c2;");
_builder.newLine();
_builder.append("\t");
_builder.append("private C c3;");
_builder.newLine();
_builder.append("\t");
_builder.append("protected C c4;");
_builder.newLine();
_builder.append("}");
SJProgram _parse = this._parseHelper.parse(_builder);
final Procedure1<SJProgram> _function = new Procedure1<SJProgram>() {
@Override
public void apply(final SJProgram it) {
SmallJavaParserTest.this._validationTestHelper.assertNoErrors(it);
SmallJavaParserTest.this.assertAccessLevel(it, 0, SJAccessLevel.PRIVATE);
SmallJavaParserTest.this.assertAccessLevel(it, 1, SJAccessLevel.PUBLIC);
SmallJavaParserTest.this.assertAccessLevel(it, 2, SJAccessLevel.PRIVATE);
SmallJavaParserTest.this.assertAccessLevel(it, 3, SJAccessLevel.PROTECTED);
}
};
ObjectExtensions.<SJProgram>operator_doubleArrow(_parse, _function);
} catch (Throwable _e) {
throw Exceptions.sneakyThrow(_e);
}
}
@Test
public void testElse() {
try {
StringConcatenation _builder = new StringConcatenation();
_builder.append("class C {");
_builder.newLine();
_builder.append("\t");
_builder.append("C c;");
_builder.newLine();
_builder.append("\t");
_builder.append("C m() {");
_builder.newLine();
_builder.append("\t\t");
_builder.append("if (true)");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("if (false)");
_builder.newLine();
_builder.append("\t\t\t\t");
_builder.append("this.c = null;");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("else");
_builder.newLine();
_builder.append("\t\t\t\t");
_builder.append("this.c = null;");
_builder.newLine();
_builder.append("\t\t");
_builder.append("return this.c;");
_builder.newLine();
_builder.append("\t");
_builder.append("}");
_builder.newLine();
_builder.append("}");
_builder.newLine();
SJProgram _parse = this._parseHelper.parse(_builder);
final Procedure1<SJProgram> _function = new Procedure1<SJProgram>() {
@Override
public void apply(final SJProgram it) {
SmallJavaParserTest.this._validationTestHelper.assertNoErrors(it);
EList<SJClass> _classes = it.getClasses();
SJClass _head = IterableExtensions.<SJClass>head(_classes);
EList<SJMember> _members = _head.getMembers();
SJMember _get = _members.get(1);
SJMethodBody _body = ((SJMethod) _get).getBody();
EList<SJStatement> _statements = _body.getStatements();
SJStatement _head_1 = IterableExtensions.<SJStatement>head(_statements);
final SJIfStatement ifS = ((SJIfStatement) _head_1);
SJIfBlock _elseBlock = ifS.getElseBlock();
Assert.assertNull(_elseBlock);
}
};
ObjectExtensions.<SJProgram>operator_doubleArrow(_parse, _function);
} catch (Throwable _e) {
throw Exceptions.sneakyThrow(_e);
}
}
@Test
public void testElseWithBlock() {
try {
StringConcatenation _builder = new StringConcatenation();
_builder.append("class C {");
_builder.newLine();
_builder.append("\t");
_builder.append("C c;");
_builder.newLine();
_builder.append("\t");
_builder.append("C m() {");
_builder.newLine();
_builder.append("\t\t");
_builder.append("if (true) {");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("if (false)");
_builder.newLine();
_builder.append("\t\t\t\t");
_builder.append("this.c = null;");
_builder.newLine();
_builder.append("\t\t");
_builder.append("} else");
_builder.newLine();
_builder.append("\t\t\t\t");
_builder.append("this.c = null;");
_builder.newLine();
_builder.append("\t\t");
_builder.append("return this.c;");
_builder.newLine();
_builder.append("\t");
_builder.append("}");
_builder.newLine();
_builder.append("}");
_builder.newLine();
SJProgram _parse = this._parseHelper.parse(_builder);
final Procedure1<SJProgram> _function = new Procedure1<SJProgram>() {
@Override
public void apply(final SJProgram it) {
SmallJavaParserTest.this._validationTestHelper.assertNoErrors(it);
EList<SJClass> _classes = it.getClasses();
SJClass _head = IterableExtensions.<SJClass>head(_classes);
EList<SJMember> _members = _head.getMembers();
SJMember _get = _members.get(1);
SJMethodBody _body = ((SJMethod) _get).getBody();
EList<SJStatement> _statements = _body.getStatements();
SJStatement _head_1 = IterableExtensions.<SJStatement>head(_statements);
final SJIfStatement ifS = ((SJIfStatement) _head_1);
SJIfBlock _elseBlock = ifS.getElseBlock();
Assert.assertNotNull(_elseBlock);
}
};
ObjectExtensions.<SJProgram>operator_doubleArrow(_parse, _function);
} catch (Throwable _e) {
throw Exceptions.sneakyThrow(_e);
}
}
@Test
public void testPackage() {
try {
StringConcatenation _builder = new StringConcatenation();
_builder.append("package my.pack;");
_builder.newLine();
SJProgram _parse = this._parseHelper.parse(_builder);
this._validationTestHelper.assertNoErrors(_parse);
} catch (Throwable _e) {
throw Exceptions.sneakyThrow(_e);
}
}
@Test
public void testInheritanceWithPackage() {
try {
StringConcatenation _builder = new StringConcatenation();
_builder.append("package my.pack;");
_builder.newLine();
_builder.append("class C {}");
_builder.newLine();
_builder.append("class D extends C {}");
_builder.newLine();
SJProgram _parse = this._parseHelper.parse(_builder);
this._validationTestHelper.assertNoErrors(_parse);
} catch (Throwable _e) {
throw Exceptions.sneakyThrow(_e);
}
}
@Test
public void testMemberSelectionLeftAssociativity() {
try {
StringConcatenation _builder = new StringConcatenation();
_builder.append("class A {");
_builder.newLine();
_builder.append("\t");
_builder.append("A m() { return this.m().m(); }");
_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);
SJMethodBody _body = _head_1.getBody();
EList<SJStatement> _statements = _body.getStatements();
SJStatement _last = IterableExtensions.<SJStatement>last(_statements);
this.assertAssociativity(_last, "((this.m).m)");
} catch (Throwable _e) {
throw Exceptions.sneakyThrow(_e);
}
}
@Test
public void testAssignmentRightAssociativity() {
try {
StringConcatenation _builder = new StringConcatenation();
_builder.append("class A {");
_builder.newLine();
_builder.append("\t");
_builder.append("A m() {");
_builder.newLine();
_builder.append("\t\t");
_builder.append("A f = null;");
_builder.newLine();
_builder.append("\t\t");
_builder.append("A g = null;");
_builder.newLine();
_builder.append("\t\t");
_builder.append("f = g = null;");
_builder.newLine();
_builder.append("\t\t");
_builder.append("return null;");
_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);
SJMethodBody _body = _head_1.getBody();
EList<SJStatement> _statements = _body.getStatements();
SJStatement _get = _statements.get(2);
this.assertAssociativity(_get, "(f = (g = null))");
} catch (Throwable _e) {
throw Exceptions.sneakyThrow(_e);
}
}
private void assertAccessLevel(final SJProgram p, final int memberIndex, final SJAccessLevel access) {
EList<SJClass> _classes = p.getClasses();
SJClass _last = IterableExtensions.<SJClass>last(_classes);
EList<SJMember> _members = _last.getMembers();
SJMember _get = _members.get(memberIndex);
SJAccessLevel _access = _get.getAccess();
Assert.assertEquals(access, _access);
}
private void assertReturnExpressionOfType(final SJProgram p, final Class<?> type) {
this._validationTestHelper.assertNoErrors(p);
EList<SJClass> _classes = p.getClasses();
SJClass _head = IterableExtensions.<SJClass>head(_classes);
EList<SJMember> _members = _head.getMembers();
SJMember _last = IterableExtensions.<SJMember>last(_members);
SJReturn _returnStatement = SmallJavaModelUtil.returnStatement(((SJMethod) _last));
SJExpression _expression = _returnStatement.getExpression();
Class<? extends SJExpression> _class = _expression.getClass();
boolean _isAssignableFrom = type.isAssignableFrom(_class);
Assert.assertTrue(_isAssignableFrom);
}
private void assertAssociativity(final SJStatement s, final CharSequence expected) {
String _string = expected.toString();
String _stringRepr = this.stringRepr(s);
Assert.assertEquals(_string, _stringRepr);
}
private String stringRepr(final SJStatement s) {
String _switchResult = null;
boolean _matched = false;
if (!_matched) {
if (s instanceof SJAssignment) {
_matched=true;
StringConcatenation _builder = new StringConcatenation();
_builder.append("(");
SJExpression _left = ((SJAssignment)s).getLeft();
String _stringRepr = this.stringRepr(_left);
_builder.append(_stringRepr, "");
_builder.append(" = ");
SJExpression _right = ((SJAssignment)s).getRight();
String _stringRepr_1 = this.stringRepr(_right);
_builder.append(_stringRepr_1, "");
_builder.append(")");
_switchResult = _builder.toString();
}
}
if (!_matched) {
if (s instanceof SJMemberSelection) {
_matched=true;
StringConcatenation _builder = new StringConcatenation();
_builder.append("(");
SJExpression _receiver = ((SJMemberSelection)s).getReceiver();
String _stringRepr = this.stringRepr(_receiver);
_builder.append(_stringRepr, "");
_builder.append(".");
SJMember _member = ((SJMemberSelection)s).getMember();
String _name = _member.getName();
_builder.append(_name, "");
_builder.append(")");
_switchResult = _builder.toString();
}
}
if (!_matched) {
if (s instanceof SJThis) {
_matched=true;
_switchResult = "this";
}
}
if (!_matched) {
if (s instanceof SJNew) {
_matched=true;
StringConcatenation _builder = new StringConcatenation();
_builder.append("new ");
SJClass _type = ((SJNew)s).getType();
String _name = _type.getName();
_builder.append(_name, "");
_builder.append("()");
_switchResult = _builder.toString();
}
}
if (!_matched) {
if (s instanceof SJNull) {
_matched=true;
_switchResult = "null";
}
}
if (!_matched) {
if (s instanceof SJSymbolRef) {
_matched=true;
SJSymbol _symbol = ((SJSymbolRef)s).getSymbol();
_switchResult = _symbol.getName();
}
}
if (!_matched) {
if (s instanceof SJReturn) {
_matched=true;
SJExpression _expression = ((SJReturn)s).getExpression();
_switchResult = this.stringRepr(_expression);
}
}
return _switchResult;
}
}