/**
*
*/
package it.xsemantics.example.fj.tests;
import it.xsemantics.example.fj.fj.Class;
import it.xsemantics.example.fj.fj.Field;
import it.xsemantics.example.fj.fj.Method;
import it.xsemantics.example.fj.fj.Program;
import it.xsemantics.example.fj.lookup.FjAuxiliaryFunctions;
import it.xsemantics.example.fj.util.ClassFactory;
import java.util.List;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.xtext.xbase.lib.Functions;
import org.eclipse.xtext.xbase.lib.IterableExtensions;
/**
* @author bettini
*
* Tests for auxiliary functions
*/
public class FjAuxiliaryFunctionTest extends TestWithLoader {
FjAuxiliaryFunctions fixture;
public FjAuxiliaryFunctionTest(String name) {
super(name);
}
@Override
protected void setUp() throws Exception {
fixture = new FjAuxiliaryFunctions();
super.setUp();
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
}
/**
* Test for file one_class.fj
*/
public void testOneClass() {
Program program = getProgramFromResource("one_class.fj");
assertTrue(program != null);
Class class1 = program.getClasses().get(0);
List<Field> fields = fixture.getFields(class1);
assertEquals(1, fields.size());
assertEquals("a", fields.get(0).getName());
}
/**
* Test for file two_classes.fj
*/
public void testTwoClasses() {
Program program = getProgramFromResource("two_classes.fj");
assertTrue(program != null);
Class class1 = program.getClasses().get(1);
assertEquals("B", class1.getName());
List<Field> fields = fixture.getFields(class1);
assertEquals(1, fields.size());
assertEquals("a", fields.get(0).getName());
}
/**
* Test for file classes_fields.fj
*/
public void testFieldsAdditions() {
Program program = getProgramFromResource("classes_fields.fj");
assertTrue(program != null);
Class class1 = program.getClasses().get(2);
assertEquals("C", class1.getName());
List<Field> fields = fixture.getFields(class1);
assertEquals(3, fields.size());
// inherited fields come first
assertEquals("a", fields.get(0).getName());
assertEquals("b", fields.get(1).getName());
assertEquals("c", fields.get(2).getName());
}
/**
* Test for file two_classes.fj and getMethods
*/
public void testGetMethods() {
Program program = getProgramFromResource("two_classes.fj");
assertTrue(program != null);
Class class1 = program.getClasses().get(1);
assertEquals("B", class1.getName());
List<Method> methods = fixture.getMethods(class1);
assertEquals(1, methods.size());
assertEquals("m", methods.get(0).getName());
}
/**
* Test for method redefinitions
*/
public void testMethodsOverridden() {
Program program = getProgramFromResource("classes_methods_overridden.fj");
assertTrue(program != null);
Class class1 = program.getClasses().get(2);
assertEquals("C", class1.getName());
List<Method> methods = fixture.getMethods(class1);
assertEquals(2, methods.size());
Method m;
m = methodByName(methods, "m");
// take the overridden version in B
assertSame(program.getClasses().get(1), m.eContainer());
m = methodByName(methods, "n");
// take the overridden version in C
assertSame(program.getClasses().get(2), m.eContainer());
}
public void testSuperclasses() {
// make sure to put everything in a resource
Resource resource = createResource();
Class c1 = ClassFactory.createClass("c1");
resource.getContents().add(c1);
Class c2 = ClassFactory.createClass("c2", c1);
resource.getContents().add(c2);
Class c3 = ClassFactory.createClass("c3", c2);
resource.getContents().add(c3);
List<Class> superClasses = fixture.getSuperclasses(c1);
// Object is implicit
assertEquals(0, superClasses.size());
superClasses = fixture.getSuperclasses(c3);
assertEquals(2, superClasses.size());
assertTrue(superClasses.contains(c1));
assertTrue(superClasses.contains(c2));
}
private Method methodByName(List<Method> methods, final String name) {
return IterableExtensions.findFirst(methods, new Functions.Function1<Method, Boolean>() {
@Override
public Boolean apply(Method p) {
return p.getName().equals(name);
}
});
}
}