Ejemplo n.º 1
0
 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)
Ejemplo n.º 2
0
 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)
Ejemplo n.º 3
0
 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)
Ejemplo n.º 4
0
 def test_basic(self):
     info = Info()
     system = DeleteListenerSystem(info.record_deletion)
     self.assertFalse(info.deleted)
     del system
     self.assertTrue(info.deleted)