try:
    import unittest2 as unittest
except ImportError:
    import unittest

import bpython.keys as keys


class TestCLIKeys(unittest.TestCase):
    def test_keymap_map(self):
        """Verify KeyMap.map being a dictionary with the correct
        length."""
        self.assertEqual(len(keys.cli_key_dispatch.map), 43)

    def test_keymap_setitem(self):
        """Verify keys.KeyMap correctly setting items."""
        keys.cli_key_dispatch['simon'] = 'awesome'
        self.assertEqual(keys.cli_key_dispatch['simon'], 'awesome')

    def test_keymap_delitem(self):
        """Verify keys.KeyMap correctly removing items."""
        keys.cli_key_dispatch['simon'] = 'awesome'
        del keys.cli_key_dispatch['simon']
        if 'simon' in keys.cli_key_dispatch.map:
            raise Exception('Key still exists in dictionary')

    def test_keymap_getitem(self):
        """Verify keys.KeyMap correctly looking up items."""
        self.assertEqual(keys.cli_key_dispatch['C-['], (chr(27), '^['))
        self.assertEqual(keys.cli_key_dispatch['F11'], ('KEY_F(11)',))
        self.assertEqual(keys.cli_key_dispatch['C-a'], ('\x01', '^A'))

    def test_keymap_keyerror(self):
        """Verify keys.KeyMap raising KeyError when getting undefined key"""
        def raiser():
            keys.cli_key_dispatch['C-asdf']
            keys.cli_key_dispatch['C-qwerty']
        self.assertRaises(KeyError, raiser)


class TestUrwidKeys(unittest.TestCase):
    def test_keymap_map(self):
        """Verify KeyMap.map being a dictionary with the correct
        length."""
        self.assertEqual(len(keys.urwid_key_dispatch.map), 64)

    def test_keymap_setitem(self):
        """Verify keys.KeyMap correctly setting items."""
        keys.urwid_key_dispatch['simon'] = 'awesome'
        self.assertEqual(keys.urwid_key_dispatch['simon'], 'awesome')

    def test_keymap_delitem(self):
        """Verify keys.KeyMap correctly removing items."""
        keys.urwid_key_dispatch['simon'] = 'awesome'
        del keys.urwid_key_dispatch['simon']
        if 'simon' in keys.urwid_key_dispatch.map:
            raise Exception('Key still exists in dictionary')

    def test_keymap_getitem(self):
        """Verify keys.KeyMap correctly looking up items."""
        self.assertEqual(keys.urwid_key_dispatch['F11'], 'f11')
        self.assertEqual(keys.urwid_key_dispatch['C-a'], 'ctrl a')
        self.assertEqual(keys.urwid_key_dispatch['M-a'], 'meta a')

    def test_keymap_keyerror(self):
        """Verify keys.KeyMap raising KeyError when getting undefined key"""
        def raiser():
            keys.urwid_key_dispatch['C-asdf']
            keys.urwid_key_dispatch['C-qwerty']
        self.assertRaises(KeyError, raiser)


if __name__ == '__main__':
    unittest.main()
