import os # Test results. class TestResult: def __init__(self, name, isFailure): self.name = name self.isFailure = isFailure PASS = TestResult('PASS', False) XFAIL = TestResult('XFAIL', False) FAIL = TestResult('FAIL', True) XPASS = TestResult('XPASS', True) UNRESOLVED = TestResult('UNRESOLVED', True) UNSUPPORTED = TestResult('UNSUPPORTED', False) # Test classes. class TestFormat: """TestFormat - Test information provider.""" def __init__(self, name): self.name = name class TestSuite: """TestSuite - Information on a group of tests. A test suite groups together a set of logically related tests. """ def __init__(self, name, source_root, exec_root, config): self.name = name self.source_root = source_root self.exec_root = exec_root # The test suite configuration. self.config = config def getSourcePath(self, components): return os.path.join(self.source_root, *components) def getExecPath(self, components): return os.path.join(self.exec_root, *components) class Test: """Test - Information on a single test instance.""" def __init__(self, suite, path_in_suite, config): self.suite = suite self.path_in_suite = path_in_suite self.config = config # The test result code, once complete. self.result = None # Any additional output from the test, once complete. self.output = None # The wall time to execute this test, if timing and once complete. self.elapsed = None # The repeat index of this test, or None. self.index = None def copyWithIndex(self, index): import copy res = copy.copy(self) res.index = index return res def setResult(self, result, output, elapsed): assert self.result is None, "Test result already set!" self.result = result self.output = output self.elapsed = elapsed def getFullName(self): return self.suite.config.name + '::' + '/'.join(self.path_in_suite) def getSourcePath(self): return self.suite.getSourcePath(self.path_in_suite) def getExecPath(self): return self.suite.getExecPath(self.path_in_suite)