diff options
Diffstat (limited to 'test/tc_newkeys.py')
-rw-r--r-- | test/tc_newkeys.py | 620 |
1 files changed, 0 insertions, 620 deletions
diff --git a/test/tc_newkeys.py b/test/tc_newkeys.py deleted file mode 100644 index c9597201..00000000 --- a/test/tc_newkeys.py +++ /dev/null @@ -1,620 +0,0 @@ -# coding=utf-8 -# Copyright (C) 2009, 2010 Roman Zimbelmann <romanz@lavabit.com> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License - -import os.path -import sys -rangerpath = os.path.join(os.path.dirname(__file__), '..') -if sys.path[1] != rangerpath: - sys.path[1:1] = [rangerpath] -sys.path[1:1] = ['..'] - -from unittest import TestCase, main - -from testlib import TODO -from ranger.ext.tree import Tree -from ranger.container.keymap import * -from ranger.container.keybuffer import KeyBuffer -from ranger.ext.keybinding_parser import parse_keybinding - -def simulate_press(self, string): - for char in parse_keybinding(string): - self.add(char) - if self.done: - return self.command - if self.failure: - break - return self.command - -class PressTestCase(TestCase): - """Some useful methods for the actual test""" - def _mkpress(self, keybuffer, _=0): - def press(keys): - keybuffer.clear() - match = simulate_press(keybuffer, keys) - self.assertFalse(keybuffer.failure, - "parsing keys '"+keys+"' did fail!") - self.assertTrue(keybuffer.done, - "parsing keys '"+keys+"' did not complete!") - arg = CommandArgs(None, None, keybuffer) - self.assert_(match.function, "No function found! " + \ - str(match.__dict__)) - return match.function(arg) - return press - - def assertPressFails(self, kb, keys): - kb.clear() - simulate_press(kb, keys) - self.assertTrue(kb.failure, "Keypress did not fail as expected") - kb.clear() - - def assertPressIncomplete(self, kb, keys): - kb.clear() - simulate_press(kb, keys) - self.assertFalse(kb.failure, "Keypress failed, expected incomplete") - self.assertFalse(kb.done, "Keypress done which was unexpected") - kb.clear() - -class Test(PressTestCase): - """The test cases""" - def test_passive_action(self): - km = KeyMap() - directions = KeyMap() - kb = KeyBuffer(km, directions) - def n(value): - """return n or value""" - def fnc(arg=None): - if arg is None or arg.n is None: - return value - return arg.n - return fnc - - km.map('ppp', n(5)) - km.map('pp<bg>', n(8)) - km.map('pp<dir>', n(2)) - directions.map('j', dir=Direction(down=1)) - - press = self._mkpress(kb, km) - self.assertEqual(5, press('ppp')) - self.assertEqual(3, press('3ppp')) - - self.assertEqual(2, press('ppj')) - - kb.clear() - match = simulate_press(kb, 'pp') - args = CommandArgs(0, 0, kb) - self.assert_(match) - self.assert_(match.function) - self.assertEqual(8, match.function(args)) - - def test_translate_keys(self): - def test(string, *args): - if not args: - args = (string, ) - self.assertEqual(ordtuple(*args), tuple(parse_keybinding(string))) - - def ordtuple(*args): - lst = [] - for arg in args: - if isinstance(arg, str): - lst.extend(ord(c) for c in arg) - else: - lst.append(arg) - return tuple(lst) - - # 1 argument means: assume nothing is translated. - test('k') - test('kj') - test('k<dir>', 'k', DIRKEY) - test('k<ANY>z<any>', 'k', ANYKEY, 'z', ANYKEY) - test('k<anY>z<dir>', 'k', ANYKEY, 'z', DIRKEY) - test('<cr>', "\n") - test('<tab><tab><cr>', "\t\t\n") - test('<') - test('>') - test('<C-a>', 1) - test('<C-b>', 2) - for i in range(1, 26): - test('<C-' + chr(i+ord('a')-1) + '>', i) - test('<A-x>', 27, ord('x')) - test('<a-o>', 27, ord('o')) - test('k<a') - test('k<anz>') - test('k<a<nz>') - test('k<a<nz>') - test('k<a<>nz>') - test('>nz>') - - def test_alias(self): - def add_dirs(arg): - return sum(dir.down() for dir in arg.directions) - def return5(_): - return 5 - - directions = KeyMap() - directions.map('j', dir=Direction(down=1)) - directions.map('k', dir=Direction(down=-1)) - directions.map('<CR>', alias='j') - directions.map('@', alias='<CR>') - - base = KeyMap() - base.map('a<dir>', add_dirs) - base.map('b<dir>', add_dirs) - base.map('x<dir>x<dir>', add_dirs) - base.map('f', return5) - base.map('yy', alias='y') - base.map('!', alias='!') - - other = KeyMap() - other.map('b<dir>b<dir>', alias='x<dir>x<dir>') - other.map('c<dir>', add_dirs) - other.map('g', alias='f') - - km = base.merge(other, copy=True) - kb = KeyBuffer(km, directions) - - press = self._mkpress(kb, km) - - self.assertEqual(1, press('aj')) - self.assertEqual(2, press('bjbj')) - self.assertEqual(1, press('cj')) - self.assertEqual(1, press('c<CR>')) - - self.assertEqual(5, press('f')) - self.assertEqual(5, press('g')) - self.assertEqual(press('c<CR>'), press('c@')) - self.assertEqual(press('c<CR>'), press('c@')) - self.assertEqual(press('c<CR>'), press('c@')) - - for n in range(1, 10): - self.assertPressIncomplete(kb, 'y' * n) - - for n in range(1, 5): - self.assertPressFails(kb, '!' * n) - - def test_tree(self): - t = Tree() - t.set('abcd', "Yes") - self.assertEqual("Yes", t.traverse('abcd')) - self.assertRaises(KeyError, t.traverse, 'abcde') - self.assertRaises(KeyError, t.traverse, 'xyz') - self.assert_(isinstance(t.traverse('abc'), Tree)) - - t2 = Tree() - self.assertRaises(KeyError, t2.set, 'axy', "Lol", force=False) - t2.set('axx', 'ololol') - t2.set('axyy', "Lol") - self.assertEqual("Yes", t.traverse('abcd')) - self.assertRaises(KeyError, t2.traverse, 'abcd') - self.assertEqual("Lol", t2.traverse('axyy')) - self.assertEqual("ololol", t2.traverse('axx')) - - t2.unset('axyy') - self.assertEqual("ololol", t2.traverse('axx')) - self.assertRaises(KeyError, t2.traverse, 'axyy') - self.assertRaises(KeyError, t2.traverse, 'axy') - - t2.unset('a') - self.assertRaises(KeyError, t2.traverse, 'abcd') - self.assertRaises(KeyError, t2.traverse, 'a') - self.assert_(t2.empty()) - - def test_merge_trees(self): - def makeTreeA(): - t = Tree() - t.set('aaaX', 1) - t.set('aaaY', 2) - t.set('aaaZ', 3) - t.set('bbbA', 11) - t.set('bbbB', 12) - t.set('bbbC', 13) - t.set('bbbD', 14) - t.set('bP', 21) - t.set('bQ', 22) - return t - - def makeTreeB(): - u = Tree() - u.set('aaaX', 0) - u.set('bbbC', 'Yes') - u.set('bbbD', None) - u.set('bbbE', 15) - u.set('bbbF', 16) - u.set('bQ', 22) - u.set('bR', 23) - u.set('ffff', 1337) - return u - - # test 1 - t = Tree('a') - u = Tree('b') - merged = t.merge(u, copy=True) - self.assertEqual('b', merged._tree) - - # test 2 - t = Tree('a') - u = makeTreeA() - merged = t.merge(u, copy=True) - self.assertEqual(u._tree, merged._tree) - - # test 3 - t = makeTreeA() - u = makeTreeB() - v = t.merge(u, copy=True) - - self.assertEqual(0, v['aaaX']) - self.assertEqual(2, v['aaaY']) - self.assertEqual(3, v['aaaZ']) - self.assertEqual(11, v['bbbA']) - self.assertEqual('Yes', v['bbbC']) - self.assertEqual(None, v['bbbD']) - self.assertEqual(15, v['bbbE']) - self.assertEqual(16, v['bbbF']) - self.assertRaises(KeyError, t.__getitem__, 'bbbG') - self.assertEqual(21, v['bP']) - self.assertEqual(22, v['bQ']) - self.assertEqual(23, v['bR']) - self.assertEqual(1337, v['ffff']) - - # merge shouldn't be destructive - self.assertEqual(makeTreeA()._tree, t._tree) - self.assertEqual(makeTreeB()._tree, u._tree) - - v['fff'].replace('Lolz') - self.assertEqual('Lolz', v['fff']) - - v['aaa'].replace('Very bad') - v.plow('qqqqqqq').replace('eww.') - - self.assertEqual(makeTreeA()._tree, t._tree) - self.assertEqual(makeTreeB()._tree, u._tree) - - def test_add(self): - c = KeyMap() - c.map('aa', 'b', lambda *_: 'lolz') - self.assert_(c['aa'].function(), 'lolz') - @c.map('a', 'c') - def test(): - return 5 - self.assert_(c['b'].function(), 'lolz') - self.assert_(c['c'].function(), 5) - self.assert_(c['a'].function(), 5) - - def test_quantifier(self): - km = KeyMap() - directions = KeyMap() - kb = KeyBuffer(km, directions) - def n(value): - """return n or value""" - def fnc(arg=None): - if arg is None or arg.n is None: - return value - return arg.n - return fnc - km.map('p', n(5)) - press = self._mkpress(kb, km) - self.assertEqual(5, press('p')) - self.assertEqual(3, press('3p')) - self.assertEqual(6223, press('6223p')) - - def test_direction(self): - km = KeyMap() - directions = KeyMap() - kb = KeyBuffer(km, directions) - directions.map('j', dir=Direction(down=1)) - directions.map('k', dir=Direction(down=-1)) - def nd(arg): - """ n * direction """ - n = arg.n is None and 1 or arg.n - dir = arg.direction is None and Direction(down=1) \ - or arg.direction - return n * dir.down() - km.map('d<dir>', nd) - km.map('dd', func=nd) - - press = self._mkpress(kb, km) - - self.assertPressIncomplete(kb, 'd') - self.assertEqual( 1, press('dj')) - self.assertEqual( 3, press('3ddj')) - self.assertEqual( 15, press('3d5j')) - self.assertEqual(-15, press('3d5k')) - # supporting this kind of key combination would be too confusing: - # self.assertEqual( 15, press('3d5d')) - self.assertEqual( 3, press('3dd')) - self.assertEqual( 33, press('33dd')) - self.assertEqual( 1, press('dd')) - - km.map('x<dir>', nd) - km.map('xxxx', func=nd) - - self.assertEqual(1, press('xxxxj')) - self.assertEqual(1, press('xxxxjsomeinvalitchars')) - - # these combinations should break: - self.assertPressFails(kb, 'xxxj') - self.assertPressFails(kb, 'xxj') - self.assertPressFails(kb, 'xxkldfjalksdjklsfsldkj') - self.assertPressFails(kb, 'xyj') - self.assertPressIncomplete(kb, 'x') # direction missing - - def test_any_key(self): - km = KeyMap() - directions = KeyMap() - kb = KeyBuffer(km, directions) - directions.map('j', dir=Direction(down=1)) - directions.map('k', dir=Direction(down=-1)) - - directions.map('g<any>', dir=Direction(down=-1)) - - def cat(arg): - n = arg.n is None and 1 or arg.n - return ''.join(chr(c) for c in arg.matches) * n - - km.map('return<any>', cat) - km.map('cat4<any><any><any><any>', cat) - km.map('foo<dir><any>', cat) - - press = self._mkpress(kb, km) - - self.assertEqual('x', press('returnx')) - self.assertEqual('abcd', press('cat4abcd')) - self.assertEqual('abcdabcd', press('2cat4abcd')) - self.assertEqual('55555', press('5return5')) - - self.assertEqual('x', press('foojx')) - self.assertPressFails(kb, 'fooggx') # ANYKEY forbidden in DIRECTION - - km.map('<any>', lambda _: Ellipsis) - self.assertEqual('x', press('returnx')) - self.assertEqual('abcd', press('cat4abcd')) - self.assertEqual(Ellipsis, press('2cat4abcd')) - self.assertEqual(Ellipsis, press('5return5')) - self.assertEqual(Ellipsis, press('g')) - self.assertEqual(Ellipsis, press('ß')) - self.assertEqual(Ellipsis, press('ア')) - self.assertEqual(Ellipsis, press('9')) - - def test_multiple_directions(self): - km = KeyMap() - directions = KeyMap() - kb = KeyBuffer(km, directions) - directions.map('j', dir=Direction(down=1)) - directions.map('k', dir=Direction(down=-1)) - - def add_dirs(arg): - return sum(dir.down() for dir in arg.directions) - - km.map('x<dir>y<dir>', add_dirs) - km.map('four<dir><dir><dir><dir>', add_dirs) - - press = self._mkpress(kb, km) - - self.assertEqual(2, press('xjyj')) - self.assertEqual(0, press('fourjkkj')) - self.assertEqual(2, press('four2j4k2j2j')) - self.assertEqual(10, press('four1j2j3j4j')) - self.assertEqual(10, press('four1j2j3j4jafslkdfjkldj')) - - def test_corruptions(self): - km = KeyMap() - directions = KeyMap() - kb = KeyBuffer(km, directions) - press = self._mkpress(kb, km) - directions.map('j', dir=Direction(down=1)) - directions.map('k', dir=Direction(down=-1)) - km.map('xxx', lambda _: 1) - - self.assertEqual(1, press('xxx')) - - # corrupt the tree - tup = tuple(parse_keybinding('xxx')) - x = ord('x') - km._tree[x][x][x] = "Boo" - - self.assertPressFails(kb, 'xxy') - self.assertPressFails(kb, 'xzy') - self.assertPressIncomplete(kb, 'xx') - self.assertPressIncomplete(kb, 'x') - if not sys.flags.optimize: # asserts are ignored with python -O - self.assertRaises(AssertionError, simulate_press, kb, 'xxx') - kb.clear() - - def test_directions_as_functions(self): - km = KeyMap() - directions = KeyMap() - kb = KeyBuffer(km, directions) - press = self._mkpress(kb, km) - - def move(arg): - return arg.direction.down() - - directions.map('j', dir=Direction(down=1)) - directions.map('s', alias='j') - directions.map('k', dir=Direction(down=-1)) - km.map('<dir>', func=move) - - self.assertEqual(1, press('j')) - self.assertEqual(1, press('j')) - self.assertEqual(1, press('j')) - self.assertEqual(1, press('j')) - self.assertEqual(1, press('j')) - self.assertEqual(1, press('s')) - self.assertEqual(1, press('s')) - self.assertEqual(1, press('s')) - self.assertEqual(1, press('s')) - self.assertEqual(1, press('s')) - self.assertEqual(-1, press('k')) - self.assertEqual(-1, press('k')) - self.assertEqual(-1, press('k')) - - km.map('k', func=lambda _: 'love') - - self.assertEqual(1, press('j')) - self.assertEqual('love', press('k')) - - self.assertEqual(1, press('40j')) - self.assertEqual(40, kb.quant) - - km.map('<dir><dir><any><any>', func=move) - - self.assertEqual(1, press('40jkhl')) - self.assertEqual(40, kb.quant) - - def test_tree_deep_copy(self): - t = Tree() - s = t.plow('abcd') - s.replace('X') - u = t.copy() - self.assertEqual(t._tree, u._tree) - s = t.traverse('abc') - s.replace('Y') - self.assertNotEqual(t._tree, u._tree) - - def test_keymanager(self): - def func(arg): - return 5 - def getdown(arg): - return arg.direction.down() - - buffer = KeyBuffer(None, None) - press = self._mkpress(buffer) - keymanager = KeyManager(buffer, ['foo', 'bar']) - - map = keymanager.get_context('foo') - map('a', func) - map('b', func) - map = keymanager.get_context('bar') - map('c', func) - map('<dir>', getdown) - - keymanager.dir('foo', 'j', down=1) - keymanager.dir('bar', 'j', down=1) - - keymanager.use_context('foo') - self.assertEqual(5, press('a')) - self.assertEqual(5, press('b')) - self.assertPressFails(buffer, 'c') - - keymanager.use_context('bar') - self.assertPressFails(buffer, 'a') - self.assertPressFails(buffer, 'b') - self.assertEqual(5, press('c')) - self.assertEqual(1, press('j')) - keymanager.use_context('foo') - keymanager.use_context('foo') - keymanager.use_context('foo') - keymanager.use_context('bar') - keymanager.use_context('foo') - keymanager.use_context('bar') - keymanager.use_context('bar') - self.assertEqual(1, press('j')) - - def test_alias_to_direction(self): - def func(arg): - return arg.direction.down() - - km = KeyMapWithDirections() - kb = KeyBuffer(km, km.directions) - press = self._mkpress(kb) - - km.map('<dir>', func) - km.map('d<dir>', func) - km.dir('j', down=42) - km.dir('k', alias='j') - self.assertEqual(42, press('j')) - - km.dir('o', alias='j') - km.dir('ick', alias='j') - self.assertEqual(42, press('o')) - self.assertEqual(42, press('dj')) - self.assertEqual(42, press('dk')) - self.assertEqual(42, press('do')) - self.assertEqual(42, press('dick')) - self.assertPressFails(kb, 'dioo') - - def test_both_directory_and_any_key(self): - def func(arg): - return arg.direction.down() - def func2(arg): - return "yay" - - km = KeyMap() - directions = KeyMap() - kb = KeyBuffer(km, directions) - press = self._mkpress(kb) - - km.map('abc<dir>', func) - directions.map('j', dir=Direction(down=42)) - self.assertEqual(42, press('abcj')) - - km.unmap('abc<dir>') - - km.map('abc<any>', func2) - self.assertEqual("yay", press('abcd')) - - km.map('abc<dir>', func) - - km.map('abc<any>', func2) - self.assertEqual("yay", press('abcd')) - - def test_map_collision(self): - def add_dirs(arg): - return sum(dir.down() for dir in arg.directions) - def return5(_): - return 5 - - - directions = KeyMap() - directions.map('gg', dir=Direction(down=1)) - - - km = KeyMap() - km.map('gh', return5) - km.map('agh', return5) - km.map('a<dir>', add_dirs) - - kb = KeyBuffer(km, directions) - press = self._mkpress(kb, km) - - self.assertEqual(5, press('gh')) - self.assertEqual(5, press('agh')) -# self.assertPressFails(kb, 'agh') - - @TODO - def test_map_collision2(self): - directions = KeyMap() - directions.map('gg', dir=Direction(down=1)) - km = KeyMap() - km.map('agh', lambda _: 1) - km.map('a<dir>', lambda _: 2) - kb = KeyBuffer(km, directions) - press = self._mkpress(kb, km) - self.assertEqual(1, press('agh')) - self.assertEqual(2, press('agg')) - - def test_keymap_with_dir(self): - def func(arg): - return arg.direction.down() - - km = KeyMapWithDirections() - kb = KeyBuffer(km, km.directions) - - press = self._mkpress(kb) - - km.map('abc<dir>', func) - km.dir('j', down=42) - self.assertEqual(42, press('abcj')) - -if __name__ == '__main__': main() |