package fr.inria.diversify.diversification;
import fr.inria.diversify.statistic.SinglePointSessionResults;
import fr.inria.diversify.testamplification.compare.diff.Diff;
import fr.inria.diversify.transformation.MultiTransformation;
import fr.inria.diversify.transformation.Transformation;
import fr.inria.diversify.transformation.ast.ASTTransformation;
import fr.inria.diversify.transformation.ast.exception.ApplyTransformationException;
import fr.inria.diversify.transformation.ast.exception.BuildTransplantException;
import fr.inria.diversify.transformation.query.AmpSosieQuery;
import fr.inria.diversify.util.Log;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Simon on 13/02/15.
*/
public class MultiTransformationGenerator extends DiversifyAndCompare {
protected MultiTransformation currentMultiTransformation;
protected boolean onlySosie;
protected int transformationSize;
public MultiTransformationGenerator(InputConfiguration inputConfiguration, String projectDir, String srcDir) {
super(inputConfiguration, projectDir, srcDir, null, null);
}
@Override
public void run(int n) throws Exception {
currentMultiTransformation = new MultiTransformation(true);
while(trial < n && transQuery.hasNextTransformation()) {
applyAndCheck(transQuery.query());
addTransformation();
if(currentMultiTransformation.size() == transformationSize || !transQuery.hasNextTransformation()) {
addTransformation();
copySosieProgram();
currentMultiTransformation = new MultiTransformation(true);
transQuery.currentTransformationEnd();
trial++;
}
}
}
protected void addTransformation() throws JSONException {
if(currentMultiTransformation.getStatus() == 0) {
Transformation clone = currentMultiTransformation.clone();
if(!transformations.contains(clone)) {
transformations.add(clone);
Diff d = ((AmpSosieQuery) transQuery).getCurrentDiff().clone();
d.setSosie(clone);
diff.add(d.toJson());
}
}
}
protected void applyAndCheck(Transformation trans) throws Exception {
currentMultiTransformation.add(trans);
String dir = tmpDir + "/" + sourceDir;
try {
currentMultiTransformation.apply(dir);
try {
int status = runTest(tmpDir);
currentMultiTransformation.setStatus(status);
currentMultiTransformation.setFailures(builder.getTestFail());
} catch (Exception e) {
currentMultiTransformation.setStatus(-2);
Log.debug("compile error during diversification", e);
}
currentMultiTransformation.restore(dir);
if (currentMultiTransformation.getStatus() != 0) {
currentMultiTransformation.remove(trans);
}
} catch (ApplyTransformationException e) {
tryRestore(trans,e);
} catch (BuildTransplantException e) {}
if(onlySosie && currentMultiTransformation.getStatus() != 0) {
currentMultiTransformation.remove(trans);
}
}
protected void writeTransformation(String fileName, ASTTransformation transformation) throws IOException, JSONException {
FileWriter out = new FileWriter(fileName);
out.write(transformation.toJSONObject().toString());
out.close();
}
public void setOnlySosie(boolean onlySosie) {
this.onlySosie = onlySosie;
}
public void setTransformationSize(int transformationSize) {
this.transformationSize = transformationSize;
}
}