diff options
-rw-r--r-- | Workshop.activity/WorkshopModel.py | 12 | ||||
-rw-r--r-- | addons/triggereventfilter.py | 4 | ||||
-rw-r--r-- | tests/coretests.py | 51 | ||||
-rw-r--r-- | tests/filterstests.py | 20 | ||||
-rw-r--r-- | tests/linear_creatortests.py | 8 | ||||
-rw-r--r-- | tutorius/core.py | 23 |
6 files changed, 57 insertions, 61 deletions
diff --git a/Workshop.activity/WorkshopModel.py b/Workshop.activity/WorkshopModel.py index cc066ba..ebc5579 100644 --- a/Workshop.activity/WorkshopModel.py +++ b/Workshop.activity/WorkshopModel.py @@ -4,7 +4,7 @@ WorkshopModel This module is the model of the Workshop Activity """ -#import sugar.tutorius.vault +from sugar.tutorius.vault import * class WorkshopModel(): def __init__(self,view): @@ -25,8 +25,8 @@ class WorkshopModel(): ## t6 = Tutorial({'name':'tuto 6',"description":"This is the description oh the last","rating":1}) ## t7 = Tutorial({'name':'tuto 7',"description":"This is the description oh the last","rating":1}) ## tutorial_list = [t1,t2,t3,t4,t5,t6,t7] - - vault_return = vault.query({},{},{}) + + vault_return = Vault.query() tutorial_list = [] for tuto in vault_return: tutorial_list.append(Tutorial(tuto)) @@ -95,15 +95,15 @@ class Tutorial(): if 'rating' in self.__original_dict: self.__rating = self.__original_dict['rating'] else: - self.__rating = None + self.__rating = 0 if 'publish_state' in self.__original_dict: - self.__published_state = original_dict['publish_state'] + self.__published_state = self.__original_dict['publish_state'] else: self.__published_state = None if 'guid' in self.__original_dict: - self.__id = original_state['guid'] + self.__id = self.__original_dict['guid'] else: self.__id = None diff --git a/addons/triggereventfilter.py b/addons/triggereventfilter.py index 06c0995..acc0d0d 100644 --- a/addons/triggereventfilter.py +++ b/addons/triggereventfilter.py @@ -23,8 +23,8 @@ class TriggerEventFilter(EventFilter): Used to fake events and see the effect on the FSM. """ - def __init__(self, next_state): - EventFilter.__init__(self, next_state) + def __init__(self): + EventFilter.__init__(self) self.toggle_on_callback = False def install_handlers(self, callback, **kwargs): diff --git a/tests/coretests.py b/tests/coretests.py index 4f564c8..b2f68e5 100644 --- a/tests/coretests.py +++ b/tests/coretests.py @@ -130,9 +130,9 @@ class StateTest(unittest.TestCase): Tests the fact that the event filters are correctly installed on setup and uninstalled on teardown. """ - event_filter = addon.create('TriggerEventFilter', "second_state") + event_filter = addon.create('TriggerEventFilter') - state = State("event_test", event_filter_list=[event_filter]) + state = State("event_test", event_filter_list=[(event_filter, "next_state")]) state.set_tutorial(SimpleTutorial()) assert event_filter.toggle_on_callback == False, "Wrong init of event_filter" @@ -198,17 +198,20 @@ class StateTest(unittest.TestCase): def test_add_event_filter(self): state = State("INIT") - event1 = addon.create('TriggerEventFilter', "s") - event2 = addon.create('TriggerEventFilter', "t") - event3 = addon.create('TriggerEventFilter', "r") + event1 = addon.create('TriggerEventFilter') + # MJM : 2009-10-21 : Commenting the below as per new FSM standard, a state cannot + # have more than one event filter with the same properties (no identical + # properties containers) + #event2 = addon.create('TriggerEventFilter') + #event3 = addon.create('TriggerEventFilter') # Insert the event filters - assert state.add_event_filter(event1), "Could not add event filter 1" - assert state.add_event_filter(event2), "Could not add event filter 2" - assert state.add_event_filter(event3), "Could not add event filter 3" + assert state.add_event_filter(event1, 's'), "Could not add event filter 1" + #assert state.add_event_filter(event2, 't'), "Could not add event filter 2" + #assert state.add_event_filter(event3, 'r'), "Could not add event filter 3" # Make sure we cannot insert an event twice - assert state.add_event_filter(event1) == False, "Could add twice the event filter" + assert state.add_event_filter(event1, 's') == False, "Could add twice the event filter" # Get the list of event filters event_filters = state.get_event_filter_list() @@ -243,19 +246,19 @@ class StateTest(unittest.TestCase): act1 = addon.create("BubbleMessage", message="Hi", position=[132,450]) act2 = addon.create("BubbleMessage", message="Hi", position=[132,450]) - event1 = addon.create("GtkWidgetEventFilter", "nextState", "0.0.0.1.1.2.3.1", "clicked") + event1 = addon.create("GtkWidgetEventFilter", "0.0.0.1.1.2.3.1", "clicked") act3 = addon.create("DialogMessage", message="Hello again.", position=[200, 400]) # Build the first state st1.add_action(act1) st1.add_action(act3) - st1.add_event_filter(event1) + st1.add_event_filter(event1, 'nextState') # Build the second state st2.add_action(act2) st2.add_action(act3) - st2.add_event_filter(event1) + st2.add_event_filter(event1, 'nextState') # Make sure that they are identical for now assert st1 == st2, "States should be considered as identical" @@ -282,14 +285,14 @@ class StateTest(unittest.TestCase): assert not (st1 == st3), "States having a different number of actions should be different" st4 = copy.deepcopy(st1) - st4.add_event_filter(addon.create("GtkWidgetEventFilter", "next_state", "0.0.1.1.2.2.3", "clicked")) + st4.add_event_filter(addon.create("GtkWidgetEventFilter", "0.0.1.1.2.2.3", "clicked"), "next_state") assert not (st1 == st4), "States having a different number of events should be different" st5 = copy.deepcopy(st1) - st5._event_filters = [] + st5.clear_event_filters() - st5.add_event_filter(addon.create("GtkWidgetEventFilter", "other_state", "0.1.2.3.4.1.2", "pressed")) + st5.add_event_filter(addon.create("GtkWidgetEventFilter", "0.1.2.3.4.1.2", "pressed"), "other_state") #import rpdb2; rpdb2.start_embedded_debugger('pass') assert not (st1 == st5), "States having the same number of event filters" \ @@ -305,10 +308,10 @@ class FSMTest(unittest.TestCase): act_init = TrueWhileActiveAction() act_second = TrueWhileActiveAction() - event_init = FakeEventFilter("SECOND") + event_init = FakeEventFilter() content = { - "INIT": State("INIT", action_list=[act_init],event_filter_list=[event_init]), + "INIT": State("INIT", action_list=[act_init],event_filter_list=[(event_init, "SECOND")]), "SECOND": State("SECOND", action_list=[act_second]) } @@ -399,9 +402,9 @@ class FSMTest(unittest.TestCase): This test removes a state from the FSM. It also verifies that the links from other states going into the removed state are gone. """ - st1 = State("INIT", event_filter_list=[addon.create('TriggerEventFilter', "second")]) - st2 = State("second", event_filter_list=[addon.create('TriggerEventFilter', "third")]) - st3 = State("third", event_filter_list=[addon.create('TriggerEventFilter', "second")]) + st1 = State("INIT", event_filter_list=[(addon.create('TriggerEventFilter'), "second")]) + st2 = State("second", event_filter_list=[(addon.create('TriggerEventFilter'), "third")]) + st3 = State("third", event_filter_list=[(addon.create('TriggerEventFilter'), "second")]) fsm = FiniteStateMachine("StateRemovalTest") @@ -582,13 +585,13 @@ class FSMExplorationTests(unittest.TestCase): """ st1 = State("INIT") st1.add_action(CountAction()) - st1.add_event_filter(addon.create('TriggerEventFilter', "Second")) - st1.add_event_filter(addon.create('TriggerEventFilter', "Third")) + st1.add_event_filter(addon.create('TriggerEventFilter'), "Second") + st1.add_event_filter(addon.create('TriggerEventFilter'), "Third") st2 = State("Second") st2.add_action(TrueWhileActiveAction()) - st2.add_event_filter(addon.create('TriggerEventFilter', "Third")) - st2.add_event_filter(addon.create('TriggerEventFilter', "Fourth")) + st2.add_event_filter(addon.create('TriggerEventFilter'), "Third") + st2.add_event_filter(addon.create('TriggerEventFilter'), "Fourth") st3 = State("Third") st3.add_action(CountAction()) diff --git a/tests/filterstests.py b/tests/filterstests.py index c45f924..ee6033b 100644 --- a/tests/filterstests.py +++ b/tests/filterstests.py @@ -32,20 +32,10 @@ from gtkutilstests import SignalCatcher class BaseEventFilterTests(unittest.TestCase): """Test the behavior of the Base EventFilter class""" - def test_properties(self): - """Test EventFilter properties""" - e = EventFilter("NEXTSTATE") - - assert e.next_state == "NEXTSTATE", "next_state should have value used in constructor" - - e.next_state = "NEWSTATE" - - assert e.next_state == "NEWSTATE", "next_state should have been changed by setter" - def test_callback(self): """Test the callback mechanism""" - e = EventFilter("Next") + e = EventFilter() s = SignalCatcher() #Trigger the do_callback, shouldn't do anything @@ -79,7 +69,7 @@ class TestTimerEvent(unittest.TestCase): ctx = gobject.MainContext() main = gobject.MainLoop(ctx) - e = addon.create('TimerEvent', "Next", 2) # 2 seconds should be enough :s + e = addon.create('TimerEvent', 2) # 2 seconds should be enough :s s = SignalCatcher() e.install_handlers(s.callback) @@ -122,7 +112,7 @@ class TestTimerEvent(unittest.TestCase): ctx = gobject.MainContext() main = gobject.MainLoop(ctx) - e = addon.create('TimerEvent', "Next", 2) # 2 seconds should be enough :s + e = addon.create('TimerEvent', 2) # 2 seconds should be enough :s s = SignalCatcher() e.install_handlers(s.callback) @@ -169,7 +159,7 @@ class TestGtkWidgetEventFilter(unittest.TestCase): self.top.add(self.btn1) def test_install(self): - h = addon.create('GtkWidgetEventFilter', "Next","0","whatever") + h = addon.create('GtkWidgetEventFilter', "0","whatever") try: h.install_handlers(None) @@ -178,7 +168,7 @@ class TestGtkWidgetEventFilter(unittest.TestCase): assert True, "Install should have failed" def test_button_clicks(self): - h = addon.create('GtkWidgetEventFilter', "Next","0.0","clicked") + h = addon.create('GtkWidgetEventFilter', "0.0","clicked") s = SignalCatcher() h.install_handlers(s.callback, activity=self.top) diff --git a/tests/linear_creatortests.py b/tests/linear_creatortests.py index 999f4d5..8b13656 100644 --- a/tests/linear_creatortests.py +++ b/tests/linear_creatortests.py @@ -35,11 +35,11 @@ class CreatorTests(unittest.TestCase): creator.action(CountAction()) creator.action(CountAction()) - creator.event(TriggerEventFilter("Not important")) + creator.event(TriggerEventFilter()) creator.action(CountAction()) - creator.event(TriggerEventFilter("Not good either...")) + creator.event(TriggerEventFilter()) fsm = creator.generate_fsm() @@ -50,13 +50,13 @@ class CreatorTests(unittest.TestCase): assert len(init_state.get_action_list()) == 2, "Creator did not insert all the actions" - assert init_state.get_event_filter_list()[0].get_next_state() == "State 1" , "expected next state to be 'State 1' but got %s" % init_state.get_event_filter_list()[0].get_next_state() + assert init_state.get_event_filter_list()[0][1] == "State 1" , "expected next state to be 'State 1' but got %s" % init_state.get_event_filter_list()[0].get_next_state() state1 = fsm.get_state_by_name("State 1") assert len(state1.get_action_list()) == 1, "Creator did not insert all the actions" - assert state1.get_event_filter_list()[0].get_next_state() == "State 2" + assert state1.get_event_filter_list()[0][1] == "State 2" # Make sure we have the final state and that it's empty state2 = fsm.get_state_by_name("State2") diff --git a/tutorius/core.py b/tutorius/core.py index 15a0c87..d08c136 100644 --- a/tutorius/core.py +++ b/tutorius/core.py @@ -271,7 +271,7 @@ class State(object): if len(self._actions) != len(otherState._actions): return False - if len(self._event_filters) != len(otherState._event_filters): + if len(self._transitions) != len(otherState._transitions): return False for act in self._actions: @@ -287,12 +287,14 @@ class State(object): return False # Do they have the same event filters? - for event in self._event_filters: + for event in self._transitions: + state_name = self._transitions[event] 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: + for otherEvent in otherState._transitions: + other_state_name = otherState._transitions[otherEvent] if event == otherEvent: found = True break @@ -515,10 +517,10 @@ class FiniteStateMachine(State): #TODO : Move this code inside the State itself - we're breaking # encap :P - if st._transitions: - for event, state in st._transitions.items(): - if state == state_name: - del st._transitions[event] + for event in st._transitions.keys(): + state = st._transitions[event] + if state == state_name: + del st._transitions[event] # Remove the state from the dictionary del self._states[state_name] @@ -536,8 +538,9 @@ class FiniteStateMachine(State): next_states = set() - for event, state in state._transitions: - next_states.add(state) + for event in state._transitions.keys(): + state_name_in_dict = state._transitions[event] + next_states.add(state_name_in_dict) return tuple(next_states) @@ -559,7 +562,7 @@ class FiniteStateMachine(State): states = [] # Walk through the list of states for st in self._states.itervalues(): - for event, state in st._transitions: + for event, state in st._transitions.items(): if state == state_name: states.append(state) continue |