test_event.py 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. from panda3d.core import Event, EventQueue
  2. from contextlib import contextmanager
  3. import gc
  4. @contextmanager
  5. def gc_disabled():
  6. gc.disable()
  7. gc.collect()
  8. gc.freeze()
  9. gc.set_debug(gc.DEBUG_SAVEALL)
  10. try:
  11. yield
  12. finally:
  13. gc.set_debug(0)
  14. gc.garbage.clear()
  15. gc.unfreeze()
  16. gc.collect()
  17. gc.enable()
  18. def test_event_subclass_gc():
  19. class PythonEvent(Event):
  20. pass
  21. # Only subclasses should be tracked by the GC
  22. assert not gc.is_tracked(Event('test'))
  23. # Python wrapper destructs last
  24. with gc_disabled():
  25. event = PythonEvent('test_event_subclass_gc1')
  26. assert event in gc.get_objects()
  27. event = None
  28. gc.collect()
  29. assert len(gc.garbage) == 1
  30. assert gc.garbage[0].name == 'test_event_subclass_gc1'
  31. # C++ reference destructs last
  32. with gc_disabled():
  33. event = PythonEvent('test_event_subclass_gc2')
  34. queue = EventQueue()
  35. queue.queue_event(event)
  36. assert event in gc.get_objects()
  37. event = None
  38. # Hasn't been collected yet, since parent still holds a reference
  39. gc.collect()
  40. assert len(gc.garbage) == 0
  41. assert 'test_event_subclass_gc2' in [obj.name for obj in gc.get_objects() if isinstance(obj, Event)]
  42. queue = None
  43. # Destructed without needing the GC
  44. assert 'test_event_subclass_gc2' not in [obj.name for obj in gc.get_objects() if isinstance(obj, Event)]
  45. gc.collect()
  46. assert len(gc.garbage) == 0