summaryrefslogtreecommitdiff
path: root/distbuild/sm_tests.py
diff options
context:
space:
mode:
Diffstat (limited to 'distbuild/sm_tests.py')
-rw-r--r--distbuild/sm_tests.py86
1 files changed, 86 insertions, 0 deletions
diff --git a/distbuild/sm_tests.py b/distbuild/sm_tests.py
new file mode 100644
index 00000000..3c33e494
--- /dev/null
+++ b/distbuild/sm_tests.py
@@ -0,0 +1,86 @@
+# distbuild/sm_tests.py -- unit tests for state machine abstraction
+#
+# Copyright 2012 Codethink Limited.
+# All rights reserved.
+
+
+import unittest
+
+import distbuild
+
+
+class DummyEventSource(object):
+
+ pass
+
+
+class DummyEvent(object):
+
+ pass
+
+
+class StateMachineTests(unittest.TestCase):
+
+ def setUp(self):
+ self.sm = distbuild.StateMachine('init')
+ self.sm.distbuild = None
+ self.sm.setup()
+ self.event_source = DummyEventSource()
+ self.event = DummyEvent()
+ self.event_sources = []
+ self.events = []
+ self.callback_result = None
+
+ def callback(self, event_source, event):
+ self.event_sources.append(event_source)
+ self.events.append(event)
+ return self.callback_result
+
+ def test_ignores_event_when_there_are_no_transitions(self):
+ new_events = self.sm.handle_event(self.event_source, self.event)
+ self.assertEqual(new_events, [])
+ self.assertEqual(self.event_sources, [])
+ self.assertEqual(self.events, [])
+
+ def test_ignores_event_when_no_transition_matches(self):
+ spec = [
+ ('init', self.event_source, str, 'init', self.callback),
+ ]
+ self.sm.add_transitions(spec)
+ new_events = self.sm.handle_event(self.event_source, self.event)
+ self.assertEqual(new_events, [])
+ self.assertEqual(self.event_sources, [])
+ self.assertEqual(self.events, [])
+
+ def test_handles_lack_of_callback_ok(self):
+ spec = [
+ ('init', self.event_source, DummyEvent, 'init', None),
+ ]
+ self.sm.add_transitions(spec)
+ new_events = self.sm.handle_event(self.event_source, self.event)
+ self.assertEqual(new_events, [])
+ self.assertEqual(self.event_sources, [])
+ self.assertEqual(self.events, [])
+
+ def test_calls_registered_callback_for_right_event(self):
+ spec = [
+ ('init', self.event_source, DummyEvent, 'init', self.callback),
+ ]
+ self.sm.add_transitions(spec)
+ new_events = self.sm.handle_event(self.event_source, self.event)
+ self.assertEqual(new_events, [])
+ self.assertEqual(self.event_sources, [self.event_source])
+ self.assertEqual(self.events, [self.event])
+
+ def test_handle_converts_nonlist_to_list(self):
+ self.callback_result = ('foo', 'bar')
+
+ spec = [
+ ('init', self.event_source, DummyEvent, 'init', self.callback),
+ ]
+ self.sm.add_transitions(spec)
+ new_events = self.sm.handle_event(self.event_source, self.event)
+ self.assertEqual(new_events, ['foo', 'bar'])
+ self.assertEqual(self.event_sources, [self.event_source])
+ self.assertEqual(self.events, [self.event])
+