diff options
author | Alan McIntyre <alan.mcintyre@local> | 2008-09-04 18:23:48 +0000 |
---|---|---|
committer | Alan McIntyre <alan.mcintyre@local> | 2008-09-04 18:23:48 +0000 |
commit | ba9a02dcb2c3ca635076a75cc9eb0f406e00ceed (patch) | |
tree | 403f11ecbb8ac0671240e57f3cf977084e35be2b | |
parent | 1a8809acef23b2480ec9b5eecbd4e4b57d7f14b7 (diff) | |
download | numpy-ba9a02dcb2c3ca635076a75cc9eb0f406e00ceed.tar.gz |
Replaced numpy.testing.decorators.skipknownfailure with knownfailureif,
which allows flagging tests as known failures rather than skips.
Updated test_umath to use knownfailureif.
-rw-r--r-- | numpy/core/tests/test_umath.py | 2 | ||||
-rw-r--r-- | numpy/testing/decorators.py | 45 | ||||
-rw-r--r-- | numpy/testing/noseclasses.py | 37 | ||||
-rw-r--r-- | numpy/testing/nosetester.py | 4 |
4 files changed, 75 insertions, 13 deletions
diff --git a/numpy/core/tests/test_umath.py b/numpy/core/tests/test_umath.py index 96b635666..1486a15e7 100644 --- a/numpy/core/tests/test_umath.py +++ b/numpy/core/tests/test_umath.py @@ -229,6 +229,7 @@ class TestComplexFunctions(object): yield _check_branch_cut, np.arccosh, [-2j, 2j, 2], [1, 1, 1j], 1, 1 yield _check_branch_cut, np.arctanh, [-2j, 2j, 0], [1, 1, 1j], 1, 1 + @dec.knownfailureif(True, "These branch cuts are known to fail") def test_branch_cuts_failing(self): # XXX: signed zeros are not OK for sqrt or for the arc* functions yield _check_branch_cut, np.sqrt, -0.5, 1j, 1, -1, True @@ -238,7 +239,6 @@ class TestComplexFunctions(object): yield _check_branch_cut, np.arcsinh, [-2j, 2j], [-1, 1], -1, 1, True yield _check_branch_cut, np.arccosh, [ -1, 0.5], [1j, 1j], 1, -1, True yield _check_branch_cut, np.arctanh, [ -2, 2], [1j, -1j], 1, -1, True - test_branch_cuts_failing = dec.skipknownfailure(test_branch_cuts_failing) def test_against_cmath(self): import cmath, sys diff --git a/numpy/testing/decorators.py b/numpy/testing/decorators.py index 77871d339..5d8f863d2 100644 --- a/numpy/testing/decorators.py +++ b/numpy/testing/decorators.py @@ -83,12 +83,41 @@ def skipif(skip_condition, msg=None): return nose.tools.make_decorator(f)(skipper) return skip_decorator -def skipknownfailure(f): - ''' Decorator to raise SkipTest for test known to fail +def knownfailureif(skip_condition, msg=None): + ''' Make function raise KnownFailureTest exception if skip_condition is true + + Parameters + --------- + skip_condition : bool + Flag to determine whether to mark test as known failure (True) + or not (False) + msg : string + Message to give on raising a KnownFailureTest exception + + Returns + ------- + decorator : function + Decorator, which, when applied to a function, causes SkipTest + to be raised when the skip_condition was True, and the function + to be called normally otherwise. + + Notes + ----- + You will see from the code that we had to further decorate the + decorator with the nose.tools.make_decorator function in order to + transmit function name, and various other metadata. ''' - # Local import to avoid a hard nose dependency and only incur the - # import time overhead at actual test-time. - import nose - def skipper(*args, **kwargs): - raise nose.SkipTest, 'This test is known to fail' - return nose.tools.make_decorator(f)(skipper) + if msg is None: + msg = 'Test skipped due to known failure' + def skip_decorator(f): + # Local import to avoid a hard nose dependency and only incur the + # import time overhead at actual test-time. + import nose + from noseclasses import KnownFailureTest + def skipper(*args, **kwargs): + if skip_condition: + raise KnownFailureTest, msg + else: + return f(*args, **kwargs) + return nose.tools.make_decorator(f)(skipper) + return skip_decorator diff --git a/numpy/testing/noseclasses.py b/numpy/testing/noseclasses.py index 68b9dff8f..6b084b409 100644 --- a/numpy/testing/noseclasses.py +++ b/numpy/testing/noseclasses.py @@ -7,6 +7,7 @@ import os import doctest from nose.plugins import doctests as npd +from nose.plugins.errorclass import ErrorClass, ErrorClassPlugin from nose.plugins.base import Plugin from nose.util import src, tolist import numpy @@ -16,8 +17,8 @@ import inspect _doctest_ignore = ['generate_numpy_api.py', 'scons_support.py', 'setupscons.py', 'setup.py'] -# All the classes in this module begin with 'numpy' to clearly distinguish them -# from the plethora of very similar names from nose/unittest/doctest +# Some of the classes in this module begin with 'numpy' to clearly distinguish +# them from the plethora of very similar names from nose/unittest/doctest #----------------------------------------------------------------------------- @@ -246,3 +247,35 @@ class numpyDoctest(npd.Doctest): if bn in _doctest_ignore: return False return npd.Doctest.wantFile(self, file) + + +class KnownFailureTest(Exception): + '''Raise this exception to mark a test as a known failing test.''' + pass + + +class KnownFailure(ErrorClassPlugin): + '''Plugin that installs a KNOWNFAIL error class for the + KnownFailureClass exception. When KnownFailureTest is raised, + the exception will be logged in the knownfail attribute of the + result, 'K' or 'KNOWNFAIL' (verbose) will be output, and the + exception will not be counted as an error or failure.''' + enabled = True + knownfail = ErrorClass(KnownFailureTest, + label='KNOWNFAIL', + isfailure=False) + + def options(self, parser, env=os.environ): + env_opt = 'NOSE_WITHOUT_KNOWNFAIL' + parser.add_option('--no-knownfail', action='store_true', + dest='noKnownFail', default=env.get(env_opt, False), + help='Disable special handling of KnownFailureTest ' + 'exceptions') + + def configure(self, options, conf): + if not self.can_configure: + return + self.conf = conf + disable = getattr(options, 'noKnownFail', False) + if disable: + self.enabled = False diff --git a/numpy/testing/nosetester.py b/numpy/testing/nosetester.py index ae3a56094..e5fb2cd35 100644 --- a/numpy/testing/nosetester.py +++ b/numpy/testing/nosetester.py @@ -266,8 +266,8 @@ class NoseTester(object): # construct list of plugins, omitting the existing doctest plugin import nose.plugins.builtin - from noseclasses import numpyDoctest - plugins = [numpyDoctest()] + from noseclasses import numpyDoctest, KnownFailure + plugins = [numpyDoctest(), KnownFailure()] for p in nose.plugins.builtin.plugins: plug = p() if plug.name == 'doctest': |