1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156
|
from time import sleep
import pytest
from labgrid import step, steps
@step()
def step_a(*, step):
assert steps.get_current() is not None
return step.level
@step()
def step_outer(*, step):
assert step.level == 1
return step_a()
def test_single():
assert steps.get_current() is None
step_a()
assert steps.get_current() is None
def test_nested():
assert steps.get_current() is None
inner_level = step_outer()
assert steps.get_current() is None
assert inner_level == 2
@step()
def step_sleep(*, step):
sleep(0.25)
return step
def test_timing():
step = step_sleep()
assert step.duration == pytest.approx(0.25, abs=1e-2)
assert step.exception is None
class A:
@step()
def method_step(self, foo, *, step):
return step
@step(args=['foo'])
def method_args_step(self, foo, *, step):
return step
@step(title='test-title')
def method_title_step(self, foo, *, step):
return step
@step(result=True)
def method_result_step(self, foo, *, step):
return step
@step(tag='dummy')
def method_tag_step(self, foo, *, step):
return step
def test_method():
a = A()
step = a.method_step('foo')
assert step.source == a
assert step.title == 'method_step'
assert step.args is None
assert step.result is None
assert step.tag is None
def test_method_args():
a = A()
step = a.method_args_step('foo')
assert step.source == a
assert step.title == 'method_args_step'
assert step.args == {'foo': 'foo'}
assert step.result is None
assert step.tag is None
def test_method_title():
a = A()
step = a.method_title_step('foo')
assert step.source == a
assert step.title == 'test-title'
assert step.args is None
assert step.result is None
assert step.tag is None
def test_method_result():
a = A()
step = a.method_result_step('foo')
assert step.source == a
assert step.title == 'method_result_step'
assert step.args is None
assert step.result is step
assert step.tag is None
def test_method_tag():
a = A()
step = a.method_tag_step('foo')
assert step.source == a
assert step.title == 'method_tag_step'
assert step.args is None
assert step.result is None
assert step.tag == 'dummy'
@step(args=['default'])
def step_default_arg(default=None, *, step):
return step
def test_default_arg():
step = step_default_arg()
assert step.args['default'] == None
step = step_default_arg(default='real')
assert step.args['default'] == 'real'
@step()
def step_error(output, *, step):
output.append(step)
raise ValueError('dummy')
def test_error():
output = []
with pytest.raises(ValueError, match=r'dummy'):
step_error(output)
step = output[0]
assert step.exception is not None
assert isinstance(step.exception, ValueError)
@step()
def step_event_skip(*, step):
step.skip('testing')
def test_event():
events = []
def callback(event):
events.append(event)
steps.subscribe(callback)
try:
step = step_event_skip()
finally:
steps.unsubscribe(callback)
skip_event = [e for e in events if 'skip' in e.data]
assert len(skip_event) == 1
assert skip_event[0].data['skip'] == 'testing'
def test_subscriber_error():
events = []
def callback(event):
raise ValueError('from callback')
steps.subscribe(callback)
with pytest.warns(UserWarning):
step = step_event_skip()
steps.unsubscribe(callback)
|