package fr.inria.diversify.testamplification.compare.diff;
import fr.inria.diversify.diversification.InputProgram;
import fr.inria.diversify.transformation.Transformation;
import fr.inria.diversify.transformation.TransformationJsonParser;
import fr.inria.diversify.transformation.TransformationParserException;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.*;
import java.util.stream.Collectors;
/**
* Created by Simon on 13/02/15.
*/
@Deprecated
public class Diff {
List<TestDiff> testDiffs;
Transformation sosie;
public void add(TestDiff testDiff) {
testDiffs.add(testDiff);
}
public Diff() {
testDiffs = new ArrayList<>();
}
public Diff(JSONObject td, InputProgram inputProgram) throws JSONException, TransformationParserException {
TransformationJsonParser parser = new TransformationJsonParser(true, inputProgram);
sosie = parser.parseTransformation(td.getJSONObject("transformation"));
JSONArray array = td.getJSONArray("testDiff");
testDiffs = new ArrayList<>();
for (int i = 0; i < array.length(); i++) {
testDiffs.add(new TestDiff(array.getJSONObject(i)));
}
}
public Set<String> buildFilter() {
Set<String> filter = new HashSet<>();
for(TestDiff d : testDiffs) {
filter.addAll(d.buildFilter());
}
return filter;
}
public JSONObject toJson() throws JSONException {
JSONObject object = new JSONObject();
if(sosie != null) {
object.put("transformation", sosie.toJSONObject());
}
JSONArray array = new JSONArray();
object.put("testDiff", array);
for(TestDiff diff : testDiffs) {
if(!diff.getDiff().isEmpty()) {
array.put(diff.toJSON());
}
}
return object;
}
public void setSosie(Transformation sosie) {
this.sosie = sosie;
}
public Transformation getSosie() {
return sosie;
}
public void filter(Filter filter) {
testDiffs.stream()
.forEach(d -> d.filter(filter));
testDiffs = testDiffs.stream()
.filter(d -> d.size() != 0)
.collect(Collectors.toList());
}
public void merge(Diff other) {
for(TestDiff sosie : other.testDiffs) {
String signature = sosie.getSignature();
TestDiff original = testDiffs.stream()
.filter(td -> td.getSignature().equals(signature))
.findAny()
.orElse(null);
if(original != null) {
original.merge(sosie);
} else {
testDiffs.add(sosie);
}
}
}
public int size() {
return testDiffs.stream()
.mapToInt(diff -> diff.size()).sum();
}
public int mergeSize(Diff other) {
int mergeSize = 0;
for(TestDiff sosie : other.testDiffs) {
String signature = sosie.getSignature();
TestDiff original = testDiffs.stream()
.filter(td -> td.getSignature().equals(signature))
.findAny()
.orElse(null);
if(original != null) {
mergeSize += original.mergeSize(sosie);
} else {
mergeSize += sosie.size();
}
}
return mergeSize;
}
@Override
public String toString() {
String ret = "";
for(TestDiff testDiff : testDiffs) {
if(testDiff.size() != 0) {
ret += testDiff.toString() +"\n";
}
}
return ret;
}
public Diff clone () {
Diff d = new Diff();
for(TestDiff testDiff: testDiffs) {
d.add(testDiff.clone());
}
return d;
}
}