#!/usr/bin/env python

'''Unit tests for cacher_mod'''

import unittest

import dohdbm
import python2x3
import cacher_mod

class test_cacher_mod(unittest.TestCase):
	# pylint: disable=R0904
	# R0904: We're a module inheriting from unittest.TestCase; of course we have lots of public methods
	'''Unit tests for cacher_mod'''

	b_a = python2x3.string_to_binary('a')
	b_b = python2x3.string_to_binary('b')
	b_c = python2x3.string_to_binary('c')
	b_key = python2x3.string_to_binary('key')
	b_key2 = python2x3.string_to_binary('key2')
	b_key3 = python2x3.string_to_binary('key3')
	b_value = python2x3.string_to_binary('value')
	b_value2 = python2x3.string_to_binary('value2')
	b_value3 = python2x3.string_to_binary('value3')
	b_a_doh = python2x3.string_to_binary('a.doh')
	b_b_doh = python2x3.string_to_binary('b.doh')
	b_c_doh = python2x3.string_to_binary('c.doh')

	def test_open_and_close(self):
		'''Test a single file'''
		dummy = self
		cacher = cacher_mod.Cacher(max_entries = 2)
		cacher[test_cacher_mod.b_a] = dohdbm.open(test_cacher_mod.b_a_doh, 'w')
		cacher[test_cacher_mod.b_a].close()

	def test_open_value_close(self):
		'''Test a single file with a single value'''
		dummy = self
		cacher = cacher_mod.Cacher(max_entries = 2)
		cacher[test_cacher_mod.b_a] = dohdbm.open(test_cacher_mod.b_a_doh, 'n')
		cacher[test_cacher_mod.b_a][test_cacher_mod.b_key] = test_cacher_mod.b_value
		cacher[test_cacher_mod.b_a].close()

	def test_2_open_value_close(self):
		'''Test 2 files with values'''
		dummy = self
		cacher = cacher_mod.Cacher(max_entries = 2)
		cacher[test_cacher_mod.b_a] = dohdbm.open(test_cacher_mod.b_a_doh, 'n')
		cacher[test_cacher_mod.b_b] = dohdbm.open(test_cacher_mod.b_b_doh, 'n')
		cacher[test_cacher_mod.b_a][test_cacher_mod.b_key] = test_cacher_mod.b_value
		cacher[test_cacher_mod.b_b][test_cacher_mod.b_key2] = test_cacher_mod.b_value2
		cacher[test_cacher_mod.b_a].close()
		cacher[test_cacher_mod.b_b].close()

	def test_3_open_value_close(self):
		'''Test 3 files with values in a cacher that'll only hold 2 - close the remaining two, one at a time'''
		dummy = self
		cacher = cacher_mod.Cacher(max_entries = 2)
		assert len(cacher) == 0, len(cacher)
		cacher[test_cacher_mod.b_a] = dohdbm.open(test_cacher_mod.b_a_doh, 'n')
		assert len(cacher) == 1, len(cacher)
		cacher[test_cacher_mod.b_b] = dohdbm.open(test_cacher_mod.b_b_doh, 'n')
		assert len(cacher) == 2, len(cacher)
		cacher[test_cacher_mod.b_c] = dohdbm.open(test_cacher_mod.b_c_doh, 'n')
		assert len(cacher) == 2, len(cacher)
		try:
			cacher[test_cacher_mod.b_a][test_cacher_mod.b_key] = test_cacher_mod.b_value
		except KeyError:
			pass
		else:
			raise AssertionError
		cacher[test_cacher_mod.b_b][test_cacher_mod.b_key2] = test_cacher_mod.b_value2
		cacher[test_cacher_mod.b_c][test_cacher_mod.b_key3] = test_cacher_mod.b_value3
		cacher[test_cacher_mod.b_b].close()
		cacher[test_cacher_mod.b_c].close()

	def test_3_open_value_agg_close(self):
		'''Test 3 files with values in a cacher that'll only hold 2 - close en masse'''
		dummy = self
		cacher = cacher_mod.Cacher(max_entries = 2)
		assert len(cacher) == 0, len(cacher)
		cacher[test_cacher_mod.b_a] = dohdbm.open(test_cacher_mod.b_a_doh, 'n')
		assert len(cacher) == 1, len(cacher)
		cacher[test_cacher_mod.b_b] = dohdbm.open(test_cacher_mod.b_b_doh, 'n')
		assert len(cacher) == 2, len(cacher)
		cacher[test_cacher_mod.b_c] = dohdbm.open(test_cacher_mod.b_c_doh, 'n')
		assert len(cacher) == 2, len(cacher)
		try:
			cacher[test_cacher_mod.b_a][test_cacher_mod.b_key] = test_cacher_mod.b_value
		except KeyError:
			pass
		else:
			raise AssertionError
		cacher[test_cacher_mod.b_b][test_cacher_mod.b_key2] = test_cacher_mod.b_value2
		cacher[test_cacher_mod.b_c][test_cacher_mod.b_key3] = test_cacher_mod.b_value3
		cacher.close()

	def test_3_open_part_then_agg_close(self):
		'''3 files, two values, close en masse'''
		dummy = self
		cacher = cacher_mod.Cacher(max_entries = 2)
		assert len(cacher) == 0, len(cacher)
		cacher[test_cacher_mod.b_a] = dohdbm.open(test_cacher_mod.b_a_doh, 'n')
		assert len(cacher) == 1, len(cacher)
		cacher[test_cacher_mod.b_b] = dohdbm.open(test_cacher_mod.b_b_doh, 'n')
		assert len(cacher) == 2, len(cacher)
		cacher[test_cacher_mod.b_c] = dohdbm.open(test_cacher_mod.b_c_doh, 'n')
		assert len(cacher) == 2, len(cacher)
		try:
			cacher[test_cacher_mod.b_a][test_cacher_mod.b_key] = test_cacher_mod.b_value
		except KeyError:
			pass
		else:
			raise AssertionError
		cacher[test_cacher_mod.b_b][test_cacher_mod.b_key2] = test_cacher_mod.b_value2
		cacher.close()

unittest.main()