package fr.inria.diversify.testamplification.compare.diff;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
/**
* Created by Simon on 19/01/15.
*/
@Deprecated
public class TestDiff {
List<MonitoringPointDiff> diff;
String signature;
boolean excludeThisTest = false;
public TestDiff(String signature) {
this.signature = signature;
diff = new ArrayList<>();
}
public TestDiff(JSONObject object) throws JSONException {
buildFrom(object);
}
public void add(MonitoringPointDiff logResult) {
diff.add(logResult);
}
public List<MonitoringPointDiff> getDiff() {
return diff;
}
public String getSignature() {
return signature;
}
public JSONObject toJSON() throws JSONException {
JSONObject object = new JSONObject();
object.put("test", signature);
if(excludeThisTest) {
object.put("excludeThisTest", true);
} else {
JSONArray array = new JSONArray();
object.put("monitoringPoints", array);
for (MonitoringPointDiff d : diff) {
array.put(d.toJson());
}
}
return object;
}
protected void buildFrom(JSONObject object) throws JSONException {
this.signature = object.getString("test");
diff = new ArrayList<>();
if(object.has("exclude")) {
excludeThisTest = true;
} else {
JSONArray logDiff;
if( object.has("logDiff")) { //old version
logDiff = object.getJSONArray("logDiff");
} else {
logDiff = object.getJSONArray("monitoringPoints");
}
for (int i = 0; i < logDiff.length(); i++) {
diff.add(new MonitoringPointDiff(logDiff.getJSONObject(i)));
}
}
}
public void filter(Filter filter) {
if(filter.excludeThisTest(signature)) {
excludeThisTest = true;
} else {
diff = diff.stream()
.filter(d -> !filter.getMonitorPoint().contains(d.id))
.collect(Collectors.toList());
diff.stream()
.filter(d -> filter.get(signature) != null)
.forEach(d -> d.filter(filter.get(signature)));
diff = diff.stream()
.filter(d -> d.size() != 0)
.collect(Collectors.toList());
}
}
public Set<String> buildFilter() {
Set<String> filter = new HashSet<>();
if(excludeThisTest) {
filter.add("exclude");
} else {
for (MonitoringPointDiff d : diff) {
filter.add(d.buildFilter());
}
}
return filter.stream()
.map(f -> signature + " " + f).collect(Collectors.toSet());
}
public void excludeThisTest() {
excludeThisTest = true;
diff.clear();
}
public int size() {
if(excludeThisTest) {
return 0;
} else {
return diff.stream()
.mapToInt(d -> d.size())
.sum();
}
}
public String toString() {
try {
return toJSON().toString();
} catch (JSONException e) {
e.printStackTrace();
}
return "";
}
public void merge(TestDiff other) {
if(excludeThisTest || other.excludeThisTest) {
excludeThisTest = true;
} else {
for(MonitoringPointDiff diffOther : other.diff) {
MonitoringPointDiff diffThis = diff.stream()
.filter(d -> d.id == diffOther.id)
.findAny()
.orElse(null);
if(diffThis != null) {
diffThis.merge(diffOther);
} else {
diff.add(diffOther.clone());
}
}
}
}
public int mergeSize(TestDiff other) {
if(excludeThisTest || other.excludeThisTest) {
return 0;
} else {
int size = 0;
for(MonitoringPointDiff diffOther : other.diff) {
MonitoringPointDiff diffThis = diff.stream()
.filter(d -> d.id == diffOther.id)
.findAny()
.orElse(null);
if(diffThis != null) {
size += diffThis.mergeSize(diffOther);
} else {
size += diffOther.size();
}
}
return size;
}
}
public TestDiff clone() {
TestDiff td = new TestDiff(signature);
td.excludeThisTest = excludeThisTest;
for(MonitoringPointDiff md : diff) {
td.add(md.clone());
}
return td;
}
}