[Checkins] SVN: Acquisition/trunk/src/Acquisition/tests.py Document strange behavior with parent pointer cycles involving an intermediate object, but show that these don't lead to infinite recursion

Hanno Schlichting hannosch at hannosch.eu
Sat Feb 19 11:14:20 EST 2011


Log message for revision 120449:
  Document strange behavior with parent pointer cycles involving an intermediate object, but show that these don't lead to infinite recursion
  

Changed:
  U   Acquisition/trunk/src/Acquisition/tests.py

-=-
Modified: Acquisition/trunk/src/Acquisition/tests.py
===================================================================
--- Acquisition/trunk/src/Acquisition/tests.py	2011-02-19 16:13:16 UTC (rev 120448)
+++ Acquisition/trunk/src/Acquisition/tests.py	2011-02-19 16:14:19 UTC (rev 120449)
@@ -2427,7 +2427,46 @@
         self.assertRaises(AttributeError, Acquisition.aq_acquire,
             y, 'non_existant_attr')
 
+    def test_parent_parent_parent_circles(self):
+        class Impl(Acquisition.Implicit):
+            hello = 'world'
+        class Impl2(Acquisition.Implicit):
+            hello = 'world'
+        class Impl3(Acquisition.Implicit):
+            hello = 'world2'
+            only = 'here'
 
+        a = Impl()
+        b = Impl2()
+        c = Impl3()
+        a.__parent__ = b
+        b.__parent__ = c
+        c.__parent__ = a
+
+        # This is not quite what you'd expect, an AQ circle with an
+        # intermediate object gives strange results
+        self.assertTrue(a.__parent__.__parent__ is a)
+        self.assertTrue(a.__parent__.__parent__.__parent__.aq_base is b)
+        self.assertTrue(b.__parent__.__parent__ is b)
+        self.assertTrue(c.__parent__.__parent__ is c)
+
+        self.assertEqual(Acquisition.aq_acquire(a, 'hello'), 'world')
+        self.assertEqual(Acquisition.aq_acquire(b, 'hello'), 'world')
+        self.assertEqual(Acquisition.aq_acquire(c, 'hello'), 'world2')
+
+        self.assertRaises(AttributeError, Acquisition.aq_acquire,
+            a, 'only')
+        self.assertEqual(Acquisition.aq_acquire(b, 'only'), 'here')
+        self.assertEqual(Acquisition.aq_acquire(c, 'only'), 'here')
+
+        self.assertRaises(AttributeError, Acquisition.aq_acquire,
+            a, 'non_existant_attr')
+        self.assertRaises(AttributeError, Acquisition.aq_acquire,
+            b, 'non_existant_attr')
+        self.assertRaises(AttributeError, Acquisition.aq_acquire,
+            c, 'non_existant_attr')
+
+
 class TestUnicode(unittest.TestCase):
 
     def test_implicit_aq_unicode_should_be_called(self):



More information about the checkins mailing list