def test_ownership_diagram(self): info = Info() system = DeleteListenerSystem(info.record_deletion) builder = DiagramBuilder() # `system` is now owned by `builder`. builder.AddSystem(system) # `system` is now owned by `diagram`. diagram = builder.Build() # Delete the builder. Should still be alive. del builder self.assertFalse(info.deleted) # Delete the diagram. Should be dead. del diagram # Using `py::keep_alive`, `system` will keep `builder` alive after # `.AddSystem` is called, and `builder` will keep `diagram` alive after # `.Build` is called. # Transitively, `system` will keep `builder` alive (as its old owner) # and `diagram` (as its new owner, which is kept alive by `builder`). self.assertFalse(info.deleted) self.assertTrue(system is not None) del system # Upon removing this reference, everything should have been cleared up. # However, since we work around #14355 by inducing a keep_alive cycle, # it will not be deleted. self.assertFalse(info.deleted)
def test_ownership_multiple_containers(self): info = Info() system = DeleteListenerSystem(info.record_deletion) builder_1 = DiagramBuilder() builder_2 = DiagramBuilder() builder_1.AddSystem(system) # This is tested in our fork of `pybind11`, but echoed here for when # we decide to switch to use `shared_ptr`. with self.assertRaises(RuntimeError): # This should throw an error from `pybind11`, since two containers # are trying to own a unique_ptr-held object. builder_2.AddSystem(system)
def test_ownership_simulator(self): info = Info() system = DeleteListenerSystem(info.record_deletion) simulator = Simulator(system) self.assertFalse(info.deleted) del simulator # Simulator does not own the system. self.assertFalse(info.deleted) self.assertTrue(system is not None) # Now ensure that having a system be alive will keep # the system alive (using `py::keep_alive`). simulator = Simulator(system) del system self.assertFalse(info.deleted) del simulator self.assertTrue(info.deleted)
def test_basic(self): info = Info() system = DeleteListenerSystem(info.record_deletion) self.assertFalse(info.deleted) del system self.assertTrue(info.deleted)