示例#1
0
def test_replay_emits():
    emissions = (
        ('foo', {
            'args': (123, ),
            'kwargs': {}
        }),
        ('bar', {
            'args': ('hello', 'world'),
            'kwargs': {}
        }),
        ('foo', {
            'args': ('and', ),
            'kwargs': {
                'this': 'that'
            }
        }),
        ('bar', {
            'args': (),
            'kwargs': {
                'four': 56
            }
        }),
    )
    s = Signal('foo', 'bar', 'baz')
    cb = Mock()
    s.register('foo', cb.foo)
    s.register('bar', cb.bar)
    s.register('baz', cb.baz)
    s.replay(emissions)
    assert cb.mock_calls == [
        call.foo(123),
        call.bar('hello', 'world'),
        call.foo('and', this='that'),
        call.bar(four=56),
    ]
示例#2
0
def test_emit_to_single_callback(args, kwargs):
    s = Signal('foo', 'bar')
    cb = Mock()
    s.register('foo', cb)
    s.emit('foo', *args, **kwargs)
    assert cb.call_args_list == [call(*args, **kwargs)]
    s.emit('bar', *args, **kwargs)
    assert cb.call_args_list == [call(*args, **kwargs)]
示例#3
0
def test_record():
    s = Signal('foo', 'bar')
    assert s.recording == []
    s.record('foo')
    assert s.recording == ['foo']
    s.record('bar')
    assert s.recording == ['foo', 'bar']
    with pytest.raises(ValueError, match=r"^Unknown signal: 'baz'$"):
        s.record('baz')
    assert s.recording == ['foo', 'bar']
示例#4
0
def test_adding_adds_signal():
    s = Signal()
    assert s.signals == {}
    assert s._record_signals == []
    s.add('foo')
    assert s.signals == {'foo': []}
    assert s._record_signals == []
    s.add('bar', record=True)
    assert s.signals == {'foo': [], 'bar': []}
    assert s._record_signals == ['bar']
    s.add('baz', record=False)
    assert s.signals == {'foo': [], 'bar': [], 'baz': []}
    assert s._record_signals == ['bar']
示例#5
0
def test_emit_to_multiple_callbacks(args, kwargs):
    s = Signal('foo', 'bar')
    cb = Mock()
    s.register('foo', cb.a)
    s.register('foo', cb.b)
    s.register('foo', cb.c)
    s.register('bar', cb.d)
    s.register('bar', cb.e)
    s.register('bar', cb.f)
    s.emit('foo', *args, **kwargs)
    assert cb.mock_calls == [
        call.a(*args, **kwargs),
        call.b(*args, **kwargs),
        call.c(*args, **kwargs),
    ]
    s.emit('bar')
    assert cb.mock_calls == [
        call.a(*args, **kwargs),
        call.b(*args, **kwargs),
        call.c(*args, **kwargs),
        call.d(),
        call.e(),
        call.f(),
    ]
示例#6
0
def test_keyword_arguments_are_added():
    s = Signal('foo', 'bar', 'baz')
    assert s.signals == {'foo': [], 'bar': [], 'baz': []}
示例#7
0
def test_emit_to_no_callback(args, kwargs):
    s = Signal('foo')
    s.emit('foo', *args, **kwargs)
示例#8
0
def test_registering_noncallable():
    s = Signal('foo')
    with pytest.raises(TypeError, match=r"^Not a callable: 'bar'$"):
        s.register('foo', 'bar')
示例#9
0
def test_registering_for_unknown_signal():
    s = Signal('foo')
    with pytest.raises(ValueError, match=r"^Unknown signal: 'bar'$"):
        s.register('bar', lambda: None)
示例#10
0
def test_suspend_handles_unknown_signals():
    s = Signal('foo', 'bar', 'baz')
    with pytest.raises(ValueError, match=r"Unknown signal: 'boo'"):
        with s.suspend('bar', 'boo'):
            pass
示例#11
0
def test_suspend_blocks_emissions():
    s = Signal('foo', 'bar', 'baz')
    cb = Mock()
    s.register('foo', cb.foo)
    s.register('bar', cb.bar)
    s.register('baz', cb.baz)

    s.emit('foo', 123, this='that')
    s.emit('bar', 456, hey='ho')
    s.emit('baz', 789, zip='zop')
    assert cb.mock_calls == [
        call.foo(123, this='that'),
        call.bar(456, hey='ho'),
        call.baz(789, zip='zop'),
    ]
    cb.reset_mock()

    with s.suspend('bar', 'foo'):
        s.emit('foo', 123, this='that')
        s.emit('bar', 456, hey='ho')
        s.emit('baz', 789, zip='zop')
    assert cb.mock_calls == [
        call.baz(789, zip='zop'),
    ]
    cb.reset_mock()

    s.emit('foo', 123, this='that')
    s.emit('bar', 456, hey='ho')
    s.emit('baz', 789, zip='zop')
    assert cb.mock_calls == [
        call.foo(123, this='that'),
        call.bar(456, hey='ho'),
        call.baz(789, zip='zop'),
    ]
示例#12
0
def test_adding_duplicate_signal():
    s = Signal('foo')
    with pytest.raises(RuntimeError, match=r"^Signal already added: 'foo'$"):
        s.add('foo')
示例#13
0
def test_adding_unhashable_signal():
    s = Signal()
    with pytest.raises(TypeError, match=r'^Unhashable signal: \{\}$'):
        assert s.add({})
示例#14
0
def test_emit_records_call():
    s = Signal()
    s.add('foo', record=True)
    s.add('bar', record=True)
    s.add('baz', record=False)
    assert s.emissions == ()
    s.emit('foo', 123)
    s.emit('bar', 'hello', 'world')
    s.emit('foo', 'and', this='that')
    s.emit('baz', 0)
    s.emit('bar', four=56)
    assert s.emissions == (
        ('foo', {
            'args': (123, ),
            'kwargs': {}
        }),
        ('bar', {
            'args': ('hello', 'world'),
            'kwargs': {}
        }),
        ('foo', {
            'args': ('and', ),
            'kwargs': {
                'this': 'that'
            }
        }),
        ('bar', {
            'args': (),
            'kwargs': {
                'four': 56
            }
        }),
    )