@@ -306,7 +306,7 @@ def test_callback_disconnect_func(self, pickle, cls):
306306 self .is_not_empty ()
307307
308308 # disconnect by function reference
309- self .callbacks .disconnect_func ( self . signal , mini_me . dummy )
309+ self .callbacks .disconnect ( mini_me . dummy , signal = self . signal )
310310
311311 # check we now have no callbacks registered
312312 self .is_empty ()
@@ -325,22 +325,22 @@ def test_callback_disconnect_func_wrong(self, pickle, cls):
325325 self .is_not_empty ()
326326
327327 # try to disconnect with wrong signal - should do nothing
328- self .callbacks .disconnect_func ( 'wrong_signal' , mini_me .dummy )
328+ self .callbacks .disconnect ( mini_me .dummy , signal = 'wrong_signal' )
329329
330330 # check we still have callbacks registered
331331 self .is_not_empty ()
332332
333333 # try to disconnect with wrong function - should do nothing
334334 mini_me2 = cls ()
335- self .callbacks .disconnect_func ( self . signal , mini_me2 . dummy )
335+ self .callbacks .disconnect ( mini_me2 . dummy , signal = self . signal )
336336
337337 # check we still have callbacks registered
338338 self .is_not_empty ()
339339
340340 def test_callback_disconnect_func_redefined (self ):
341- # Test that redefining a function name doesn't affect disconnect_func .
341+ # Test that redefining a function name doesn't affect disconnect .
342342 # When you redefine a function, it creates a new function object,
343- # so disconnect_func should not disconnect the original.
343+ # so disconnect should not disconnect the original.
344344 self .is_empty ()
345345
346346 def func ():
@@ -354,11 +354,65 @@ def func():
354354 pass
355355
356356 # Try to disconnect with the redefined function
357- self .callbacks .disconnect_func ( self .signal , func )
357+ self .callbacks .disconnect ( func , signal = self .signal )
358358
359359 # Original callback should still be registered
360360 self .is_not_empty ()
361361
362+ @pytest .mark .parametrize ('pickle' , [True , False ])
363+ @pytest .mark .parametrize ('cls' , [Hashable , Unhashable ])
364+ def test_callback_disconnect_func_all_signals (self , pickle , cls ):
365+ # Test disconnecting a callback from all signals at once
366+ self .is_empty ()
367+
368+ mini_me = cls ()
369+
370+ # Connect to multiple signals
371+ self .callbacks .connect ('signal1' , mini_me .dummy )
372+ self .callbacks .connect ('signal2' , mini_me .dummy )
373+ assert len (list (self .callbacks ._func_cid_map )) == 2
374+
375+ # Disconnect from all signals at once (no signal specified)
376+ self .callbacks .disconnect (mini_me .dummy )
377+
378+ # All callbacks should be removed
379+ self .is_empty ()
380+
381+ def test_disconnect_cid_with_signal_raises (self ):
382+ # Passing signal with a cid should raise an error
383+ self .is_empty ()
384+ cid = self .callbacks .connect (self .signal , lambda : None )
385+ with pytest .raises (ValueError , match = "signal cannot be specified" ):
386+ self .callbacks .disconnect (cid , signal = self .signal )
387+
388+ @pytest .mark .parametrize ('pickle' , [True , False ])
389+ @pytest .mark .parametrize ('cls' , [Hashable , Unhashable ])
390+ def test_callback_disconnect_func_selective (self , pickle , cls ):
391+ # Test selectively disconnecting a callback from one signal
392+ # while keeping it connected to another
393+ self .is_empty ()
394+
395+ mini_me = cls ()
396+
397+ # Connect same function to multiple signals
398+ self .callbacks .connect ('signal1' , mini_me .dummy )
399+ self .callbacks .connect ('signal2' , mini_me .dummy )
400+ assert len (list (self .callbacks ._func_cid_map )) == 2
401+
402+ # Disconnect from only signal1
403+ self .callbacks .disconnect (mini_me .dummy , signal = 'signal1' )
404+
405+ # Should still have one callback registered (on signal2)
406+ assert len (list (self .callbacks ._func_cid_map )) == 1
407+ assert 'signal2' in self .callbacks .callbacks
408+ assert 'signal1' not in self .callbacks .callbacks
409+
410+ # Disconnect from signal2
411+ self .callbacks .disconnect (mini_me .dummy , signal = 'signal2' )
412+
413+ # Now all should be removed
414+ self .is_empty ()
415+
362416 @pytest .mark .parametrize ('pickle' , [True , False ])
363417 @pytest .mark .parametrize ('cls' , [Hashable , Unhashable ])
364418 def test_registration_on_non_empty_registry (self , pickle , cls ):
0 commit comments