Files
openide/python/helpers/pycharm/tcmessages.py
Ilya.Kazakevich ffadfee6cb IDEA-CR-51828: PY-23394, PY-18501, PY-37571: Use new test runners when running tox
When we see test runner in "commands" section of tox, we substitute it with our test runners so user may benefit from test trees.

We also pass "offset" because test runners must use it as "parent node".

Set "_jb_do_not_patch_test_runners" to disable this substitution

(cherry picked from commit c7d469e1fed52f2d7fe3aec6d96b665c4aa80a4e)

GitOrigin-RevId: b9eec43a6d26fecb72270b733266ef31989fec2c
2019-08-28 13:07:04 +00:00

101 lines
3.6 KiB
Python

import sys
class TeamcityServiceMessages:
quote = {"'": "|'", "|": "||", "\n": "|n", "\r": "|r", ']': '|]', '[': '|['}
def __init__(self, output=sys.stdout, prepend_linebreak=False):
self.output = output
self.prepend_linebreak = prepend_linebreak
self.test_stack = []
"""
Names of tests
"""
self.topmost_suite = None
"""
Last suite we entered in
"""
self.number_of_tests = 0
def escapeValue(self, value):
if sys.version_info[0] <= 2 and isinstance(value, unicode):
s = value.encode("utf-8")
else:
s = str(value)
return "".join([self.quote.get(x, x) for x in s])
def message(self, messageName, **properties):
s = "##teamcity[" + messageName
for k, v in properties.items():
if v is None:
continue
s = s + " %s='%s'" % (k, self.escapeValue(v))
s += "]\n"
if self.prepend_linebreak: self.output.write("\n")
self.output.write(s)
def testSuiteStarted(self, suiteName, location=None):
self.message('testSuiteStarted', name=suiteName, locationHint=location)
self.test_stack.append(suiteName)
self.topmost_suite = suiteName
def testSuiteFinished(self, suiteName):
self.message('testSuiteFinished', name=suiteName)
self.__pop_current_test()
def testStarted(self, testName, location=None, **properties):
self.message('testStarted', name=testName, locationHint=location, **properties)
self.test_stack.append(testName)
self.number_of_tests = self.number_of_tests + 1
def testFinished(self, testName, duration=None, **properties):
self.message('testFinished', name=testName, duration=duration, **properties)
self.__pop_current_test()
def testIgnored(self, testName, message='', **properties):
self.message('testIgnored', name=testName, message=message)
self.testFinished(testName, **properties)
def testFailed(self, testName, message='', details='', expected='', actual='', duration=None, **properties):
"""
Marks test as failed. *CAUTION*: This method calls ``testFinished``, so you do not need
to call it second time. Try to provide ``duration`` if possible.
"""
if expected and actual:
self.message('testFailed', type='comparisonFailure', name=testName, message=message,
details=details, expected=expected, actual=actual, **properties)
else:
self.message('testFailed', name=testName, message=message, details=details, **properties)
self.testFinished(testName, int(duration) if duration else None, **properties)
def __pop_current_test(self):
try:
self.test_stack.pop()
except IndexError:
pass
def testError(self, testName, message='', details='', duration=None):
self.message('testFailed', name=testName, message=message, details=details, error="true")
self.testFinished(testName, int(duration) if duration else None)
def current_test_name(self):
"""
:return: name of current test we are in
"""
return self.test_stack[-1] if len(self.test_stack) > 0 else None
def testStdOut(self, testName, out, **properties):
self.message('testStdOut', name=testName, out=out, **properties)
def testStdErr(self, testName, out):
self.message('testStdErr', name=testName, out=out)
def testCount(self, count):
self.message('testCount', count=count)
def testMatrixEntered(self, **kwargs):
self.message('enteredTheMatrix', **kwargs)