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 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172
|
# Copyright (c) 2016 Ultimaker B.V.
# Uranium is released under the terms of the LGPLv3 or higher.
from unittest.mock import patch, MagicMock
import pytest
from UM import FlameProfiler
from UM.Signal import Signal, signalemitter, postponeSignals, CompressTechnique
from copy import deepcopy
class SignalReceiver:
def __init__(self):
self._emit_count = 0
def getEmitCount(self):
return self._emit_count
def slot(self, *args, **kwargs):
self._emit_count += 1
def test_signalWithFlameProfiler():
with patch("UM.Signal._recordSignalNames", MagicMock(return_value = True)):
FlameProfiler.record_profile = True
test = SignalReceiver()
signal = Signal(type=Signal.Direct)
signal.connect(test.slot)
signal.emit()
assert test.getEmitCount() == 1
FlameProfiler.record_profile = False
def test_doubleSignalWithFlameProfiler():
FlameProfiler.record_profile = True
test = SignalReceiver()
signal = Signal(type=Signal.Direct)
signal2 = Signal(type=Signal.Direct)
signal.connect(test.slot)
signal2.connect(signal)
signal2.emit()
assert test.getEmitCount() == 1
FlameProfiler.record_profile = False
def test_signal():
test = SignalReceiver()
signal = Signal(type = Signal.Direct)
signal.connect(test.slot)
signal.emit()
assert test.getEmitCount() == 1
def test_postponeEmitNoCompression():
test = SignalReceiver()
signal = Signal(type=Signal.Direct)
signal.connect(test.slot)
with postponeSignals(signal, compress=CompressTechnique.NoCompression):
signal.emit()
assert test.getEmitCount() == 0 # as long as we're in this context, nothing should happen!
signal.emit()
assert test.getEmitCount() == 0
assert test.getEmitCount() == 2
def test_postponeEmitCompressSingle():
test = SignalReceiver()
signal = Signal(type=Signal.Direct)
signal.connect(test.slot)
with postponeSignals(signal, compress=CompressTechnique.CompressSingle):
signal.emit()
assert test.getEmitCount() == 0 # as long as we're in this context, nothing should happen!
signal.emit()
assert test.getEmitCount() == 0
assert test.getEmitCount() == 1
def test_postponeEmitCompressPerParameterValue():
test = SignalReceiver()
signal = Signal(type=Signal.Direct)
signal.connect(test.slot)
with postponeSignals(signal, compress=CompressTechnique.CompressPerParameterValue):
signal.emit("ZOMG")
assert test.getEmitCount() == 0 # as long as we're in this context, nothing should happen!
signal.emit("ZOMG")
assert test.getEmitCount() == 0
signal.emit("BEEP")
# We got 3 signal emits, but 2 of them were the same, so we end up with 2 unique emits.
assert test.getEmitCount() == 2
def test_connectWhilePostponed():
test = SignalReceiver()
signal = Signal(type=Signal.Direct)
with postponeSignals(signal):
signal.connect(test.slot) # This won't do anything, as we're postponing at the moment!
signal.emit()
assert test.getEmitCount() == 0 # The connection was never made, so we should get 0
def test_disconnectWhilePostponed():
test = SignalReceiver()
signal = Signal(type=Signal.Direct)
signal.connect(test.slot)
with postponeSignals(signal):
signal.disconnect(test.slot) # This won't do anything, as we're postponing at the moment!
signal.disconnectAll() # Same holds true for the disconnect all
signal.emit()
assert test.getEmitCount() == 1 # Despite attempting to disconnect, this didn't happen because of the postpone
def test_disconnectAll():
test = SignalReceiver()
signal = Signal(type=Signal.Direct)
signal.connect(test.slot)
signal.disconnectAll()
signal.emit()
assert test.getEmitCount() == 0
def test_connectSelf():
signal = Signal(type=Signal.Direct)
signal.connect(signal)
signal.emit() # If they are connected, this crashes with a max recursion depth error
def test_deepCopy():
test = SignalReceiver()
signal = Signal(type=Signal.Direct)
signal.connect(test.slot)
copied_signal = deepcopy(signal)
copied_signal.emit()
# Even though the original signal was not called, the copied one should have the same result
assert test.getEmitCount() == 1
def test_signalemitter():
def declare_signalemitter():
@signalemitter
class Test:
testSignal = Signal()
return Test
cls = declare_signalemitter()
assert cls is not None
inst = cls()
assert cls is not None
assert hasattr(inst, "testSignal")
assert inst.testSignal != cls.testSignal
def declare_bad_signalemitter():
@signalemitter
class Test:
pass
return Test
with pytest.raises(TypeError):
declare_bad_signalemitter()
|