integrated new Permuter in argument generation
This commit is contained in:
parent
4c1a6d4417
commit
0c12b6acc7
13 changed files with 68 additions and 96 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -4,9 +4,9 @@
|
||||||
<results>
|
<results>
|
||||||
<contents>
|
<contents>
|
||||||
<case>
|
<case>
|
||||||
<input class="args">
|
<input class="nl.jssl.autounit.utils.Permuter$Tuple">
|
||||||
<arg1>false</arg1>
|
<element1 class="boolean">false</element1>
|
||||||
<arg1>false</arg1>
|
<element2 class="boolean">false</element2>
|
||||||
</input>
|
</input>
|
||||||
<output class="string">falsefalse</output>
|
<output class="string">falsefalse</output>
|
||||||
</case>
|
</case>
|
||||||
|
|
|
||||||
|
|
@ -4,14 +4,14 @@
|
||||||
<results>
|
<results>
|
||||||
<contents>
|
<contents>
|
||||||
<case>
|
<case>
|
||||||
<input class="args">
|
<input class="nl.jssl.autounit.utils.Permuter$Tuple">
|
||||||
<arg1>-128</arg1>
|
<element1 class="byte">-128</element1>
|
||||||
</input>
|
</input>
|
||||||
<output class="int">-256</output>
|
<output class="int">-256</output>
|
||||||
</case>
|
</case>
|
||||||
<case>
|
<case>
|
||||||
<input class="args">
|
<input class="nl.jssl.autounit.utils.Permuter$Tuple">
|
||||||
<arg1>0</arg1>
|
<element1 class="byte">0</element1>
|
||||||
</input>
|
</input>
|
||||||
<output class="int">11</output>
|
<output class="int">11</output>
|
||||||
</case>
|
</case>
|
||||||
|
|
|
||||||
|
|
@ -4,8 +4,8 @@
|
||||||
<results>
|
<results>
|
||||||
<contents>
|
<contents>
|
||||||
<case>
|
<case>
|
||||||
<input class="args">
|
<input class="nl.jssl.autounit.utils.Permuter$Tuple">
|
||||||
<arg1>-Infinity</arg1>
|
<element1 class="float">-2.006128E38</element1>
|
||||||
</input>
|
</input>
|
||||||
<output class="int">-2147483648</output>
|
<output class="int">-2147483648</output>
|
||||||
</case>
|
</case>
|
||||||
|
|
|
||||||
|
|
@ -1,36 +1,36 @@
|
||||||
<map>
|
<map>
|
||||||
<entry>
|
|
||||||
<string>public int randomOther(int arg1)</string>
|
|
||||||
<results>
|
|
||||||
<contents>
|
|
||||||
<case>
|
|
||||||
<input class="args">
|
|
||||||
<arg1>-2147483648</arg1>
|
|
||||||
</input>
|
|
||||||
<output class="int">0</output>
|
|
||||||
</case>
|
|
||||||
</contents>
|
|
||||||
</results>
|
|
||||||
</entry>
|
|
||||||
<entry>
|
<entry>
|
||||||
<string>public java.lang.String evenOrUneven(int arg1,int arg2)</string>
|
<string>public java.lang.String evenOrUneven(int arg1,int arg2)</string>
|
||||||
<results>
|
<results>
|
||||||
<contents>
|
<contents>
|
||||||
<case>
|
<case>
|
||||||
<input class="args">
|
<input class="nl.jssl.autounit.utils.Permuter$Tuple">
|
||||||
<arg1>-2147483648</arg1>
|
<element1 class="int">-2147483648</element1>
|
||||||
<arg1>-2147483648</arg1>
|
<element2 class="int">-2147483648</element2>
|
||||||
</input>
|
</input>
|
||||||
<output class="string">even</output>
|
<output class="string">even</output>
|
||||||
</case>
|
</case>
|
||||||
<case>
|
<case>
|
||||||
<input class="args">
|
<input class="nl.jssl.autounit.utils.Permuter$Tuple">
|
||||||
<arg1>-1</arg1>
|
<element1 class="int">-2147483648</element1>
|
||||||
<arg1>-1</arg1>
|
<element2 class="int">-1</element2>
|
||||||
</input>
|
</input>
|
||||||
<output class="string">uneven</output>
|
<output class="string">uneven</output>
|
||||||
</case>
|
</case>
|
||||||
</contents>
|
</contents>
|
||||||
</results>
|
</results>
|
||||||
</entry>
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<string>public int randomOther(int arg1)</string>
|
||||||
|
<results>
|
||||||
|
<contents>
|
||||||
|
<case>
|
||||||
|
<input class="nl.jssl.autounit.utils.Permuter$Tuple">
|
||||||
|
<element1 class="int">-2147483648</element1>
|
||||||
|
</input>
|
||||||
|
<output class="int">0</output>
|
||||||
|
</case>
|
||||||
|
</contents>
|
||||||
|
</results>
|
||||||
|
</entry>
|
||||||
</map>
|
</map>
|
||||||
|
|
@ -4,6 +4,7 @@ import java.lang.reflect.Method;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import nl.jssl.autounit.inputs.ArgumentsForSingleCall;
|
import nl.jssl.autounit.inputs.ArgumentsForSingleCall;
|
||||||
|
import nl.jssl.autounit.utils.Permuter.Tuple;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* voert 1 methode uit met wisselende input parameters en bewaart het resultaat.
|
* voert 1 methode uit met wisselende input parameters en bewaart het resultaat.
|
||||||
|
|
@ -22,10 +23,10 @@ public class MethodcallExecutor {
|
||||||
this.result = new MethodCallResults(instrumentedTestTarget, m);
|
this.result = new MethodCallResults(instrumentedTestTarget, m);
|
||||||
}
|
}
|
||||||
|
|
||||||
public MethodCallResults execute(List<ArgumentsForSingleCall> inputs) {
|
public MethodCallResults execute(List<Tuple> inputs) {
|
||||||
int missedLines = Integer.MAX_VALUE;
|
int missedLines = Integer.MAX_VALUE;
|
||||||
InvocationResult lastInvocationResult = null, previous = null;
|
InvocationResult lastInvocationResult = null, previous = null;
|
||||||
for (ArgumentsForSingleCall input : inputs) {
|
for (Tuple input : inputs) {
|
||||||
previous = lastInvocationResult;
|
previous = lastInvocationResult;
|
||||||
lastInvocationResult = analyseMethodCall(m, input);
|
lastInvocationResult = analyseMethodCall(m, input);
|
||||||
int missedCount = lastInvocationResult.coverage.getLineCounter().getMissedCount();
|
int missedCount = lastInvocationResult.coverage.getLineCounter().getMissedCount();
|
||||||
|
|
@ -46,7 +47,7 @@ public class MethodcallExecutor {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
private InvocationResult analyseMethodCall(Method m, ArgumentsForSingleCall input) {
|
private InvocationResult analyseMethodCall(Method m, Tuple input) {
|
||||||
return coverageAnalyser.analyse(instrumentedTestTarget, m, input.toArray());
|
return coverageAnalyser.analyse(instrumentedTestTarget, m, input.toArray());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,7 @@ import java.util.Map;
|
||||||
|
|
||||||
import nl.jssl.autounit.inputs.ArgumentsForSingleCall;
|
import nl.jssl.autounit.inputs.ArgumentsForSingleCall;
|
||||||
import nl.jssl.autounit.inputs.CombinedInputSetFactory;
|
import nl.jssl.autounit.inputs.CombinedInputSetFactory;
|
||||||
|
import nl.jssl.autounit.utils.Permuter.Tuple;
|
||||||
|
|
||||||
public class Recorder {
|
public class Recorder {
|
||||||
private Class<?> testTarget;
|
private Class<?> testTarget;
|
||||||
|
|
@ -42,7 +43,7 @@ public class Recorder {
|
||||||
}
|
}
|
||||||
|
|
||||||
private MethodCallResults recordMethod(Method m) {
|
private MethodCallResults recordMethod(Method m) {
|
||||||
List<ArgumentsForSingleCall> inputSet = new CombinedInputSetFactory().getInputs(testTarget, m);
|
List<Tuple> inputSet = new CombinedInputSetFactory().getInputs(testTarget, m);
|
||||||
MethodcallExecutor methodcallExecutor = new MethodcallExecutor(testTarget, m);
|
MethodcallExecutor methodcallExecutor = new MethodcallExecutor(testTarget, m);
|
||||||
methodcallExecutor.execute(inputSet);
|
methodcallExecutor.execute(inputSet);
|
||||||
return methodcallExecutor.getResult();
|
return methodcallExecutor.getResult();
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,8 @@ import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import nl.jssl.autounit.utils.Permutator;
|
import nl.jssl.autounit.utils.Permuter;
|
||||||
|
import nl.jssl.autounit.utils.Permuter.Tuple;
|
||||||
|
|
||||||
public class CombinedInputSetFactory {
|
public class CombinedInputSetFactory {
|
||||||
private final Map<Class<?>, InputsFactory<?>> primitivesFactories;
|
private final Map<Class<?>, InputsFactory<?>> primitivesFactories;
|
||||||
|
|
@ -16,60 +17,37 @@ public class CombinedInputSetFactory {
|
||||||
populateFactories();
|
populateFactories();
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<ArgumentsForSingleCall> getInputs(Class<?> testTarget, Method m) {
|
public List<Tuple> getInputs(Class<?> testTarget, Method m) {
|
||||||
return combine(getInputSetsForAllArguments(testTarget, m));
|
return combine(getInputSetsForAllArguments(testTarget, m));
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<ArgumentsForSingleCall> combine(List<SingleTypeInputs<?>> inputSetsForAllArguments) {
|
private List<Tuple> combine(List<List<?>> inputSetsForAllArguments) {
|
||||||
int nrOfParameters = inputSetsForAllArguments.size();
|
int nrOfParameters = inputSetsForAllArguments.size();
|
||||||
if (nrOfParameters == 1) {
|
if (nrOfParameters == 1) {
|
||||||
// simple case
|
// simple case
|
||||||
return makeArgumentsForSingleParameterCall(inputSetsForAllArguments);
|
return makeArgumentsForSingleParameterCall(inputSetsForAllArguments);
|
||||||
} else {
|
} else {
|
||||||
List<ArgumentsForSingleCall> allPossibleArguments = new ArrayList<>();
|
return Permuter.permute(inputSetsForAllArguments);
|
||||||
|
}
|
||||||
// for (SingleTypeInputs<?> inputs : inputSetsForAllArguments) {
|
|
||||||
// // make list of all permutations of first argument values
|
|
||||||
// List<?> permutatedInputs = Permutator.permute(inputs);
|
|
||||||
// int index = 0;
|
|
||||||
// for (Object variable : permutatedInputs) {
|
|
||||||
// // all lists ("columns") are combined into "rows"
|
|
||||||
// if (index >= allPossibleArguments.size()) {
|
|
||||||
// ArgumentsForSingleCall a = new ArgumentsForSingleCall();
|
|
||||||
// a.add(variable);
|
|
||||||
// allPossibleArguments.add(a);
|
|
||||||
// } else {
|
|
||||||
// ArgumentsForSingleCall argumentsForSingleCall = allPossibleArguments.get(index);
|
|
||||||
// argumentsForSingleCall.add(variable);
|
|
||||||
// }
|
|
||||||
// index++;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// the row view
|
|
||||||
|
|
||||||
return allPossibleArguments;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
private List<Tuple> makeArgumentsForSingleParameterCall(
|
||||||
|
List<List<?>> generatedInputSetsForAllArguments) {
|
||||||
|
List<Tuple> allPossibleArguments = new ArrayList<Tuple>();
|
||||||
|
|
||||||
private List<ArgumentsForSingleCall> makeArgumentsForSingleParameterCall(
|
List<?> generatedInputs = generatedInputSetsForAllArguments.iterator().next();
|
||||||
List<SingleTypeInputs<?>> generatedInputSetsForAllArguments) {
|
|
||||||
List<ArgumentsForSingleCall> allPossibleArguments = new ArrayList<ArgumentsForSingleCall>();
|
|
||||||
|
|
||||||
SingleTypeInputs<?> generatedInputs = generatedInputSetsForAllArguments.iterator().next();
|
|
||||||
|
|
||||||
for (Object variable : generatedInputs) {
|
for (Object variable : generatedInputs) {
|
||||||
ArgumentsForSingleCall argument = new ArgumentsForSingleCall();
|
Tuple argument = new Tuple(variable);
|
||||||
argument.add(variable);
|
|
||||||
allPossibleArguments.add(argument);
|
allPossibleArguments.add(argument);
|
||||||
}
|
}
|
||||||
return allPossibleArguments;
|
return allPossibleArguments;
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<SingleTypeInputs<?>> getInputSetsForAllArguments(Class<?> testTarget, Method m) {
|
private List<List<?>> getInputSetsForAllArguments(Class<?> testTarget, Method m) {
|
||||||
List<SingleTypeInputs<?>> singleInputSets = new ArrayList<>();
|
List<List<?>> singleInputSets = new ArrayList<>();
|
||||||
for (Class<?> parametertype : m.getParameterTypes()) {
|
for (Class<?> parametertype : m.getParameterTypes()) {
|
||||||
SingleTypeInputs<?> inputs = tryPrimitives(testTarget, parametertype);
|
List<?> inputs = tryPrimitives(testTarget, parametertype);
|
||||||
|
|
||||||
if (inputs == null) {
|
if (inputs == null) {
|
||||||
inputs = new MocksFactory().getMockInputs(testTarget, parametertype);
|
inputs = new MocksFactory().getMockInputs(testTarget, parametertype);
|
||||||
|
|
|
||||||
|
|
@ -1,25 +0,0 @@
|
||||||
package nl.jssl.autounit.utils;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public class Permutator {
|
|
||||||
public static List<?> permute(List<? extends Object> arr) {
|
|
||||||
List<Object> all = new ArrayList<>();
|
|
||||||
permute(new ArrayList<Object>(arr), 0, all);
|
|
||||||
return all;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void permute(List<?> arr, int k, List<Object> all) {
|
|
||||||
for (int i = k; i < arr.size(); i++) {
|
|
||||||
Collections.swap(arr, i, k);
|
|
||||||
permute(arr, k + 1, all);
|
|
||||||
Collections.swap(arr, k, i);
|
|
||||||
}
|
|
||||||
if (k == arr.size() - 1) {
|
|
||||||
all.addAll(arr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -34,10 +34,15 @@ public class Permuter {
|
||||||
return pairs;
|
return pairs;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class Tuple implements Iterable<Object> {
|
public static class Tuple implements Iterable {
|
||||||
public final Object element1;
|
public final Object element1;
|
||||||
public final Object element2;
|
public final Object element2;
|
||||||
|
|
||||||
|
public Tuple(Object element1) {
|
||||||
|
this.element1 = element1;
|
||||||
|
this.element2 = null;
|
||||||
|
}
|
||||||
|
|
||||||
public Tuple(Object element1, Object element2) {
|
public Tuple(Object element1, Object element2) {
|
||||||
super();
|
super();
|
||||||
this.element1 = element1;
|
this.element1 = element1;
|
||||||
|
|
@ -46,10 +51,18 @@ public class Permuter {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Iterator<Object> iterator() {
|
public Iterator<Object> iterator() {
|
||||||
|
return asList().iterator();
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<Object> asList() {
|
||||||
List<Object> list = new ArrayList<>();
|
List<Object> list = new ArrayList<>();
|
||||||
|
if (element1 != null) {
|
||||||
add(element1, list);
|
add(element1, list);
|
||||||
|
}
|
||||||
|
if (element2 != null) {
|
||||||
add(element2, list);
|
add(element2, list);
|
||||||
return list.iterator();
|
}
|
||||||
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void add(Object element, List<Object> list) {
|
private void add(Object element, List<Object> list) {
|
||||||
|
|
@ -70,5 +83,9 @@ public class Permuter {
|
||||||
}
|
}
|
||||||
return string;
|
return string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Object[] toArray() {
|
||||||
|
return asList().toArray();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue