#! /usr/bin/env python

"""Test script for the anydbm module

   based on testdumbdbm.py

"""



import os

import unittest

import anydbm

import glob

from test import test_support



_fname = test_support.TESTFN



def _delete_files():

    # we don't know the precise name the underlying database uses

    # so we use glob to locate all names

    for f in glob.glob(_fname + "*"):

        try:

            os.unlink(f)

        except OSError:

            pass



class AnyDBMTestCase(unittest.TestCase):

    _dict = {'0': '',

             'a': 'Python:',

             'b': 'Programming',

             'c': 'the',

             'd': 'way',

             'f': 'Guido',

             'g': 'intended'

             }



    def __init__(self, *args):

        unittest.TestCase.__init__(self, *args)



    def test_anydbm_creation(self):

        f = anydbm.open(_fname, 'c')

        self.assertEqual(f.keys(), [])

        for key in self._dict:

            f[key] = self._dict[key]

        self.read_helper(f)

        f.close()



    def test_anydbm_modification(self):

        self.init_db()

        f = anydbm.open(_fname, 'c')

        self._dict['g'] = f['g'] = "indented"

        self.read_helper(f)

        f.close()



    def test_anydbm_read(self):

        self.init_db()

        f = anydbm.open(_fname, 'r')

        self.read_helper(f)

        f.close()



    def test_anydbm_keys(self):

        self.init_db()

        f = anydbm.open(_fname, 'r')

        keys = self.keys_helper(f)

        f.close()



    def read_helper(self, f):

        keys = self.keys_helper(f)

        for key in self._dict:

            self.assertEqual(self._dict[key], f[key])



    def init_db(self):

        f = anydbm.open(_fname, 'n')

        for k in self._dict:

            f[k] = self._dict[k]

        f.close()



    def keys_helper(self, f):

        keys = f.keys()

        keys.sort()

        dkeys = self._dict.keys()

        dkeys.sort()

        self.assertEqual(keys, dkeys)

        return keys



    def tearDown(self):

        _delete_files()



    def setUp(self):

        _delete_files()



def test_main():

    try:

        test_support.run_unittest(AnyDBMTestCase)

    finally:

        _delete_files()



if __name__ == "__main__":

    test_main()

