def test_dynamic_stream_transients(self): # Ensure Stream reset option resets streams to default value # when not triggering global xresets, yresets xresets, yresets = 0, 0 def history_callback(x, y, history=deque(maxlen=10)): global xresets, yresets if x is None: xresets += 1 else: history.append(x) if y is None: yresets += 1 return Curve(list(history)) x = PointerX(transient=True) y = PointerY(transient=True) dmap = DynamicMap(history_callback, kdims=[], streams=[x, y]) # Add stream subscriber mocking plot x.add_subscriber(lambda **kwargs: dmap[()]) y.add_subscriber(lambda **kwargs: dmap[()]) # Update each stream and count when None default appears for i in range(2): x.event(x=i) y.event(y=i) self.assertEqual(xresets, 2) self.assertEqual(yresets, 2)
def test_dynamic_callable_disable_callable_memoize(self): # Disabling Callable.memoize means no memoization is applied, # every access to DynamicMap calls callback and adds sample def history_callback(x, history=deque(maxlen=10)): history.append(x) return Curve(list(history)) x = PointerX() callable_obj = Callable(history_callback, memoize=False) dmap = DynamicMap(callable_obj, kdims=[], streams=[x]) # Add stream subscriber mocking plot x.add_subscriber(lambda **kwargs: dmap[()]) for i in range(2): x.event(x=1) self.assertEqual(dmap[()], Curve([1, 1, 1])) for i in range(2): x.event(x=2) self.assertEqual(dmap[()], Curve([1, 1, 1, 2, 2, 2]))
def test_dynamic_callable_memoize(self): # Always memoized only one of each held def history_callback(x, history=deque(maxlen=10)): history.append(x) return Curve(list(history)) x = PointerX() dmap = DynamicMap(history_callback, kdims=[], streams=[x]) # Add stream subscriber mocking plot x.add_subscriber(lambda **kwargs: dmap[()]) for i in range(2): x.event(x=1) self.assertEqual(dmap[()], Curve([1])) for i in range(2): x.event(x=2) self.assertEqual(dmap[()], Curve([1, 2]))
def test_dynamic_callable_stream_transient(self): # Enable transient stream meaning memoization only happens when # stream is inactive, should have sample for each call to # stream.update def history_callback(x, history=deque(maxlen=10)): if x is not None: history.append(x) return Curve(list(history)) x = PointerX(transient=True) dmap = DynamicMap(history_callback, kdims=[], streams=[x]) # Add stream subscriber mocking plot x.add_subscriber(lambda **kwargs: dmap[()]) for i in range(2): x.event(x=1) self.assertEqual(dmap[()], Curve([1, 1])) for i in range(2): x.event(x=2) self.assertEqual(dmap[()], Curve([1, 1, 2, 2]))
def test_subscriber_clear_internal(self): pointerx = PointerX(x=2) pointerx.add_subscriber(self.fn1, precedence=0) pointerx.add_subscriber(self.fn2, precedence=1) pointerx.add_subscriber(self.fn3, precedence=1.5) pointerx.add_subscriber(self.fn4, precedence=10) self.assertEqual(pointerx.subscribers, [self.fn1,self.fn2,self.fn3,self.fn4]) pointerx.clear('internal') self.assertEqual(pointerx.subscribers, [self.fn1,self.fn2])