#! /usr/bin/env python
"""Test script for the bsddb C module
   Roger E. Masse
"""
import bsddb
import tempfile
from test_support import verbose

def test(openmethod, what):

    if verbose:
        print '\nTesting: ', what
        
    fname = tempfile.mktemp()
    f = openmethod(fname, 'c')
    if verbose:
        print 'creation...'
    f['0'] = ''
    f['a'] = 'Guido'
    f['b'] = 'van'
    f['c'] = 'Rossum'
    f['d'] = 'invented'
    f['f'] = 'Python'
    if verbose:
        print '%s %s %s' % (f['a'], f['b'], f['c'])

    if what == 'BTree' :
        if verbose:
            print 'key ordering...'
        f.set_location(f.first()[0])
        while 1:
            try:
                rec = f.next()
            except KeyError:
                if rec <> f.last():
                    print 'Error, last <> last!'
                f.previous()
                break
            if verbose:
                print rec
        if not f.has_key('a'):
            print 'Error, missing key!'

    f.sync()
    f.close()
    if verbose:
        print 'modification...'
    f = openmethod(fname, 'w')
    f['d'] = 'discovered'

    if verbose:
        print 'access...'
    for key in f.keys():
        word = f[key]
        if verbose:
            print word

    f.close()

types = [(bsddb.btopen, 'BTree'),
         (bsddb.hashopen, 'Hash Table'),
         # (bsddb.rnopen,'Record Numbers'), 'put' for RECNO for bsddb 1.85
         #                                   appears broken... at least on
         #                                   Solaris Intel - rmasse 1/97
         ]

for type in types:
    test(type[0], type[1])

