summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGustavo Niemeyer <gustavo@niemeyer.net>2007-12-09 13:37:49 -0200
committerGustavo Niemeyer <gustavo@niemeyer.net>2007-12-09 13:37:49 -0200
commit7ba4e6a4eff5896808e7b95e84744cd97a963c07 (patch)
treefa8d823d53de7ec05e28128009186c2fbe413f59
parent92e4f5b0bc5ec7a06284b9cc2245fdfb052d9707 (diff)
downloadmocker-7ba4e6a4eff5896808e7b95e84744cd97a963c07.tar.gz
Fixed problem when requesting order on similar expressions. The
second expression might not be accepted.
-rw-r--r--NEWS3
-rw-r--r--mocker.py18
-rwxr-xr-xtest.py26
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")