def testOwnershipTransference(self): '''Ownership transference from Python to C++ and back again.''' p1 = Point(10, 20) bb = BlackBox() p1_ticket = bb.keepPoint(p1) self.assertRaises(RuntimeError, p1.x) p1_ret = bb.retrievePoint(p1_ticket) self.assertEqual(p1_ret, Point(10, 20))
def testOwnershipTransferenceCppCreated(self): '''Ownership transference using a C++ created object.''' o1 = ObjectType.create() o1.setObjectName('object1') o1_refcnt = sys.getrefcount(o1) bb = BlackBox() o1_ticket = bb.keepObjectType(o1) self.assertRaises(RuntimeError, o1.objectName)
def testBlackBoxReleasingUnknownObjectType(self): '''Asks BlackBox to release an unknown ObjectType.''' o1 = ObjectType() o2 = ObjectType() bb = BlackBox() o1_ticket = bb.keepObjectType(o1) o3 = bb.retrieveObjectType(-5) self.assertEqual(o3, None)
def testOwnershipTransference(self): '''Ownership transference from Python to C++ and back again.''' o1 = ObjectType() o1.setObjectName('object1') o1_refcnt = sys.getrefcount(o1) o2 = ObjectType() o2.setObjectName('object2') o2_refcnt = sys.getrefcount(o2) bb = BlackBox() o1_ticket = bb.keepObjectType(o1) o2_ticket = bb.keepObjectType(o2) self.assertEqual(set(bb.objects()), set([o1, o2])) self.assertEqual(str(o1.objectName()), 'object1') self.assertEqual(str(o2.objectName()), 'object2') self.assertEqual(sys.getrefcount(o1), o1_refcnt + 1) # PySide give +1 ref to object with c++ ownership self.assertEqual(sys.getrefcount(o2), o2_refcnt + 1) o2 = bb.retrieveObjectType(o2_ticket) self.assertEqual(sys.getrefcount(o2), o2_refcnt) del bb self.assertRaises(RuntimeError, o1.objectName) self.assertEqual(str(o2.objectName()), 'object2') self.assertEqual(sys.getrefcount(o2), o2_refcnt)
def testInvalidateParent(self): '''Invalidate parent should invalidate children''' parent = ObjectType.create() child1 = ObjectType(parent) child1.setObjectName("child1") child2 = ObjectType.create() child2.setObjectName("child2") child2.setParent(parent) grandchild1 = ObjectType(child1) grandchild1.setObjectName("grandchild1") grandchild2 = ObjectType.create() grandchild2.setObjectName("grandchild2") grandchild2.setParent(child2) bbox = BlackBox() bbox.keepObjectType(parent) # Should invalidate the parent self.assertRaises(RuntimeError, parent.objectName) # some children still valid they are wrapper classes self.assertEqual(child1.objectName(), "child1") self.assertRaises(RuntimeError, child2.objectName) self.assertEqual(grandchild1.objectName(), "grandchild1") self.assertRaises(RuntimeError, grandchild2.objectName)
def testInvalidateChild(self): '''Invalidating method call should remove child from the care of a parent if it has one.''' parent = ObjectType() child1 = ObjectType(parent) child1.setObjectName('child1') child2 = ObjectType.create() child2.setParent(parent) child2.setObjectName('child2') self.assertEqual(parent.children(), [child1, child2]) bbox = BlackBox() # This method steals ownership from Python to C++. bbox.keepObjectType(child1) self.assertEqual(parent.children(), [child2]) bbox.keepObjectType(child2) self.assertEqual(parent.children(), []) del parent self.assertEqual(child1.objectName(), 'child1') self.assertRaises(RuntimeError, child2.objectName)