"""

TestCases for exercising a Queue DB.

"""



import os, string

from pprint import pprint

import unittest



from test_all import db, verbose, get_new_database_path



#----------------------------------------------------------------------



class SimpleQueueTestCase(unittest.TestCase):

    def setUp(self):

        self.filename = get_new_database_path()



    def tearDown(self):

        try:

            os.remove(self.filename)

        except os.error:

            pass





    def test01_basic(self):

        # Basic Queue tests using the deprecated DBCursor.consume method.



        if verbose:

            print '\n', '-=' * 30

            print "Running %s.test01_basic..." % self.__class__.__name__



        d = db.DB()

        d.set_re_len(40)  # Queues must be fixed length

        d.open(self.filename, db.DB_QUEUE, db.DB_CREATE)



        if verbose:

            print "before appends" + '-' * 30

            pprint(d.stat())



        for x in string.letters:

            d.append(x * 40)



        self.assertEqual(len(d), len(string.letters))



        d.put(100, "some more data")

        d.put(101, "and some more ")

        d.put(75,  "out of order")

        d.put(1,   "replacement data")



        self.assertEqual(len(d), len(string.letters)+3)



        if verbose:

            print "before close" + '-' * 30

            pprint(d.stat())



        d.close()

        del d

        d = db.DB()

        d.open(self.filename)



        if verbose:

            print "after open" + '-' * 30

            pprint(d.stat())



        # Test "txn" as a positional parameter

        d.append("one more", None)

        # Test "txn" as a keyword parameter

        d.append("another one", txn=None)



        c = d.cursor()



        if verbose:

            print "after append" + '-' * 30

            pprint(d.stat())



        rec = c.consume()

        while rec:

            if verbose:

                print rec

            rec = c.consume()

        c.close()



        if verbose:

            print "after consume loop" + '-' * 30

            pprint(d.stat())



        self.assertEqual(len(d), 0, \

               "if you see this message then you need to rebuild " \

               "Berkeley DB 3.1.17 with the patch in patches/qam_stat.diff")



        d.close()







    def test02_basicPost32(self):

        # Basic Queue tests using the new DB.consume method in DB 3.2+

        # (No cursor needed)



        if verbose:

            print '\n', '-=' * 30

            print "Running %s.test02_basicPost32..." % self.__class__.__name__



        if db.version() < (3, 2, 0):

            if verbose:

                print "Test not run, DB not new enough..."

            return



        d = db.DB()

        d.set_re_len(40)  # Queues must be fixed length

        d.open(self.filename, db.DB_QUEUE, db.DB_CREATE)



        if verbose:

            print "before appends" + '-' * 30

            pprint(d.stat())



        for x in string.letters:

            d.append(x * 40)



        self.assertEqual(len(d), len(string.letters))



        d.put(100, "some more data")

        d.put(101, "and some more ")

        d.put(75,  "out of order")

        d.put(1,   "replacement data")



        self.assertEqual(len(d), len(string.letters)+3)



        if verbose:

            print "before close" + '-' * 30

            pprint(d.stat())



        d.close()

        del d

        d = db.DB()

        d.open(self.filename)

        #d.set_get_returns_none(true)



        if verbose:

            print "after open" + '-' * 30

            pprint(d.stat())



        d.append("one more")



        if verbose:

            print "after append" + '-' * 30

            pprint(d.stat())



        rec = d.consume()

        while rec:

            if verbose:

                print rec

            rec = d.consume()



        if verbose:

            print "after consume loop" + '-' * 30

            pprint(d.stat())



        d.close()







#----------------------------------------------------------------------



def test_suite():

    return unittest.makeSuite(SimpleQueueTestCase)





if __name__ == '__main__':

    unittest.main(defaultTest='test_suite')

