ยปCore Development>Code coverage>Lib/bsddb/test/test_compare.py

Python code coverage for Lib/bsddb/test/test_compare.py

#countcontent
1n/a"""
2n/aTestCases for python DB Btree key comparison function.
3n/a"""
4n/a
5n/aimport sys, os, re
6n/aimport test_all
7n/afrom cStringIO import StringIO
8n/a
9n/aimport unittest
10n/a
11n/afrom test_all import db, dbshelve, test_support, \
12n/a get_new_environment_path, get_new_database_path
13n/a
14n/a
15n/a# Needed for python 3. "cmp" vanished in 3.0.1
16n/adef cmp(a, b) :
17n/a if a==b : return 0
18n/a if a<b : return -1
19n/a return 1
20n/a
21n/alexical_cmp = cmp
22n/a
23n/adef lowercase_cmp(left, right):
24n/a return cmp (left.lower(), right.lower())
25n/a
26n/adef make_reverse_comparator (cmp):
27n/a def reverse (left, right, delegate=cmp):
28n/a return - delegate (left, right)
29n/a return reverse
30n/a
31n/a_expected_lexical_test_data = ['', 'CCCP', 'a', 'aaa', 'b', 'c', 'cccce', 'ccccf']
32n/a_expected_lowercase_test_data = ['', 'a', 'aaa', 'b', 'c', 'CC', 'cccce', 'ccccf', 'CCCP']
33n/a
34n/aclass ComparatorTests (unittest.TestCase):
35n/a if sys.version_info < (2, 4) :
36n/a def assertTrue(self, expr, msg=None) :
37n/a return self.failUnless(expr,msg=msg)
38n/a
39n/a def comparator_test_helper (self, comparator, expected_data):
40n/a data = expected_data[:]
41n/a
42n/a import sys
43n/a if sys.version_info < (2, 6) :
44n/a if sys.version_info < (2, 4) :
45n/a data.sort(comparator)
46n/a else :
47n/a data.sort(cmp=comparator)
48n/a else : # Insertion Sort. Please, improve
49n/a data2 = []
50n/a for i in data :
51n/a for j, k in enumerate(data2) :
52n/a r = comparator(k, i)
53n/a if r == 1 :
54n/a data2.insert(j, i)
55n/a break
56n/a else :
57n/a data2.append(i)
58n/a data = data2
59n/a
60n/a self.assertEqual(data, expected_data,
61n/a "comparator `%s' is not right: %s vs. %s"
62n/a % (comparator, expected_data, data))
63n/a def test_lexical_comparator (self):
64n/a self.comparator_test_helper (lexical_cmp, _expected_lexical_test_data)
65n/a def test_reverse_lexical_comparator (self):
66n/a rev = _expected_lexical_test_data[:]
67n/a rev.reverse ()
68n/a self.comparator_test_helper (make_reverse_comparator (lexical_cmp),
69n/a rev)
70n/a def test_lowercase_comparator (self):
71n/a self.comparator_test_helper (lowercase_cmp,
72n/a _expected_lowercase_test_data)
73n/a
74n/aclass AbstractBtreeKeyCompareTestCase (unittest.TestCase):
75n/a env = None
76n/a db = None
77n/a
78n/a if sys.version_info < (2, 4) :
79n/a def assertTrue(self, expr, msg=None):
80n/a self.failUnless(expr,msg=msg)
81n/a
82n/a if (sys.version_info < (2, 7)) or ((sys.version_info >= (3,0)) and
83n/a (sys.version_info < (3, 2))) :
84n/a def assertLess(self, a, b, msg=None) :
85n/a return self.assertTrue(a<b, msg=msg)
86n/a
87n/a def setUp (self):
88n/a self.filename = self.__class__.__name__ + '.db'
89n/a self.homeDir = get_new_environment_path()
90n/a env = db.DBEnv()
91n/a env.open (self.homeDir,
92n/a db.DB_CREATE | db.DB_INIT_MPOOL
93n/a | db.DB_INIT_LOCK | db.DB_THREAD)
94n/a self.env = env
95n/a
96n/a def tearDown (self):
97n/a self.closeDB()
98n/a if self.env is not None:
99n/a self.env.close()
100n/a self.env = None
101n/a test_support.rmtree(self.homeDir)
102n/a
103n/a def addDataToDB (self, data):
104n/a i = 0
105n/a for item in data:
106n/a self.db.put (item, str (i))
107n/a i = i + 1
108n/a
109n/a def createDB (self, key_comparator):
110n/a self.db = db.DB (self.env)
111n/a self.setupDB (key_comparator)
112n/a self.db.open (self.filename, "test", db.DB_BTREE, db.DB_CREATE)
113n/a
114n/a def setupDB (self, key_comparator):
115n/a self.db.set_bt_compare (key_comparator)
116n/a
117n/a def closeDB (self):
118n/a if self.db is not None:
119n/a self.db.close ()
120n/a self.db = None
121n/a
122n/a def startTest (self):
123n/a pass
124n/a
125n/a def finishTest (self, expected = None):
126n/a if expected is not None:
127n/a self.check_results (expected)
128n/a self.closeDB ()
129n/a
130n/a def check_results (self, expected):
131n/a curs = self.db.cursor ()
132n/a try:
133n/a index = 0
134n/a rec = curs.first ()
135n/a while rec:
136n/a key, ignore = rec
137n/a self.assertLess(index, len (expected),
138n/a "to many values returned from cursor")
139n/a self.assertEqual(expected[index], key,
140n/a "expected value `%s' at %d but got `%s'"
141n/a % (expected[index], index, key))
142n/a index = index + 1
143n/a rec = curs.next ()
144n/a self.assertEqual(index, len (expected),
145n/a "not enough values returned from cursor")
146n/a finally:
147n/a curs.close ()
148n/a
149n/aclass BtreeKeyCompareTestCase (AbstractBtreeKeyCompareTestCase):
150n/a def runCompareTest (self, comparator, data):
151n/a self.startTest ()
152n/a self.createDB (comparator)
153n/a self.addDataToDB (data)
154n/a self.finishTest (data)
155n/a
156n/a def test_lexical_ordering (self):
157n/a self.runCompareTest (lexical_cmp, _expected_lexical_test_data)
158n/a
159n/a def test_reverse_lexical_ordering (self):
160n/a expected_rev_data = _expected_lexical_test_data[:]
161n/a expected_rev_data.reverse ()
162n/a self.runCompareTest (make_reverse_comparator (lexical_cmp),
163n/a expected_rev_data)
164n/a
165n/a def test_compare_function_useless (self):
166n/a self.startTest ()
167n/a def socialist_comparator (l, r):
168n/a return 0
169n/a self.createDB (socialist_comparator)
170n/a self.addDataToDB (['b', 'a', 'd'])
171n/a # all things being equal the first key will be the only key
172n/a # in the database... (with the last key's value fwiw)
173n/a self.finishTest (['b'])
174n/a
175n/a
176n/aclass BtreeExceptionsTestCase (AbstractBtreeKeyCompareTestCase):
177n/a def test_raises_non_callable (self):
178n/a self.startTest ()
179n/a self.assertRaises (TypeError, self.createDB, 'abc')
180n/a self.assertRaises (TypeError, self.createDB, None)
181n/a self.finishTest ()
182n/a
183n/a def test_set_bt_compare_with_function (self):
184n/a self.startTest ()
185n/a self.createDB (lexical_cmp)
186n/a self.finishTest ()
187n/a
188n/a def check_results (self, results):
189n/a pass
190n/a
191n/a def test_compare_function_incorrect (self):
192n/a self.startTest ()
193n/a def bad_comparator (l, r):
194n/a return 1
195n/a # verify that set_bt_compare checks that comparator('', '') == 0
196n/a self.assertRaises (TypeError, self.createDB, bad_comparator)
197n/a self.finishTest ()
198n/a
199n/a def verifyStderr(self, method, successRe):
200n/a """
201n/a Call method() while capturing sys.stderr output internally and
202n/a call self.fail() if successRe.search() does not match the stderr
203n/a output. This is used to test for uncatchable exceptions.
204n/a """
205n/a stdErr = sys.stderr
206n/a sys.stderr = StringIO()
207n/a try:
208n/a method()
209n/a finally:
210n/a temp = sys.stderr
211n/a sys.stderr = stdErr
212n/a errorOut = temp.getvalue()
213n/a if not successRe.search(errorOut):
214n/a self.fail("unexpected stderr output:\n"+errorOut)
215n/a if sys.version_info < (3, 0) : # XXX: How to do this in Py3k ???
216n/a sys.exc_traceback = sys.last_traceback = None
217n/a
218n/a def _test_compare_function_exception (self):
219n/a self.startTest ()
220n/a def bad_comparator (l, r):
221n/a if l == r:
222n/a # pass the set_bt_compare test
223n/a return 0
224n/a raise RuntimeError, "i'm a naughty comparison function"
225n/a self.createDB (bad_comparator)
226n/a #print "\n*** test should print 2 uncatchable tracebacks ***"
227n/a self.addDataToDB (['a', 'b', 'c']) # this should raise, but...
228n/a self.finishTest ()
229n/a
230n/a def test_compare_function_exception(self):
231n/a self.verifyStderr(
232n/a self._test_compare_function_exception,
233n/a re.compile('(^RuntimeError:.* naughty.*){2}', re.M|re.S)
234n/a )
235n/a
236n/a def _test_compare_function_bad_return (self):
237n/a self.startTest ()
238n/a def bad_comparator (l, r):
239n/a if l == r:
240n/a # pass the set_bt_compare test
241n/a return 0
242n/a return l
243n/a self.createDB (bad_comparator)
244n/a #print "\n*** test should print 2 errors about returning an int ***"
245n/a self.addDataToDB (['a', 'b', 'c']) # this should raise, but...
246n/a self.finishTest ()
247n/a
248n/a def test_compare_function_bad_return(self):
249n/a self.verifyStderr(
250n/a self._test_compare_function_bad_return,
251n/a re.compile('(^TypeError:.* return an int.*){2}', re.M|re.S)
252n/a )
253n/a
254n/a
255n/a def test_cannot_assign_twice (self):
256n/a
257n/a def my_compare (a, b):
258n/a return 0
259n/a
260n/a self.startTest()
261n/a self.createDB(my_compare)
262n/a self.assertRaises (RuntimeError, self.db.set_bt_compare, my_compare)
263n/a
264n/adef test_suite ():
265n/a res = unittest.TestSuite ()
266n/a
267n/a res.addTest (unittest.makeSuite (ComparatorTests))
268n/a res.addTest (unittest.makeSuite (BtreeExceptionsTestCase))
269n/a res.addTest (unittest.makeSuite (BtreeKeyCompareTestCase))
270n/a return res
271n/a
272n/aif __name__ == '__main__':
273n/a unittest.main (defaultTest = 'suite')