From 7ba4e6a4eff5896808e7b95e84744cd97a963c07 Mon Sep 17 00:00:00 2001 From: Gustavo Niemeyer Date: Sun, 9 Dec 2007 13:37:49 -0200 Subject: Fixed problem when requesting order on similar expressions. The second expression might not be accepted. --- NEWS | 3 +++ mocker.py | 18 +++++++++++------- test.py | 26 ++++++++++++++++++++------ 3 files changed, 34 insertions(+), 13 deletions(-) diff --git a/NEWS b/NEWS index 418097d..a852ca6 100644 --- a/NEWS +++ b/NEWS @@ -26,6 +26,9 @@ consistently returns an unexistent temporary filename which is properly cleaned up if created. +- Fixed problem when requesting order on similar expressions. The + second expression might not be accepted. + 0.9.3 (2007-11-24) ================== diff --git a/mocker.py b/mocker.py index 5f8572b..0ee163b 100644 --- a/mocker.py +++ b/mocker.py @@ -684,13 +684,11 @@ class MockerBase(object): recorder(self, event) return Mock(self, path) else: - satisfied = [] - for event in self._events: - if event.satisfied(): - satisfied.append(event) - elif event.matches(path): - return event.run(path) - for event in satisfied: + # First run unsatisfied events, then ones not previously run. + events = [(event.satisfied()*2 + event.has_run(), event) + for event in self._events] + events.sort() + for key, event in events: if event.matches(path): return event.run(path) raise MatchError(ERROR_PREFIX + "Unexpected expression: %s" % path) @@ -1458,6 +1456,7 @@ class Event(object): def __init__(self, path=None): self.path = path self._tasks = [] + self._has_run = False def add_task(self, task): """Add a new task to this taks.""" @@ -1477,6 +1476,9 @@ class Event(object): return False return bool(self._tasks) + def has_run(self): + return self._has_run + def run(self, path): """Run all tasks with the given action. @@ -1487,6 +1489,7 @@ class Event(object): The result of this method will be the last result of a task which isn't None, or None if they're all None. """ + self._has_run = True result = None errors = [] for task in self._tasks: @@ -1548,6 +1551,7 @@ class Event(object): def replay(self): """Put all tasks in replay mode.""" + self._has_run = False for task in self._tasks: task.replay() diff --git a/test.py b/test.py index 783463c..10285aa 100755 --- a/test.py +++ b/test.py @@ -1370,27 +1370,33 @@ class MockerTest(TestCase): self.assertRaises(AssertionError, self.mocker.act, self.path) self.assertEquals(calls, ["matches"]) - def test_replaying_not_satisfied_first(self): + def test_replaying_order_not_satisfied_first_then_not_run(self): class MyTask1(Task): def run(self, path): return "result1" class MyTask2(Task): + def run(self, path): + return "result2" + class MyTask3(Task): raised = False def verify(self): if not self.raised: self.raised = True raise AssertionError("An error") def run(self, path): - return "result2" + return "result3" event1 = self.mocker.add_event(Event()) event1.add_task(MyTask1()) event2 = self.mocker.add_event(Event()) event2.add_task(MyTask2()) event3 = self.mocker.add_event(Event()) - event3.add_task(MyTask1()) + event3.add_task(MyTask3()) + event4 = self.mocker.add_event(Event()) + event4.add_task(MyTask1()) self.mocker.replay() - self.assertEquals(self.mocker.act(self.path), "result2") + self.assertEquals(self.mocker.act(self.path), "result3") self.assertEquals(self.mocker.act(self.path), "result1") + self.assertEquals(self.mocker.act(self.path), "result2") def test_recorder_decorator(self): result = recorder(42) @@ -2540,8 +2546,6 @@ class MockTest(TestCase): pass - - class EventTest(TestCase): def setUp(self): @@ -2649,6 +2653,16 @@ class EventTest(TestCase): self.event.add_task(MyTask()) self.assertRaises(RuntimeError, self.event.run, 42) + def test_has_run(self): + self.assertFalse(self.event.has_run()) + self.event.run(None) + self.assertTrue(self.event.has_run()) + + def test_has_run_reset_on_replay(self): + self.event.run(None) + self.event.replay() + self.assertFalse(self.event.has_run()) + def test_satisfied_false(self): def raise_error(): raise AssertionError("An error") -- cgit v1.2.1