summaryrefslogtreecommitdiff
path: root/python
diff options
context:
space:
mode:
authorRobert Collins <robertc@robertcollins.net>2009-10-11 05:57:10 +1100
committerRobert Collins <robertc@robertcollins.net>2009-10-11 05:57:10 +1100
commitcb60d38fd8da1c3146344569ed52fface0bcbef7 (patch)
tree20a822f865da37bf13aadaa01d59e95a7102b6e3 /python
parenta5370700d7c9a70af8b7baa897b5edef81a1ebe0 (diff)
downloadsubunit-git-cb60d38fd8da1c3146344569ed52fface0bcbef7.tar.gz
Pull the outside-test state logic out of the Python parser into a separate state object.
Diffstat (limited to 'python')
-rw-r--r--python/subunit/__init__.py61
1 files changed, 44 insertions, 17 deletions
diff --git a/python/subunit/__init__.py b/python/subunit/__init__.py
index a93b6eb..911308e 100644
--- a/python/subunit/__init__.py
+++ b/python/subunit/__init__.py
@@ -173,13 +173,31 @@ class DiscardStream(object):
pass
+class _OutSideTest(object):
+ """State for the subunit parser."""
+
+ def __init__(self, parser):
+ self.parser = parser
+
+ def lostConnection(self):
+ """Connection lost."""
+
+ def startTest(self, offset, line):
+ """A test start command received."""
+ self.parser.state = TestProtocolServer.TEST_STARTED
+ self.parser._state = None
+ self.parser._current_test = RemotedTestCase(line[offset:-1])
+ self.parser.current_test_description = line[offset:-1]
+ self.parser.client.startTest(self.parser._current_test)
+
+
class TestProtocolServer(object):
"""A parser for subunit.
:ivar tags: The current tags associated with the protocol stream.
"""
- OUTSIDE_TEST = 0
+ STATE_OBJECT = 0
TEST_STARTED = 1
READING_FAILURE = 2
READING_ERROR = 3
@@ -196,16 +214,19 @@ class TestProtocolServer(object):
of mixed protocols. By default, sys.stdout will be used for
convenience.
"""
- self.state = TestProtocolServer.OUTSIDE_TEST
self.client = client
if stream is None:
stream = sys.stdout
self._stream = stream
+ self._outside_test = _OutSideTest(self)
+ self._state = self._outside_test
+ self.state = TestProtocolServer.STATE_OBJECT
def _addError(self, offset, line):
if (self.state == TestProtocolServer.TEST_STARTED and
self.current_test_description == line[offset:-1]):
- self.state = TestProtocolServer.OUTSIDE_TEST
+ self._state = self._outside_test
+ self.state = TestProtocolServer.STATE_OBJECT
self.current_test_description = None
self.client.addError(self._current_test, RemoteError(""))
self.client.stopTest(self._current_test)
@@ -220,7 +241,8 @@ class TestProtocolServer(object):
def _addExpectedFail(self, offset, line):
if (self.state == TestProtocolServer.TEST_STARTED and
self.current_test_description == line[offset:-1]):
- self.state = TestProtocolServer.OUTSIDE_TEST
+ self._state = self._outside_test
+ self.state = TestProtocolServer.STATE_OBJECT
self.current_test_description = None
xfail = getattr(self.client, 'addExpectedFailure', None)
if callable(xfail):
@@ -238,7 +260,8 @@ class TestProtocolServer(object):
def _addFailure(self, offset, line):
if (self.state == TestProtocolServer.TEST_STARTED and
self.current_test_description == line[offset:-1]):
- self.state = TestProtocolServer.OUTSIDE_TEST
+ self._state = self._outside_test
+ self.state = TestProtocolServer.STATE_OBJECT
self.current_test_description = None
self.client.addFailure(self._current_test, RemoteError())
self.client.stopTest(self._current_test)
@@ -252,7 +275,8 @@ class TestProtocolServer(object):
def _addSkip(self, offset, line):
if (self.state == TestProtocolServer.TEST_STARTED and
self.current_test_description == line[offset:-1]):
- self.state = TestProtocolServer.OUTSIDE_TEST
+ self._state = self._outside_test
+ self.state = TestProtocolServer.STATE_OBJECT
self.current_test_description = None
self._skip_or_error()
self.client.stopTest(self._current_test)
@@ -293,24 +317,28 @@ class TestProtocolServer(object):
def endQuote(self, line):
if self.state == TestProtocolServer.READING_FAILURE:
- self.state = TestProtocolServer.OUTSIDE_TEST
+ self._state = self._outside_test
+ self.state = TestProtocolServer.STATE_OBJECT
self.current_test_description = None
self.client.addFailure(self._current_test,
RemoteError(self._message))
self.client.stopTest(self._current_test)
elif self.state == TestProtocolServer.READING_ERROR:
- self.state = TestProtocolServer.OUTSIDE_TEST
+ self._state = self._outside_test
+ self.state = TestProtocolServer.STATE_OBJECT
self.current_test_description = None
self.client.addError(self._current_test,
RemoteError(self._message))
self.client.stopTest(self._current_test)
elif self.state == TestProtocolServer.READING_SKIP:
- self.state = TestProtocolServer.OUTSIDE_TEST
+ self._state = self._outside_test
+ self.state = TestProtocolServer.STATE_OBJECT
self.current_test_description = None
self._skip_or_error(self._message)
self.client.stopTest(self._current_test)
elif self.state == TestProtocolServer.READING_XFAIL:
- self.state = TestProtocolServer.OUTSIDE_TEST
+ self._state = self._outside_test
+ self.state = TestProtocolServer.STATE_OBJECT
self.current_test_description = None
xfail = getattr(self.client, 'addExpectedFailure', None)
if callable(xfail):
@@ -407,7 +435,8 @@ class TestProtocolServer(object):
def lostConnection(self):
"""The input connection has finished."""
- if self.state == TestProtocolServer.OUTSIDE_TEST:
+ if self.state == TestProtocolServer.STATE_OBJECT:
+ self._state.lostConnection()
return
if self.state == TestProtocolServer.TEST_STARTED:
self._lostConnectionInTest('')
@@ -431,11 +460,8 @@ class TestProtocolServer(object):
def _startTest(self, offset, line):
"""Internal call to change state machine. Override startTest()."""
- if self.state == TestProtocolServer.OUTSIDE_TEST:
- self.state = TestProtocolServer.TEST_STARTED
- self._current_test = RemotedTestCase(line[offset:-1])
- self.current_test_description = line[offset:-1]
- self.client.startTest(self._current_test)
+ if self.state == TestProtocolServer.STATE_OBJECT:
+ self._state.startTest(offset, line)
else:
self.stdOutLineReceived(line)
@@ -447,7 +473,8 @@ class TestProtocolServer(object):
self.client.stopTest(self._current_test)
self.current_test_description = None
self._current_test = None
- self.state = TestProtocolServer.OUTSIDE_TEST
+ self._state = self._outside_test
+ self.state = TestProtocolServer.STATE_OBJECT
class RemoteException(Exception):