package com.google.jstestdriver.idea.rt.coverage;
import com.google.common.base.Preconditions;
import com.google.common.collect.Lists;
import com.google.jstestdriver.idea.rt.coverage.CoverageReport;
import org.jetbrains.annotations.NotNull;
import java.io.*;
import java.util.List;
import java.util.Map;
/**
* @author Sergey Simonchik
*/
public class CoverageSerializationUtils {
private static final String SOURCE_FILE_PREFIX = "SF:";
private static final String LINE_HIT_PREFIX = "DA:";
private static final String END_OF_RECORD = "end_of_record";
public static CoverageReport readLCOV(@NotNull File file) throws IOException {
BufferedReader reader = new BufferedReader(new FileReader(file));
try {
String currentFileName = null;
String line;
List<CoverageReport.LineHits> lineDataList = null;
CoverageReport report = new CoverageReport();
while ((line = reader.readLine()) != null) {
if (line.startsWith(SOURCE_FILE_PREFIX)) {
currentFileName = line.substring(SOURCE_FILE_PREFIX.length());
lineDataList = Lists.newArrayList();
}
else if (line.startsWith(LINE_HIT_PREFIX)) {
if (lineDataList == null) {
throw new RuntimeException("lineDataList is null!");
}
String[] values = line.substring(LINE_HIT_PREFIX.length()).split(",");
Preconditions.checkState(values.length == 2);
int lineNum = Integer.parseInt(values[0]);
int hitCount = Integer.parseInt(values[1]);
CoverageReport.LineHits lineHits = new CoverageReport.LineHits(lineNum, hitCount);
lineDataList.add(lineHits);
}
else if (END_OF_RECORD.equals(line)) {
if (lineDataList == null) {
throw new RuntimeException("lineDataList is null!");
}
Preconditions.checkNotNull(currentFileName);
report.mergeFileReport(currentFileName, lineDataList);
currentFileName = null;
lineDataList = null;
}
}
Preconditions.checkState(lineDataList == null && currentFileName == null);
return report;
} finally {
reader.close();
}
}
public static void writeLCOV(@NotNull CoverageReport report, @NotNull File outputFile) throws IOException {
PrintWriter out = new PrintWriter(outputFile);
try {
for (Map.Entry<String, List<CoverageReport.LineHits>> entry : report.getInfo().entrySet()) {
out.print(SOURCE_FILE_PREFIX);
out.println(entry.getKey());
for (CoverageReport.LineHits lineHits : entry.getValue()) {
out.print(LINE_HIT_PREFIX);
out.print(lineHits.getLineNumber());
out.print(',');
out.println(lineHits.getHits());
}
out.println(END_OF_RECORD);
}
} finally {
out.close();
}
}
}