1""" Testing decorators module
2"""
3
4from numpy.testing import assert_equal
5from skimage._shared.testing import doctest_skip_parser, test_parallel
6from skimage._shared import testing
7
8from skimage._shared._warnings import expected_warnings
9from warnings import warn
10
11
12def test_skipper():
13    def f():
14        pass
15
16    class c():
17
18        def __init__(self):
19            self.me = "I think, therefore..."
20
21    docstring = \
22        """ Header
23
24            >>> something # skip if not HAVE_AMODULE
25            >>> something + else
26            >>> a = 1 # skip if not HAVE_BMODULE
27            >>> something2   # skip if HAVE_AMODULE
28        """
29    f.__doc__ = docstring
30    c.__doc__ = docstring
31
32    global HAVE_AMODULE, HAVE_BMODULE
33    HAVE_AMODULE = False
34    HAVE_BMODULE = True
35
36    f2 = doctest_skip_parser(f)
37    c2 = doctest_skip_parser(c)
38    assert f is f2
39    assert c is c2
40
41    expected = \
42        """ Header
43
44            >>> something # doctest: +SKIP
45            >>> something + else
46            >>> a = 1
47            >>> something2
48        """
49    assert_equal(f2.__doc__, expected)
50    assert_equal(c2.__doc__, expected)
51
52    HAVE_AMODULE = True
53    HAVE_BMODULE = False
54    f.__doc__ = docstring
55    c.__doc__ = docstring
56    f2 = doctest_skip_parser(f)
57    c2 = doctest_skip_parser(c)
58
59    assert f is f2
60    expected = \
61        """ Header
62
63            >>> something
64            >>> something + else
65            >>> a = 1 # doctest: +SKIP
66            >>> something2   # doctest: +SKIP
67        """
68    assert_equal(f2.__doc__, expected)
69    assert_equal(c2.__doc__, expected)
70
71    del HAVE_AMODULE
72    f.__doc__ = docstring
73    c.__doc__ = docstring
74    with testing.raises(NameError):
75        doctest_skip_parser(f)
76    with testing.raises(NameError):
77        doctest_skip_parser(c)
78
79
80def test_test_parallel():
81    state = []
82
83    @test_parallel()
84    def change_state1():
85        state.append(None)
86    change_state1()
87    assert len(state) == 2
88
89    @test_parallel(num_threads=1)
90    def change_state2():
91        state.append(None)
92    change_state2()
93    assert len(state) == 3
94
95    @test_parallel(num_threads=3)
96    def change_state3():
97        state.append(None)
98    change_state3()
99    assert len(state) == 6
100
101
102def test_parallel_warning():
103    @test_parallel()
104    def change_state_warns_fails():
105        warn("Test warning for test parallel", stacklevel=2)
106
107    with expected_warnings(['Test warning for test parallel']):
108        change_state_warns_fails()
109
110    @test_parallel(warnings_matching=['Test warning for test parallel'])
111    def change_state_warns_passes():
112        warn("Test warning for test parallel", stacklevel=2)
113
114    change_state_warns_passes()
115
116
117def test_expected_warnings_noop():
118    # This will ensure the line beolow it behaves like a no-op
119    with expected_warnings(['Expected warnings test']):
120
121        # This should behave as a no-op
122        with expected_warnings(None):
123            warn('Expected warnings test')
124
125