[Zope-CVS] CVS: Packages/pypes/pypes/tests - test_query.py:1.1 runtests.py:1.6

Casey Duncan casey at zope.com
Tue Mar 30 23:58:10 EST 2004


Update of /cvs-repository/Packages/pypes/pypes/tests
In directory cvs.zope.org:/tmp/cvs-serv9981/tests

Modified Files:
	runtests.py 
Added Files:
	test_query.py 
Log Message:
Add basic scan and sort query primitives w/tests


=== Added File Packages/pypes/pypes/tests/test_query.py ===
##############################################################################
#
# Copyright (c) 2004 Zope Corporation and Contributors.
# All Rights Reserved.
#
# This software is subject to the provisions of the Zope Public License,
# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE.
#
##############################################################################
"""Query tests

$Id: test_query.py,v 1.1 2004/03/31 04:58:09 caseman Exp $"""

import unittest
from sets import Set
from zope.interface import implements
from zope.interface.verify import verifyObject
from persistent import Persistent
from pypes.interfaces import IExpression
from pypes.tests.common import sort, PypesTestCase, TestClass
            
class DummyExpr:
    
    implements(IExpression)
    
    def __init__(self, func, names=[]):
        self._func = func
        self._names = Set(names)
    
    def names(self):
        return self._names
    
    def freeNames(self, free_names=[]):
        return self._names
    
    def freeOperands(self, free_names=[]):
        return []
    
    def optimize(self, free_names=[]):
        pass
    
    def __call__(self, *args, **kw):
        return self._func(*args, **kw)


class TestScanner(unittest.TestCase):
    
    def setUp(self):
        self.foos = [TestClass(foo=i) for i in range(10)]
        self.bars = [TestClass(bar=chr(i+65)) for i in range(26)]
    
    def test_scan_one_input(self):
        from pypes.query import scan
        rows = [row.copy() for row in scan(foo=self.foos)]
        for foo, row in zip(self.foos, rows):
            self.assertEqual(len(row), 1)
            self.failUnless(row['foo'] is foo)
    
    def test_scan_one_self_named_input(self):
        from pypes.query import scan
        from UserList import UserList     
        foos = UserList(self.foos)
        foos.__name__ = 'yahoozie'
        rows = [row.copy() for row in scan(foos)]
        for foo, row in zip(self.foos, rows):
            self.assertEqual(len(row), 1)
            self.failUnless(row['yahoozie'] is foo)

    def test_scan_unnamed_fails(self):
        from pypes.query import scan
        from pypes.exceptions import PypesQueryInputError
        rows = scan(self.foos)
        self.assertRaises(PypesQueryInputError, list, rows)

    def test_scan_with_dupe_names_fails(self):
        from pypes.query import scan
        from pypes.exceptions import PypesQueryInputError
        from UserList import UserList     
        foos = UserList(self.foos)
        foos.__name__ = 'johndoe'     
        bars = UserList(self.bars)
        bars.__name__ = 'johndoe'
        rows = scan(foos, bars)
        self.assertRaises(PypesQueryInputError, list, rows)
        rows = scan(bars, johndoe=foos)
        self.assertRaises(PypesQueryInputError, list, rows)
    
    def test_scan_multiple_inputs(self):
        from sets import Set
        from pypes.query import scan
        rows = [row.copy() for row in scan(foo=self.foos, bar=self.bars)]
        self.assertEqual(len(rows), len(self.foos) * len(self.bars))
        expected = [{'foo':foo, 'bar':bar} 
                    for foo in self.foos for bar in self.bars]
        self.assertEqual(sort(rows), sort(expected))
    
    def test_scan_multiple_self_named_inputs(self):
        from sets import Set
        from pypes.query import scan
        from UserList import UserList
        foos = UserList(self.foos)
        foos.__name__ = 'yup'     
        bars = UserList(self.bars)
        bars.__name__ = 'nope'
        rows = [row.copy() for row in scan(foos, bars)]
        self.assertEqual(len(rows), len(self.foos) * len(self.bars))
        expected = [{'yup':foo, 'nope':bar} 
                    for foo in self.foos for bar in self.bars]
        self.assertEqual(sort(rows), sort(expected))               

class TestSort(unittest.TestCase):
    
    def setUp(self):
        self.ordered = [TestClass(foo=i) for i in range(10)]
        scrambled = []
        for i in range(5):
            scrambled.insert(-1, self.ordered[i])
            scrambled.insert(1, self.ordered[9-i])
        self.scrambled = scrambled
    
    def test_sort_simple(self):
        from pypes.query import sort
        sorted = list(sort(self.scrambled, lambda x: x.foo))
        self.assertEqual(sorted, self.ordered)
        
    def test_sort_descending(self):
        from pypes.query import sort, descending
        sorted = list(sort(self.scrambled, lambda x: x.foo, descending))
        self.ordered.reverse()
        self.assertEqual(sorted, self.ordered)
        
    def test_sort_limit_ascending(self):
        from pypes.query import sort
        sorted = list(sort(self.scrambled, lambda x: x.foo, limit=3))
        self.assertEqual(sorted, self.ordered[:3])
        
    def test_sort_limit_descending(self):
        from pypes.query import sort, descending
        sorted = list(
            sort(self.scrambled, lambda x: x.foo, descending, limit=3))
        self.ordered.reverse()
        self.assertEqual(sorted, self.ordered[:3])
            
    
if __name__ == '__main__':
    unittest.main()


=== Packages/pypes/pypes/tests/runtests.py 1.5 => 1.6 ===
--- Packages/pypes/pypes/tests/runtests.py:1.5	Sun Mar  7 05:09:13 2004
+++ Packages/pypes/pypes/tests/runtests.py	Tue Mar 30 23:58:09 2004
@@ -11,6 +11,7 @@
 from test_graph import *
 from test_expression import *
 from test_extent import *
+from test_query import *
 from test_util import *
 
 if __name__ == '__main__':




More information about the Zope-CVS mailing list