Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/tutorius/core.py
diff options
context:
space:
mode:
Diffstat (limited to 'tutorius/core.py')
-rw-r--r--tutorius/core.py61
1 files changed, 47 insertions, 14 deletions
diff --git a/tutorius/core.py b/tutorius/core.py
index 41089f1..ff592ad 100644
--- a/tutorius/core.py
+++ b/tutorius/core.py
@@ -261,8 +261,15 @@ class State(object):
def is_identical(self, otherState):
"""
- Compares two states and tells whether they contain the same states and
-
+ Compares two states and tells whether they contain the same states with the
+ same actions and event filters.
+
+ @param otherState The other State that we wish to match
+ @returns True if every action in this state has a matching action in the
+ other state with the same properties and values AND if every
+ event filters in this state has a matching filter in the
+ other state having the same properties and values AND if both
+ states have the same name.
` """
if not isinstance(otherState, State):
return False
@@ -272,27 +279,38 @@ class State(object):
# Do they have the same actions?
if len(self._actions) != len(otherState._actions):
return False
+
+ if len(self._event_filters) != len(otherState._event_filters):
+ return False
+
for act in self._actions:
found = False
+ # For each action in the other state, try to match it with this one.
for otherAct in otherState._actions:
if act.is_identical(otherAct):
found = True
break
if found == False:
+ # If we arrive here, then we could not find an action with the
+ # same values in the other state. We know they're not identical
return False
# Do they have the same event filters?
- if len(self._actions) != len(otherState._actions):
- return False
for event in self._event_filters:
found = False
+ # For every event filter in the other state, try to match it with
+ # the current filter. We just need to find one with the right
+ # properties and values.
for otherEvent in otherState._event_filters:
if event.is_identical(otherEvent):
found = True
break
- if found == False:
+ if found == False:
+ # We could not find the given event filter in the other state.
return False
+ # If nothing failed up to now, then every actions and every filters can
+ # be found in the other state
return True
class FiniteStateMachine(State):
@@ -568,20 +586,25 @@ class FiniteStateMachine(State):
Compares the elements of two FSM to ensure and returns true if they have the
same set of states, containing the same actions and the same event filters.
- @returns True if the two FSMs have the same content false otherwise
+ @returns True if the two FSMs have the same content, False otherwise
"""
if not isinstance(otherFSM, FiniteStateMachine):
return False
+ # Make sure they share the same name
if not (self.name == otherFSM.name) or \
not (self.start_state_name == otherFSM.start_state_name):
return False
-
+
+ # Ensure they have the same number of FSM-level actions
if len(self._actions) != len(otherFSM._actions):
return False
+
# Test that we have all the same FSM level actions
for act in self._actions:
found = False
+ # For every action in the other FSM, try to match it with the
+ # current one.
for otherAct in otherFSM._actions:
if act.is_identical(otherAct):
found = True
@@ -589,16 +612,26 @@ class FiniteStateMachine(State):
if found == False:
return False
+ # Make sure we have the same number of states in both FSMs
if len(self._states) != len(otherFSM._states):
return False
- for state in self._states.itervalues():
- found = False
- for otherState in otherFSM._states.itervalues():
- if state.is_identical(otherState):
- found = True
- break
- if found == False:
+ # For each state, try to find a corresponding state in the other FSM
+ for state_name in self._states.keys():
+ state = self._states[state_name]
+ other_state = None
+ try:
+ # Attempt to use this key in the other FSM. If it's not present
+ # the dictionary will throw an exception and we'll know we have
+ # at least one different state in the other FSM
+ other_state = otherFSM._states[state_name]
+ except:
+ return False
+ # If two states with the same name exist, then we want to make sure
+ # they are also identical
+ if not state.is_identical(other_state):
return False
+ # If we made it here, then all the states in this FSM could be matched to an
+ # identical state in the other FSM.
return True