From 0c12b6acc74e50b74f6d7c4db47da9a80fe95ab5 Mon Sep 17 00:00:00 2001 From: Sander Hautvast Date: Thu, 3 Jul 2014 17:35:29 +0200 Subject: [PATCH] integrated new Permuter in argument generation --- bin/nl/jssl/autounit/MethodcallExecutor.class | Bin 3156 -> 3187 bytes bin/nl/jssl/autounit/Recorder.class | Bin 3839 -> 3949 bytes .../inputs/CombinedInputSetFactory.class | Bin 4886 -> 4724 bytes bin/nl/jssl/autounit/utils/Permutator.class | Bin 1301 -> 0 bytes ....autounit.testclasses.BooleanArguments.xml | 6 +-- ...ssl.autounit.testclasses.ByteArguments.xml | 8 +-- ...sl.autounit.testclasses.FloatArguments.xml | 4 +- nl.jssl.autounit.testclasses.IntArguments.xml | 38 +++++++------- src/nl/jssl/autounit/MethodcallExecutor.java | 7 +-- src/nl/jssl/autounit/Recorder.java | 3 +- .../inputs/CombinedInputSetFactory.java | 48 +++++------------- src/nl/jssl/autounit/utils/Permutator.java | 25 --------- src/nl/jssl/autounit/utils/Permuter.java | 25 +++++++-- 13 files changed, 68 insertions(+), 96 deletions(-) delete mode 100644 bin/nl/jssl/autounit/utils/Permutator.class delete mode 100644 src/nl/jssl/autounit/utils/Permutator.java diff --git a/bin/nl/jssl/autounit/MethodcallExecutor.class b/bin/nl/jssl/autounit/MethodcallExecutor.class index b986e88db7f6fd9f7611b45dcd0aa7fc062fecc6..fa13f860b49aa7f56d83a51768b0b9ed89d9ff0e 100644 GIT binary patch delta 456 zcma)%OG^S_7=_O_GoqtH5?-_NGUla}30#Cs1tJ86fl!O6MF>rxj8i!CMXRo^f>z(A zzY%VtML(dm%l7Wtw69)V3$;0Cah`Kt-ckH39(weD*nNl8nmMUi52 zVx-JQr!huJ?0B_d(Q_!(3eA7b8VrG6$8pS)2HkcUYT`o9hNrC$WnYx7GX%G7+w3>2 zHnkit?if;koMP}y{uT-KArgjy5M~fT5>ccP!z$w9Mg6QNA!8msEFgtNWJxQOZy+qK0*;6=v5YQOz){8}kpt*r?Ehg^F%GmUYm@>(Fj5auWpW8u6TQX_xu3E+ IZgCIw7i^b#o&W#< delta 423 zcmew?aYaJl)W2Q(7#J9g85-Cbm>3z9Co3|EZ&deXX3Ef*yntOvAv3R_w4_+yu_(PX zH#M)M*e$;(I5RIjC)GJIC&${(dh!Ae)yY?wd-V14a`dx`i*xi7OH1-g^D;~H@oJsi z#-hNKuQ6GkQEKub79n}Oimf##>$59w=4Fjyax(BC%_3_?2JYO<;^Nd4XP~o67#W;E z{*uLO-{x!VVvLhDIJ-oJ8CV$jfl!1&nn9F7fkBMHfI)onan5&+QVh&MF%AY926+Zq z1|VPB@Lp=b5iFa)P diff --git a/bin/nl/jssl/autounit/Recorder.class b/bin/nl/jssl/autounit/Recorder.class index 3d9c4e9a98d75995e107147bbbb8496068c76a77..30d934a65aec5db90f1deca2b8845753e885f03e 100644 GIT binary patch delta 320 zcmaiwOD_Xa7>1wIXzC1=x)hDnP_2YuOla#8D=RBfV&BC?+KeG{W_EsrMnB%7I6P+C%~?^u*xnwy$eQtXyr6r7ot zo|EdFn3J>FjWdXG@_(*iP5}lM20;c+2BFE(+_OYQ88{fk7~~nm8Ppgg7)*d{TL!7k zTs(%1x^fIUKnX(zIR;Y(1qO2lMWB=tLlA>9Ln(s_Lk)u}!vr9I7J~-EItIeWC diff --git a/bin/nl/jssl/autounit/inputs/CombinedInputSetFactory.class b/bin/nl/jssl/autounit/inputs/CombinedInputSetFactory.class index dfa38c5912a95327834f5d5885b963a83718e5df..06c8dcb7591621637946beadec5d50c86789c2f3 100644 GIT binary patch literal 4724 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 PiS&1#3EbpK1h;+zYjqwe diff --git a/nl.jssl.autounit.testclasses.BooleanArguments.xml b/nl.jssl.autounit.testclasses.BooleanArguments.xml index 0b71359..c6ed3ef 100644 --- a/nl.jssl.autounit.testclasses.BooleanArguments.xml +++ b/nl.jssl.autounit.testclasses.BooleanArguments.xml @@ -4,9 +4,9 @@ - - false - false + + false + false falsefalse diff --git a/nl.jssl.autounit.testclasses.ByteArguments.xml b/nl.jssl.autounit.testclasses.ByteArguments.xml index 8d8158b..8499087 100644 --- a/nl.jssl.autounit.testclasses.ByteArguments.xml +++ b/nl.jssl.autounit.testclasses.ByteArguments.xml @@ -4,14 +4,14 @@ - - -128 + + -128 -256 - - 0 + + 0 11 diff --git a/nl.jssl.autounit.testclasses.FloatArguments.xml b/nl.jssl.autounit.testclasses.FloatArguments.xml index 397f4cc..979b8f4 100644 --- a/nl.jssl.autounit.testclasses.FloatArguments.xml +++ b/nl.jssl.autounit.testclasses.FloatArguments.xml @@ -4,8 +4,8 @@ - - -Infinity + + -2.006128E38 -2147483648 diff --git a/nl.jssl.autounit.testclasses.IntArguments.xml b/nl.jssl.autounit.testclasses.IntArguments.xml index 3d74d3e..85818e6 100644 --- a/nl.jssl.autounit.testclasses.IntArguments.xml +++ b/nl.jssl.autounit.testclasses.IntArguments.xml @@ -1,36 +1,36 @@ - - public int randomOther(int arg1) - - - - - -2147483648 - - 0 - - - - public java.lang.String evenOrUneven(int arg1,int arg2) - - -2147483648 - -2147483648 + + -2147483648 + -2147483648 even - - -1 - -1 + + -2147483648 + -1 uneven + + public int randomOther(int arg1) + + + + + -2147483648 + + 0 + + + + \ No newline at end of file diff --git a/src/nl/jssl/autounit/MethodcallExecutor.java b/src/nl/jssl/autounit/MethodcallExecutor.java index 5613502..6af41b7 100644 --- a/src/nl/jssl/autounit/MethodcallExecutor.java +++ b/src/nl/jssl/autounit/MethodcallExecutor.java @@ -4,6 +4,7 @@ import java.lang.reflect.Method; import java.util.List; 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. @@ -22,10 +23,10 @@ public class MethodcallExecutor { this.result = new MethodCallResults(instrumentedTestTarget, m); } - public MethodCallResults execute(List inputs) { + public MethodCallResults execute(List inputs) { int missedLines = Integer.MAX_VALUE; InvocationResult lastInvocationResult = null, previous = null; - for (ArgumentsForSingleCall input : inputs) { + for (Tuple input : inputs) { previous = lastInvocationResult; lastInvocationResult = analyseMethodCall(m, input); int missedCount = lastInvocationResult.coverage.getLineCounter().getMissedCount(); @@ -46,7 +47,7 @@ public class MethodcallExecutor { return result; } - private InvocationResult analyseMethodCall(Method m, ArgumentsForSingleCall input) { + private InvocationResult analyseMethodCall(Method m, Tuple input) { return coverageAnalyser.analyse(instrumentedTestTarget, m, input.toArray()); } diff --git a/src/nl/jssl/autounit/Recorder.java b/src/nl/jssl/autounit/Recorder.java index 4159a9c..648317c 100644 --- a/src/nl/jssl/autounit/Recorder.java +++ b/src/nl/jssl/autounit/Recorder.java @@ -9,6 +9,7 @@ import java.util.Map; import nl.jssl.autounit.inputs.ArgumentsForSingleCall; import nl.jssl.autounit.inputs.CombinedInputSetFactory; +import nl.jssl.autounit.utils.Permuter.Tuple; public class Recorder { private Class testTarget; @@ -42,7 +43,7 @@ public class Recorder { } private MethodCallResults recordMethod(Method m) { - List inputSet = new CombinedInputSetFactory().getInputs(testTarget, m); + List inputSet = new CombinedInputSetFactory().getInputs(testTarget, m); MethodcallExecutor methodcallExecutor = new MethodcallExecutor(testTarget, m); methodcallExecutor.execute(inputSet); return methodcallExecutor.getResult(); diff --git a/src/nl/jssl/autounit/inputs/CombinedInputSetFactory.java b/src/nl/jssl/autounit/inputs/CombinedInputSetFactory.java index de733d4..58a7f8c 100644 --- a/src/nl/jssl/autounit/inputs/CombinedInputSetFactory.java +++ b/src/nl/jssl/autounit/inputs/CombinedInputSetFactory.java @@ -6,7 +6,8 @@ import java.util.HashMap; import java.util.List; 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 { private final Map, InputsFactory> primitivesFactories; @@ -16,60 +17,37 @@ public class CombinedInputSetFactory { populateFactories(); } - public List getInputs(Class testTarget, Method m) { + public List getInputs(Class testTarget, Method m) { return combine(getInputSetsForAllArguments(testTarget, m)); } - private List combine(List> inputSetsForAllArguments) { + private List combine(List> inputSetsForAllArguments) { int nrOfParameters = inputSetsForAllArguments.size(); if (nrOfParameters == 1) { // simple case return makeArgumentsForSingleParameterCall(inputSetsForAllArguments); } else { - List allPossibleArguments = new ArrayList<>(); - -// 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; + return Permuter.permute(inputSetsForAllArguments); } - } - private List makeArgumentsForSingleParameterCall( - List> generatedInputSetsForAllArguments) { - List allPossibleArguments = new ArrayList(); + private List makeArgumentsForSingleParameterCall( + List> generatedInputSetsForAllArguments) { + List allPossibleArguments = new ArrayList(); - SingleTypeInputs generatedInputs = generatedInputSetsForAllArguments.iterator().next(); + List generatedInputs = generatedInputSetsForAllArguments.iterator().next(); for (Object variable : generatedInputs) { - ArgumentsForSingleCall argument = new ArgumentsForSingleCall(); - argument.add(variable); + Tuple argument = new Tuple(variable); allPossibleArguments.add(argument); } return allPossibleArguments; } - private List> getInputSetsForAllArguments(Class testTarget, Method m) { - List> singleInputSets = new ArrayList<>(); + private List> getInputSetsForAllArguments(Class testTarget, Method m) { + List> singleInputSets = new ArrayList<>(); for (Class parametertype : m.getParameterTypes()) { - SingleTypeInputs inputs = tryPrimitives(testTarget, parametertype); + List inputs = tryPrimitives(testTarget, parametertype); if (inputs == null) { inputs = new MocksFactory().getMockInputs(testTarget, parametertype); diff --git a/src/nl/jssl/autounit/utils/Permutator.java b/src/nl/jssl/autounit/utils/Permutator.java deleted file mode 100644 index 97c1d9a..0000000 --- a/src/nl/jssl/autounit/utils/Permutator.java +++ /dev/null @@ -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 arr) { - List all = new ArrayList<>(); - permute(new ArrayList(arr), 0, all); - return all; - } - - private static void permute(List arr, int k, List 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); - } - } - -} \ No newline at end of file diff --git a/src/nl/jssl/autounit/utils/Permuter.java b/src/nl/jssl/autounit/utils/Permuter.java index b8aed9b..9b2f137 100644 --- a/src/nl/jssl/autounit/utils/Permuter.java +++ b/src/nl/jssl/autounit/utils/Permuter.java @@ -34,10 +34,15 @@ public class Permuter { return pairs; } - public static class Tuple implements Iterable { + public static class Tuple implements Iterable { public final Object element1; public final Object element2; + public Tuple(Object element1) { + this.element1 = element1; + this.element2 = null; + } + public Tuple(Object element1, Object element2) { super(); this.element1 = element1; @@ -46,10 +51,18 @@ public class Permuter { @Override public Iterator iterator() { + return asList().iterator(); + } + + private List asList() { List list = new ArrayList<>(); - add(element1, list); - add(element2, list); - return list.iterator(); + if (element1 != null) { + add(element1, list); + } + if (element2 != null) { + add(element2, list); + } + return list; } private void add(Object element, List list) { @@ -70,5 +83,9 @@ public class Permuter { } return string; } + + public Object[] toArray() { + return asList().toArray(); + } } }