[Zope-Checkins] CVS: Zope/lib/python/Products/PluginIndexes/DateIndex/tests - test_DateIndex.py:1.1.2.3

Martijn Pieters mj@zope.com
Fri, 10 May 2002 18:30:43 -0400


Update of /cvs-repository/Zope/lib/python/Products/PluginIndexes/DateIndex/tests
In directory cvs.zope.org:/tmp/cvs-serv13148/tests

Modified Files:
      Tag: mj-dateindexes_integration-branch
	test_DateIndex.py 
Log Message:
Checkpoint. Potential bugfix, remove duplicate override in index class, extend
tests. There is a bug triggered by the tests I have to squash.


=== Zope/lib/python/Products/PluginIndexes/DateIndex/tests/test_DateIndex.py 1.1.2.2 => 1.1.2.3 ===
         return self._date
 
-dummies = (Dummy('a', None), Dummy('b', DateTime(0)), Dummy('c',
-DateTime('2002-05-08 15:16:17')))
-
-def matchingDummies(value):
-    return [d for d in dummies if d.date() == value]
+    def __str__(self):
+        return "<Dummy %s, date %s>" % (self._name, str(self._date))
 
 class DI_Tests(unittest.TestCase):
+    def setUp(self):
+        self._values = (
+            (0, Dummy('a', None)),
+            (1, Dummy('b', DateTime(0))),
+            (2, Dummy('c', DateTime('2002-05-08 15:16:17'))),
+            (3, Dummy('d', DateTime('2032-05-08 15:16:17'))),
+            (4, Dummy('e', DateTime('2062-05-08 15:16:17'))),
+            (5, Dummy('e', DateTime('2062-05-08 15:16:17')))
+        )
+        self._index = DateIndex('date')
+        self._noop_req  = {'bar': 123}
+        self._request   = {'date': DateTime(0)}
+        self._min_req   = {'date': DateTime('2032-05-08 15:16:17'),
+            'date_usage': 'range:min'}
+        self._max_req   = {'date': DateTime('2032-05-08 15:16:17'),
+            'date_usage': 'range:max'}
+        self._range_req = {'date': (DateTime('2002-05-08 15:16:17'),
+                                    DateTime('2062-05-08 15:16:17')),
+                           'date_usage': 'range:min:max'}
+        self._zero_req  = {'date': 0}
+        self._none_req  = {'date': None}
+
+    def _populateIndex( self ):
+        for k, v in self._values:
+            self._index.index_object(k, v)
+
+    def _checkApply(self, req, expectedValues):
+        result, used = self._index._apply_index(req)
+        if hasattr(result, 'keys'):
+            result = result.keys()
+        self.failUnlessEqual(used, ('date',))
+        self.failUnlessEqual(len(result), len(expectedValues), 
+            '%s | %s' % (map(None, result), expectedValues))
+        for k, v in expectedValues:
+            self.failUnless(k in result)
+
+    def _convert(self, date):
+        yr, mo, dy, hr, mn = date.parts()[:5]
+        return (((yr * 12 + mo) * 31 + dy) * 24 + hr) * 60 + mn
+
     def test_empty(self):
-        
-        empty = DateIndex('empty')
+        empty = self._index
 
-        self.assert_(empty.getEntryForObject(1234) is None)
+        self.failUnlessEqual(len(empty), 0)
+        self.failUnlessEqual(len(empty.referencedObjects()), 0)
+        
+        self.failUnless(empty.getEntryForObject(1234) is None)
+        marker = []
+        self.failUnless(empty.getEntryForObject(1234, marker) is marker)
         empty.unindex_object(1234) # shouldn't throw
 
-        assert not empty.uniqueValues('foo')
-        assert not empty.uniqueValues('foo', 1)
-
-        assert empty._apply_index({'zed' : 12345}) is None
-
-        result, used = empty._apply_index({'empty': 12345})
-
-        assert not result
-        assert used == ( None )
+        self.failUnless(empty.hasUniqueValuesFor('date'))
+        self.failIf(empty.hasUniqueValuesFor('foo'))
+        self.failUnlessEqual(len(empty.uniqueValues('date')), 0)
+
+        self.failUnless(empty._apply_index({'zed': 12345}) is None)
+
+        self._checkApply(self._request, [])
+        self._checkApply(self._min_req, [])
+        self._checkApply(self._max_req, [])
+        self._checkApply(self._range_req, [])
 
     def test_retrieval( self ):
-
-        work = DateIndex( 'work', 'date' )
-
-        for i in range( len( dummies ) ):
-            work.index_object( i, dummies[i] )
-
-        for i in range( len( dummies ) ):
-            assert work.getEntryForObject( i ) == dummies[i].date()
+        self._populateIndex()
+        values = self._values
+        index = self._index
+
+        self.failUnlessEqual(len(index), len(values) - 2) # One dupe, one empty
+        self.failUnlessEqual(len(index.referencedObjects()), len(values) - 1)
+            # One empty
+
+        self.failUnless(index.getEntryForObject(1234) is None)
+        marker = []
+        self.failUnless(index.getEntryForObject(1234, marker) is marker)
+        index.unindex_object(1234) # shouldn't throw
+        
+        for k, v in values:
+            if v.date():
+                self.failUnlessEqual(self._index.getEntryForObject(k),
+                    self._convert(v.date()))
+
+        self.failUnlessEqual(len(index.uniqueValues('date')), len(values) - 2)
+        self.failUnless(index._apply_index(self._noop_req) is None)
+
+        self._checkApply(self._request, values[1:2])
+        self._checkApply(self._min_req, values[3:])
+        self._checkApply(self._max_req, values[1:3])
+        self._checkApply(self._range_req, values[2:4] )
 
 def test_suite():
     suite = unittest.TestSuite()