/**
* Copyright (C) 2015 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package mujava.test;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.DecimalFormat;
import java.util.Arrays;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.Vector;
import mujava.MutationSystem;
import mujava.TestExecuterCLI;
import mujava.cli.Util;
import mujava.cli.runmutes;
/**
* <p>
* Description: New test result class build exclusively for command line version
* </p>
*
* @author Lin Deng
* @version 1.0
*/
public class TestResultCLI extends TestResult {
public Vector eq_mutants = new Vector();
public String path = new String();
public void outputToFile(String method) throws IOException {
//displayResultConsole();
File f = new File(path);
if (runmutes.mode.equals("fresh")) // fresh mode, need to save with time
// stamp
{
if(!TestExecuterCLI.methodList.contains(method))
{System.out.println("ERROR");return;}
TestExecuterCLI.methodList.remove(method);
// merge results
Util.mutants.addAll(mutants);
Util.killed_mutants.addAll(killed_mutants);
Util.live_mutants.addAll(live_mutants);
Util.eq_mutants.addAll(eq_mutants);
// if no methods left, save file
// else continue
if(TestExecuterCLI.methodList.size()==0)
{
// get time
Calendar nowtime = new GregorianCalendar();
path = path + "_" + nowtime.get(Calendar.YEAR) + "_" + (nowtime.get(Calendar.MONTH) + 1) + "_"
+ nowtime.get(Calendar.DATE) + "_" + nowtime.get(Calendar.HOUR) + "_"
+ nowtime.get(Calendar.MINUTE) + "_" + nowtime.get(Calendar.SECOND);
f = new File(path);
FileOutputStream fout = new FileOutputStream(f);
StringBuffer fileContent = new StringBuffer();
fileContent.append("killed mutants (" + Util.killed_mutants.size() + "): ");
for (Object object : Util.killed_mutants) {
fileContent.append(object.toString() + ", ");
}
fileContent.append("\r\n");
fileContent.append("live mutants (" + Util.live_mutants.size() + "): ");
for (Object object : Util.live_mutants) {
fileContent.append(object.toString() + ", ");
}
fileContent.append("\r\n");
fileContent.append("equivalent mutants (" + Util.eq_mutants.size() + "): ");
for (Object object : Util.eq_mutants) {
fileContent.append(object.toString() + ", ");
}
fout.write(fileContent.toString().getBytes("utf-8"));
fout.close();
displayResultConsole();
Util.setUpVectors(); // reset after finish
}
return;
}
if (!f.exists()) // no file exist, save to file without reading history
// results
{
FileOutputStream fout = new FileOutputStream(f);
StringBuffer fileContent = new StringBuffer();
fileContent.append("killed mutants (" + killed_mutants.size() + "): ");
for (Object object : killed_mutants) {
fileContent.append(object.toString() + ", ");
}
fileContent.append("\r\n");
fileContent.append("live mutants (" + live_mutants.size() + "): ");
for (Object object : live_mutants) {
fileContent.append(object.toString() + ", ");
}
fileContent.append("\r\n");
fileContent.append("equivalent mutants (" + eq_mutants.size() + "): ");
for (Object object : eq_mutants) {
fileContent.append(object.toString() + ", ");
}
fout.write(fileContent.toString().getBytes("utf-8"));
fout.close();
displayResultConsole();
return;
}
if (runmutes.mode.equals("default")) {
if (!f.exists()) // no file exist, new run
{
FileOutputStream fout = new FileOutputStream(f);
StringBuffer fileContent = new StringBuffer();
fileContent.append("killed mutants (" + killed_mutants.size() + "): ");
for (Object object : killed_mutants) {
fileContent.append(object.toString() + ", ");
}
fileContent.append("\r\n");
fileContent.append("live mutants (" + live_mutants.size() + "): ");
for (Object object : live_mutants) {
fileContent.append(object.toString() + ", ");
}
fileContent.append("\r\n");
fileContent.append("equivalent mutants (" + eq_mutants.size() + "): ");
for (Object object : eq_mutants) {
fileContent.append(object.toString() + ", ");
}
fout.write(fileContent.toString().getBytes("utf-8"));
fout.close();
displayResultConsole();
return;
} else { // second run, need read file first
TestResultCLI oldTestResult = new TestResultCLI();
oldTestResult.setPath(path);
oldTestResult.getResults();
for (Object liveMutant : live_mutants)
{
if(!oldTestResult.live_mutants.contains((String) liveMutant))
oldTestResult.live_mutants.add(liveMutant);
}
for (Object killedMutant : killed_mutants) // for each new
// killed mutant,
// move it from live
// to killed
{
if (oldTestResult.live_mutants.contains((String) killedMutant))
oldTestResult.live_mutants.remove(killedMutant);
if (!oldTestResult.killed_mutants.contains((String) killedMutant))
oldTestResult.killed_mutants.add(killedMutant);
}
// if in eq mode, an eq mutant is killed, also need to move to
// killed mutant set
if (runmutes.runEq) {
for (Object killedMutant : killed_mutants) // for each new
// killed
// mutant, move
// it from live
// to killed
{
if (oldTestResult.eq_mutants.contains((String) killedMutant)) {
oldTestResult.eq_mutants.remove(killedMutant);
oldTestResult.killed_mutants.add(killedMutant);
}
}
}
FileOutputStream fout = new FileOutputStream(f);
StringBuffer fileContent = new StringBuffer();
fileContent.append("killed mutants (" + oldTestResult.killed_mutants.size() + "): ");
for (Object object : oldTestResult.killed_mutants) {
fileContent.append(object.toString() + ", ");
}
fileContent.append("\r\n");
fileContent.append("live mutants (" + oldTestResult.live_mutants.size() + "): ");
for (Object object : oldTestResult.live_mutants) {
fileContent.append(object.toString() + ", ");
}
fileContent.append("\r\n");
fileContent.append("equivalent mutants (" + oldTestResult.eq_mutants.size() + "): ");
for (Object object : oldTestResult.eq_mutants) {
fileContent.append(object.toString() + ", ");
}
fout.write(fileContent.toString().getBytes("utf-8"));
fout.close();
displayResultConsole();
return;
}
}
if (runmutes.mode.equals("dead")) {
if (!f.exists()) // no file exist, new run
{
FileOutputStream fout = new FileOutputStream(f);
StringBuffer fileContent = new StringBuffer();
fileContent.append("killed mutants (" + killed_mutants.size() + "): ");
for (Object object : killed_mutants) {
fileContent.append(object.toString() + ", ");
}
fileContent.append("\r\n");
fileContent.append("live mutants (" + live_mutants.size() + "): ");
for (Object object : live_mutants) {
fileContent.append(object.toString() + ", ");
}
fileContent.append("\r\n");
fileContent.append("equivalent mutants (" + eq_mutants.size() + "): ");
for (Object object : eq_mutants) {
fileContent.append(object.toString() + ", ");
}
fout.write(fileContent.toString().getBytes("utf-8"));
fout.close();
displayResultConsole();
return;
} else { // second run, need read file first
TestResultCLI oldTestResult = new TestResultCLI();
oldTestResult.setPath(path);
oldTestResult.getResults();
//
for (Object liveMutant : live_mutants)
{
if(!oldTestResult.live_mutants.contains((String) liveMutant))
oldTestResult.live_mutants.add(liveMutant);
}
for (Object killedMutant : killed_mutants) // for each new
// killed mutant,
// move it from live
// to killed
{
if (oldTestResult.live_mutants.contains((String) killedMutant))
oldTestResult.live_mutants.remove(killedMutant);
if (!oldTestResult.killed_mutants.contains((String) killedMutant))
oldTestResult.killed_mutants.add(killedMutant);
}
// if in eq mode, an eq mutant is killed, also need to move to
// killed mutant set
if (runmutes.runEq) {
for (Object killedMutant : killed_mutants) // for each new
// killed
// mutant, move
// it from live
// to killed
{
if (oldTestResult.eq_mutants.contains((String) killedMutant))
oldTestResult.eq_mutants.remove(killedMutant);
if (!oldTestResult.killed_mutants.contains((String) killedMutant))
oldTestResult.killed_mutants.add(killedMutant);
}
}
FileOutputStream fout = new FileOutputStream(f);
StringBuffer fileContent = new StringBuffer();
fileContent.append("killed mutants (" + oldTestResult.killed_mutants.size() + "): ");
for (Object object : oldTestResult.killed_mutants) {
fileContent.append(object.toString() + ", ");
}
fileContent.append("\r\n");
fileContent.append("live mutants (" + oldTestResult.live_mutants.size() + "): ");
for (Object object : oldTestResult.live_mutants) {
fileContent.append(object.toString() + ", ");
}
fileContent.append("\r\n");
fileContent.append("equivalent mutants (" + oldTestResult.eq_mutants.size() + "): ");
for (Object object : oldTestResult.eq_mutants) {
fileContent.append(object.toString() + ", ");
}
fout.write(fileContent.toString().getBytes("utf-8"));
fout.close();
displayResultConsole();
return;
}
}
}
private void displayResultConsole() throws IOException {
File f = new File(path);
// if file exist, need to read file
if (f.exists()) {
TestResultCLI oldTestResult = new TestResultCLI();
oldTestResult.setPath(path);
oldTestResult.getResults();
for (Object killedMutant : killed_mutants) // for each new killed
// mutant, move it from
// live to killed
{
if (oldTestResult.live_mutants.contains((String) killedMutant)) {
oldTestResult.live_mutants.remove(killedMutant);
}
if (!oldTestResult.killed_mutants.contains((String) killedMutant))
oldTestResult.killed_mutants.add(killedMutant);
}
int total = oldTestResult.killed_mutants.size() + oldTestResult.live_mutants.size()
+ oldTestResult.eq_mutants.size();
Util.Print("\nTotal mutants killed: " + oldTestResult.killed_mutants.size());
Util.Print("Total mutants: " + total);
double ms = (double)oldTestResult.killed_mutants.size() / (double)total;
DecimalFormat df = new DecimalFormat();
df.setMaximumFractionDigits(4);
Util.Print("Mutation Score: " + df.format(ms));
} else {// file not exist, directly display
int total = killed_mutants.size() + live_mutants.size() + eq_mutants.size();
Util.Print("\nTotal mutants killed: " + killed_mutants.size());
Util.Print("Total mutants: " + total);
double ms = (double)killed_mutants.size() / (double)total;
DecimalFormat df = new DecimalFormat();
df.setMaximumFractionDigits(4);
Util.Print("Mutation Score: " + df.format(ms));
}
Util.Print("Please look at the result files (mutant_list and result_list.csv) for details."
+ " \nUse \"markequiv\" command to mark equivalent mutants.");
}
public void getResults() throws IOException {
String s = null;
StringBuffer sb = new StringBuffer();
File f = new File(path);
if (!f.exists()) {
System.out.println("can't find the mutant result file");
}
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(f)));
while ((s = br.readLine()) != null) {
sb.append(s);
// : divide; , divide
String[] temp = s.split(":\\s+");
Util.DebugPrint(temp[0]);
if (temp[0].contains("killed") && temp.length > 1) {
List<String> killed_mutantsList = Arrays.asList(temp[1].split(",\\s+"));
killed_mutants = new Vector(killed_mutantsList);
} else if (temp[0].contains("live") && temp.length > 1) {
List<String> live_mutantsList = Arrays.asList(temp[1].split(",\\s+"));
live_mutants = new Vector(live_mutantsList);
} else if (temp[0].contains("equivalent") && temp.length > 1) {
List<String> eq_mutantsList = Arrays.asList(temp[1].split(",\\s+"));
eq_mutants = new Vector(eq_mutantsList);
}
}
}
public void markEqvl(String eqMutant) throws IOException {
if (!live_mutants.contains(eqMutant))
return;
// erase and update
live_mutants.remove(eqMutant);
eq_mutants.add(eqMutant);
// write file
outputToFile(" ");
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
}