1   /*
2    * Created on 25-Oct-2006
3    *
4    */
5   package com.tomgibara.pronto.state;
6   
7   import java.util.Arrays;
8   import java.util.HashSet;
9   import java.util.LinkedList;
10  import java.util.List;
11  import java.util.Set;
12  import java.util.regex.Matcher;
13  import java.util.regex.Pattern;
14  
15  import com.tomgibara.pronto.state.impl.StateTransitionImpl;
16  import com.tomgibara.pronto.util.Objects;
17  
18  public class TestUtil {
19  
20      private static Pattern pattern = Pattern.compile("([^-]*)(\\-\\>|\\-(\\d+)\\-\\>)([^-]*)");
21  
22      static StateGraph<String, Integer> makeGraph(String str) {
23          StateGraphEditor<String, Integer> editor = StateFactory.getInstance().<String, Integer> emptyStateGraph()
24                  .newEditor();
25          Set<Object> set = mixedSet(str);
26          for (Object object : set) {
27              if (object instanceof String) editor.addState((String) object);
28              else if (object instanceof StateTransition) editor.addTransition((StateTransition<String, Integer>) object);
29              else throw new IllegalArgumentException(Objects.toString(object));
30          }
31          return editor.getGraph();
32      }
33  
34      static StateTransition<String, Integer> transition(String str) {
35          Matcher matcher = pattern.matcher(str);
36          if (!matcher.matches()) throw new IllegalArgumentException(str);
37          final String from = matcher.group(1);
38          final Integer i = matcher.group(3) == null ? 0 : new Integer(matcher.group(3));
39          final String to = matcher.group(4);
40          return new StateTransitionImpl<String, Integer>(from, i, to);
41      }
42      
43      static Set<StateTransition<String, Integer>> transitionSet(String str) {
44          HashSet<StateTransition<String, Integer>> set = new HashSet<StateTransition<String, Integer>>();
45          if (str.length() > 0) {
46              String[] strings = str.split("\\s*;\\s*");
47              for (String string : strings) {
48                  set.add(transition(string));
49              }
50          }
51          return set;
52      }
53      
54      static Set<Object> mixedSet(String str) {
55          HashSet<Object> set = new HashSet<Object>();
56          if (str.length() > 0) {
57              String[] strings = str.split("\\s*;\\s*");
58              for (String string : strings) {
59                  Object object;
60                  try {
61                      object = transition(string);
62                  } catch (IllegalArgumentException e) {
63                      object = string;
64                  }
65                  set.add(object);
66              }
67          }
68          return set;
69      }
70      
71      static List<StateTransition<String, Integer>> transitionList(String str) {
72          LinkedList<StateTransition<String, Integer>> list = new LinkedList<StateTransition<String, Integer>>();
73          if (str.length() > 0) {
74              String[] strings = str.split("\\s*;\\s*");
75              for (String string : strings) {
76                  list.add(transition(string));
77              }
78          }
79          return list;
80      }
81      
82      static Set<String> stateSet(String str) {
83          String[] strings = str.split("\\s*;\\s*");
84          HashSet<String> set = new HashSet<String>();
85          set.addAll(Arrays.asList(strings));
86          return set;
87      }
88  
89      static Set<Integer> labelSet(String str) {
90          String[] strings = str.split("\\s*;\\s*");
91          HashSet<Integer> set = new HashSet<Integer>();
92          for (String string : strings)
93              set.add(new Integer(string));
94          return set;
95      }
96  
97      static StateEngine<String, Integer, Object> makeEngine(StateGraph<String, Integer> graph, StateActivator<String, Integer, Object> activator) {
98          return StateFactory.getInstance().<String, Integer, Object>newEngine(graph, activator);
99      }
100  
101 }