Index: trunk/autoquest-core-usageprofiles-test/src/test/java/de/ugoe/cs/autoquest/usageprofiles/TrieTest.java
===================================================================
--- trunk/autoquest-core-usageprofiles-test/src/test/java/de/ugoe/cs/autoquest/usageprofiles/TrieTest.java	(revision 1110)
+++ trunk/autoquest-core-usageprofiles-test/src/test/java/de/ugoe/cs/autoquest/usageprofiles/TrieTest.java	(revision 1118)
@@ -261,4 +261,654 @@
 
                 ListAssert.assertEquals(expected, result);
+        }
+
+        @Test
+        public void testProcessWithTrieProcessor_1() throws Exception {
+                Trie<String> fixture = new Trie<String>();
+                fixture.train(sequence, 2);
+
+                final List<String> sequences = new ArrayList<String>();
+                TrieProcessor<String> processor = new TrieProcessor<String>() {
+                    @Override
+                    public TrieProcessor.Result process(List<String> sequence, int count) {
+                        sequences.add(count + "_" + sequence.toString());
+                        return TrieProcessor.Result.CONTINUE;
+                    }
+                    
+                };
+                
+                fixture.process(processor);
+                
+                List<String> expected = new ArrayList<String>();
+                
+                expected.add("5_[a]");
+                expected.add("2_[a, b]");
+                expected.add("2_[b]");
+                expected.add("2_[b, r]");
+                expected.add("2_[r]");
+                expected.add("2_[r, a]");
+                expected.add("1_[a, c]");
+                expected.add("1_[c]");
+                expected.add("1_[c, a]");
+                expected.add("1_[a, d]");
+                expected.add("1_[d]");
+                expected.add("1_[d, a]");
+                
+                assertEquals(expected.size(), sequences.size());
+                
+                for (String sequence : sequences) {
+                    ListAssert.assertContains(expected, sequence);
+                }
+        }
+
+        @Test
+        public void testProcessWithTrieProcessor_2() throws Exception {
+                Trie<String> fixture = new Trie<String>();
+                fixture.train(sequence, 3);
+
+                final List<String> sequences = new ArrayList<String>();
+                TrieProcessor<String> processor = new TrieProcessor<String>() {
+                    @Override
+                    public TrieProcessor.Result process(List<String> sequence, int count) {
+                        sequences.add(count + "_" + sequence.toString());
+                        return TrieProcessor.Result.CONTINUE;
+                    }
+                    
+                };
+                
+                fixture.process(processor);
+                
+                List<String> expected = new ArrayList<String>();
+                
+                expected.add("5_[a]");
+                expected.add("2_[a, b]");
+                expected.add("2_[a, b, r]");
+                expected.add("2_[b]");
+                expected.add("2_[b, r]");
+                expected.add("2_[b, r, a]");
+                expected.add("2_[r]");
+                expected.add("2_[r, a]");
+                expected.add("1_[r, a, c]");
+                expected.add("1_[a, c]");
+                expected.add("1_[a, c, a]");
+                expected.add("1_[c]");
+                expected.add("1_[c, a]");
+                expected.add("1_[c, a, d]");
+                expected.add("1_[a, d]");
+                expected.add("1_[a, d, a]");
+                expected.add("1_[d]");
+                expected.add("1_[d, a]");
+                expected.add("1_[d, a, b]");
+                
+                assertEquals(expected.size(), sequences.size());
+                
+                for (String sequence : sequences) {
+                    ListAssert.assertContains(expected, sequence);
+                }
+        }
+
+        @Test
+        public void testProcessWithTrieProcessor_3() throws Exception {
+                Trie<String> fixture = new Trie<String>();
+                fixture.train(sequence, 4);
+
+                final List<String> sequences = new ArrayList<String>();
+                TrieProcessor<String> processor = new TrieProcessor<String>() {
+                    @Override
+                    public TrieProcessor.Result process(List<String> sequence, int count) {
+                        sequences.add(count + "_" + sequence.toString());
+                        return TrieProcessor.Result.CONTINUE;
+                    }
+                    
+                };
+                
+                fixture.process(processor);
+                
+                List<String> expected = new ArrayList<String>();
+                
+                expected.add("5_[a]");
+                expected.add("2_[a, b]");
+                expected.add("2_[a, b, r]");
+                expected.add("2_[a, b, r, a]");
+                expected.add("2_[b]");
+                expected.add("2_[b, r]");
+                expected.add("2_[b, r, a]");
+                expected.add("1_[b, r, a, c]");
+                expected.add("2_[r]");
+                expected.add("2_[r, a]");
+                expected.add("1_[r, a, c]");
+                expected.add("1_[r, a, c, a]");
+                expected.add("1_[a, c]");
+                expected.add("1_[a, c, a]");
+                expected.add("1_[a, c, a, d]");
+                expected.add("1_[c]");
+                expected.add("1_[c, a]");
+                expected.add("1_[c, a, d]");
+                expected.add("1_[c, a, d, a]");
+                expected.add("1_[a, d]");
+                expected.add("1_[a, d, a]");
+                expected.add("1_[a, d, a, b]");
+                expected.add("1_[d]");
+                expected.add("1_[d, a]");
+                expected.add("1_[d, a, b]");
+                expected.add("1_[d, a, b, r]");
+                
+                assertEquals(expected.size(), sequences.size());
+                
+                for (String sequence : sequences) {
+                    ListAssert.assertContains(expected, sequence);
+                }
+        }
+
+        @Test
+        public void testProcessWithTrieProcessor_4() throws Exception {
+                Trie<String> fixture = new Trie<String>();
+                fixture.train(sequence, 5);
+
+                final List<String> sequences = new ArrayList<String>();
+                TrieProcessor<String> processor = new TrieProcessor<String>() {
+                    @Override
+                    public TrieProcessor.Result process(List<String> sequence, int count) {
+                        sequences.add(count + "_" + sequence.toString());
+                        return TrieProcessor.Result.CONTINUE;
+                    }
+                    
+                };
+                
+                fixture.process(processor);
+                
+                List<String> expected = new ArrayList<String>();
+                
+                expected.add("5_[a]");
+                expected.add("2_[a, b]");
+                expected.add("2_[a, b, r]");
+                expected.add("2_[a, b, r, a]");
+                expected.add("1_[a, b, r, a, c]");
+                expected.add("2_[b]");
+                expected.add("2_[b, r]");
+                expected.add("2_[b, r, a]");
+                expected.add("1_[b, r, a, c]");
+                expected.add("1_[b, r, a, c, a]");
+                expected.add("2_[r]");
+                expected.add("2_[r, a]");
+                expected.add("1_[r, a, c]");
+                expected.add("1_[r, a, c, a]");
+                expected.add("1_[r, a, c, a, d]");
+                expected.add("1_[a, c]");
+                expected.add("1_[a, c, a]");
+                expected.add("1_[a, c, a, d]");
+                expected.add("1_[a, c, a, d, a]");
+                expected.add("1_[c]");
+                expected.add("1_[c, a]");
+                expected.add("1_[c, a, d]");
+                expected.add("1_[c, a, d, a]");
+                expected.add("1_[c, a, d, a, b]");
+                expected.add("1_[a, d]");
+                expected.add("1_[a, d, a]");
+                expected.add("1_[a, d, a, b]");
+                expected.add("1_[a, d, a, b, r]");
+                expected.add("1_[d]");
+                expected.add("1_[d, a]");
+                expected.add("1_[d, a, b]");
+                expected.add("1_[d, a, b, r]");
+                expected.add("1_[d, a, b, r, a]");
+                
+                assertEquals(expected.size(), sequences.size());
+                
+                for (String sequence : sequences) {
+                    ListAssert.assertContains(expected, sequence);
+                }
+        }
+
+        @Test
+        public void testProcessWithTrieProcessor_5() throws Exception {
+                Trie<String> fixture = new Trie<String>();
+                fixture.train(sequence, 6);
+
+                final List<String> sequences = new ArrayList<String>();
+                TrieProcessor<String> processor = new TrieProcessor<String>() {
+                    @Override
+                    public TrieProcessor.Result process(List<String> sequence, int count) {
+                        sequences.add(count + "_" + sequence.toString());
+                        return TrieProcessor.Result.CONTINUE;
+                    }
+                    
+                };
+                
+                fixture.process(processor);
+                
+                List<String> expected = new ArrayList<String>();
+                
+                expected.add("5_[a]");
+                expected.add("2_[a, b]");
+                expected.add("2_[a, b, r]");
+                expected.add("2_[a, b, r, a]");
+                expected.add("1_[a, b, r, a, c]");
+                expected.add("1_[a, b, r, a, c, a]");
+                expected.add("2_[b]");
+                expected.add("2_[b, r]");
+                expected.add("2_[b, r, a]");
+                expected.add("1_[b, r, a, c]");
+                expected.add("1_[b, r, a, c, a]");
+                expected.add("1_[b, r, a, c, a, d]");
+                expected.add("2_[r]");
+                expected.add("2_[r, a]");
+                expected.add("1_[r, a, c]");
+                expected.add("1_[r, a, c, a]");
+                expected.add("1_[r, a, c, a, d]");
+                expected.add("1_[r, a, c, a, d, a]");
+                expected.add("1_[a, c]");
+                expected.add("1_[a, c, a]");
+                expected.add("1_[a, c, a, d]");
+                expected.add("1_[a, c, a, d, a]");
+                expected.add("1_[a, c, a, d, a, b]");
+                expected.add("1_[c]");
+                expected.add("1_[c, a]");
+                expected.add("1_[c, a, d]");
+                expected.add("1_[c, a, d, a]");
+                expected.add("1_[c, a, d, a, b]");
+                expected.add("1_[c, a, d, a, b, r]");
+                expected.add("1_[a, d]");
+                expected.add("1_[a, d, a]");
+                expected.add("1_[a, d, a, b]");
+                expected.add("1_[a, d, a, b, r]");
+                expected.add("1_[a, d, a, b, r, a]");
+                expected.add("1_[d]");
+                expected.add("1_[d, a]");
+                expected.add("1_[d, a, b]");
+                expected.add("1_[d, a, b, r]");
+                expected.add("1_[d, a, b, r, a]");
+                
+                assertEquals(expected.size(), sequences.size());
+                
+                for (String sequence : sequences) {
+                    ListAssert.assertContains(expected, sequence);
+                }
+        }
+
+        @Test
+        public void testProcessWithTrieProcessor_6() throws Exception {
+                Trie<String> fixture = new Trie<String>();
+                fixture.train(sequence, 7);
+
+                final List<String> sequences = new ArrayList<String>();
+                TrieProcessor<String> processor = new TrieProcessor<String>() {
+                    @Override
+                    public TrieProcessor.Result process(List<String> sequence, int count) {
+                        sequences.add(count + "_" + sequence.toString());
+                        return TrieProcessor.Result.CONTINUE;
+                    }
+                    
+                };
+                
+                fixture.process(processor);
+                
+                List<String> expected = new ArrayList<String>();
+                
+                expected.add("5_[a]");
+                expected.add("2_[a, b]");
+                expected.add("2_[a, b, r]");
+                expected.add("2_[a, b, r, a]");
+                expected.add("1_[a, b, r, a, c]");
+                expected.add("1_[a, b, r, a, c, a]");
+                expected.add("1_[a, b, r, a, c, a, d]");
+                expected.add("2_[b]");
+                expected.add("2_[b, r]");
+                expected.add("2_[b, r, a]");
+                expected.add("1_[b, r, a, c]");
+                expected.add("1_[b, r, a, c, a]");
+                expected.add("1_[b, r, a, c, a, d]");
+                expected.add("1_[b, r, a, c, a, d, a]");
+                expected.add("2_[r]");
+                expected.add("2_[r, a]");
+                expected.add("1_[r, a, c]");
+                expected.add("1_[r, a, c, a]");
+                expected.add("1_[r, a, c, a, d]");
+                expected.add("1_[r, a, c, a, d, a]");
+                expected.add("1_[r, a, c, a, d, a, b]");
+                expected.add("1_[a, c]");
+                expected.add("1_[a, c, a]");
+                expected.add("1_[a, c, a, d]");
+                expected.add("1_[a, c, a, d, a]");
+                expected.add("1_[a, c, a, d, a, b]");
+                expected.add("1_[a, c, a, d, a, b, r]");
+                expected.add("1_[c]");
+                expected.add("1_[c, a]");
+                expected.add("1_[c, a, d]");
+                expected.add("1_[c, a, d, a]");
+                expected.add("1_[c, a, d, a, b]");
+                expected.add("1_[c, a, d, a, b, r]");
+                expected.add("1_[c, a, d, a, b, r, a]");
+                expected.add("1_[a, d]");
+                expected.add("1_[a, d, a]");
+                expected.add("1_[a, d, a, b]");
+                expected.add("1_[a, d, a, b, r]");
+                expected.add("1_[a, d, a, b, r, a]");
+                expected.add("1_[d]");
+                expected.add("1_[d, a]");
+                expected.add("1_[d, a, b]");
+                expected.add("1_[d, a, b, r]");
+                expected.add("1_[d, a, b, r, a]");
+                
+                assertEquals(expected.size(), sequences.size());
+                
+                for (String sequence : sequences) {
+                    ListAssert.assertContains(expected, sequence);
+                }
+        }
+
+        @Test
+        public void testProcessWithTrieProcessor_7() throws Exception {
+                Trie<String> fixture = new Trie<String>();
+                fixture.train(sequence, 8);
+
+                final List<String> sequences = new ArrayList<String>();
+                TrieProcessor<String> processor = new TrieProcessor<String>() {
+                    @Override
+                    public TrieProcessor.Result process(List<String> sequence, int count) {
+                        sequences.add(count + "_" + sequence.toString());
+                        return TrieProcessor.Result.CONTINUE;
+                    }
+                    
+                };
+                
+                fixture.process(processor);
+                
+                List<String> expected = new ArrayList<String>();
+                
+                expected.add("5_[a]");
+                expected.add("2_[a, b]");
+                expected.add("2_[a, b, r]");
+                expected.add("2_[a, b, r, a]");
+                expected.add("1_[a, b, r, a, c]");
+                expected.add("1_[a, b, r, a, c, a]");
+                expected.add("1_[a, b, r, a, c, a, d]");
+                expected.add("1_[a, b, r, a, c, a, d, a]");
+                expected.add("2_[b]");
+                expected.add("2_[b, r]");
+                expected.add("2_[b, r, a]");
+                expected.add("1_[b, r, a, c]");
+                expected.add("1_[b, r, a, c, a]");
+                expected.add("1_[b, r, a, c, a, d]");
+                expected.add("1_[b, r, a, c, a, d, a]");
+                expected.add("1_[b, r, a, c, a, d, a, b]");
+                expected.add("2_[r]");
+                expected.add("2_[r, a]");
+                expected.add("1_[r, a, c]");
+                expected.add("1_[r, a, c, a]");
+                expected.add("1_[r, a, c, a, d]");
+                expected.add("1_[r, a, c, a, d, a]");
+                expected.add("1_[r, a, c, a, d, a, b]");
+                expected.add("1_[r, a, c, a, d, a, b, r]");
+                expected.add("1_[a, c]");
+                expected.add("1_[a, c, a]");
+                expected.add("1_[a, c, a, d]");
+                expected.add("1_[a, c, a, d, a]");
+                expected.add("1_[a, c, a, d, a, b]");
+                expected.add("1_[a, c, a, d, a, b, r]");
+                expected.add("1_[a, c, a, d, a, b, r, a]");
+                expected.add("1_[c]");
+                expected.add("1_[c, a]");
+                expected.add("1_[c, a, d]");
+                expected.add("1_[c, a, d, a]");
+                expected.add("1_[c, a, d, a, b]");
+                expected.add("1_[c, a, d, a, b, r]");
+                expected.add("1_[c, a, d, a, b, r, a]");
+                expected.add("1_[a, d]");
+                expected.add("1_[a, d, a]");
+                expected.add("1_[a, d, a, b]");
+                expected.add("1_[a, d, a, b, r]");
+                expected.add("1_[a, d, a, b, r, a]");
+                expected.add("1_[d]");
+                expected.add("1_[d, a]");
+                expected.add("1_[d, a, b]");
+                expected.add("1_[d, a, b, r]");
+                expected.add("1_[d, a, b, r, a]");
+                
+                assertEquals(expected.size(), sequences.size());
+                
+                for (String sequence : sequences) {
+                    ListAssert.assertContains(expected, sequence);
+                }
+        }
+
+        @Test
+        public void testProcessWithTrieProcessor_8() throws Exception {
+                Trie<String> fixture = new Trie<String>();
+                fixture.train(sequence, 9);
+
+                final List<String> sequences = new ArrayList<String>();
+                TrieProcessor<String> processor = new TrieProcessor<String>() {
+                    @Override
+                    public TrieProcessor.Result process(List<String> sequence, int count) {
+                        sequences.add(count + "_" + sequence.toString());
+                        return TrieProcessor.Result.CONTINUE;
+                    }
+                    
+                };
+                
+                fixture.process(processor);
+                
+                List<String> expected = new ArrayList<String>();
+                
+                expected.add("5_[a]");
+                expected.add("2_[a, b]");
+                expected.add("2_[a, b, r]");
+                expected.add("2_[a, b, r, a]");
+                expected.add("1_[a, b, r, a, c]");
+                expected.add("1_[a, b, r, a, c, a]");
+                expected.add("1_[a, b, r, a, c, a, d]");
+                expected.add("1_[a, b, r, a, c, a, d, a]");
+                expected.add("1_[a, b, r, a, c, a, d, a, b]");
+                expected.add("2_[b]");
+                expected.add("2_[b, r]");
+                expected.add("2_[b, r, a]");
+                expected.add("1_[b, r, a, c]");
+                expected.add("1_[b, r, a, c, a]");
+                expected.add("1_[b, r, a, c, a, d]");
+                expected.add("1_[b, r, a, c, a, d, a]");
+                expected.add("1_[b, r, a, c, a, d, a, b]");
+                expected.add("1_[b, r, a, c, a, d, a, b, r]");
+                expected.add("2_[r]");
+                expected.add("2_[r, a]");
+                expected.add("1_[r, a, c]");
+                expected.add("1_[r, a, c, a]");
+                expected.add("1_[r, a, c, a, d]");
+                expected.add("1_[r, a, c, a, d, a]");
+                expected.add("1_[r, a, c, a, d, a, b]");
+                expected.add("1_[r, a, c, a, d, a, b, r]");
+                expected.add("1_[r, a, c, a, d, a, b, r, a]");
+                expected.add("1_[a, c]");
+                expected.add("1_[a, c, a]");
+                expected.add("1_[a, c, a, d]");
+                expected.add("1_[a, c, a, d, a]");
+                expected.add("1_[a, c, a, d, a, b]");
+                expected.add("1_[a, c, a, d, a, b, r]");
+                expected.add("1_[a, c, a, d, a, b, r, a]");
+                expected.add("1_[c]");
+                expected.add("1_[c, a]");
+                expected.add("1_[c, a, d]");
+                expected.add("1_[c, a, d, a]");
+                expected.add("1_[c, a, d, a, b]");
+                expected.add("1_[c, a, d, a, b, r]");
+                expected.add("1_[c, a, d, a, b, r, a]");
+                expected.add("1_[a, d]");
+                expected.add("1_[a, d, a]");
+                expected.add("1_[a, d, a, b]");
+                expected.add("1_[a, d, a, b, r]");
+                expected.add("1_[a, d, a, b, r, a]");
+                expected.add("1_[d]");
+                expected.add("1_[d, a]");
+                expected.add("1_[d, a, b]");
+                expected.add("1_[d, a, b, r]");
+                expected.add("1_[d, a, b, r, a]");
+                
+                assertEquals(expected.size(), sequences.size());
+                
+                for (String sequence : sequences) {
+                    ListAssert.assertContains(expected, sequence);
+                }
+        }
+
+        @Test
+        public void testProcessWithTrieProcessor_9() throws Exception {
+                Trie<String> fixture = new Trie<String>();
+                fixture.train(sequence, 10);
+
+                final List<String> sequences = new ArrayList<String>();
+                TrieProcessor<String> processor = new TrieProcessor<String>() {
+                    @Override
+                    public TrieProcessor.Result process(List<String> sequence, int count) {
+                        sequences.add(count + "_" + sequence.toString());
+                        return TrieProcessor.Result.CONTINUE;
+                    }
+                    
+                };
+                
+                fixture.process(processor);
+                
+                List<String> expected = new ArrayList<String>();
+                
+                expected.add("5_[a]");
+                expected.add("2_[a, b]");
+                expected.add("2_[a, b, r]");
+                expected.add("2_[a, b, r, a]");
+                expected.add("1_[a, b, r, a, c]");
+                expected.add("1_[a, b, r, a, c, a]");
+                expected.add("1_[a, b, r, a, c, a, d]");
+                expected.add("1_[a, b, r, a, c, a, d, a]");
+                expected.add("1_[a, b, r, a, c, a, d, a, b]");
+                expected.add("1_[a, b, r, a, c, a, d, a, b, r]");
+                expected.add("2_[b]");
+                expected.add("2_[b, r]");
+                expected.add("2_[b, r, a]");
+                expected.add("1_[b, r, a, c]");
+                expected.add("1_[b, r, a, c, a]");
+                expected.add("1_[b, r, a, c, a, d]");
+                expected.add("1_[b, r, a, c, a, d, a]");
+                expected.add("1_[b, r, a, c, a, d, a, b]");
+                expected.add("1_[b, r, a, c, a, d, a, b, r]");
+                expected.add("1_[b, r, a, c, a, d, a, b, r, a]");
+                expected.add("2_[r]");
+                expected.add("2_[r, a]");
+                expected.add("1_[r, a, c]");
+                expected.add("1_[r, a, c, a]");
+                expected.add("1_[r, a, c, a, d]");
+                expected.add("1_[r, a, c, a, d, a]");
+                expected.add("1_[r, a, c, a, d, a, b]");
+                expected.add("1_[r, a, c, a, d, a, b, r]");
+                expected.add("1_[r, a, c, a, d, a, b, r, a]");
+                expected.add("1_[a, c]");
+                expected.add("1_[a, c, a]");
+                expected.add("1_[a, c, a, d]");
+                expected.add("1_[a, c, a, d, a]");
+                expected.add("1_[a, c, a, d, a, b]");
+                expected.add("1_[a, c, a, d, a, b, r]");
+                expected.add("1_[a, c, a, d, a, b, r, a]");
+                expected.add("1_[c]");
+                expected.add("1_[c, a]");
+                expected.add("1_[c, a, d]");
+                expected.add("1_[c, a, d, a]");
+                expected.add("1_[c, a, d, a, b]");
+                expected.add("1_[c, a, d, a, b, r]");
+                expected.add("1_[c, a, d, a, b, r, a]");
+                expected.add("1_[a, d]");
+                expected.add("1_[a, d, a]");
+                expected.add("1_[a, d, a, b]");
+                expected.add("1_[a, d, a, b, r]");
+                expected.add("1_[a, d, a, b, r, a]");
+                expected.add("1_[d]");
+                expected.add("1_[d, a]");
+                expected.add("1_[d, a, b]");
+                expected.add("1_[d, a, b, r]");
+                expected.add("1_[d, a, b, r, a]");
+                
+                assertEquals(expected.size(), sequences.size());
+                
+                for (String sequence : sequences) {
+                    ListAssert.assertContains(expected, sequence);
+                }
+        }
+
+
+        @Test
+        public void testProcessWithTrieProcessor_10() throws Exception {
+                Trie<String> fixture = new Trie<String>();
+                fixture.train(sequence, 11);
+
+                final List<String> sequences = new ArrayList<String>();
+                TrieProcessor<String> processor = new TrieProcessor<String>() {
+                    @Override
+                    public TrieProcessor.Result process(List<String> sequence, int count) {
+                        sequences.add(count + "_" + sequence.toString());
+                        return TrieProcessor.Result.CONTINUE;
+                    }
+                    
+                };
+                
+                fixture.process(processor);
+                
+                List<String> expected = new ArrayList<String>();
+                
+                expected.add("5_[a]");
+                expected.add("2_[a, b]");
+                expected.add("2_[a, b, r]");
+                expected.add("2_[a, b, r, a]");
+                expected.add("1_[a, b, r, a, c]");
+                expected.add("1_[a, b, r, a, c, a]");
+                expected.add("1_[a, b, r, a, c, a, d]");
+                expected.add("1_[a, b, r, a, c, a, d, a]");
+                expected.add("1_[a, b, r, a, c, a, d, a, b]");
+                expected.add("1_[a, b, r, a, c, a, d, a, b, r]");
+                expected.add("1_[a, b, r, a, c, a, d, a, b, r, a]");
+                expected.add("2_[b]");
+                expected.add("2_[b, r]");
+                expected.add("2_[b, r, a]");
+                expected.add("1_[b, r, a, c]");
+                expected.add("1_[b, r, a, c, a]");
+                expected.add("1_[b, r, a, c, a, d]");
+                expected.add("1_[b, r, a, c, a, d, a]");
+                expected.add("1_[b, r, a, c, a, d, a, b]");
+                expected.add("1_[b, r, a, c, a, d, a, b, r]");
+                expected.add("1_[b, r, a, c, a, d, a, b, r, a]");
+                expected.add("2_[r]");
+                expected.add("2_[r, a]");
+                expected.add("1_[r, a, c]");
+                expected.add("1_[r, a, c, a]");
+                expected.add("1_[r, a, c, a, d]");
+                expected.add("1_[r, a, c, a, d, a]");
+                expected.add("1_[r, a, c, a, d, a, b]");
+                expected.add("1_[r, a, c, a, d, a, b, r]");
+                expected.add("1_[r, a, c, a, d, a, b, r, a]");
+                expected.add("1_[a, c]");
+                expected.add("1_[a, c, a]");
+                expected.add("1_[a, c, a, d]");
+                expected.add("1_[a, c, a, d, a]");
+                expected.add("1_[a, c, a, d, a, b]");
+                expected.add("1_[a, c, a, d, a, b, r]");
+                expected.add("1_[a, c, a, d, a, b, r, a]");
+                expected.add("1_[c]");
+                expected.add("1_[c, a]");
+                expected.add("1_[c, a, d]");
+                expected.add("1_[c, a, d, a]");
+                expected.add("1_[c, a, d, a, b]");
+                expected.add("1_[c, a, d, a, b, r]");
+                expected.add("1_[c, a, d, a, b, r, a]");
+                expected.add("1_[a, d]");
+                expected.add("1_[a, d, a]");
+                expected.add("1_[a, d, a, b]");
+                expected.add("1_[a, d, a, b, r]");
+                expected.add("1_[a, d, a, b, r, a]");
+                expected.add("1_[d]");
+                expected.add("1_[d, a]");
+                expected.add("1_[d, a, b]");
+                expected.add("1_[d, a, b, r]");
+                expected.add("1_[d, a, b, r, a]");
+                
+                assertEquals(expected.size(), sequences.size());
+                
+                for (String sequence : sequences) {
+                    ListAssert.assertContains(expected, sequence);
+                }
         }
 
