diff --git a/src/nl/jssl/autounit/utils/Permuter.java b/src/nl/jssl/autounit/utils/Permuter.java index 03c65dc..b8aed9b 100644 --- a/src/nl/jssl/autounit/utils/Permuter.java +++ b/src/nl/jssl/autounit/utils/Permuter.java @@ -4,22 +4,23 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; +/** + * Makes permutations of n lists of m elements, ie: + * + * [A,B], [1,2] => [A,1], [A,2], [B,1], [B,2] + */ public class Permuter { public static List permute(List> elements) { - if (elements.size() > 2) { - return permute(elements.get(0), elements.subList(1, elements.size() - 1)); - } else if (elements.size() == 2) { - return permutePairs(elements.get(0), elements.get(1)); - } else - throw new IllegalArgumentException("need at least 2"); - } + if (elements.size() >= 2) { + List result = permutePairs(elements.remove(0), elements.remove(0)); - private static List permute(List list, List> elements) { - if (elements.size() > 2) { - return permute(elements.get(0), elements.subList(1, elements.size() - 1)); + for (List element : elements) { + result = permutePairs(element, result); + } + return result; } else { - return permutePairs(elements.get(0), elements.get(1)); + throw new IllegalArgumentException("need at least 2"); } } @@ -60,11 +61,12 @@ public class Permuter { add(pair.element2, list); } } + @Override public String toString() { - String string=""; - for (Object o:this){ - string+=o.toString()+","; + String string = ""; + for (Object o : this) { + string += o.toString() + "-"; } return string; } diff --git a/tst/nl/jssl/autounit/util/PermuterTests.java b/tst/nl/jssl/autounit/util/PermuterTests.java index 2b68f43..6fb15cf 100644 --- a/tst/nl/jssl/autounit/util/PermuterTests.java +++ b/tst/nl/jssl/autounit/util/PermuterTests.java @@ -12,20 +12,63 @@ import org.junit.Test; public class PermuterTests { @Test - public void test(){ - List integers=new ArrayList<>(); + public void testPairs() { + List integers = new ArrayList<>(); integers.add(1); integers.add(2); - List strings=new ArrayList<>(); + List strings = new ArrayList<>(); strings.add("A"); strings.add("B"); - List> outer=new ArrayList<>(); + List> outer = new ArrayList<>(); outer.add(integers); outer.add(strings); List permuted = Permuter.permute(outer); - assertEquals("1,A,",permuted.get(0).toString()); - assertEquals("1,B,",permuted.get(1).toString()); - assertEquals("2,A,",permuted.get(2).toString()); - assertEquals("2,B,",permuted.get(3).toString()); + assertEquals("1-A-", permuted.get(0).toString()); + assertEquals("1-B-", permuted.get(1).toString()); + assertEquals("2-A-", permuted.get(2).toString()); + assertEquals("2-B-", permuted.get(3).toString()); + } + + @Test + public void testTriplets() { + List integers = new ArrayList<>(); + integers.add(1); + integers.add(2); + List strings = new ArrayList<>(); + strings.add("A"); + strings.add("B"); + List vogons = new ArrayList<>(); + vogons.add(new Vogon("Jeltz")); + vogons.add(new Vogon("Gummbah")); + + List> outer = new ArrayList<>(); + outer.add(integers); + outer.add(strings); + outer.add(vogons); + + List permuted = Permuter.permute(outer); + assertEquals("Vogon Jeltz-1-A-", permuted.get(0).toString()); + assertEquals("Vogon Jeltz-1-B-", permuted.get(1).toString()); + assertEquals("Vogon Jeltz-2-A-", permuted.get(2).toString()); + assertEquals("Vogon Jeltz-2-B-", permuted.get(3).toString()); + assertEquals("Vogon Gummbah-1-A-", permuted.get(4).toString()); + assertEquals("Vogon Gummbah-1-B-", permuted.get(5).toString()); + assertEquals("Vogon Gummbah-2-A-", permuted.get(6).toString()); + assertEquals("Vogon Gummbah-2-B-", permuted.get(7).toString()); + + } + + public class Vogon { + private String name; + + public Vogon(String name) { + super(); + this.name = name; + } + + @Override + public String toString() { + return "Vogon " + name; + } } }