summaryrefslogtreecommitdiff
path: root/python
diff options
context:
space:
mode:
authorRobert Collins <robertc@robertcollins.net>2009-10-11 06:24:25 +1100
committerRobert Collins <robertc@robertcollins.net>2009-10-11 06:24:25 +1100
commit0f525a77443d3e6f2949cdf57fa3466db224c471 (patch)
tree475fa5077f0d2bf0b5b21365f3785b04584f8c26 /python
parentcb60d38fd8da1c3146344569ed52fface0bcbef7 (diff)
downloadsubunit-git-0f525a77443d3e6f2949cdf57fa3466db224c471.tar.gz
Move the TEST_STARTED parser state to a state object.
Diffstat (limited to 'python')
-rw-r--r--python/subunit/__init__.py192
1 files changed, 127 insertions, 65 deletions
diff --git a/python/subunit/__init__.py b/python/subunit/__init__.py
index 911308e..012555e 100644
--- a/python/subunit/__init__.py
+++ b/python/subunit/__init__.py
@@ -173,19 +173,126 @@ class DiscardStream(object):
pass
-class _OutSideTest(object):
+class _ParserState(object):
"""State for the subunit parser."""
def __init__(self, parser):
self.parser = parser
+ def addError(self, offset, line):
+ """An 'error:' directive has been read."""
+ self.parser.stdOutLineReceived(line)
+
+ def addExpectedFail(self, offset, line):
+ """An 'xfail:' directive has been read."""
+ self.parser.stdOutLineReceived(line)
+
+ def addFailure(self, offset, line):
+ """A 'failure:' directive has been read."""
+ self.parser.stdOutLineReceived(line)
+
+ def addSkip(self, offset, line):
+ """A 'skip:' directive has been read."""
+ self.parser.stdOutLineReceived(line)
+
+ def addSuccess(self, offset, line):
+ """A 'success:' directive has been read."""
+ self.parser.stdOutLineReceived(line)
+
+ def startTest(self, offset, line):
+ """A test start command received."""
+ self.parser.stdOutLineReceived(line)
+
+
+class _InTest(_ParserState):
+ """State for the subunit parser after reading a test: directive."""
+
+ def addError(self, offset, line):
+ """An 'error:' directive has been read."""
+ if self.parser.current_test_description == line[offset:-1]:
+ self.parser._state = self.parser._outside_test
+ self.parser.state = TestProtocolServer.STATE_OBJECT
+ self.parser.current_test_description = None
+ self.parser.client.addError(self.parser._current_test, RemoteError(""))
+ self.parser.client.stopTest(self.parser._current_test)
+ self.parser._current_test = None
+ elif self.parser.current_test_description + " [" == line[offset:-1]:
+ self.parser.state = TestProtocolServer.READING_ERROR
+ self.parser._message = ""
+ else:
+ self.parser.stdOutLineReceived(line)
+
+ def addExpectedFail(self, offset, line):
+ """An 'xfail:' directive has been read."""
+ if self.parser.current_test_description == line[offset:-1]:
+ self.parser._state = self.parser._outside_test
+ self.parser.state = TestProtocolServer.STATE_OBJECT
+ self.parser.current_test_description = None
+ xfail = getattr(self.parser.client, 'addExpectedFailure', None)
+ if callable(xfail):
+ xfail(self.parser._current_test, RemoteError())
+ else:
+ self.parser.client.addSuccess(self.parser._current_test)
+ self.parser.client.stopTest(self.parser._current_test)
+ elif self.parser.current_test_description + " [" == line[offset:-1]:
+ self.parser.state = TestProtocolServer.READING_XFAIL
+ self.parser._message = ""
+ else:
+ self.parser.stdOutLineReceived(line)
+
+ def addFailure(self, offset, line):
+ """A 'failure:' directive has been read."""
+ if self.parser.current_test_description == line[offset:-1]:
+ self.parser._state = self.parser._outside_test
+ self.parser.state = TestProtocolServer.STATE_OBJECT
+ self.parser.current_test_description = None
+ self.parser.client.addFailure(self.parser._current_test, RemoteError())
+ self.parser.client.stopTest(self.parser._current_test)
+ elif self.parser.current_test_description + " [" == line[offset:-1]:
+ self.parser.state = TestProtocolServer.READING_FAILURE
+ self.parser._message = ""
+ else:
+ self.parser.stdOutLineReceived(line)
+
+ def addSkip(self, offset, line):
+ """A 'skip:' directive has been read."""
+ if self.parser.current_test_description == line[offset:-1]:
+ self.parser._state = self.parser._outside_test
+ self.parser.state = TestProtocolServer.STATE_OBJECT
+ self.parser.current_test_description = None
+ self.parser._skip_or_error()
+ self.parser.client.stopTest(self.parser._current_test)
+ elif self.parser.current_test_description + " [" == line[offset:-1]:
+ self.parser.state = TestProtocolServer.READING_SKIP
+ self.parser._message = ""
+ else:
+ self.parser.stdOutLineReceived(line)
+
+ def addSuccess(self, offset, line):
+ """A 'success:' directive has been read."""
+ if self.parser.current_test_description == line[offset:-1]:
+ self.parser._succeedTest()
+ elif self.parser.current_test_description + " [" == line[offset:-1]:
+ self.parser.state = TestProtocolServer.READING_SUCCESS
+ self.parser._message = ""
+ else:
+ self.parser.stdOutLineReceived(line)
+
+ def lostConnection(self):
+ """Connection lost."""
+ self.parser._lostConnectionInTest('')
+
+
+class _OutSideTest(_ParserState):
+ """State for the subunit parser outside of a test context."""
+
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._state = self.parser._in_test
+ self.parser.state = TestProtocolServer.STATE_OBJECT
self.parser._current_test = RemotedTestCase(line[offset:-1])
self.parser.current_test_description = line[offset:-1]
self.parser.client.startTest(self.parser._current_test)
@@ -198,7 +305,7 @@ class TestProtocolServer(object):
"""
STATE_OBJECT = 0
- TEST_STARTED = 1
+ STATE_OBJECTS = [0]
READING_FAILURE = 2
READING_ERROR = 3
READING_SKIP = 4
@@ -218,72 +325,34 @@ class TestProtocolServer(object):
if stream is None:
stream = sys.stdout
self._stream = stream
+ # state objects we can switch too
+ self._in_test = _InTest(self)
self._outside_test = _OutSideTest(self)
+ # start with outside test.
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 = 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)
- self._current_test = None
- elif (self.state == TestProtocolServer.TEST_STARTED and
- self.current_test_description + " [" == line[offset:-1]):
- self.state = TestProtocolServer.READING_ERROR
- self._message = ""
+ if self.state in TestProtocolServer.STATE_OBJECTS:
+ self._state.addError(offset, line)
else:
self.stdOutLineReceived(line)
def _addExpectedFail(self, offset, line):
- if (self.state == TestProtocolServer.TEST_STARTED and
- self.current_test_description == line[offset:-1]):
- self._state = self._outside_test
- self.state = TestProtocolServer.STATE_OBJECT
- self.current_test_description = None
- xfail = getattr(self.client, 'addExpectedFailure', None)
- if callable(xfail):
- xfail(self._current_test, RemoteError())
- else:
- self.client.addSuccess(self._current_test)
- self.client.stopTest(self._current_test)
- elif (self.state == TestProtocolServer.TEST_STARTED and
- self.current_test_description + " [" == line[offset:-1]):
- self.state = TestProtocolServer.READING_XFAIL
- self._message = ""
+ if self.state in TestProtocolServer.STATE_OBJECTS:
+ self._state.addExpectedFail(offset, line)
else:
self.stdOutLineReceived(line)
def _addFailure(self, offset, line):
- if (self.state == TestProtocolServer.TEST_STARTED and
- self.current_test_description == line[offset:-1]):
- 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)
- elif (self.state == TestProtocolServer.TEST_STARTED and
- self.current_test_description + " [" == line[offset:-1]):
- self.state = TestProtocolServer.READING_FAILURE
- self._message = ""
+ if self.state in TestProtocolServer.STATE_OBJECTS:
+ self._state.addFailure(offset, line)
else:
self.stdOutLineReceived(line)
def _addSkip(self, offset, line):
- if (self.state == TestProtocolServer.TEST_STARTED and
- self.current_test_description == line[offset:-1]):
- 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)
- elif (self.state == TestProtocolServer.TEST_STARTED and
- self.current_test_description + " [" == line[offset:-1]):
- self.state = TestProtocolServer.READING_SKIP
- self._message = ""
+ if self.state in TestProtocolServer.STATE_OBJECTS:
+ self._state.addSkip(offset, line)
else:
self.stdOutLineReceived(line)
@@ -298,13 +367,8 @@ class TestProtocolServer(object):
addSkip(self._current_test, message)
def _addSuccess(self, offset, line):
- if (self.state == TestProtocolServer.TEST_STARTED and
- self.current_test_description == line[offset:-1]):
- self._succeedTest()
- elif (self.state == TestProtocolServer.TEST_STARTED and
- self.current_test_description + " [" == line[offset:-1]):
- self.state = TestProtocolServer.READING_SUCCESS
- self._message = ""
+ if self.state in TestProtocolServer.STATE_OBJECTS:
+ self._state.addSuccess(offset, line)
else:
self.stdOutLineReceived(line)
@@ -435,12 +499,10 @@ class TestProtocolServer(object):
def lostConnection(self):
"""The input connection has finished."""
- if self.state == TestProtocolServer.STATE_OBJECT:
+ if self.state in TestProtocolServer.STATE_OBJECTS:
self._state.lostConnection()
return
- if self.state == TestProtocolServer.TEST_STARTED:
- self._lostConnectionInTest('')
- elif self.state == TestProtocolServer.READING_ERROR:
+ if self.state == TestProtocolServer.READING_ERROR:
self._lostConnectionInTest('error report of ')
elif self.state == TestProtocolServer.READING_FAILURE:
self._lostConnectionInTest('failure report of ')
@@ -460,7 +522,7 @@ class TestProtocolServer(object):
def _startTest(self, offset, line):
"""Internal call to change state machine. Override startTest()."""
- if self.state == TestProtocolServer.STATE_OBJECT:
+ if self.state in TestProtocolServer.STATE_OBJECTS:
self._state.startTest(offset, line)
else:
self.stdOutLineReceived(line)