[Zope-Checkins] CVS: ZODB3/Persistence/tests - testPersistent.py:1.1.2.2

Jeremy Hylton jeremy@zope.com
Thu, 3 Jul 2003 14:16:11 -0400


Update of /cvs-repository/ZODB3/Persistence/tests
In directory cvs.zope.org:/tmp/cvs-serv26871/Persistence/tests

Modified Files:
      Tag: zodb33-devel-branch
	testPersistent.py 
Log Message:
Add tests for _p_changed and _p_serial.


=== ZODB3/Persistence/tests/testPersistent.py 1.1.2.1 => 1.1.2.2 ===
--- ZODB3/Persistence/tests/testPersistent.py:1.1.2.1	Thu Jul  3 13:25:14 2003
+++ ZODB3/Persistence/tests/testPersistent.py	Thu Jul  3 14:16:06 2003
@@ -23,6 +23,7 @@
     def __init__(self):
         self.cache = PickleCache(self)
         self.oid = 1
+        self.registered = {}
 
     def add(self, obj):
         obj._p_oid = p64(self.oid)
@@ -36,8 +37,13 @@
     # the following methods must be implemented to be a jar
 
     def setklassstate(self):
+        # I don't know what this method does, but the pickle cache
+        # constructor calls it.
         pass
 
+    def register(self, obj):
+        self.registered[obj] = 1
+
 class P(Persistent):
     pass
 
@@ -72,7 +78,60 @@
         def setoid():
             obj._p_jar = 12
         self.assertRaises(ValueError, setoid)
+
+    def testChanged(self):
+        obj = P()
+        self.jar.add(obj)
+
+        # The value returned for _p_changed can be one of:
+        # 0 -- it is not changed
+        # 1 -- it is changed
+        # None -- it is a ghost
+
+        obj.x = 1
+        self.assertEqual(obj._p_changed, 1)
+        self.assert_(obj in self.jar.registered)
+
+        obj._p_changed = 0
+        self.assertEqual(obj._p_changed, 0)
+        self.jar.registered.clear()
+
+        obj._p_changed = 1
+        self.assertEqual(obj._p_changed, 1)
+        self.assert_(obj in self.jar.registered)
+
+        # setting obj._p_changed to None ghostifies if the
+        # object is in the up-to-date state, but not otherwise.
+        obj._p_changed = None
+        self.assertEqual(obj._p_changed, 1)
+        obj._p_changed = 0
+        # Now it's a ghost.
+        obj._p_changed = None
+        self.assertEqual(obj._p_changed, None)
+
+        obj = P()
+        self.jar.add(obj)
+        obj._p_changed = 1
+        # You can transition directly from modified to ghost if
+        # you delete the _p_changed attribute.
+        del obj._p_changed
+        self.assertEqual(obj._p_changed, None)
+
+    def testSerial(self):
+        noserial = "\000" * 8
+        obj = P()
+        self.assertEqual(obj._p_serial, noserial)
         
+        def set(val):
+            obj._p_serial = val
+        self.assertRaises(ValueError, set, 1)
+        self.assertRaises(ValueError, set, "0123")
+        self.assertRaises(ValueError, set, "012345678")
+        self.assertRaises(ValueError, set, u"01234567")
+
+        obj._p_serial = "01234567"
+        del obj._p_serial
+        self.assertEqual(obj._p_serial, noserial)
         
 
 def test_suite():