shadowbrokers-exploits/windows/fuzzbunch/pyreadline/test/emacs_test.py

397 lines
14 KiB
Python
Raw Permalink Normal View History

# -*- coding: utf-8 -*-
#*****************************************************************************
# Copyright (C) 2006 Michael Graz. <mgraz@plan10.com>
# Copyright (C) 2006 Michael Graz. <mgraz@plan10.com>
#
# Distributed under the terms of the BSD License. The full license is in
# the file COPYING, distributed as part of this software.
#*****************************************************************************
import sys, unittest
import pdb
sys.path.append ('../..')
from pyreadline.modes.emacs import *
from pyreadline import keysyms
from pyreadline.lineeditor import lineobj
from common import *
from pyreadline.logger import log_sock
import pyreadline.logger as logger
logger.sock_silent=True
logger.show_event=["debug"]
#----------------------------------------------------------------------
class EmacsModeTest (EmacsMode):
tested_commands={}
def __init__ (self):
EmacsMode.__init__ (self, MockReadline())
self.mock_console = MockConsole ()
self.init_editing_mode (None)
self.lst_completions = []
self.completer = self.mock_completer
self.completer_delims = ' '
self.tabstop = 4
self.mark_directories=False
self.show_all_if_ambiguous=False
def get_mock_console (self):
return self.mock_console
console = property (get_mock_console)
def _set_line (self, text):
self.l_buffer.set_line (text)
def get_line (self):
return self.l_buffer.get_line_text ()
line = property (get_line)
def get_line_cursor (self):
return self.l_buffer.point
line_cursor = property (get_line_cursor)
def input (self, keytext):
if keytext[0:1] == '"' and keytext[-1:] == '"':
lst_key = ['"%s"' % c for c in keytext[1:-1]]
else:
lst_key = [keytext]
for key in lst_key:
keyinfo, event = keytext_to_keyinfo_and_event (key)
dispatch_func = self.key_dispatch.get(keyinfo.tuple(),self.self_insert)
self.tested_commands[dispatch_func.__name__]=dispatch_func
log_sock("keydisp: %s %s"%( key,dispatch_func.__name__),"debug")
dispatch_func (event)
self.previous_func=dispatch_func
def accept_line (self, e):
if EmacsMode.accept_line (self, e):
# simulate return
# self.add_history (self.line)
self.l_buffer.reset_line ()
def mock_completer (self, text, state):
return self.lst_completions [state]
#----------------------------------------------------------------------
class TestsKeyinfo (unittest.TestCase):
def test_keyinfo (self):
keyinfo, event = keytext_to_keyinfo_and_event ('"d"')
self.assertEqual ('d', event.char)
keyinfo, event = keytext_to_keyinfo_and_event ('"D"')
self.assertEqual ('D', event.char)
keyinfo, event = keytext_to_keyinfo_and_event ('"$"')
self.assertEqual ('$', event.char)
keyinfo, event = keytext_to_keyinfo_and_event ('Escape')
self.assertEqual ('\x1b', event.char)
class TestsMovement (unittest.TestCase):
def test_cursor (self):
r = EmacsModeTest ()
self.assertEqual (r.line, '')
r.input('"First Second Third"')
self.assertEqual (r.line, 'First Second Third')
self.assertEqual (r.line_cursor, 18)
r.input('Control-a')
self.assertEqual (r.line, 'First Second Third')
self.assertEqual (r.line_cursor, 0)
r.input('Control-e')
self.assertEqual (r.line, 'First Second Third')
self.assertEqual (r.line_cursor, 18)
r.input('Home')
self.assertEqual (r.line, 'First Second Third')
self.assertEqual (r.line_cursor, 0)
r.input('Right')
self.assertEqual (r.line, 'First Second Third')
self.assertEqual (r.line_cursor, 1)
r.input('Ctrl-f')
self.assertEqual (r.line, 'First Second Third')
self.assertEqual (r.line_cursor, 2)
r.input('Ctrl-Right')
self.assertEqual (r.line, 'First Second Third')
self.assertEqual (r.line_cursor, 5)
r.input('Ctrl-Right')
self.assertEqual (r.line, 'First Second Third')
self.assertEqual (r.line_cursor, 12)
r.input('Ctrl-Right')
self.assertEqual (r.line, 'First Second Third')
self.assertEqual (r.line_cursor, 18)
r.input('Ctrl-Right')
self.assertEqual (r.line, 'First Second Third')
self.assertEqual (r.line_cursor, 18)
r.input('Ctrl-Left')
self.assertEqual (r.line, 'First Second Third')
self.assertEqual (r.line_cursor, 13)
r.input('Ctrl-Left')
self.assertEqual (r.line, 'First Second Third')
self.assertEqual (r.line_cursor, 6)
r.input('Ctrl-Left')
self.assertEqual (r.line, 'First Second Third')
self.assertEqual (r.line_cursor, 0)
r.input('Ctrl-Left')
self.assertEqual (r.line, 'First Second Third')
self.assertEqual (r.line_cursor, 0)
class TestsDelete (unittest.TestCase):
def test_delete (self):
r = EmacsModeTest ()
self.assertEqual (r.line, '')
r.input('"First Second Third"')
self.assertEqual (r.line, 'First Second Third')
self.assertEqual (r.line_cursor, 18)
r.input('Delete')
self.assertEqual (r.line, 'First Second Third')
self.assertEqual (r.line_cursor, 18)
r.input('Left')
r.input('Left')
r.input('Delete')
self.assertEqual (r.line, 'First Second Thid')
self.assertEqual (r.line_cursor, 16)
r.input('Delete')
self.assertEqual (r.line, 'First Second Thi')
self.assertEqual (r.line_cursor, 16)
r.input('Backspace')
self.assertEqual (r.line, 'First Second Th')
self.assertEqual (r.line_cursor, 15)
r.input('Home')
r.input('Right')
r.input('Right')
self.assertEqual (r.line, 'First Second Th')
self.assertEqual (r.line_cursor, 2)
r.input('Backspace')
self.assertEqual (r.line, 'Frst Second Th')
self.assertEqual (r.line_cursor, 1)
r.input('Backspace')
self.assertEqual (r.line, 'rst Second Th')
self.assertEqual (r.line_cursor, 0)
r.input('Backspace')
self.assertEqual (r.line, 'rst Second Th')
self.assertEqual (r.line_cursor, 0)
r.input('Escape')
self.assertEqual (r.line, '')
self.assertEqual (r.line_cursor, 0)
def test_delete_word (self):
r = EmacsModeTest ()
self.assertEqual (r.line, '')
r.input('"First Second Third"')
self.assertEqual (r.line, 'First Second Third')
self.assertEqual (r.line_cursor, 18)
r.input('Control-Backspace')
self.assertEqual (r.line, 'First Second ')
self.assertEqual (r.line_cursor, 13)
r.input('Backspace')
r.input('Left')
r.input('Left')
self.assertEqual (r.line, 'First Second')
self.assertEqual (r.line_cursor, 10)
r.input('Control-Backspace')
self.assertEqual (r.line, 'First nd')
self.assertEqual (r.line_cursor, 6)
r.input('Escape')
self.assertEqual (r.line, '')
self.assertEqual (r.line_cursor, 0)
r.input('"First Second Third"')
r.input('Home')
r.input('Right')
r.input('Right')
r.input('Control-Delete')
self.assertEqual (r.line, 'FiSecond Third')
self.assertEqual (r.line_cursor, 2)
r.input('Control-Delete')
self.assertEqual (r.line, 'FiThird')
self.assertEqual (r.line_cursor, 2)
r.input('Control-Delete')
self.assertEqual (r.line, 'Fi')
self.assertEqual (r.line_cursor, 2)
r.input('Control-Delete')
self.assertEqual (r.line, 'Fi')
self.assertEqual (r.line_cursor, 2)
r.input('Escape')
self.assertEqual (r.line, '')
self.assertEqual (r.line_cursor, 0)
class TestsSelectionMovement (unittest.TestCase):
def test_cursor (self):
r = EmacsModeTest ()
self.assertEqual (r.line, '')
r.input('"First Second Third"')
self.assertEqual (r.line, 'First Second Third')
self.assertEqual (r.line_cursor, 18)
self.assertEqual (r.l_buffer.selection_mark, -1)
r.input('Home')
r.input('Shift-Right')
self.assertEqual (r.line, 'First Second Third')
self.assertEqual (r.line_cursor, 1)
self.assertEqual (r.l_buffer.selection_mark, 0)
r.input('Shift-Control-Right')
self.assertEqual (r.line, 'First Second Third')
self.assertEqual (r.line_cursor, 5)
self.assertEqual (r.l_buffer.selection_mark, 0)
r.input('"a"')
self.assertEqual (r.line, 'a Second Third')
self.assertEqual (r.line_cursor, 1)
self.assertEqual (r.l_buffer.selection_mark, -1)
r.input('Shift-End')
self.assertEqual (r.line, 'a Second Third')
self.assertEqual (r.line_cursor, 14)
self.assertEqual (r.l_buffer.selection_mark, 1)
r.input('Delete')
self.assertEqual (r.line, 'a')
self.assertEqual (r.line_cursor, 1)
self.assertEqual (r.l_buffer.selection_mark, -1)
class TestsHistory (unittest.TestCase):
def test_history_1 (self):
r = EmacsModeTest ()
r.add_history ('aa')
r.add_history ('bbb')
self.assertEqual (r.line, '')
r.input ('Up')
self.assertEqual (r.line, 'bbb')
self.assertEqual (r.line_cursor, 3)
r.input ('Up')
self.assertEqual (r.line, 'aa')
self.assertEqual (r.line_cursor, 2)
r.input ('Up')
self.assertEqual (r.line, 'aa')
self.assertEqual (r.line_cursor, 2)
r.input ('Down')
self.assertEqual (r.line, 'bbb')
self.assertEqual (r.line_cursor, 3)
r.input ('Down')
self.assertEqual (r.line, '')
self.assertEqual (r.line_cursor, 0)
def test_history_2 (self):
r = EmacsModeTest ()
r.add_history ('aaaa')
r.add_history ('aaba')
r.add_history ('aaca')
r.add_history ('akca')
r.add_history ('bbb')
r.add_history ('ako')
self.assert_line(r,'',0)
r.input ('"a"')
r.input ('Up')
self.assert_line(r,'ako',1)
r.input ('Up')
self.assert_line(r,'akca',1)
r.input ('Up')
self.assert_line(r,'aaca',1)
r.input ('Up')
self.assert_line(r,'aaba',1)
r.input ('Up')
self.assert_line(r,'aaaa',1)
r.input ('Right')
self.assert_line(r,'aaaa',2)
r.input ('Down')
self.assert_line(r,'aaba',2)
r.input ('Down')
self.assert_line(r,'aaca',2)
r.input ('Down')
self.assert_line(r,'aaca',2)
r.input ('Left')
r.input ('Left')
r.input ('Down')
r.input ('Down')
self.assert_line(r,'bbb',3)
r.input ('Left')
self.assert_line(r,'bbb',2)
r.input ('Down')
self.assert_line(r,'bbb',2)
r.input ('Up')
self.assert_line(r,'bbb',2)
def test_history_3 (self):
r = EmacsModeTest ()
r.add_history ('aaaa')
r.add_history ('aaba')
r.add_history ('aaca')
r.add_history ('akca')
r.add_history ('bbb')
r.add_history ('ako')
self.assert_line(r,'',0)
r.input ('')
r.input ('Up')
self.assert_line(r,'ako',3)
r.input ('Down')
self.assert_line(r,'',0)
r.input ('Up')
self.assert_line(r,'ako',3)
def test_history_3 (self):
r = EmacsModeTest ()
r.add_history ('aaaa')
r.add_history ('aaba')
r.add_history ('aaca')
r.add_history ('akca')
r.add_history ('bbb')
r.add_history ('ako')
self.assert_line(r,'',0)
r.input ('k')
r.input ('Up')
self.assert_line(r,'k',1)
def test_complete (self):
import rlcompleter
logger.sock_silent=False
log_sock("-"*50,"debug")
r=EmacsModeTest()
r.completer=rlcompleter.Completer().complete
r._bind_key("tab",r.complete)
r.input('"exi(ksdjksjd)"')
r.input('Control-a')
r.input('Right')
r.input('Right')
r.input('Right')
r.input('Tab')
self.assert_line(r,"exit(ksdjksjd)",4)
r.input('Escape')
r.input('"exi"')
r.input('Control-a')
r.input('Right')
r.input('Right')
r.input('Right')
r.input('Tab')
self.assert_line(r,"exit",4)
def assert_line(self,r,line,cursor):
self.assertEqual (r.line, line)
self.assertEqual (r.line_cursor, cursor)
#----------------------------------------------------------------------
# utility functions
#----------------------------------------------------------------------
if __name__ == '__main__':
Tester()
tested=EmacsModeTest.tested_commands.keys()
tested.sort()
# print " Tested functions ".center(60,"-")
# print "\n".join(tested)
# print
all_funcs=dict([(x.__name__,x) for x in EmacsModeTest().key_dispatch.values()])
all_funcs=all_funcs.keys()
not_tested=[x for x in all_funcs if x not in tested]
not_tested.sort()
print " Not tested functions ".center(60,"-")
print "\n".join(not_tested)