package fj.test; import fj.data.List; import fj.function.Effect1; import org.junit.Test; import static fj.Ord.charOrd; import static fj.data.List.list; import static fj.data.List.range; import static fj.test.Gen.selectionOf; import static fj.test.Gen.combinationOf; import static fj.test.Gen.wordOf; import static fj.test.Gen.permutationOf; import static fj.test.Rand.standard; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; public final class GenTest { private static final List<Character> AS = list('A', 'B', 'C'); @Test public void testCombinationOf_none() { Gen<List<Character>> instance = combinationOf(0, AS); testPick(100, instance, actual -> { assertTrue(actual.isEmpty()); }); } @Test public void testCombinationOf_one() { Gen<List<Character>> instance = combinationOf(1, AS); testPick(100, instance, actual -> { assertEquals(1, actual.length()); assertTrue(AS.exists(a -> a.equals(actual.head()))); }); } @Test public void testCombinationOf_two() { Gen<List<Character>> instance = combinationOf(2, AS); testPick(100, instance, actual -> { assertEquals(2, actual.length()); assertTrue(actual.forall(actualA -> AS.exists(a -> a.equals(actualA)))); assertTrue(actual.tails().forall(l -> l.isEmpty() || l.tail().forall(a -> charOrd.isGreaterThan(a, l.head())))); }); } @Test public void testCombinationOf_three() { Gen<List<Character>> instance = combinationOf(3, AS); testPick(100, instance, actual -> { assertEquals(3, actual.length()); assertTrue(actual.forall(actualA -> AS.exists(a -> a.equals(actualA)))); assertTrue(actual.tails().forall(l -> l.isEmpty() || l.tail().forall(a -> charOrd.isGreaterThan(a, l.head())))); }); } @Test public void testSelectionOf_none() { Gen<List<Character>> instance = selectionOf(0, AS); testPick(100, instance, actual -> { assertTrue(actual.isEmpty()); }); } @Test public void testSelectionOf_one() { Gen<List<Character>> instance = selectionOf(1, AS); testPick(100, instance, actual -> { assertEquals(1, actual.length()); assertTrue(AS.exists(a -> a.equals(actual.head()))); }); } @Test public void testSelectionOf_two() { Gen<List<Character>> instance = selectionOf(2, AS); testPick(100, instance, actual -> { assertEquals(2, actual.length()); assertTrue(actual.forall(actualA -> AS.exists(a -> a.equals(actualA)))); assertTrue(actual.tails().forall(l -> l.isEmpty() || l.tail().forall(a -> !charOrd.isLessThan(a, l.head())))); }); } @Test public void testSelectionOf_three() { Gen<List<Character>> instance = selectionOf(3, AS); testPick(100, instance, actual -> { assertEquals(3, actual.length()); assertTrue(actual.forall(actualA -> AS.exists(a -> a.equals(actualA)))); assertTrue(actual.tails().forall(l -> l.isEmpty() || l.tail().forall(a -> !charOrd.isLessThan(a, l.head())))); }); } @Test public void testSelectionOf_four() { Gen<List<Character>> instance = selectionOf(4, AS); testPick(100, instance, actual -> { assertEquals(4, actual.length()); assertTrue(actual.forall(actualA -> AS.exists(a -> a.equals(actualA)))); assertTrue(actual.tails().forall(l -> l.isEmpty() || l.tail().forall(a -> !charOrd.isLessThan(a, l.head())))); }); } @Test public void testPermutationOf_none() { Gen<List<Character>> instance = permutationOf(0, AS); testPick(100, instance, actual -> { assertTrue(actual.isEmpty()); }); } @Test public void testPermutationOf_one() { Gen<List<Character>> instance = permutationOf(1, AS); testPick(100, instance, actual -> { assertEquals(1, actual.length()); assertTrue(AS.exists(a -> a.equals(actual.head()))); }); } @Test public void testPermutationOf_two() { Gen<List<Character>> instance = combinationOf(2, AS); testPick(100, instance, actual -> { assertEquals(2, actual.length()); assertTrue(actual.tails().forall(l -> l.isEmpty() || l.tail().forall(a -> !a.equals(l.head())))); }); } @Test public void testPermutationOf_three() { Gen<List<Character>> instance = permutationOf(3, AS); testPick(100, instance, actual -> { assertEquals(3, actual.length()); assertTrue(actual.forall(actualA -> AS.exists(a -> a.equals(actualA)))); assertTrue(actual.tails().forall(l -> l.isEmpty() || l.tail().forall(a -> !a.equals(l.head())))); }); } @Test public void testWordOf_none() { Gen<List<Character>> instance = wordOf(0, AS); testPick(100, instance, actual -> { assertTrue(actual.isEmpty()); }); } @Test public void testWordOf_one() { Gen<List<Character>> instance = wordOf(1, AS); testPick(100, instance, actual -> { assertEquals(1, actual.length()); assertTrue(AS.exists(a -> a.equals(actual.head()))); }); } @Test public void testWordOf_two() { Gen<List<Character>> instance = wordOf(2, AS); testPick(100, instance, actual -> { assertEquals(2, actual.length()); assertTrue(actual.forall(actualA -> AS.exists(a -> a.equals(actualA)))); }); } @Test public void testWordOf_three() { Gen<List<Character>> instance = wordOf(3, AS); testPick(100, instance, actual -> { assertEquals(3, actual.length()); assertTrue(actual.forall(actualA -> AS.exists(a -> a.equals(actualA)))); }); } @Test public void testWordOf_four() { Gen<List<Character>> instance = wordOf(4, AS); testPick(100, instance, actual -> { assertEquals(4, actual.length()); assertTrue(actual.forall(actualA -> AS.exists(a -> a.equals(actualA)))); }); } private static <A> void testPick(int n, Gen<List<A>> instance, Effect1<List<A>> test) { range(0, n).map(ignore -> instance.gen(0, standard)).foreachDoEffect(test::f); } }