integrated new Permuter in argument generation

This commit is contained in:
Sander Hautvast 2014-07-03 17:35:29 +02:00
parent 4c1a6d4417
commit 0c12b6acc7
13 changed files with 68 additions and 96 deletions

Binary file not shown.

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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());
} }

View file

@ -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();

View file

@ -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<ArgumentsForSingleCall> makeArgumentsForSingleParameterCall( private List<Tuple> makeArgumentsForSingleParameterCall(
List<SingleTypeInputs<?>> generatedInputSetsForAllArguments) { List<List<?>> generatedInputSetsForAllArguments) {
List<ArgumentsForSingleCall> allPossibleArguments = new ArrayList<ArgumentsForSingleCall>(); List<Tuple> allPossibleArguments = new ArrayList<Tuple>();
SingleTypeInputs<?> generatedInputs = generatedInputSetsForAllArguments.iterator().next(); List<?> 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);

View file

@ -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);
}
}
}

View file

@ -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<>();
add(element1, list); if (element1 != null) {
add(element2, list); add(element1, list);
return list.iterator(); }
if (element2 != null) {
add(element2, list);
}
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();
}
} }
} }