1 """TestCases for exercising a Recno DB.
6 from pprint
import pprint
9 from test_all
import db
, test_support
, verbose
, get_new_environment_path
, get_new_database_path
11 letters
= 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
14 #----------------------------------------------------------------------
16 class SimpleRecnoTestCase(unittest
.TestCase
):
18 if sys
.version_info
[:3] < (2, 4, 0):
19 def assertFalse(self
, expr
, msg
=None):
20 self
.failIf(expr
,msg
=msg
)
23 self
.filename
= get_new_database_path()
27 test_support
.unlink(self
.filename
)
29 test_support
.rmtree(self
.homeDir
)
31 def test01_basic(self
):
34 get_returns_none
= d
.set_get_returns_none(2)
35 d
.set_get_returns_none(get_returns_none
)
37 d
.open(self
.filename
, db
.DB_RECNO
, db
.DB_CREATE
)
40 recno
= d
.append(x
* 60)
41 self
.assertEqual(type(recno
), type(0))
42 self
.assert_(recno
>= 1)
52 for recno
in range(1, len(d
)+1):
57 self
.assertEqual(type(data
), type(""))
58 self
.assertEqual(data
, d
.get(recno
))
61 data
= d
[0] # This should raise a KeyError!?!?!
62 except db
.DBInvalidArgError
, val
:
64 if sys
.version_info
[0] < 3 :
65 self
.assertEqual(val
[0], db
.EINVAL
)
67 self
.assertEqual(val
.args
[0], db
.EINVAL
)
70 self
.fail("expected exception")
72 # test that has_key raises DB exceptions (fixed in pybsddb 4.3.2)
75 except db
.DBError
, val
:
78 self
.fail("has_key did not raise a proper exception")
85 self
.fail("expected exception")
89 except db
.DBNotFoundError
, val
:
91 self
.fail("unexpected exception")
93 self
.assertEqual(data
, None)
98 self
.assertEqual(type(keys
), type([]))
99 self
.assertEqual(type(keys
[0]), type(123))
100 self
.assertEqual(len(keys
), len(d
))
105 self
.assertEqual(type(items
), type([]))
106 self
.assertEqual(type(items
[0]), type(()))
107 self
.assertEqual(len(items
[0]), 2)
108 self
.assertEqual(type(items
[0][0]), type(123))
109 self
.assertEqual(type(items
[0][1]), type(""))
110 self
.assertEqual(len(items
), len(d
))
112 self
.assert_(d
.has_key(25))
115 self
.assertFalse(d
.has_key(25))
118 self
.assertFalse(d
.has_key(13))
120 data
= d
.get_both(26, "z" * 60)
121 self
.assertEqual(data
, "z" * 60, 'was %r' % data
)
141 c
.put(-1, "a replacement record", db
.DB_CURRENT
)
145 self
.assertEqual(rec
, (50, "a replacement record"))
149 rec
= c
.set_range(30)
153 # test that non-existent key lookups work (and that
154 # DBC_set_range doesn't have a memleak under valgrind)
155 rec
= c
.set_range(999999)
156 self
.assertEqual(rec
, None)
164 d
.open(self
.filename
)
167 # put a record beyond the consecutive end of the recno's
168 d
[100] = "way out there"
169 self
.assertEqual(d
[100], "way out there")
176 self
.fail("expected exception")
180 except db
.DBKeyEmptyError
, val
:
182 self
.fail("unexpected DBKeyEmptyError exception")
184 self
.assertEqual(val
[0], db
.DB_KEYEMPTY
)
185 if verbose
: print val
187 if not get_returns_none
:
188 self
.fail("expected exception")
199 def test02_WithSource(self
):
201 A Recno file that is given a "backing source file" is essentially a
202 simple ASCII file. Normally each record is delimited by \n and so is
203 just a line in the file, but you can set a different record delimiter
206 homeDir
= get_new_environment_path()
207 self
.homeDir
= homeDir
208 source
= os
.path
.join(homeDir
, 'test_recno.txt')
209 if not os
.path
.isdir(homeDir
):
211 f
= open(source
, 'w') # create the file
215 # This is the default value, just checking if both int
217 d
.set_re_delim('\n') # and char can be used...
218 d
.set_re_source(source
)
219 d
.open(self
.filename
, db
.DB_RECNO
, db
.DB_CREATE
)
221 data
= "The quick brown fox jumped over the lazy dog".split()
227 # get the text from the backing source
228 text
= open(source
, 'r').read()
233 print text
.split('\n')
235 self
.assertEqual(text
.split('\n'), data
)
239 d
.set_re_source(source
)
240 d
.open(self
.filename
, db
.DB_RECNO
)
242 d
[3] = 'reddish-brown'
248 text
= open(source
, 'r').read()
252 print text
.split('\n')
254 self
.assertEqual(text
.split('\n'),
255 "The quick reddish-brown fox jumped over the comatose dog".split())
257 def test03_FixedLength(self
):
259 d
.set_re_len(40) # fixed length records, 40 bytes long
260 d
.set_re_pad('-') # sets the pad character...
261 d
.set_re_pad(45) # ...test both int and char
262 d
.open(self
.filename
, db
.DB_RECNO
, db
.DB_CREATE
)
265 d
.append(x
* 35) # These will be padded
267 d
.append('.' * 40) # this one will be exact
269 try: # this one will fail
271 except db
.DBInvalidArgError
, val
:
273 if sys
.version_info
[0] < 3 :
274 self
.assertEqual(val
[0], db
.EINVAL
)
276 self
.assertEqual(val
.args
[0], db
.EINVAL
)
277 if verbose
: print val
279 self
.fail("expected exception")
292 #----------------------------------------------------------------------
296 return unittest
.makeSuite(SimpleRecnoTestCase
)
299 if __name__
== '__main__':
300 unittest
.main(defaultTest
='test_suite')