test_event.py 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  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 len(gc.get_objects()) == 1
  27. assert gc.get_objects()[0] == event
  28. event = None
  29. gc.collect()
  30. assert len(gc.garbage) == 1
  31. assert gc.garbage[0].name == 'test_event_subclass_gc1'
  32. # C++ reference destructs last
  33. with gc_disabled():
  34. event = PythonEvent('test_event_subclass_gc2')
  35. queue = EventQueue()
  36. queue.queue_event(event)
  37. assert event in gc.get_objects()
  38. event = None
  39. # Hasn't been collected yet, since parent still holds a reference
  40. gc.collect()
  41. assert len(gc.garbage) == 0
  42. assert 'test_event_subclass_gc2' in [obj.name for obj in gc.get_objects() if isinstance(obj, Event)]
  43. queue = None
  44. # Destructed without needing the GC
  45. assert 'test_event_subclass_gc2' not in [obj.name for obj in gc.get_objects() if isinstance(obj, Event)]
  46. gc.collect()
  47. assert len(gc.garbage) == 0