~ipython-contrib/ipython/traitlets-rename

« back to all changes in this revision

Viewing changes to IPython/testing/_paramtestpy2.py

  • Committer: Dav Clark
  • Date: 2010-01-14 04:02:25 UTC
  • mfrom: (1102.1.220 trunk-dev)
  • Revision ID: davclark@berkeley.edu-20100114040225-dl8eyu6eao2oszra
mergedĀ fromĀ ~fdo.perez/ipython/trunk-dev

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
"""Implementation of the parametric test support for Python 2.x
 
2
"""
 
3
#-----------------------------------------------------------------------------
 
4
# Imports
 
5
#-----------------------------------------------------------------------------
 
6
 
 
7
# Stdlib
 
8
import unittest
 
9
from compiler.consts import CO_GENERATOR
 
10
 
 
11
#-----------------------------------------------------------------------------
 
12
# Classes and functions
 
13
#-----------------------------------------------------------------------------
 
14
 
 
15
def isgenerator(func):
 
16
    try:
 
17
        return func.func_code.co_flags & CO_GENERATOR != 0
 
18
    except AttributeError:
 
19
        return False
 
20
 
 
21
class ParametricTestCase(unittest.TestCase):
 
22
    """Write parametric tests in normal unittest testcase form.
 
23
 
 
24
    Limitations: the last iteration misses printing out a newline when running
 
25
    in verbose mode.
 
26
    """
 
27
    def run_parametric(self, result, testMethod):
 
28
        # But if we have a test generator, we iterate it ourselves
 
29
        testgen = testMethod()
 
30
        while True:
 
31
            try:
 
32
                # Initialize test
 
33
                result.startTest(self)
 
34
 
 
35
                # SetUp
 
36
                try:
 
37
                    self.setUp()
 
38
                except KeyboardInterrupt:
 
39
                    raise
 
40
                except:
 
41
                    result.addError(self, self._exc_info())
 
42
                    return
 
43
                # Test execution
 
44
                ok = False
 
45
                try:
 
46
                    testgen.next()
 
47
                    ok = True
 
48
                except StopIteration:
 
49
                    # We stop the loop
 
50
                    break
 
51
                except self.failureException:
 
52
                    result.addFailure(self, self._exc_info())
 
53
                except KeyboardInterrupt:
 
54
                    raise
 
55
                except:
 
56
                    result.addError(self, self._exc_info())
 
57
                # TearDown
 
58
                try:
 
59
                    self.tearDown()
 
60
                except KeyboardInterrupt:
 
61
                    raise
 
62
                except:
 
63
                    result.addError(self, self._exc_info())
 
64
                    ok = False
 
65
                if ok: result.addSuccess(self)
 
66
 
 
67
            finally:
 
68
                result.stopTest(self)
 
69
 
 
70
    def run(self, result=None):
 
71
        if result is None:
 
72
            result = self.defaultTestResult()
 
73
        testMethod = getattr(self, self._testMethodName)
 
74
        # For normal tests, we just call the base class and return that
 
75
        if isgenerator(testMethod):
 
76
            return self.run_parametric(result, testMethod)
 
77
        else:
 
78
            return super(ParametricTestCase, self).run(result)
 
79
 
 
80
 
 
81
def parametric(func):
 
82
    """Decorator to make a simple function into a normal test via unittest."""
 
83
 
 
84
    class Tester(ParametricTestCase):
 
85
        test = staticmethod(func)
 
86
 
 
87
    Tester.__name__ = func.__name__
 
88
 
 
89
    return Tester