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.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
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.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.lib.SmallJavaLib;
import org.example.smalljava.smallJava.SJClass;
import org.example.smalljava.smallJava.SJProgram;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
@RunWith(XtextRunner.class)
@InjectWith(SmallJavaInjectorProvider.class)
@SuppressWarnings("all")
public class SmallJavaLibTest {
@Inject
@Extension
private ParseHelper<SJProgram> _parseHelper;
@Inject
@Extension
private ValidationTestHelper _validationTestHelper;
@Inject
@Extension
private SmallJavaLib _smallJavaLib;
@Test
public void testLib() {
StringConcatenation _builder = new StringConcatenation();
_builder.append("import smalljava.lang.*;");
_builder.newLine();
_builder.append("class C extends Object {");
_builder.newLine();
_builder.append("\t");
_builder.append("String s;");
_builder.newLine();
_builder.append("}");
_builder.newLine();
SJProgram _loadLibAndParse = this.loadLibAndParse(_builder);
this._validationTestHelper.assertNoErrors(_loadLibAndParse);
}
@Test
public void testImplicitImports() {
StringConcatenation _builder = new StringConcatenation();
_builder.append("class C extends Object {");
_builder.newLine();
_builder.append("\t");
_builder.append("String s;");
_builder.newLine();
_builder.append("\t");
_builder.append("Object m(Object o) { return o.toString(); }");
_builder.newLine();
_builder.append("}");
_builder.newLine();
SJProgram _loadLibAndParse = this.loadLibAndParse(_builder);
this._validationTestHelper.assertNoErrors(_loadLibAndParse);
}
@Test
public void testSmallJavaObjectClass() {
StringConcatenation _builder = new StringConcatenation();
_builder.append("class C {}");
final SJProgram C = this.loadLibAndParse(_builder);
SJClass _smallJavaObjectClass = this._smallJavaLib.getSmallJavaObjectClass(C);
Assert.assertNotNull(_smallJavaObjectClass);
}
@Test
public void testImplicitExtendObject() {
StringConcatenation _builder = new StringConcatenation();
_builder.append("class C {");
_builder.newLine();
_builder.append("\t");
_builder.append("Object m(Object o) { return this.toString(); }");
_builder.newLine();
_builder.append("}");
_builder.newLine();
SJProgram _loadLibAndParse = this.loadLibAndParse(_builder);
this._validationTestHelper.assertNoErrors(_loadLibAndParse);
}
@Test
public void testClassHierarchyWithObject() {
StringConcatenation _builder = new StringConcatenation();
_builder.append("class A { }");
_builder.newLine();
_builder.append("class B extends A { }");
_builder.newLine();
_builder.append("class C extends Object { }");
_builder.newLine();
_builder.append("class D extends C { }");
_builder.newLine();
SJProgram _loadLibAndParse = this.loadLibAndParse(_builder);
final Procedure1<SJProgram> _function = new Procedure1<SJProgram>() {
@Override
public void apply(final SJProgram it) {
SmallJavaLibTest.this._validationTestHelper.assertNoErrors(it);
EList<SJClass> _classes = it.getClasses();
final Procedure1<EList<SJClass>> _function = new Procedure1<EList<SJClass>>() {
@Override
public void apply(final EList<SJClass> it) {
SJClass _get = it.get(0);
SmallJavaLibTest.this.assertHierarchyWithObject(_get, "Object");
SJClass _get_1 = it.get(1);
SmallJavaLibTest.this.assertHierarchyWithObject(_get_1, "A, Object");
SJClass _get_2 = it.get(3);
SmallJavaLibTest.this.assertHierarchyWithObject(_get_2, "C, Object");
}
};
ObjectExtensions.<EList<SJClass>>operator_doubleArrow(_classes, _function);
}
};
ObjectExtensions.<SJProgram>operator_doubleArrow(_loadLibAndParse, _function);
}
@Test
public void testSuperclassOrObject() {
StringConcatenation _builder = new StringConcatenation();
_builder.append("class A { }");
_builder.newLine();
_builder.append("class B extends A { }");
_builder.newLine();
_builder.append("class C extends Object { }");
_builder.newLine();
_builder.append("class D extends C { }");
_builder.newLine();
SJProgram _loadLibAndParse = this.loadLibAndParse(_builder);
final Procedure1<SJProgram> _function = new Procedure1<SJProgram>() {
@Override
public void apply(final SJProgram it) {
SmallJavaLibTest.this._validationTestHelper.assertNoErrors(it);
EList<SJClass> _classes = it.getClasses();
final Procedure1<EList<SJClass>> _function = new Procedure1<EList<SJClass>>() {
@Override
public void apply(final EList<SJClass> it) {
SJClass _head = IterableExtensions.<SJClass>head(it);
final SJClass objClass = SmallJavaLibTest.this._smallJavaLib.getSmallJavaObjectClass(_head);
Assert.assertNotNull(objClass);
SJClass _get = it.get(0);
SJClass _superclassOrObject = SmallJavaLibTest.this._smallJavaLib.getSuperclassOrObject(_get);
Assert.assertSame(objClass, _superclassOrObject);
SJClass _get_1 = it.get(0);
SJClass _get_2 = it.get(1);
SJClass _superclassOrObject_1 = SmallJavaLibTest.this._smallJavaLib.getSuperclassOrObject(_get_2);
Assert.assertSame(_get_1, _superclassOrObject_1);
SJClass _get_3 = it.get(2);
SJClass _superclassOrObject_2 = SmallJavaLibTest.this._smallJavaLib.getSuperclassOrObject(_get_3);
Assert.assertSame(objClass, _superclassOrObject_2);
}
};
ObjectExtensions.<EList<SJClass>>operator_doubleArrow(_classes, _function);
}
};
ObjectExtensions.<SJProgram>operator_doubleArrow(_loadLibAndParse, _function);
}
@Test
public void testAccessToSuperWithImplicitExtendsObject() {
StringConcatenation _builder = new StringConcatenation();
_builder.append("class A {");
_builder.newLine();
_builder.append("\t");
_builder.append("String toString() {");
_builder.newLine();
_builder.append("\t\t");
_builder.append("return super.toString();");
_builder.newLine();
_builder.append("\t");
_builder.append("}");
_builder.newLine();
_builder.append("}");
_builder.newLine();
SJProgram _loadLibAndParse = this.loadLibAndParse(_builder);
this._validationTestHelper.assertNoErrors(_loadLibAndParse);
}
@Test
public void testLibHasNoError() {
this.loadLibrary();
}
private SJProgram loadLibAndParse(final CharSequence p) {
try {
ResourceSet _loadLibrary = this.loadLibrary();
return this._parseHelper.parse(p, _loadLibrary);
} catch (Throwable _e) {
throw Exceptions.sneakyThrow(_e);
}
}
private ResourceSet loadLibrary() {
ResourceSet _loadLib = this._smallJavaLib.loadLib();
final Procedure1<ResourceSet> _function = new Procedure1<ResourceSet>() {
@Override
public void apply(final ResourceSet it) {
EList<Resource> _resources = it.getResources();
final Procedure1<Resource> _function = new Procedure1<Resource>() {
@Override
public void apply(final Resource it) {
EList<EObject> _contents = it.getContents();
EObject _get = _contents.get(0);
SmallJavaLibTest.this._validationTestHelper.assertNoErrors(_get);
}
};
IterableExtensions.<Resource>forEach(_resources, _function);
}
};
return ObjectExtensions.<ResourceSet>operator_doubleArrow(_loadLib, _function);
}
private void assertHierarchyWithObject(final SJClass c, final CharSequence expected) {
String _string = expected.toString();
ArrayList<SJClass> _classHierarchyWithObject = this._smallJavaLib.getClassHierarchyWithObject(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(_classHierarchyWithObject, _function);
String _join = IterableExtensions.join(_map, ", ");
Assert.assertEquals(_string, _join);
}
}