10a8c90248264a8b26970b4473770bcc3df8515fJosh Gao"""TestCases for exercising a Recno DB.
20a8c90248264a8b26970b4473770bcc3df8515fJosh Gao"""
30a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
40a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoimport os, sys
50a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoimport errno
60a8c90248264a8b26970b4473770bcc3df8515fJosh Gaofrom pprint import pprint
70a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoimport unittest
80a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
90a8c90248264a8b26970b4473770bcc3df8515fJosh Gaofrom test_all import db, test_support, verbose, get_new_environment_path, get_new_database_path
100a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
110a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoletters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
120a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
130a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
140a8c90248264a8b26970b4473770bcc3df8515fJosh Gao#----------------------------------------------------------------------
150a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
160a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoclass SimpleRecnoTestCase(unittest.TestCase):
170a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    if (sys.version_info < (2, 7)) or ((sys.version_info >= (3, 0)) and
180a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            (sys.version_info < (3, 2))) :
190a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        def assertIsInstance(self, obj, datatype, msg=None) :
200a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            return self.assertEqual(type(obj), datatype, msg=msg)
210a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        def assertGreaterEqual(self, a, b, msg=None) :
220a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            return self.assertTrue(a>=b, msg=msg)
230a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
240a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
250a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    def setUp(self):
260a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.filename = get_new_database_path()
270a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.homeDir = None
280a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
290a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    def tearDown(self):
300a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        test_support.unlink(self.filename)
310a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        if self.homeDir:
320a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            test_support.rmtree(self.homeDir)
330a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
340a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    def test01_basic(self):
350a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        d = db.DB()
360a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
370a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        get_returns_none = d.set_get_returns_none(2)
380a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        d.set_get_returns_none(get_returns_none)
390a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
400a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        d.open(self.filename, db.DB_RECNO, db.DB_CREATE)
410a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
420a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        for x in letters:
430a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            recno = d.append(x * 60)
440a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            self.assertIsInstance(recno, int)
450a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            self.assertGreaterEqual(recno, 1)
460a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            if verbose:
470a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                print recno,
480a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
490a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        if verbose: print
500a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
510a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        stat = d.stat()
520a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        if verbose:
530a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            pprint(stat)
540a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
550a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        for recno in range(1, len(d)+1):
560a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            data = d[recno]
570a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            if verbose:
580a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                print data
590a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
600a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            self.assertIsInstance(data, str)
610a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            self.assertEqual(data, d.get(recno))
620a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
630a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        try:
640a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            data = d[0]  # This should raise a KeyError!?!?!
650a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        except db.DBInvalidArgError, val:
660a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            if sys.version_info < (2, 6) :
670a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                self.assertEqual(val[0], db.EINVAL)
680a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            else :
690a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                self.assertEqual(val.args[0], db.EINVAL)
700a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            if verbose: print val
710a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        else:
720a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            self.fail("expected exception")
730a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
740a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # test that has_key raises DB exceptions (fixed in pybsddb 4.3.2)
750a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        try:
760a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            d.has_key(0)
770a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        except db.DBError, val:
780a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            pass
790a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        else:
800a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            self.fail("has_key did not raise a proper exception")
810a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
820a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        try:
830a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            data = d[100]
840a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        except KeyError:
850a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            pass
860a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        else:
870a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            self.fail("expected exception")
880a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
890a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        try:
900a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            data = d.get(100)
910a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        except db.DBNotFoundError, val:
920a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            if get_returns_none:
930a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                self.fail("unexpected exception")
940a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        else:
950a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            self.assertEqual(data, None)
960a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
970a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        keys = d.keys()
980a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        if verbose:
990a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            print keys
1000a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertIsInstance(keys, list)
1010a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertIsInstance(keys[0], int)
1020a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(len(keys), len(d))
1030a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
1040a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        items = d.items()
1050a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        if verbose:
1060a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            pprint(items)
1070a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertIsInstance(items, list)
1080a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertIsInstance(items[0], tuple)
1090a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(len(items[0]), 2)
1100a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertIsInstance(items[0][0], int)
1110a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertIsInstance(items[0][1], str)
1120a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(len(items), len(d))
1130a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
1140a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertTrue(d.has_key(25))
1150a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
1160a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        del d[25]
1170a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertFalse(d.has_key(25))
1180a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
1190a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        d.delete(13)
1200a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertFalse(d.has_key(13))
1210a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
1220a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        data = d.get_both(26, "z" * 60)
1230a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(data, "z" * 60, 'was %r' % data)
1240a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        if verbose:
1250a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            print data
1260a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
1270a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        fd = d.fd()
1280a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        if verbose:
1290a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            print fd
1300a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
1310a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        c = d.cursor()
1320a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        rec = c.first()
1330a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        while rec:
1340a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            if verbose:
1350a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                print rec
1360a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            rec = c.next()
1370a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
1380a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        c.set(50)
1390a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        rec = c.current()
1400a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        if verbose:
1410a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            print rec
1420a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
1430a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        c.put(-1, "a replacement record", db.DB_CURRENT)
1440a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
1450a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        c.set(50)
1460a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        rec = c.current()
1470a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(rec, (50, "a replacement record"))
1480a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        if verbose:
1490a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            print rec
1500a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
1510a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        rec = c.set_range(30)
1520a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        if verbose:
1530a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            print rec
1540a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
1550a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # test that non-existent key lookups work (and that
1560a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # DBC_set_range doesn't have a memleak under valgrind)
1570a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        rec = c.set_range(999999)
1580a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(rec, None)
1590a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        if verbose:
1600a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            print rec
1610a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
1620a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        c.close()
1630a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        d.close()
1640a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
1650a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        d = db.DB()
1660a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        d.open(self.filename)
1670a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        c = d.cursor()
1680a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
1690a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # put a record beyond the consecutive end of the recno's
1700a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        d[100] = "way out there"
1710a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(d[100], "way out there")
1720a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
1730a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        try:
1740a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            data = d[99]
1750a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        except KeyError:
1760a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            pass
1770a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        else:
1780a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            self.fail("expected exception")
1790a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
1800a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        try:
1810a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            d.get(99)
1820a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        except db.DBKeyEmptyError, val:
1830a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            if get_returns_none:
1840a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                self.fail("unexpected DBKeyEmptyError exception")
1850a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            else:
1860a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                if sys.version_info < (2, 6) :
1870a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                    self.assertEqual(val[0], db.DB_KEYEMPTY)
1880a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                else :
1890a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                    self.assertEqual(val.args[0], db.DB_KEYEMPTY)
1900a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                if verbose: print val
1910a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        else:
1920a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            if not get_returns_none:
1930a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                self.fail("expected exception")
1940a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
1950a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        rec = c.set(40)
1960a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        while rec:
1970a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            if verbose:
1980a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                print rec
1990a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            rec = c.next()
2000a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
2010a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        c.close()
2020a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        d.close()
2030a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
2040a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    def test02_WithSource(self):
2050a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        """
2060a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        A Recno file that is given a "backing source file" is essentially a
2070a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        simple ASCII file.  Normally each record is delimited by \n and so is
2080a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        just a line in the file, but you can set a different record delimiter
2090a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        if needed.
2100a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        """
2110a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        homeDir = get_new_environment_path()
2120a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.homeDir = homeDir
2130a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        source = os.path.join(homeDir, 'test_recno.txt')
2140a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        if not os.path.isdir(homeDir):
2150a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            os.mkdir(homeDir)
2160a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        f = open(source, 'w') # create the file
2170a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        f.close()
2180a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
2190a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        d = db.DB()
2200a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # This is the default value, just checking if both int
2210a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        d.set_re_delim(0x0A)
2220a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        d.set_re_delim('\n')  # and char can be used...
2230a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        d.set_re_source(source)
2240a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        d.open(self.filename, db.DB_RECNO, db.DB_CREATE)
2250a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
2260a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        data = "The quick brown fox jumped over the lazy dog".split()
2270a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        for datum in data:
2280a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            d.append(datum)
2290a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        d.sync()
2300a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        d.close()
2310a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
2320a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # get the text from the backing source
2330a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        f = open(source, 'r')
2340a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        text = f.read()
2350a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        f.close()
2360a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        text = text.strip()
2370a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        if verbose:
2380a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            print text
2390a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            print data
2400a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            print text.split('\n')
2410a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
2420a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(text.split('\n'), data)
2430a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
2440a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # open as a DB again
2450a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        d = db.DB()
2460a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        d.set_re_source(source)
2470a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        d.open(self.filename, db.DB_RECNO)
2480a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
2490a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        d[3] = 'reddish-brown'
2500a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        d[8] = 'comatose'
2510a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
2520a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        d.sync()
2530a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        d.close()
2540a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
2550a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        f = open(source, 'r')
2560a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        text = f.read()
2570a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        f.close()
2580a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        text = text.strip()
2590a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        if verbose:
2600a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            print text
2610a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            print text.split('\n')
2620a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
2630a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(text.split('\n'),
2640a8c90248264a8b26970b4473770bcc3df8515fJosh Gao           "The quick reddish-brown fox jumped over the comatose dog".split())
2650a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
2660a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    def test03_FixedLength(self):
2670a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        d = db.DB()
2680a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        d.set_re_len(40)  # fixed length records, 40 bytes long
2690a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        d.set_re_pad('-') # sets the pad character...
2700a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        d.set_re_pad(45)  # ...test both int and char
2710a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        d.open(self.filename, db.DB_RECNO, db.DB_CREATE)
2720a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
2730a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        for x in letters:
2740a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            d.append(x * 35)    # These will be padded
2750a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
2760a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        d.append('.' * 40)      # this one will be exact
2770a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
2780a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        try:                    # this one will fail
2790a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            d.append('bad' * 20)
2800a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        except db.DBInvalidArgError, val:
2810a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            if sys.version_info < (2, 6) :
2820a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                self.assertEqual(val[0], db.EINVAL)
2830a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            else :
2840a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                self.assertEqual(val.args[0], db.EINVAL)
2850a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            if verbose: print val
2860a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        else:
2870a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            self.fail("expected exception")
2880a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
2890a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        c = d.cursor()
2900a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        rec = c.first()
2910a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        while rec:
2920a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            if verbose:
2930a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                print rec
2940a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            rec = c.next()
2950a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
2960a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        c.close()
2970a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        d.close()
2980a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
2990a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    def test04_get_size_empty(self) :
3000a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        d = db.DB()
3010a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        d.open(self.filename, dbtype=db.DB_RECNO, flags=db.DB_CREATE)
3020a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
3030a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        row_id = d.append(' ')
3040a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(1, d.get_size(key=row_id))
3050a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        row_id = d.append('')
3060a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(0, d.get_size(key=row_id))
3070a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
3080a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
3090a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
3100a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
3110a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
3120a8c90248264a8b26970b4473770bcc3df8515fJosh Gao#----------------------------------------------------------------------
3130a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
3140a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
3150a8c90248264a8b26970b4473770bcc3df8515fJosh Gaodef test_suite():
3160a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    return unittest.makeSuite(SimpleRecnoTestCase)
3170a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
3180a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
3190a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoif __name__ == '__main__':
3200a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    unittest.main(defaultTest='test_suite')
321