package org.example.smalljava.tests;
import com.google.inject.Inject;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.resource.ResourceSet;
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.lib.SmallJavaLib;
import org.example.smalljava.smallJava.SJClass;
import org.example.smalljava.smallJava.SJExpression;
import org.example.smalljava.smallJava.SJMethod;
import org.example.smalljava.smallJava.SJProgram;
import org.example.smalljava.smallJava.SJReturn;
import org.example.smalljava.typing.SmallJavaTypeConformance;
import org.example.smalljava.typing.SmallJavaTypeProvider;
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 SmallJavaTypeConformanceTest {
@Inject
@Extension
private ParseHelper<SJProgram> _parseHelper;
@Inject
@Extension
private ValidationTestHelper _validationTestHelper;
@Inject
@Extension
private SmallJavaTypeConformance _smallJavaTypeConformance;
@Inject
@Extension
private SmallJavaTypeProvider _smallJavaTypeProvider;
@Inject
@Extension
private SmallJavaLib _smallJavaLib;
@Test
public void testClassConformance() {
try {
StringConcatenation _builder = new StringConcatenation();
_builder.append("class A {}");
_builder.newLine();
_builder.append("class B extends A {}");
_builder.newLine();
_builder.append("class C {}");
_builder.newLine();
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);
SJClass _get_1 = it.get(0);
boolean _isConformant = SmallJavaTypeConformanceTest.this._smallJavaTypeConformance.isConformant(_get, _get_1);
Assert.assertTrue(_isConformant);
SJClass _get_2 = it.get(1);
SJClass _get_3 = it.get(0);
boolean _isConformant_1 = SmallJavaTypeConformanceTest.this._smallJavaTypeConformance.isConformant(_get_2, _get_3);
Assert.assertTrue(_isConformant_1);
SJClass _get_4 = it.get(2);
SJClass _get_5 = it.get(0);
boolean _isConformant_2 = SmallJavaTypeConformanceTest.this._smallJavaTypeConformance.isConformant(_get_4, _get_5);
Assert.assertFalse(_isConformant_2);
}
};
ObjectExtensions.<EList<SJClass>>operator_doubleArrow(_classes, _function);
} catch (Throwable _e) {
throw Exceptions.sneakyThrow(_e);
}
}
@Test
public void testNullConformance() {
try {
StringConcatenation _builder = new StringConcatenation();
_builder.append("class C {}");
_builder.newLine();
_builder.append("class D {");
_builder.newLine();
_builder.append("\t");
_builder.append("C m() { return null; }");
_builder.newLine();
_builder.append("}");
_builder.newLine();
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 _last = IterableExtensions.<SJClass>last(it);
Iterable<SJMethod> _methods = SmallJavaModelUtil.methods(_last);
SJMethod _head = IterableExtensions.<SJMethod>head(_methods);
SJReturn _returnStatement = SmallJavaModelUtil.returnStatement(_head);
SJExpression _expression = _returnStatement.getExpression();
final SJClass typeOfNull = SmallJavaTypeConformanceTest.this._smallJavaTypeProvider.typeFor(_expression);
SJClass _get = it.get(0);
boolean _isConformant = SmallJavaTypeConformanceTest.this._smallJavaTypeConformance.isConformant(typeOfNull, _get);
Assert.assertTrue(_isConformant);
SJClass _get_1 = it.get(1);
boolean _isConformant_1 = SmallJavaTypeConformanceTest.this._smallJavaTypeConformance.isConformant(typeOfNull, _get_1);
Assert.assertTrue(_isConformant_1);
}
};
ObjectExtensions.<EList<SJClass>>operator_doubleArrow(_classes, _function);
} catch (Throwable _e) {
throw Exceptions.sneakyThrow(_e);
}
}
@Test
public void testStringConformance() {
try {
StringConcatenation _builder = new StringConcatenation();
_builder.append("class A {");
_builder.newLine();
_builder.append("\t");
_builder.append("String m() { return \"foo\"; }");
_builder.newLine();
_builder.append("}");
_builder.newLine();
ResourceSet _loadLib = this._smallJavaLib.loadLib();
SJProgram _parse = this._parseHelper.parse(_builder, _loadLib);
this._validationTestHelper.assertNoErrors(_parse);
} catch (Throwable _e) {
throw Exceptions.sneakyThrow(_e);
}
}
@Test
public void testIntConformance() {
try {
StringConcatenation _builder = new StringConcatenation();
_builder.append("class A {");
_builder.newLine();
_builder.append("\t");
_builder.append("Integer m() { return 10; }");
_builder.newLine();
_builder.append("}");
_builder.newLine();
ResourceSet _loadLib = this._smallJavaLib.loadLib();
SJProgram _parse = this._parseHelper.parse(_builder, _loadLib);
this._validationTestHelper.assertNoErrors(_parse);
} catch (Throwable _e) {
throw Exceptions.sneakyThrow(_e);
}
}
@Test
public void testBooleanConformance() {
try {
StringConcatenation _builder = new StringConcatenation();
_builder.append("class A {");
_builder.newLine();
_builder.append("\t");
_builder.append("Boolean m() { return true; }");
_builder.newLine();
_builder.append("}");
_builder.newLine();
ResourceSet _loadLib = this._smallJavaLib.loadLib();
SJProgram _parse = this._parseHelper.parse(_builder, _loadLib);
this._validationTestHelper.assertNoErrors(_parse);
} catch (Throwable _e) {
throw Exceptions.sneakyThrow(_e);
}
}
@Test
public void testBooleanAcceptedByIfStatement() {
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("if (new Boolean()) {");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("return null;");
_builder.newLine();
_builder.append("\t\t");
_builder.append("}");
_builder.newLine();
_builder.append("\t\t");
_builder.append("return null;");
_builder.newLine();
_builder.append("\t");
_builder.append("}");
_builder.newLine();
_builder.append("}");
_builder.newLine();
ResourceSet _loadLib = this._smallJavaLib.loadLib();
SJProgram _parse = this._parseHelper.parse(_builder, _loadLib);
this._validationTestHelper.assertNoErrors(_parse);
} catch (Throwable _e) {
throw Exceptions.sneakyThrow(_e);
}
}
@Test
public void testEveryClassExtendsObject() {
try {
StringConcatenation _builder = new StringConcatenation();
_builder.append("class A {");
_builder.newLine();
_builder.append("\t");
_builder.append("Object m() {");
_builder.newLine();
_builder.append("\t\t");
_builder.append("return new A();");
_builder.newLine();
_builder.append("\t");
_builder.append("}");
_builder.newLine();
_builder.append("}");
_builder.newLine();
ResourceSet _loadLib = this._smallJavaLib.loadLib();
SJProgram _parse = this._parseHelper.parse(_builder, _loadLib);
this._validationTestHelper.assertNoErrors(_parse);
} catch (Throwable _e) {
throw Exceptions.sneakyThrow(_e);
}
}
@Test
public void testStringConformantToObject() {
try {
StringConcatenation _builder = new StringConcatenation();
_builder.append("class A {");
_builder.newLine();
_builder.append("\t");
_builder.append("Object m() {");
_builder.newLine();
_builder.append("\t\t");
_builder.append("return \"a\";");
_builder.newLine();
_builder.append("\t");
_builder.append("}");
_builder.newLine();
_builder.append("}");
_builder.newLine();
ResourceSet _loadLib = this._smallJavaLib.loadLib();
SJProgram _parse = this._parseHelper.parse(_builder, _loadLib);
this._validationTestHelper.assertNoErrors(_parse);
} catch (Throwable _e) {
throw Exceptions.sneakyThrow(_e);
}
}
}