package fr.inria.diversify.oldTests.transformation.ast;
import fr.inria.diversify.buildSystem.maven.MavenDependencyResolver;
import fr.inria.diversify.factories.SpoonMetaFactory;
import fr.inria.diversify.diversification.InputProgram;
import fr.inria.diversify.transformation.Transformation;
import fr.inria.diversify.transformation.query.KnownSosieQuery;
import fr.inria.diversify.transformation.query.QueryException;
import fr.inria.diversify.transformation.query.SeveralTriesUnsuccessful;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import spoon.reflect.factory.Factory;
import java.util.ArrayList;
import java.util.Collection;
import static junit.framework.Assert.*;
/**
* Created by marcel on 8/06/14.
*/
public class KnownSosieStrategyTest {
private static InputProgram inputProgram = null;
private static ArrayList<Transformation> sosies;
private String getResourcePath(String name) throws Exception {
return getClass().getResource("/" + name).toURI().getPath();
}
@Before
public void setUp() throws Exception {
if (inputProgram == null) {
MavenDependencyResolver dr = new MavenDependencyResolver();
dr.DependencyResolver(getResourcePath("easymock-light-3.2/pom.xml"));
Factory factory = new SpoonMetaFactory().buildNewFactory(getResourcePath("easymock-light-3.2"), 5);
inputProgram = new InputProgram();
inputProgram.setFactory(factory);
inputProgram.setRelativeSourceCodeDir(getResourcePath("easymock-light-3.2"));
inputProgram.setPreviousTransformationsPath(getResourcePath("easymock3.2-non-rep-index.json"));
inputProgram.setTransformationPerRun(5);
inputProgram.processCodeFragments();
KnownSosieQuery st = new KnownSosieQuery(inputProgram);
sosies = st.getSosies();
}
}
/**
* Test the sharing of transformations
* @throws Exception
*/
@Test
public void testQuery() throws Exception {
//Set the amount of points we must find
KnownSosieQuery st = new KnownSosieQuery(inputProgram, sosies);
st.executeQuery();
Collection<Transformation> cf1 = st.getMultiTransformations();
assertEquals(5, cf1.size());
}
/**
* Test that the transformations are taken without reposition
* @throws Exception
*/
@Test
public void testMultipleQueryWithoutReposition() throws Exception {
//Set the amount of points we must find
KnownSosieQuery st = new KnownSosieQuery(inputProgram, sosies);
//Query three times
st.executeQuery();
Collection<Transformation> cf1 = st.getMultiTransformations();
st.executeQuery();
Collection<Transformation> cf2 = st.getMultiTransformations();
st.executeQuery();
Collection<Transformation> cf3 = st.getMultiTransformations();
String s1 = "";
String s2 = "";
String s3 = "";
for ( Transformation t : cf1 ) { s1 += t.toString(); }
for ( Transformation t : cf2 ) { s2 += t.toString(); }
for ( Transformation t : cf3 ) { s3 += t.toString(); }
assertFalse(s1.equals(s2));
assertFalse(s1.equals(s3));
assertFalse(s3.equals(s2));
}
/**
* Test that the transformations are taken incrementally, simple case
* @throws Exception
*/
@Test
public void testIncrementalMultiSosieQuery() throws Exception {
//Set the amount of points we must find
KnownSosieQuery st = new KnownSosieQuery(inputProgram, sosies);
//Query three times
inputProgram.setTransformationPerRun(5);
st.executeQuery();
Collection<Transformation> cf1 = st.getMultiTransformations();
inputProgram.setTransformationPerRun(6);
st.executeQuery();
Collection<Transformation> cf2 = st.getMultiTransformations();
inputProgram.setTransformationPerRun(5);
String s1 = "";
String s2 = "";
for ( Transformation t : cf1 ) { s1 += t.toString(); }
for ( Transformation t : cf2 ) { s2 += t.toString(); }
assertTrue(s2.contains(s1));
}
/**
* Test that the transformations are taken incrementally
* @throws Exception
*/
@Test
public void testIncrementalMultiSosieQuery2() throws Exception {
//Set the amount of points we must find
KnownSosieQuery st = new KnownSosieQuery(inputProgram, sosies);
//Query three times
inputProgram.setTransformationPerRun(5);
st.executeQuery();
Collection<Transformation> cf51 = st.getMultiTransformations();
st.executeQuery();
Collection<Transformation> cf52 = st.getMultiTransformations();
inputProgram.setTransformationPerRun(6);
st.executeQuery();
Collection<Transformation> cf62 = st.getMultiTransformations();
st.executeQuery();
Collection<Transformation> cf61 = st.getMultiTransformations();
inputProgram.setTransformationPerRun(5);
String s51 = "";
String s52 = "";
String s61 = "";
String s62 = "";
for ( Transformation t : cf51 ) { s51 += t.toString(); }
for ( Transformation t : cf52 ) { s52 += t.toString(); }
for ( Transformation t : cf61 ) { s61 += t.toString(); }
for ( Transformation t : cf62 ) { s62 += t.toString(); }
assertTrue(s62.contains(s52));
assertTrue(s61.contains(s51));
}
/**
* Test incremental sosies with bad status. Arrangement 1
* @throws Exception
*/
@Test
public void testIncrementalSeriesBad1() throws Exception {
//Expected search graph
// 5 6 7
// O 0 - 0 0
// | | |
// x x x 1
// | | |
// O - x x 2
//Set the amount of points we must find
KnownSosieQuery st = new KnownSosieQuery(inputProgram, sosies);
st.setCleanSeriesOnly(true);
//Query three times
inputProgram.setTransformationPerRun(5);
//51
st.executeQuery();
Collection<Transformation> cf51 = st.getMultiTransformations();
assertEquals(0, st.getLastIncrementalSeries());
//52
st.executeQuery();
st.setLastTransformationStatus(Transformation.COMPILED_FAIL);
assertEquals(1, st.getLastIncrementalSeries());
//53
st.executeQuery();
Collection<Transformation> cf53 = st.getMultiTransformations();
assertEquals(2, st.getLastIncrementalSeries());
//63
inputProgram.setTransformationPerRun(6);
st.executeQuery();
Collection<Transformation> cf63 = st.getMultiTransformations();
st.setLastTransformationStatus(Transformation.COMPILED_FAIL);
assertEquals(2, st.getLastIncrementalSeries());
//62 is bad blood
//61
st.executeQuery();
Collection<Transformation> cf61 = st.getMultiTransformations();
assertEquals(0, st.getLastIncrementalSeries());
try {
//Query again to simulate that we din't get all the sosies we wanted
st.executeQuery();
fail();
} catch (SeveralTriesUnsuccessful e) {
assertTrue(((QueryException)e.getCauses()[0]).getReason().equals(
QueryException.Reasons.UNABLE_TO_FIND_SOSIE_PARENT));
}
//71
inputProgram.setTransformationPerRun(7);
st.executeQuery();
Collection<Transformation> cf71 = st.getMultiTransformations();
assertEquals(0, st.getLastIncrementalSeries());
// 71 and 72 are bad blood
try {
st.executeQuery();
fail();
} catch (SeveralTriesUnsuccessful e) {
assertTrue(((QueryException)e.getCauses()[0]).getReason().equals(
QueryException.Reasons.UNABLE_TO_FIND_SOSIE_PARENT));
}
String s51 = "";
String s61 = "";
String s71 = "";
String s53 = "";
String s63 = "";
for ( Transformation t : cf51 ) { s51 += t.toString(); }
for ( Transformation t : cf61 ) { s61 += t.toString(); }
for ( Transformation t : cf71 ) { s71 += t.toString(); }
assertTrue(s61.contains(s51));
assertTrue(s71.contains(s61));
for ( Transformation t : cf53 ) { s53 += t.toString(); }
for ( Transformation t : cf63 ) { s63 += t.toString(); }
assertTrue(s63.contains(s53));
}
/**
* Test incremental sosies with bad status. Arrangement 2
* @throws Exception
*/
@Test
@Ignore
public void testIncrementalSeriesBad2() throws Exception {
//Expected search graph
// 5 6 7
// O x - x 0
// | | |
// x x x 1
// | | |
// O - O O 2
//Set the amount of points we must find
KnownSosieQuery st = new KnownSosieQuery(inputProgram, sosies);
st.setCleanSeriesOnly(true);
//Query three times
inputProgram.setTransformationPerRun(5);
//51
st.executeQuery();
Collection<Transformation> cf51 = st.getMultiTransformations();
assertEquals(0, st.getLastIncrementalSeries());
//52
st.executeQuery();
st.setLastTransformationStatus(Transformation.COMPILED_FAIL);
assertEquals(1, st.getLastIncrementalSeries());
//53
st.executeQuery();
Collection<Transformation> cf53 = st.getMultiTransformations();
assertEquals(2, st.getLastIncrementalSeries());
//63
inputProgram.setTransformationPerRun(6);
st.executeQuery();
Collection<Transformation> cf63 = st.getMultiTransformations();
assertEquals(2, st.getLastIncrementalSeries());
//62 is bad blood
//61
st.executeQuery();
Collection<Transformation> cf61 = st.getMultiTransformations();
st.setLastTransformationStatus(-1);
assertEquals(0, st.getLastIncrementalSeries());
//71 and 72 are bad blood
inputProgram.setTransformationPerRun(7);
st.executeQuery();
Collection<Transformation> cf73 = st.getMultiTransformations();
assertEquals(2, st.getLastIncrementalSeries());
String s51 = "";
String s53 = "";
String s61 = "";
String s63 = "";
String s73 = "";
for ( Transformation t : cf51 ) { s51 += t.toString(); }
for ( Transformation t : cf53 ) { s53 += t.toString(); }
for ( Transformation t : cf61 ) { s61 += t.toString(); }
for ( Transformation t : cf63 ) { s63 += t.toString(); }
for ( Transformation t : cf73 ) { s73 += t.toString(); }
assertTrue(s63.contains(s53));
assertTrue(s73.contains(s63));
assertTrue(s61.contains(s51));
}
}