diff options
author | shadchin <[email protected]> | 2022-02-10 16:44:39 +0300 |
---|---|---|
committer | Daniil Cherednik <[email protected]> | 2022-02-10 16:44:39 +0300 |
commit | e9656aae26e0358d5378e5b63dcac5c8dbe0e4d0 (patch) | |
tree | 64175d5cadab313b3e7039ebaa06c5bc3295e274 /contrib/python/prompt-toolkit/py2/tests | |
parent | 2598ef1d0aee359b4b6d5fdd1758916d5907d04f (diff) |
Restoring authorship annotation for <[email protected]>. Commit 2 of 2.
Diffstat (limited to 'contrib/python/prompt-toolkit/py2/tests')
15 files changed, 1980 insertions, 1980 deletions
diff --git a/contrib/python/prompt-toolkit/py2/tests/test_buffer.py b/contrib/python/prompt-toolkit/py2/tests/test_buffer.py index 9ef53956e77..a9cff190240 100644 --- a/contrib/python/prompt-toolkit/py2/tests/test_buffer.py +++ b/contrib/python/prompt-toolkit/py2/tests/test_buffer.py @@ -1,111 +1,111 @@ -from __future__ import unicode_literals - -from prompt_toolkit.buffer import Buffer - -import pytest - - -def _buffer(): - return Buffer() - - -def test_initial(_buffer): - assert _buffer.text == '' - assert _buffer.cursor_position == 0 - - -def test_insert_text(_buffer): - _buffer.insert_text('some_text') - assert _buffer.text == 'some_text' - assert _buffer.cursor_position == len('some_text') - - -def test_cursor_movement(_buffer): - _buffer.insert_text('some_text') - _buffer.cursor_left() - _buffer.cursor_left() - _buffer.cursor_left() - _buffer.cursor_right() - _buffer.insert_text('A') - - assert _buffer.text == 'some_teAxt' - assert _buffer.cursor_position == len('some_teA') - - -def test_backspace(_buffer): - _buffer.insert_text('some_text') - _buffer.cursor_left() - _buffer.cursor_left() - _buffer.delete_before_cursor() - - assert _buffer.text == 'some_txt' - assert _buffer.cursor_position == len('some_t') - - -def test_cursor_up(_buffer): - # Cursor up to a line thats longer. - _buffer.insert_text('long line1\nline2') - _buffer.cursor_up() - - assert _buffer.document.cursor_position == 5 - - # Going up when already at the top. - _buffer.cursor_up() - assert _buffer.document.cursor_position == 5 - - # Going up to a line that's shorter. - _buffer.reset() - _buffer.insert_text('line1\nlong line2') - - _buffer.cursor_up() - assert _buffer.document.cursor_position == 5 - - -def test_cursor_down(_buffer): - _buffer.insert_text('line1\nline2') - _buffer.cursor_position = 3 - - # Normally going down - _buffer.cursor_down() - assert _buffer.document.cursor_position == len('line1\nlin') - - # Going down to a line that's storter. - _buffer.reset() - _buffer.insert_text('long line1\na\nb') - _buffer.cursor_position = 3 - - _buffer.cursor_down() - assert _buffer.document.cursor_position == len('long line1\na') - - -def test_join_next_line(_buffer): - _buffer.insert_text('line1\nline2\nline3') - _buffer.cursor_up() - _buffer.join_next_line() - - assert _buffer.text == 'line1\nline2 line3' - - # Test when there is no '\n' in the text - _buffer.reset() - _buffer.insert_text('line1') - _buffer.cursor_position = 0 - _buffer.join_next_line() - - assert _buffer.text == 'line1' - - -def test_newline(_buffer): - _buffer.insert_text('hello world') - _buffer.newline() - - assert _buffer.text == 'hello world\n' - - -def test_swap_characters_before_cursor(_buffer): - _buffer.insert_text('hello world') - _buffer.cursor_left() - _buffer.cursor_left() - _buffer.swap_characters_before_cursor() - - assert _buffer.text == 'hello wrold' +from __future__ import unicode_literals + +from prompt_toolkit.buffer import Buffer + +import pytest + + +def _buffer(): + return Buffer() + + +def test_initial(_buffer): + assert _buffer.text == '' + assert _buffer.cursor_position == 0 + + +def test_insert_text(_buffer): + _buffer.insert_text('some_text') + assert _buffer.text == 'some_text' + assert _buffer.cursor_position == len('some_text') + + +def test_cursor_movement(_buffer): + _buffer.insert_text('some_text') + _buffer.cursor_left() + _buffer.cursor_left() + _buffer.cursor_left() + _buffer.cursor_right() + _buffer.insert_text('A') + + assert _buffer.text == 'some_teAxt' + assert _buffer.cursor_position == len('some_teA') + + +def test_backspace(_buffer): + _buffer.insert_text('some_text') + _buffer.cursor_left() + _buffer.cursor_left() + _buffer.delete_before_cursor() + + assert _buffer.text == 'some_txt' + assert _buffer.cursor_position == len('some_t') + + +def test_cursor_up(_buffer): + # Cursor up to a line thats longer. + _buffer.insert_text('long line1\nline2') + _buffer.cursor_up() + + assert _buffer.document.cursor_position == 5 + + # Going up when already at the top. + _buffer.cursor_up() + assert _buffer.document.cursor_position == 5 + + # Going up to a line that's shorter. + _buffer.reset() + _buffer.insert_text('line1\nlong line2') + + _buffer.cursor_up() + assert _buffer.document.cursor_position == 5 + + +def test_cursor_down(_buffer): + _buffer.insert_text('line1\nline2') + _buffer.cursor_position = 3 + + # Normally going down + _buffer.cursor_down() + assert _buffer.document.cursor_position == len('line1\nlin') + + # Going down to a line that's storter. + _buffer.reset() + _buffer.insert_text('long line1\na\nb') + _buffer.cursor_position = 3 + + _buffer.cursor_down() + assert _buffer.document.cursor_position == len('long line1\na') + + +def test_join_next_line(_buffer): + _buffer.insert_text('line1\nline2\nline3') + _buffer.cursor_up() + _buffer.join_next_line() + + assert _buffer.text == 'line1\nline2 line3' + + # Test when there is no '\n' in the text + _buffer.reset() + _buffer.insert_text('line1') + _buffer.cursor_position = 0 + _buffer.join_next_line() + + assert _buffer.text == 'line1' + + +def test_newline(_buffer): + _buffer.insert_text('hello world') + _buffer.newline() + + assert _buffer.text == 'hello world\n' + + +def test_swap_characters_before_cursor(_buffer): + _buffer.insert_text('hello world') + _buffer.cursor_left() + _buffer.cursor_left() + _buffer.swap_characters_before_cursor() + + assert _buffer.text == 'hello wrold' diff --git a/contrib/python/prompt-toolkit/py2/tests/test_cli.py b/contrib/python/prompt-toolkit/py2/tests/test_cli.py index 403b6163d4c..68ca3d03f05 100644 --- a/contrib/python/prompt-toolkit/py2/tests/test_cli.py +++ b/contrib/python/prompt-toolkit/py2/tests/test_cli.py @@ -1,629 +1,629 @@ -# encoding: utf-8 -""" -These are almost end-to-end tests. They create a CommandLineInterface -instance, feed it with some input and check the result. -""" -from __future__ import unicode_literals -from prompt_toolkit.application import Application -from prompt_toolkit.buffer import Buffer, AcceptAction -from prompt_toolkit.clipboard import InMemoryClipboard, ClipboardData -from prompt_toolkit.enums import DEFAULT_BUFFER, EditingMode -from prompt_toolkit.eventloop.posix import PosixEventLoop -from prompt_toolkit.history import InMemoryHistory -from prompt_toolkit.input import PipeInput -from prompt_toolkit.interface import CommandLineInterface -from prompt_toolkit.key_binding.manager import KeyBindingManager -from prompt_toolkit.output import DummyOutput -from prompt_toolkit.terminal.vt100_input import ANSI_SEQUENCES -from functools import partial -import pytest - - -def _history(): - h = InMemoryHistory() - h.append('line1 first input') - h.append('line2 second input') - h.append('line3 third input') - return h - - -def _feed_cli_with_input(text, editing_mode=EditingMode.EMACS, clipboard=None, - history=None, multiline=False, check_line_ending=True, - pre_run_callback=None): - """ - Create a CommandLineInterface, feed it with the given user input and return - the CLI object. - - This returns a (result, CLI) tuple. - """ - # If the given text doesn't end with a newline, the interface won't finish. - if check_line_ending: - assert text.endswith('\n') - - loop = PosixEventLoop() - try: - inp = PipeInput() - inp.send_text(text) - cli = CommandLineInterface( - application=Application( - buffer=Buffer(accept_action=AcceptAction.RETURN_DOCUMENT, - history=history, is_multiline=multiline), - editing_mode=editing_mode, - clipboard=clipboard or InMemoryClipboard(), - key_bindings_registry=KeyBindingManager.for_prompt().registry, - ), - eventloop=loop, - input=inp, - output=DummyOutput()) - - if pre_run_callback: - pre_run_callback(cli) - - result = cli.run() - return result, cli - finally: - loop.close() - inp.close() - - -def test_simple_text_input(): - # Simple text input, followed by enter. - result, cli = _feed_cli_with_input('hello\n') - assert result.text == 'hello' - assert cli.buffers[DEFAULT_BUFFER].text == 'hello' - - -def test_emacs_cursor_movements(): - """ - Test cursor movements with Emacs key bindings. - """ - # ControlA (beginning-of-line) - result, cli = _feed_cli_with_input('hello\x01X\n') - assert result.text == 'Xhello' - - # ControlE (end-of-line) - result, cli = _feed_cli_with_input('hello\x01X\x05Y\n') - assert result.text == 'XhelloY' - - # ControlH or \b - result, cli = _feed_cli_with_input('hello\x08X\n') - assert result.text == 'hellX' - - # Delete. (Left, left, delete) - result, cli = _feed_cli_with_input('hello\x1b[D\x1b[D\x1b[3~\n') - assert result.text == 'helo' - - # Left. - result, cli = _feed_cli_with_input('hello\x1b[DX\n') - assert result.text == 'hellXo' - - # ControlA, right - result, cli = _feed_cli_with_input('hello\x01\x1b[CX\n') - assert result.text == 'hXello' - - # ControlA, right - result, cli = _feed_cli_with_input('hello\x01\x1b[CX\n') - assert result.text == 'hXello' - - # ControlB (backward-char) - result, cli = _feed_cli_with_input('hello\x02X\n') - assert result.text == 'hellXo' - - # ControlF (forward-char) - result, cli = _feed_cli_with_input('hello\x01\x06X\n') - assert result.text == 'hXello' - - # ControlC: raise KeyboardInterrupt. - with pytest.raises(KeyboardInterrupt): - result, cli = _feed_cli_with_input('hello\x03\n') - assert result.text == 'hello' - - # ControlD without any input: raises EOFError. - with pytest.raises(EOFError): - result, cli = _feed_cli_with_input('\x04\n') - assert result.text == 'hello' - - # ControlD: delete after cursor. - result, cli = _feed_cli_with_input('hello\x01\x04\n') - assert result.text == 'ello' - - # ControlD at the end of the input ssshould not do anything. - result, cli = _feed_cli_with_input('hello\x04\n') - assert result.text == 'hello' - - # Left, Left, ControlK (kill-line) - result, cli = _feed_cli_with_input('hello\x1b[D\x1b[D\x0b\n') - assert result.text == 'hel' - - # Left, Left Esc- ControlK (kill-line, but negative) - result, cli = _feed_cli_with_input('hello\x1b[D\x1b[D\x1b-\x0b\n') - assert result.text == 'lo' - - # ControlL: should not influence the result. - result, cli = _feed_cli_with_input('hello\x0c\n') - assert result.text == 'hello' - - # ControlRight (forward-word) - result, cli = _feed_cli_with_input('hello world\x01X\x1b[1;5CY\n') - assert result.text == 'XhelloY world' - - # ContrlolLeft (backward-word) - result, cli = _feed_cli_with_input('hello world\x1b[1;5DY\n') - assert result.text == 'hello Yworld' - - # <esc>-f with argument. (forward-word) - result, cli = _feed_cli_with_input('hello world abc def\x01\x1b3\x1bfX\n') - assert result.text == 'hello world abcX def' - - # <esc>-f with negative argument. (forward-word) - result, cli = _feed_cli_with_input('hello world abc def\x1b-\x1b3\x1bfX\n') - assert result.text == 'hello Xworld abc def' - - # <esc>-b with argument. (backward-word) - result, cli = _feed_cli_with_input('hello world abc def\x1b3\x1bbX\n') - assert result.text == 'hello Xworld abc def' - - # <esc>-b with negative argument. (backward-word) - result, cli = _feed_cli_with_input('hello world abc def\x01\x1b-\x1b3\x1bbX\n') - assert result.text == 'hello world abc Xdef' - - # ControlW (kill-word / unix-word-rubout) - result, cli = _feed_cli_with_input('hello world\x17\n') - assert result.text == 'hello ' - assert cli.clipboard.get_data().text == 'world' - - result, cli = _feed_cli_with_input('test hello world\x1b2\x17\n') - assert result.text == 'test ' - - # Escape Backspace (unix-word-rubout) - result, cli = _feed_cli_with_input('hello world\x1b\x7f\n') - assert result.text == 'hello ' - assert cli.clipboard.get_data().text == 'world' - - result, cli = _feed_cli_with_input('hello world\x1b\x08\n') - assert result.text == 'hello ' - assert cli.clipboard.get_data().text == 'world' - - # Backspace (backward-delete-char) - result, cli = _feed_cli_with_input('hello world\x7f\n') - assert result.text == 'hello worl' - assert result.cursor_position == len('hello worl') - - result, cli = _feed_cli_with_input('hello world\x08\n') - assert result.text == 'hello worl' - assert result.cursor_position == len('hello worl') - - # Delete (delete-char) - result, cli = _feed_cli_with_input('hello world\x01\x1b[3~\n') - assert result.text == 'ello world' - assert result.cursor_position == 0 - - # Escape-\\ (delete-horizontal-space) - result, cli = _feed_cli_with_input('hello world\x1b8\x02\x1b\\\n') - assert result.text == 'helloworld' - assert result.cursor_position == len('hello') - - -def test_emacs_yank(): - # ControlY (yank) - c = InMemoryClipboard(ClipboardData('XYZ')) - result, cli = _feed_cli_with_input('hello\x02\x19\n', clipboard=c) - assert result.text == 'hellXYZo' - assert result.cursor_position == len('hellXYZ') - - -def test_quoted_insert(): - # ControlQ - ControlB (quoted-insert) - result, cli = _feed_cli_with_input('hello\x11\x02\n') - assert result.text == 'hello\x02' - - -def test_transformations(): - # Meta-c (capitalize-word) - result, cli = _feed_cli_with_input('hello world\01\x1bc\n') - assert result.text == 'Hello world' - assert result.cursor_position == len('Hello') - - # Meta-u (uppercase-word) - result, cli = _feed_cli_with_input('hello world\01\x1bu\n') - assert result.text == 'HELLO world' - assert result.cursor_position == len('Hello') - - # Meta-u (downcase-word) - result, cli = _feed_cli_with_input('HELLO WORLD\01\x1bl\n') - assert result.text == 'hello WORLD' - assert result.cursor_position == len('Hello') - - # ControlT (transpose-chars) - result, cli = _feed_cli_with_input('hello\x14\n') - assert result.text == 'helol' - assert result.cursor_position == len('hello') - - # Left, Left, Control-T (transpose-chars) - result, cli = _feed_cli_with_input('abcde\x1b[D\x1b[D\x14\n') - assert result.text == 'abdce' - assert result.cursor_position == len('abcd') - - -def test_emacs_other_bindings(): - # Transpose characters. - result, cli = _feed_cli_with_input('abcde\x14X\n') # Ctrl-T - assert result.text == 'abcedX' - - # Left, Left, Transpose. (This is slightly different.) - result, cli = _feed_cli_with_input('abcde\x1b[D\x1b[D\x14X\n') - assert result.text == 'abdcXe' - - # Clear before cursor. - result, cli = _feed_cli_with_input('hello\x1b[D\x1b[D\x15X\n') - assert result.text == 'Xlo' - - # unix-word-rubout: delete word before the cursor. - # (ControlW). - result, cli = _feed_cli_with_input('hello world test\x17X\n') - assert result.text == 'hello world X' - - result, cli = _feed_cli_with_input('hello world /some/very/long/path\x17X\n') - assert result.text == 'hello world X' - - # (with argument.) - result, cli = _feed_cli_with_input('hello world test\x1b2\x17X\n') - assert result.text == 'hello X' - - result, cli = _feed_cli_with_input('hello world /some/very/long/path\x1b2\x17X\n') - assert result.text == 'hello X' - - # backward-kill-word: delete word before the cursor. - # (Esc-ControlH). - result, cli = _feed_cli_with_input('hello world /some/very/long/path\x1b\x08X\n') - assert result.text == 'hello world /some/very/long/X' - - # (with arguments.) - result, cli = _feed_cli_with_input('hello world /some/very/long/path\x1b3\x1b\x08X\n') - assert result.text == 'hello world /some/very/X' - - -def test_controlx_controlx(): - # At the end: go to the start of the line. - result, cli = _feed_cli_with_input('hello world\x18\x18X\n') - assert result.text == 'Xhello world' - assert result.cursor_position == 1 - - # At the start: go to the end of the line. - result, cli = _feed_cli_with_input('hello world\x01\x18\x18X\n') - assert result.text == 'hello worldX' - - # Left, Left Control-X Control-X: go to the end of the line. - result, cli = _feed_cli_with_input('hello world\x1b[D\x1b[D\x18\x18X\n') - assert result.text == 'hello worldX' - - -def test_emacs_history_bindings(): - # Adding a new item to the history. - history = _history() - result, cli = _feed_cli_with_input('new input\n', history=history) - assert result.text == 'new input' - history.strings[-1] == 'new input' - - # Go up in history, and accept the last item. - result, cli = _feed_cli_with_input('hello\x1b[A\n', history=history) - assert result.text == 'new input' - - # Esc< (beginning-of-history) - result, cli = _feed_cli_with_input('hello\x1b<\n', history=history) - assert result.text == 'line1 first input' - - # Esc> (end-of-history) - result, cli = _feed_cli_with_input('another item\x1b[A\x1b[a\x1b>\n', history=history) - assert result.text == 'another item' - - # ControlUp (previous-history) - result, cli = _feed_cli_with_input('\x1b[1;5A\n', history=history) - assert result.text == 'another item' - - # Esc< ControlDown (beginning-of-history, next-history) - result, cli = _feed_cli_with_input('\x1b<\x1b[1;5B\n', history=history) - assert result.text == 'line2 second input' - - -def test_emacs_reverse_search(): - history = _history() - - # ControlR (reverse-search-history) - result, cli = _feed_cli_with_input('\x12input\n\n', history=history) - assert result.text == 'line3 third input' - - # Hitting ControlR twice. - result, cli = _feed_cli_with_input('\x12input\x12\n\n', history=history) - assert result.text == 'line2 second input' - - -def test_emacs_arguments(): - """ - Test various combinations of arguments in Emacs mode. - """ - # esc 4 - result, cli = _feed_cli_with_input('\x1b4x\n') - assert result.text == 'xxxx' - - # esc 4 4 - result, cli = _feed_cli_with_input('\x1b44x\n') - assert result.text == 'x' * 44 - - # esc 4 esc 4 - result, cli = _feed_cli_with_input('\x1b4\x1b4x\n') - assert result.text == 'x' * 44 - - # esc - right (-1 position to the right, equals 1 to the left.) - result, cli = _feed_cli_with_input('aaaa\x1b-\x1b[Cbbbb\n') - assert result.text == 'aaabbbba' - - # esc - 3 right - result, cli = _feed_cli_with_input('aaaa\x1b-3\x1b[Cbbbb\n') - assert result.text == 'abbbbaaa' - - # esc - - - 3 right - result, cli = _feed_cli_with_input('aaaa\x1b---3\x1b[Cbbbb\n') - assert result.text == 'abbbbaaa' - - -def test_emacs_arguments_for_all_commands(): - """ - Test all Emacs commands with Meta-[0-9] arguments (both positive and - negative). No one should crash. - """ - for key in ANSI_SEQUENCES: - # Ignore BracketedPaste. This would hang forever, because it waits for - # the end sequence. - if key != '\x1b[200~': - try: - # Note: we add an 'X' after the key, because Ctrl-Q (quoted-insert) - # expects something to follow. We add an additional \n, because - # Ctrl-R and Ctrl-S (reverse-search) expect that. - result, cli = _feed_cli_with_input( - 'hello\x1b4' + key + 'X\n\n') - - result, cli = _feed_cli_with_input( - 'hello\x1b-' + key + 'X\n\n') - except KeyboardInterrupt: - # This exception should only be raised for Ctrl-C - assert key == '\x03' - - -def test_emacs_kill_ring(): - operations = ( - # abc ControlA ControlK - 'abc\x01\x0b' - - # def ControlA ControlK - 'def\x01\x0b' - - # ghi ControlA ControlK - 'ghi\x01\x0b' - - # ControlY (yank) - '\x19' - ) - - result, cli = _feed_cli_with_input(operations + '\n') - assert result.text == 'ghi' - - result, cli = _feed_cli_with_input(operations + '\x1by\n') - assert result.text == 'def' - - result, cli = _feed_cli_with_input(operations + '\x1by\x1by\n') - assert result.text == 'abc' - - result, cli = _feed_cli_with_input(operations + '\x1by\x1by\x1by\n') - assert result.text == 'ghi' - - -def test_emacs_insert_comment(): - # Test insert-comment (M-#) binding. - result, cli = _feed_cli_with_input('hello\x1b#', check_line_ending=False) - assert result.text == '#hello' - - result, cli = _feed_cli_with_input( - 'hello\nworld\x1b#', check_line_ending=False, multiline=True) - assert result.text == '#hello\n#world' - - -def test_emacs_record_macro(): - operations = ( - ' ' - '\x18(' # Start recording macro. C-X( - 'hello' - '\x18)' # Stop recording macro. - ' ' - '\x18e' # Execute macro. - '\x18e' # Execute macro. - '\n' - ) - - result, cli = _feed_cli_with_input(operations) - assert result.text == ' hello hellohello' - - -def test_prefix_meta(): - # Test the prefix-meta command. - def setup_keybindings(cli): - from prompt_toolkit.key_binding.bindings.named_commands import prefix_meta - from prompt_toolkit.filters import ViInsertMode - cli.application.key_bindings_registry.add_binding('j', 'j', filter=ViInsertMode())(prefix_meta) - - result, cli = _feed_cli_with_input( - 'hellojjIX\n', pre_run_callback=setup_keybindings, editing_mode=EditingMode.VI) - assert result.text == 'Xhello' - - -def test_bracketed_paste(): - result, cli = _feed_cli_with_input('\x1b[200~hello world\x1b[201~\n') - assert result.text == 'hello world' - - result, cli = _feed_cli_with_input('\x1b[200~hello\nworld\x1b[201~\x1b\n') - assert result.text == 'hello\nworld' - - # With \r\n endings. - result, cli = _feed_cli_with_input('\x1b[200~hello\r\nworld\x1b[201~\x1b\n') - assert result.text == 'hello\nworld' - - # With \r endings. - result, cli = _feed_cli_with_input('\x1b[200~hello\rworld\x1b[201~\x1b\n') - assert result.text == 'hello\nworld' - - -def test_vi_cursor_movements(): - """ - Test cursor movements with Vi key bindings. - """ - feed = partial(_feed_cli_with_input, editing_mode=EditingMode.VI) - - result, cli = feed('\x1b\n') - assert result.text == '' - assert cli.editing_mode == EditingMode.VI - - # Esc h a X - result, cli = feed('hello\x1bhaX\n') - assert result.text == 'hellXo' - - # Esc I X - result, cli = feed('hello\x1bIX\n') - assert result.text == 'Xhello' - - # Esc I X - result, cli = feed('hello\x1bIX\n') - assert result.text == 'Xhello' - - # Esc 2hiX - result, cli = feed('hello\x1b2hiX\n') - assert result.text == 'heXllo' - - # Esc 2h2liX - result, cli = feed('hello\x1b2h2liX\n') - assert result.text == 'hellXo' - - # Esc \b\b - result, cli = feed('hello\b\b\n') - assert result.text == 'hel' - - # Esc \b\b - result, cli = feed('hello\b\b\n') - assert result.text == 'hel' - - # Esc 2h D - result, cli = feed('hello\x1b2hD\n') - assert result.text == 'he' - - # Esc 2h rX \n - result, cli = feed('hello\x1b2hrX\n') - assert result.text == 'heXlo' - - -def test_vi_operators(): - feed = partial(_feed_cli_with_input, editing_mode=EditingMode.VI) - - # Esc g~0 - result, cli = feed('hello\x1bg~0\n') - assert result.text == 'HELLo' - - # Esc gU0 - result, cli = feed('hello\x1bgU0\n') - assert result.text == 'HELLo' - - # Esc d0 - result, cli = feed('hello\x1bd0\n') - assert result.text == 'o' - - -def test_vi_text_objects(): - feed = partial(_feed_cli_with_input, editing_mode=EditingMode.VI) - - # Esc gUgg - result, cli = feed('hello\x1bgUgg\n') - assert result.text == 'HELLO' - - # Esc gUU - result, cli = feed('hello\x1bgUU\n') - assert result.text == 'HELLO' - - # Esc di( - result, cli = feed('before(inside)after\x1b8hdi(\n') - assert result.text == 'before()after' - - # Esc di[ - result, cli = feed('before[inside]after\x1b8hdi[\n') - assert result.text == 'before[]after' - - # Esc da( - result, cli = feed('before(inside)after\x1b8hda(\n') - assert result.text == 'beforeafter' - - -def test_vi_digraphs(): - feed = partial(_feed_cli_with_input, editing_mode=EditingMode.VI) - - # C-K o/ - result, cli = feed('hello\x0bo/\n') - assert result.text == 'helloø' - - # C-K /o (reversed input.) - result, cli = feed('hello\x0b/o\n') - assert result.text == 'helloø' - - # C-K e: - result, cli = feed('hello\x0be:\n') - assert result.text == 'helloë' - - # C-K xxy (Unknown digraph.) - result, cli = feed('hello\x0bxxy\n') - assert result.text == 'helloy' - - -def test_vi_block_editing(): - " Test Vi Control-V style block insertion. " - feed = partial(_feed_cli_with_input, editing_mode=EditingMode.VI, - multiline=True) - - operations = ( - # Three lines of text. - '-line1\n-line2\n-line3\n-line4\n-line5\n-line6' - # Go to the second character of the second line. - '\x1bkkkkkkkj0l' - # Enter Visual block mode. - '\x16' - # Go down two more lines. - 'jj' - # Go 3 characters to the right. - 'lll' - # Go to insert mode. - 'insert' # (Will be replaced.) - # Insert stars. - '***' - # Escape again. - '\x1b\n') - - # Control-I - result, cli = feed(operations.replace('insert', 'I')) - - assert (result.text == - '-line1\n-***line2\n-***line3\n-***line4\n-line5\n-line6') - - # Control-A - result, cli = feed(operations.replace('insert', 'A')) - - assert (result.text == - '-line1\n-line***2\n-line***3\n-line***4\n-line5\n-line6') - - -def test_vi_character_paste(): - feed = partial(_feed_cli_with_input, editing_mode=EditingMode.VI) - - # Test 'p' character paste. - result, cli = feed('abcde\x1bhhxp\n') - assert result.text == 'abdce' - assert result.cursor_position == 3 - - # Test 'P' character paste. - result, cli = feed('abcde\x1bhhxP\n') - assert result.text == 'abcde' - assert result.cursor_position == 2 +# encoding: utf-8 +""" +These are almost end-to-end tests. They create a CommandLineInterface +instance, feed it with some input and check the result. +""" +from __future__ import unicode_literals +from prompt_toolkit.application import Application +from prompt_toolkit.buffer import Buffer, AcceptAction +from prompt_toolkit.clipboard import InMemoryClipboard, ClipboardData +from prompt_toolkit.enums import DEFAULT_BUFFER, EditingMode +from prompt_toolkit.eventloop.posix import PosixEventLoop +from prompt_toolkit.history import InMemoryHistory +from prompt_toolkit.input import PipeInput +from prompt_toolkit.interface import CommandLineInterface +from prompt_toolkit.key_binding.manager import KeyBindingManager +from prompt_toolkit.output import DummyOutput +from prompt_toolkit.terminal.vt100_input import ANSI_SEQUENCES +from functools import partial +import pytest + + +def _history(): + h = InMemoryHistory() + h.append('line1 first input') + h.append('line2 second input') + h.append('line3 third input') + return h + + +def _feed_cli_with_input(text, editing_mode=EditingMode.EMACS, clipboard=None, + history=None, multiline=False, check_line_ending=True, + pre_run_callback=None): + """ + Create a CommandLineInterface, feed it with the given user input and return + the CLI object. + + This returns a (result, CLI) tuple. + """ + # If the given text doesn't end with a newline, the interface won't finish. + if check_line_ending: + assert text.endswith('\n') + + loop = PosixEventLoop() + try: + inp = PipeInput() + inp.send_text(text) + cli = CommandLineInterface( + application=Application( + buffer=Buffer(accept_action=AcceptAction.RETURN_DOCUMENT, + history=history, is_multiline=multiline), + editing_mode=editing_mode, + clipboard=clipboard or InMemoryClipboard(), + key_bindings_registry=KeyBindingManager.for_prompt().registry, + ), + eventloop=loop, + input=inp, + output=DummyOutput()) + + if pre_run_callback: + pre_run_callback(cli) + + result = cli.run() + return result, cli + finally: + loop.close() + inp.close() + + +def test_simple_text_input(): + # Simple text input, followed by enter. + result, cli = _feed_cli_with_input('hello\n') + assert result.text == 'hello' + assert cli.buffers[DEFAULT_BUFFER].text == 'hello' + + +def test_emacs_cursor_movements(): + """ + Test cursor movements with Emacs key bindings. + """ + # ControlA (beginning-of-line) + result, cli = _feed_cli_with_input('hello\x01X\n') + assert result.text == 'Xhello' + + # ControlE (end-of-line) + result, cli = _feed_cli_with_input('hello\x01X\x05Y\n') + assert result.text == 'XhelloY' + + # ControlH or \b + result, cli = _feed_cli_with_input('hello\x08X\n') + assert result.text == 'hellX' + + # Delete. (Left, left, delete) + result, cli = _feed_cli_with_input('hello\x1b[D\x1b[D\x1b[3~\n') + assert result.text == 'helo' + + # Left. + result, cli = _feed_cli_with_input('hello\x1b[DX\n') + assert result.text == 'hellXo' + + # ControlA, right + result, cli = _feed_cli_with_input('hello\x01\x1b[CX\n') + assert result.text == 'hXello' + + # ControlA, right + result, cli = _feed_cli_with_input('hello\x01\x1b[CX\n') + assert result.text == 'hXello' + + # ControlB (backward-char) + result, cli = _feed_cli_with_input('hello\x02X\n') + assert result.text == 'hellXo' + + # ControlF (forward-char) + result, cli = _feed_cli_with_input('hello\x01\x06X\n') + assert result.text == 'hXello' + + # ControlC: raise KeyboardInterrupt. + with pytest.raises(KeyboardInterrupt): + result, cli = _feed_cli_with_input('hello\x03\n') + assert result.text == 'hello' + + # ControlD without any input: raises EOFError. + with pytest.raises(EOFError): + result, cli = _feed_cli_with_input('\x04\n') + assert result.text == 'hello' + + # ControlD: delete after cursor. + result, cli = _feed_cli_with_input('hello\x01\x04\n') + assert result.text == 'ello' + + # ControlD at the end of the input ssshould not do anything. + result, cli = _feed_cli_with_input('hello\x04\n') + assert result.text == 'hello' + + # Left, Left, ControlK (kill-line) + result, cli = _feed_cli_with_input('hello\x1b[D\x1b[D\x0b\n') + assert result.text == 'hel' + + # Left, Left Esc- ControlK (kill-line, but negative) + result, cli = _feed_cli_with_input('hello\x1b[D\x1b[D\x1b-\x0b\n') + assert result.text == 'lo' + + # ControlL: should not influence the result. + result, cli = _feed_cli_with_input('hello\x0c\n') + assert result.text == 'hello' + + # ControlRight (forward-word) + result, cli = _feed_cli_with_input('hello world\x01X\x1b[1;5CY\n') + assert result.text == 'XhelloY world' + + # ContrlolLeft (backward-word) + result, cli = _feed_cli_with_input('hello world\x1b[1;5DY\n') + assert result.text == 'hello Yworld' + + # <esc>-f with argument. (forward-word) + result, cli = _feed_cli_with_input('hello world abc def\x01\x1b3\x1bfX\n') + assert result.text == 'hello world abcX def' + + # <esc>-f with negative argument. (forward-word) + result, cli = _feed_cli_with_input('hello world abc def\x1b-\x1b3\x1bfX\n') + assert result.text == 'hello Xworld abc def' + + # <esc>-b with argument. (backward-word) + result, cli = _feed_cli_with_input('hello world abc def\x1b3\x1bbX\n') + assert result.text == 'hello Xworld abc def' + + # <esc>-b with negative argument. (backward-word) + result, cli = _feed_cli_with_input('hello world abc def\x01\x1b-\x1b3\x1bbX\n') + assert result.text == 'hello world abc Xdef' + + # ControlW (kill-word / unix-word-rubout) + result, cli = _feed_cli_with_input('hello world\x17\n') + assert result.text == 'hello ' + assert cli.clipboard.get_data().text == 'world' + + result, cli = _feed_cli_with_input('test hello world\x1b2\x17\n') + assert result.text == 'test ' + + # Escape Backspace (unix-word-rubout) + result, cli = _feed_cli_with_input('hello world\x1b\x7f\n') + assert result.text == 'hello ' + assert cli.clipboard.get_data().text == 'world' + + result, cli = _feed_cli_with_input('hello world\x1b\x08\n') + assert result.text == 'hello ' + assert cli.clipboard.get_data().text == 'world' + + # Backspace (backward-delete-char) + result, cli = _feed_cli_with_input('hello world\x7f\n') + assert result.text == 'hello worl' + assert result.cursor_position == len('hello worl') + + result, cli = _feed_cli_with_input('hello world\x08\n') + assert result.text == 'hello worl' + assert result.cursor_position == len('hello worl') + + # Delete (delete-char) + result, cli = _feed_cli_with_input('hello world\x01\x1b[3~\n') + assert result.text == 'ello world' + assert result.cursor_position == 0 + + # Escape-\\ (delete-horizontal-space) + result, cli = _feed_cli_with_input('hello world\x1b8\x02\x1b\\\n') + assert result.text == 'helloworld' + assert result.cursor_position == len('hello') + + +def test_emacs_yank(): + # ControlY (yank) + c = InMemoryClipboard(ClipboardData('XYZ')) + result, cli = _feed_cli_with_input('hello\x02\x19\n', clipboard=c) + assert result.text == 'hellXYZo' + assert result.cursor_position == len('hellXYZ') + + +def test_quoted_insert(): + # ControlQ - ControlB (quoted-insert) + result, cli = _feed_cli_with_input('hello\x11\x02\n') + assert result.text == 'hello\x02' + + +def test_transformations(): + # Meta-c (capitalize-word) + result, cli = _feed_cli_with_input('hello world\01\x1bc\n') + assert result.text == 'Hello world' + assert result.cursor_position == len('Hello') + + # Meta-u (uppercase-word) + result, cli = _feed_cli_with_input('hello world\01\x1bu\n') + assert result.text == 'HELLO world' + assert result.cursor_position == len('Hello') + + # Meta-u (downcase-word) + result, cli = _feed_cli_with_input('HELLO WORLD\01\x1bl\n') + assert result.text == 'hello WORLD' + assert result.cursor_position == len('Hello') + + # ControlT (transpose-chars) + result, cli = _feed_cli_with_input('hello\x14\n') + assert result.text == 'helol' + assert result.cursor_position == len('hello') + + # Left, Left, Control-T (transpose-chars) + result, cli = _feed_cli_with_input('abcde\x1b[D\x1b[D\x14\n') + assert result.text == 'abdce' + assert result.cursor_position == len('abcd') + + +def test_emacs_other_bindings(): + # Transpose characters. + result, cli = _feed_cli_with_input('abcde\x14X\n') # Ctrl-T + assert result.text == 'abcedX' + + # Left, Left, Transpose. (This is slightly different.) + result, cli = _feed_cli_with_input('abcde\x1b[D\x1b[D\x14X\n') + assert result.text == 'abdcXe' + + # Clear before cursor. + result, cli = _feed_cli_with_input('hello\x1b[D\x1b[D\x15X\n') + assert result.text == 'Xlo' + + # unix-word-rubout: delete word before the cursor. + # (ControlW). + result, cli = _feed_cli_with_input('hello world test\x17X\n') + assert result.text == 'hello world X' + + result, cli = _feed_cli_with_input('hello world /some/very/long/path\x17X\n') + assert result.text == 'hello world X' + + # (with argument.) + result, cli = _feed_cli_with_input('hello world test\x1b2\x17X\n') + assert result.text == 'hello X' + + result, cli = _feed_cli_with_input('hello world /some/very/long/path\x1b2\x17X\n') + assert result.text == 'hello X' + + # backward-kill-word: delete word before the cursor. + # (Esc-ControlH). + result, cli = _feed_cli_with_input('hello world /some/very/long/path\x1b\x08X\n') + assert result.text == 'hello world /some/very/long/X' + + # (with arguments.) + result, cli = _feed_cli_with_input('hello world /some/very/long/path\x1b3\x1b\x08X\n') + assert result.text == 'hello world /some/very/X' + + +def test_controlx_controlx(): + # At the end: go to the start of the line. + result, cli = _feed_cli_with_input('hello world\x18\x18X\n') + assert result.text == 'Xhello world' + assert result.cursor_position == 1 + + # At the start: go to the end of the line. + result, cli = _feed_cli_with_input('hello world\x01\x18\x18X\n') + assert result.text == 'hello worldX' + + # Left, Left Control-X Control-X: go to the end of the line. + result, cli = _feed_cli_with_input('hello world\x1b[D\x1b[D\x18\x18X\n') + assert result.text == 'hello worldX' + + +def test_emacs_history_bindings(): + # Adding a new item to the history. + history = _history() + result, cli = _feed_cli_with_input('new input\n', history=history) + assert result.text == 'new input' + history.strings[-1] == 'new input' + + # Go up in history, and accept the last item. + result, cli = _feed_cli_with_input('hello\x1b[A\n', history=history) + assert result.text == 'new input' + + # Esc< (beginning-of-history) + result, cli = _feed_cli_with_input('hello\x1b<\n', history=history) + assert result.text == 'line1 first input' + + # Esc> (end-of-history) + result, cli = _feed_cli_with_input('another item\x1b[A\x1b[a\x1b>\n', history=history) + assert result.text == 'another item' + + # ControlUp (previous-history) + result, cli = _feed_cli_with_input('\x1b[1;5A\n', history=history) + assert result.text == 'another item' + + # Esc< ControlDown (beginning-of-history, next-history) + result, cli = _feed_cli_with_input('\x1b<\x1b[1;5B\n', history=history) + assert result.text == 'line2 second input' + + +def test_emacs_reverse_search(): + history = _history() + + # ControlR (reverse-search-history) + result, cli = _feed_cli_with_input('\x12input\n\n', history=history) + assert result.text == 'line3 third input' + + # Hitting ControlR twice. + result, cli = _feed_cli_with_input('\x12input\x12\n\n', history=history) + assert result.text == 'line2 second input' + + +def test_emacs_arguments(): + """ + Test various combinations of arguments in Emacs mode. + """ + # esc 4 + result, cli = _feed_cli_with_input('\x1b4x\n') + assert result.text == 'xxxx' + + # esc 4 4 + result, cli = _feed_cli_with_input('\x1b44x\n') + assert result.text == 'x' * 44 + + # esc 4 esc 4 + result, cli = _feed_cli_with_input('\x1b4\x1b4x\n') + assert result.text == 'x' * 44 + + # esc - right (-1 position to the right, equals 1 to the left.) + result, cli = _feed_cli_with_input('aaaa\x1b-\x1b[Cbbbb\n') + assert result.text == 'aaabbbba' + + # esc - 3 right + result, cli = _feed_cli_with_input('aaaa\x1b-3\x1b[Cbbbb\n') + assert result.text == 'abbbbaaa' + + # esc - - - 3 right + result, cli = _feed_cli_with_input('aaaa\x1b---3\x1b[Cbbbb\n') + assert result.text == 'abbbbaaa' + + +def test_emacs_arguments_for_all_commands(): + """ + Test all Emacs commands with Meta-[0-9] arguments (both positive and + negative). No one should crash. + """ + for key in ANSI_SEQUENCES: + # Ignore BracketedPaste. This would hang forever, because it waits for + # the end sequence. + if key != '\x1b[200~': + try: + # Note: we add an 'X' after the key, because Ctrl-Q (quoted-insert) + # expects something to follow. We add an additional \n, because + # Ctrl-R and Ctrl-S (reverse-search) expect that. + result, cli = _feed_cli_with_input( + 'hello\x1b4' + key + 'X\n\n') + + result, cli = _feed_cli_with_input( + 'hello\x1b-' + key + 'X\n\n') + except KeyboardInterrupt: + # This exception should only be raised for Ctrl-C + assert key == '\x03' + + +def test_emacs_kill_ring(): + operations = ( + # abc ControlA ControlK + 'abc\x01\x0b' + + # def ControlA ControlK + 'def\x01\x0b' + + # ghi ControlA ControlK + 'ghi\x01\x0b' + + # ControlY (yank) + '\x19' + ) + + result, cli = _feed_cli_with_input(operations + '\n') + assert result.text == 'ghi' + + result, cli = _feed_cli_with_input(operations + '\x1by\n') + assert result.text == 'def' + + result, cli = _feed_cli_with_input(operations + '\x1by\x1by\n') + assert result.text == 'abc' + + result, cli = _feed_cli_with_input(operations + '\x1by\x1by\x1by\n') + assert result.text == 'ghi' + + +def test_emacs_insert_comment(): + # Test insert-comment (M-#) binding. + result, cli = _feed_cli_with_input('hello\x1b#', check_line_ending=False) + assert result.text == '#hello' + + result, cli = _feed_cli_with_input( + 'hello\nworld\x1b#', check_line_ending=False, multiline=True) + assert result.text == '#hello\n#world' + + +def test_emacs_record_macro(): + operations = ( + ' ' + '\x18(' # Start recording macro. C-X( + 'hello' + '\x18)' # Stop recording macro. + ' ' + '\x18e' # Execute macro. + '\x18e' # Execute macro. + '\n' + ) + + result, cli = _feed_cli_with_input(operations) + assert result.text == ' hello hellohello' + + +def test_prefix_meta(): + # Test the prefix-meta command. + def setup_keybindings(cli): + from prompt_toolkit.key_binding.bindings.named_commands import prefix_meta + from prompt_toolkit.filters import ViInsertMode + cli.application.key_bindings_registry.add_binding('j', 'j', filter=ViInsertMode())(prefix_meta) + + result, cli = _feed_cli_with_input( + 'hellojjIX\n', pre_run_callback=setup_keybindings, editing_mode=EditingMode.VI) + assert result.text == 'Xhello' + + +def test_bracketed_paste(): + result, cli = _feed_cli_with_input('\x1b[200~hello world\x1b[201~\n') + assert result.text == 'hello world' + + result, cli = _feed_cli_with_input('\x1b[200~hello\nworld\x1b[201~\x1b\n') + assert result.text == 'hello\nworld' + + # With \r\n endings. + result, cli = _feed_cli_with_input('\x1b[200~hello\r\nworld\x1b[201~\x1b\n') + assert result.text == 'hello\nworld' + + # With \r endings. + result, cli = _feed_cli_with_input('\x1b[200~hello\rworld\x1b[201~\x1b\n') + assert result.text == 'hello\nworld' + + +def test_vi_cursor_movements(): + """ + Test cursor movements with Vi key bindings. + """ + feed = partial(_feed_cli_with_input, editing_mode=EditingMode.VI) + + result, cli = feed('\x1b\n') + assert result.text == '' + assert cli.editing_mode == EditingMode.VI + + # Esc h a X + result, cli = feed('hello\x1bhaX\n') + assert result.text == 'hellXo' + + # Esc I X + result, cli = feed('hello\x1bIX\n') + assert result.text == 'Xhello' + + # Esc I X + result, cli = feed('hello\x1bIX\n') + assert result.text == 'Xhello' + + # Esc 2hiX + result, cli = feed('hello\x1b2hiX\n') + assert result.text == 'heXllo' + + # Esc 2h2liX + result, cli = feed('hello\x1b2h2liX\n') + assert result.text == 'hellXo' + + # Esc \b\b + result, cli = feed('hello\b\b\n') + assert result.text == 'hel' + + # Esc \b\b + result, cli = feed('hello\b\b\n') + assert result.text == 'hel' + + # Esc 2h D + result, cli = feed('hello\x1b2hD\n') + assert result.text == 'he' + + # Esc 2h rX \n + result, cli = feed('hello\x1b2hrX\n') + assert result.text == 'heXlo' + + +def test_vi_operators(): + feed = partial(_feed_cli_with_input, editing_mode=EditingMode.VI) + + # Esc g~0 + result, cli = feed('hello\x1bg~0\n') + assert result.text == 'HELLo' + + # Esc gU0 + result, cli = feed('hello\x1bgU0\n') + assert result.text == 'HELLo' + + # Esc d0 + result, cli = feed('hello\x1bd0\n') + assert result.text == 'o' + + +def test_vi_text_objects(): + feed = partial(_feed_cli_with_input, editing_mode=EditingMode.VI) + + # Esc gUgg + result, cli = feed('hello\x1bgUgg\n') + assert result.text == 'HELLO' + + # Esc gUU + result, cli = feed('hello\x1bgUU\n') + assert result.text == 'HELLO' + + # Esc di( + result, cli = feed('before(inside)after\x1b8hdi(\n') + assert result.text == 'before()after' + + # Esc di[ + result, cli = feed('before[inside]after\x1b8hdi[\n') + assert result.text == 'before[]after' + + # Esc da( + result, cli = feed('before(inside)after\x1b8hda(\n') + assert result.text == 'beforeafter' + + +def test_vi_digraphs(): + feed = partial(_feed_cli_with_input, editing_mode=EditingMode.VI) + + # C-K o/ + result, cli = feed('hello\x0bo/\n') + assert result.text == 'helloø' + + # C-K /o (reversed input.) + result, cli = feed('hello\x0b/o\n') + assert result.text == 'helloø' + + # C-K e: + result, cli = feed('hello\x0be:\n') + assert result.text == 'helloë' + + # C-K xxy (Unknown digraph.) + result, cli = feed('hello\x0bxxy\n') + assert result.text == 'helloy' + + +def test_vi_block_editing(): + " Test Vi Control-V style block insertion. " + feed = partial(_feed_cli_with_input, editing_mode=EditingMode.VI, + multiline=True) + + operations = ( + # Three lines of text. + '-line1\n-line2\n-line3\n-line4\n-line5\n-line6' + # Go to the second character of the second line. + '\x1bkkkkkkkj0l' + # Enter Visual block mode. + '\x16' + # Go down two more lines. + 'jj' + # Go 3 characters to the right. + 'lll' + # Go to insert mode. + 'insert' # (Will be replaced.) + # Insert stars. + '***' + # Escape again. + '\x1b\n') + + # Control-I + result, cli = feed(operations.replace('insert', 'I')) + + assert (result.text == + '-line1\n-***line2\n-***line3\n-***line4\n-line5\n-line6') + + # Control-A + result, cli = feed(operations.replace('insert', 'A')) + + assert (result.text == + '-line1\n-line***2\n-line***3\n-line***4\n-line5\n-line6') + + +def test_vi_character_paste(): + feed = partial(_feed_cli_with_input, editing_mode=EditingMode.VI) + + # Test 'p' character paste. + result, cli = feed('abcde\x1bhhxp\n') + assert result.text == 'abdce' + assert result.cursor_position == 3 + + # Test 'P' character paste. + result, cli = feed('abcde\x1bhhxP\n') + assert result.text == 'abcde' + assert result.cursor_position == 2 diff --git a/contrib/python/prompt-toolkit/py2/tests/test_contrib.py b/contrib/python/prompt-toolkit/py2/tests/test_contrib.py index bf9fc5e064c..64765d3f1a1 100644 --- a/contrib/python/prompt-toolkit/py2/tests/test_contrib.py +++ b/contrib/python/prompt-toolkit/py2/tests/test_contrib.py @@ -1,254 +1,254 @@ -from __future__ import unicode_literals, absolute_import, print_function - -import os -import shutil -import tempfile - -from contextlib import contextmanager - -from six import text_type - -from prompt_toolkit.completion import CompleteEvent -from prompt_toolkit.document import Document -from prompt_toolkit.contrib.completers.filesystem import PathCompleter - - -@contextmanager -def chdir(directory): - """Context manager for current working directory temporary change.""" - orig_dir = os.getcwd() - os.chdir(directory) - - try: - yield - finally: - os.chdir(orig_dir) - - -def write_test_files(test_dir, names=None): - """Write test files in test_dir using the names list.""" - names = names or range(10) - for i in names: - with open(os.path.join(test_dir, str(i)), 'wb') as out: - out.write(''.encode('UTF-8')) - - -def test_pathcompleter_completes_in_current_directory(): - completer = PathCompleter() - doc_text = '' - doc = Document(doc_text, len(doc_text)) - event = CompleteEvent() - completions = list(completer.get_completions(doc, event)) - assert len(completions) > 0 - - -def test_pathcompleter_completes_files_in_current_directory(): - # setup: create a test dir with 10 files - test_dir = tempfile.mkdtemp() - write_test_files(test_dir) - - expected = sorted([str(i) for i in range(10)]) - - if not test_dir.endswith(os.path.sep): - test_dir += os.path.sep - - with chdir(test_dir): - completer = PathCompleter() - # this should complete on the cwd - doc_text = '' - doc = Document(doc_text, len(doc_text)) - event = CompleteEvent() - completions = list(completer.get_completions(doc, event)) - result = sorted(c.text for c in completions) - assert expected == result - - # cleanup - shutil.rmtree(test_dir) - - -def test_pathcompleter_completes_files_in_absolute_directory(): - # setup: create a test dir with 10 files - test_dir = tempfile.mkdtemp() - write_test_files(test_dir) - - expected = sorted([str(i) for i in range(10)]) - - test_dir = os.path.abspath(test_dir) - if not test_dir.endswith(os.path.sep): - test_dir += os.path.sep - - completer = PathCompleter() - # force unicode - doc_text = text_type(test_dir) - doc = Document(doc_text, len(doc_text)) - event = CompleteEvent() - completions = list(completer.get_completions(doc, event)) - result = sorted([c.text for c in completions]) - assert expected == result - - # cleanup - shutil.rmtree(test_dir) - - -def test_pathcompleter_completes_directories_with_only_directories(): - # setup: create a test dir with 10 files - test_dir = tempfile.mkdtemp() - write_test_files(test_dir) - - # create a sub directory there - os.mkdir(os.path.join(test_dir, 'subdir')) - - if not test_dir.endswith(os.path.sep): - test_dir += os.path.sep - - with chdir(test_dir): - completer = PathCompleter(only_directories=True) - doc_text = '' - doc = Document(doc_text, len(doc_text)) - event = CompleteEvent() - completions = list(completer.get_completions(doc, event)) - result = [c.text for c in completions] - assert ['subdir'] == result - - # check that there is no completion when passing a file - with chdir(test_dir): - completer = PathCompleter(only_directories=True) - doc_text = '1' - doc = Document(doc_text, len(doc_text)) - event = CompleteEvent() - completions = list(completer.get_completions(doc, event)) - assert [] == completions - - # cleanup - shutil.rmtree(test_dir) - - -def test_pathcompleter_respects_completions_under_min_input_len(): - # setup: create a test dir with 10 files - test_dir = tempfile.mkdtemp() - write_test_files(test_dir) - - # min len:1 and no text - with chdir(test_dir): - completer = PathCompleter(min_input_len=1) - doc_text = '' - doc = Document(doc_text, len(doc_text)) - event = CompleteEvent() - completions = list(completer.get_completions(doc, event)) - assert [] == completions - - # min len:1 and text of len 1 - with chdir(test_dir): - completer = PathCompleter(min_input_len=1) - doc_text = '1' - doc = Document(doc_text, len(doc_text)) - event = CompleteEvent() - completions = list(completer.get_completions(doc, event)) - result = [c.text for c in completions] - assert [''] == result - - # min len:0 and text of len 2 - with chdir(test_dir): - completer = PathCompleter(min_input_len=0) - doc_text = '1' - doc = Document(doc_text, len(doc_text)) - event = CompleteEvent() - completions = list(completer.get_completions(doc, event)) - result = [c.text for c in completions] - assert [''] == result - - # create 10 files with a 2 char long name - for i in range(10): - with open(os.path.join(test_dir, str(i) * 2), 'wb') as out: - out.write(b'') - - # min len:1 and text of len 1 - with chdir(test_dir): - completer = PathCompleter(min_input_len=1) - doc_text = '2' - doc = Document(doc_text, len(doc_text)) - event = CompleteEvent() - completions = list(completer.get_completions(doc, event)) - result = sorted(c.text for c in completions) - assert ['', '2'] == result - - # min len:2 and text of len 1 - with chdir(test_dir): - completer = PathCompleter(min_input_len=2) - doc_text = '2' - doc = Document(doc_text, len(doc_text)) - event = CompleteEvent() - completions = list(completer.get_completions(doc, event)) - assert [] == completions - - # cleanup - shutil.rmtree(test_dir) - - -def test_pathcompleter_does_not_expanduser_by_default(): - completer = PathCompleter() - doc_text = '~' - doc = Document(doc_text, len(doc_text)) - event = CompleteEvent() - completions = list(completer.get_completions(doc, event)) - assert [] == completions - - -def test_pathcompleter_can_expanduser(monkeypatch): - monkeypatch.setenv('HOME', '/tmp') - completer = PathCompleter(expanduser=True) - doc_text = '~' - doc = Document(doc_text, len(doc_text)) - event = CompleteEvent() - completions = list(completer.get_completions(doc, event)) - assert len(completions) > 0 - - -def test_pathcompleter_can_apply_file_filter(): - # setup: create a test dir with 10 files - test_dir = tempfile.mkdtemp() - write_test_files(test_dir) - - # add a .csv file - with open(os.path.join(test_dir, 'my.csv'), 'wb') as out: - out.write(b'') - - file_filter = lambda f: f and f.endswith('.csv') - - with chdir(test_dir): - completer = PathCompleter(file_filter=file_filter) - doc_text = '' - doc = Document(doc_text, len(doc_text)) - event = CompleteEvent() - completions = list(completer.get_completions(doc, event)) - result = [c.text for c in completions] - assert ['my.csv'] == result - - # cleanup - shutil.rmtree(test_dir) - - -def test_pathcompleter_get_paths_constrains_path(): - # setup: create a test dir with 10 files - test_dir = tempfile.mkdtemp() - write_test_files(test_dir) - - # add a subdir with 10 other files with different names - subdir = os.path.join(test_dir, 'subdir') - os.mkdir(subdir) - write_test_files(subdir, 'abcdefghij') - - get_paths = lambda: ['subdir'] - - with chdir(test_dir): - completer = PathCompleter(get_paths=get_paths) - doc_text = '' - doc = Document(doc_text, len(doc_text)) - event = CompleteEvent() - completions = list(completer.get_completions(doc, event)) - result = [c.text for c in completions] - expected = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'] - assert expected == result - - # cleanup - shutil.rmtree(test_dir) +from __future__ import unicode_literals, absolute_import, print_function + +import os +import shutil +import tempfile + +from contextlib import contextmanager + +from six import text_type + +from prompt_toolkit.completion import CompleteEvent +from prompt_toolkit.document import Document +from prompt_toolkit.contrib.completers.filesystem import PathCompleter + + +@contextmanager +def chdir(directory): + """Context manager for current working directory temporary change.""" + orig_dir = os.getcwd() + os.chdir(directory) + + try: + yield + finally: + os.chdir(orig_dir) + + +def write_test_files(test_dir, names=None): + """Write test files in test_dir using the names list.""" + names = names or range(10) + for i in names: + with open(os.path.join(test_dir, str(i)), 'wb') as out: + out.write(''.encode('UTF-8')) + + +def test_pathcompleter_completes_in_current_directory(): + completer = PathCompleter() + doc_text = '' + doc = Document(doc_text, len(doc_text)) + event = CompleteEvent() + completions = list(completer.get_completions(doc, event)) + assert len(completions) > 0 + + +def test_pathcompleter_completes_files_in_current_directory(): + # setup: create a test dir with 10 files + test_dir = tempfile.mkdtemp() + write_test_files(test_dir) + + expected = sorted([str(i) for i in range(10)]) + + if not test_dir.endswith(os.path.sep): + test_dir += os.path.sep + + with chdir(test_dir): + completer = PathCompleter() + # this should complete on the cwd + doc_text = '' + doc = Document(doc_text, len(doc_text)) + event = CompleteEvent() + completions = list(completer.get_completions(doc, event)) + result = sorted(c.text for c in completions) + assert expected == result + + # cleanup + shutil.rmtree(test_dir) + + +def test_pathcompleter_completes_files_in_absolute_directory(): + # setup: create a test dir with 10 files + test_dir = tempfile.mkdtemp() + write_test_files(test_dir) + + expected = sorted([str(i) for i in range(10)]) + + test_dir = os.path.abspath(test_dir) + if not test_dir.endswith(os.path.sep): + test_dir += os.path.sep + + completer = PathCompleter() + # force unicode + doc_text = text_type(test_dir) + doc = Document(doc_text, len(doc_text)) + event = CompleteEvent() + completions = list(completer.get_completions(doc, event)) + result = sorted([c.text for c in completions]) + assert expected == result + + # cleanup + shutil.rmtree(test_dir) + + +def test_pathcompleter_completes_directories_with_only_directories(): + # setup: create a test dir with 10 files + test_dir = tempfile.mkdtemp() + write_test_files(test_dir) + + # create a sub directory there + os.mkdir(os.path.join(test_dir, 'subdir')) + + if not test_dir.endswith(os.path.sep): + test_dir += os.path.sep + + with chdir(test_dir): + completer = PathCompleter(only_directories=True) + doc_text = '' + doc = Document(doc_text, len(doc_text)) + event = CompleteEvent() + completions = list(completer.get_completions(doc, event)) + result = [c.text for c in completions] + assert ['subdir'] == result + + # check that there is no completion when passing a file + with chdir(test_dir): + completer = PathCompleter(only_directories=True) + doc_text = '1' + doc = Document(doc_text, len(doc_text)) + event = CompleteEvent() + completions = list(completer.get_completions(doc, event)) + assert [] == completions + + # cleanup + shutil.rmtree(test_dir) + + +def test_pathcompleter_respects_completions_under_min_input_len(): + # setup: create a test dir with 10 files + test_dir = tempfile.mkdtemp() + write_test_files(test_dir) + + # min len:1 and no text + with chdir(test_dir): + completer = PathCompleter(min_input_len=1) + doc_text = '' + doc = Document(doc_text, len(doc_text)) + event = CompleteEvent() + completions = list(completer.get_completions(doc, event)) + assert [] == completions + + # min len:1 and text of len 1 + with chdir(test_dir): + completer = PathCompleter(min_input_len=1) + doc_text = '1' + doc = Document(doc_text, len(doc_text)) + event = CompleteEvent() + completions = list(completer.get_completions(doc, event)) + result = [c.text for c in completions] + assert [''] == result + + # min len:0 and text of len 2 + with chdir(test_dir): + completer = PathCompleter(min_input_len=0) + doc_text = '1' + doc = Document(doc_text, len(doc_text)) + event = CompleteEvent() + completions = list(completer.get_completions(doc, event)) + result = [c.text for c in completions] + assert [''] == result + + # create 10 files with a 2 char long name + for i in range(10): + with open(os.path.join(test_dir, str(i) * 2), 'wb') as out: + out.write(b'') + + # min len:1 and text of len 1 + with chdir(test_dir): + completer = PathCompleter(min_input_len=1) + doc_text = '2' + doc = Document(doc_text, len(doc_text)) + event = CompleteEvent() + completions = list(completer.get_completions(doc, event)) + result = sorted(c.text for c in completions) + assert ['', '2'] == result + + # min len:2 and text of len 1 + with chdir(test_dir): + completer = PathCompleter(min_input_len=2) + doc_text = '2' + doc = Document(doc_text, len(doc_text)) + event = CompleteEvent() + completions = list(completer.get_completions(doc, event)) + assert [] == completions + + # cleanup + shutil.rmtree(test_dir) + + +def test_pathcompleter_does_not_expanduser_by_default(): + completer = PathCompleter() + doc_text = '~' + doc = Document(doc_text, len(doc_text)) + event = CompleteEvent() + completions = list(completer.get_completions(doc, event)) + assert [] == completions + + +def test_pathcompleter_can_expanduser(monkeypatch): + monkeypatch.setenv('HOME', '/tmp') + completer = PathCompleter(expanduser=True) + doc_text = '~' + doc = Document(doc_text, len(doc_text)) + event = CompleteEvent() + completions = list(completer.get_completions(doc, event)) + assert len(completions) > 0 + + +def test_pathcompleter_can_apply_file_filter(): + # setup: create a test dir with 10 files + test_dir = tempfile.mkdtemp() + write_test_files(test_dir) + + # add a .csv file + with open(os.path.join(test_dir, 'my.csv'), 'wb') as out: + out.write(b'') + + file_filter = lambda f: f and f.endswith('.csv') + + with chdir(test_dir): + completer = PathCompleter(file_filter=file_filter) + doc_text = '' + doc = Document(doc_text, len(doc_text)) + event = CompleteEvent() + completions = list(completer.get_completions(doc, event)) + result = [c.text for c in completions] + assert ['my.csv'] == result + + # cleanup + shutil.rmtree(test_dir) + + +def test_pathcompleter_get_paths_constrains_path(): + # setup: create a test dir with 10 files + test_dir = tempfile.mkdtemp() + write_test_files(test_dir) + + # add a subdir with 10 other files with different names + subdir = os.path.join(test_dir, 'subdir') + os.mkdir(subdir) + write_test_files(subdir, 'abcdefghij') + + get_paths = lambda: ['subdir'] + + with chdir(test_dir): + completer = PathCompleter(get_paths=get_paths) + doc_text = '' + doc = Document(doc_text, len(doc_text)) + event = CompleteEvent() + completions = list(completer.get_completions(doc, event)) + result = [c.text for c in completions] + expected = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'] + assert expected == result + + # cleanup + shutil.rmtree(test_dir) diff --git a/contrib/python/prompt-toolkit/py2/tests/test_document.py b/contrib/python/prompt-toolkit/py2/tests/test_document.py index 0cc1762c3e2..8c0cf5704c1 100644 --- a/contrib/python/prompt-toolkit/py2/tests/test_document.py +++ b/contrib/python/prompt-toolkit/py2/tests/test_document.py @@ -1,74 +1,74 @@ -from __future__ import unicode_literals - -import pytest - -from prompt_toolkit.document import Document - - -def document(): - return Document( - 'line 1\n' + - 'line 2\n' + - 'line 3\n' + - 'line 4\n', - len('line 1\n' + 'lin') - ) - - -def test_current_char(document): - assert document.current_char == 'e' - - -def test_text_before_cursor(document): - assert document.text_before_cursor == 'line 1\nlin' - - -def test_text_after_cursor(document): - assert document.text_after_cursor == 'e 2\n' + \ - 'line 3\n' + \ - 'line 4\n' - - -def test_lines(document): - assert document.lines == [ - 'line 1', - 'line 2', - 'line 3', - 'line 4', ''] - - -def test_line_count(document): - assert document.line_count == 5 - - -def test_current_line_before_cursor(document): - assert document.current_line_before_cursor == 'lin' - - -def test_current_line_after_cursor(document): - assert document.current_line_after_cursor == 'e 2' - - -def test_current_line(document): - assert document.current_line == 'line 2' - - -def test_cursor_position(document): - assert document.cursor_position_row == 1 - assert document.cursor_position_col == 3 - - d = Document('', 0) - assert d.cursor_position_row == 0 - assert d.cursor_position_col == 0 - - -def test_translate_index_to_position(document): - pos = document.translate_index_to_position( - len('line 1\nline 2\nlin')) - - assert pos[0] == 2 - assert pos[1] == 3 - - pos = document.translate_index_to_position(0) - assert pos == (0, 0) +from __future__ import unicode_literals + +import pytest + +from prompt_toolkit.document import Document + + +def document(): + return Document( + 'line 1\n' + + 'line 2\n' + + 'line 3\n' + + 'line 4\n', + len('line 1\n' + 'lin') + ) + + +def test_current_char(document): + assert document.current_char == 'e' + + +def test_text_before_cursor(document): + assert document.text_before_cursor == 'line 1\nlin' + + +def test_text_after_cursor(document): + assert document.text_after_cursor == 'e 2\n' + \ + 'line 3\n' + \ + 'line 4\n' + + +def test_lines(document): + assert document.lines == [ + 'line 1', + 'line 2', + 'line 3', + 'line 4', ''] + + +def test_line_count(document): + assert document.line_count == 5 + + +def test_current_line_before_cursor(document): + assert document.current_line_before_cursor == 'lin' + + +def test_current_line_after_cursor(document): + assert document.current_line_after_cursor == 'e 2' + + +def test_current_line(document): + assert document.current_line == 'line 2' + + +def test_cursor_position(document): + assert document.cursor_position_row == 1 + assert document.cursor_position_col == 3 + + d = Document('', 0) + assert d.cursor_position_row == 0 + assert d.cursor_position_col == 0 + + +def test_translate_index_to_position(document): + pos = document.translate_index_to_position( + len('line 1\nline 2\nlin')) + + assert pos[0] == 2 + assert pos[1] == 3 + + pos = document.translate_index_to_position(0) + assert pos == (0, 0) diff --git a/contrib/python/prompt-toolkit/py2/tests/test_filter.py b/contrib/python/prompt-toolkit/py2/tests/test_filter.py index b9cf8fb2392..5aee62a9a90 100644 --- a/contrib/python/prompt-toolkit/py2/tests/test_filter.py +++ b/contrib/python/prompt-toolkit/py2/tests/test_filter.py @@ -1,168 +1,168 @@ -from __future__ import unicode_literals -from prompt_toolkit.filters import Condition, Never, Always, Filter -from prompt_toolkit.filters.types import CLIFilter, SimpleFilter -from prompt_toolkit.filters.utils import to_cli_filter, to_simple_filter -from prompt_toolkit.filters.cli import HasArg, HasFocus, HasSelection - -import pytest - - -def test_condition_filter_args(): - c = Condition(lambda a, b, c: True) - assert c.test_args('a', 'b', 'c') - assert not c.test_args() - assert not c.test_args('a') - assert not c.test_args('a', 'b') - assert not c.test_args('a', 'b', 'c', 'd') - - c2 = Condition(lambda a, b=1: True) - assert c2.test_args('a') - assert c2.test_args('a', 'b') - assert not c2.test_args('a', 'b', 'c') - assert not c2.test_args() - - c3 = Condition(lambda *a: True) - assert c3.test_args() - assert c3.test_args('a') - assert c3.test_args('a', 'b') - - -def test_and_arg(): - c1 = Condition(lambda a: True) - c2 = Condition(lambda a: True) - c3 = c1 & c2 - - assert c3.test_args('a') - assert not c3.test_args() - assert not c3.test_args('a', 'b') - - -def test_or_arg(): - c1 = Condition(lambda a: True) - c2 = Condition(lambda a: True) - c3 = c1 | c2 - - assert c3.test_args('a') - assert not c3.test_args() - assert not c3.test_args('a', 'b') - - -def test_condition(): - c = Condition(lambda a: a % 2 == 0) - assert c(4) - assert c(6) - assert not c(5) - assert not c(3) - - -def test_never(): - assert not Never()() - - -def test_always(): - assert Always()() - - -def test_invert(): - assert not (~Always())() - assert (~Never()()) - - c = ~Condition(lambda: False) - assert c() - - -def test_or(): - for a in (True, False): - for b in (True, False): - c1 = Condition(lambda: a) - c2 = Condition(lambda: b) - c3 = c1 | c2 - - assert isinstance(c3, Filter) - assert c3() == a or b - - -def test_and(): - for a in (True, False): - for b in (True, False): - c1 = Condition(lambda: a) - c2 = Condition(lambda: b) - c3 = c1 & c2 - - assert isinstance(c3, Filter) - assert c3() == (a and b) - - -def test_cli_filter(): - c1 = Condition(lambda cli: True) - assert isinstance(c1, CLIFilter) - assert not isinstance(c1, SimpleFilter) - - c2 = Condition(lambda: True) - assert not isinstance(c2, CLIFilter) - assert isinstance(c2, SimpleFilter) - - c3 = c1 | c2 - assert not isinstance(c3, CLIFilter) - assert not isinstance(c3, SimpleFilter) - - c4 = Condition(lambda cli: True) - c5 = Condition(lambda cli: True) - c6 = c4 & c5 - c7 = c4 | c5 - assert isinstance(c6, CLIFilter) - assert isinstance(c7, CLIFilter) - assert not isinstance(c6, SimpleFilter) - assert not isinstance(c7, SimpleFilter) - - c8 = Condition(lambda *args: True) - assert isinstance(c8, CLIFilter) - assert isinstance(c8, SimpleFilter) - - -def test_to_cli_filter(): - f1 = to_cli_filter(True) - f2 = to_cli_filter(False) - f3 = to_cli_filter(Condition(lambda cli: True)) - f4 = to_cli_filter(Condition(lambda cli: False)) - - assert isinstance(f1, CLIFilter) - assert isinstance(f2, CLIFilter) - assert isinstance(f3, CLIFilter) - assert isinstance(f4, CLIFilter) - assert f1(None) - assert not f2(None) - assert f3(None) - assert not f4(None) - - with pytest.raises(TypeError): - to_cli_filter(4) - with pytest.raises(TypeError): - to_cli_filter(Condition(lambda: True)) - - -def test_to_simple_filter(): - f1 = to_simple_filter(True) - f2 = to_simple_filter(False) - f3 = to_simple_filter(Condition(lambda: True)) - f4 = to_simple_filter(Condition(lambda: False)) - - assert isinstance(f1, SimpleFilter) - assert isinstance(f2, SimpleFilter) - assert isinstance(f3, SimpleFilter) - assert isinstance(f4, SimpleFilter) - assert f1() - assert not f2() - assert f3() - assert not f4() - - with pytest.raises(TypeError): - to_simple_filter(4) - with pytest.raises(TypeError): - to_simple_filter(Condition(lambda cli: True)) - - -def test_cli_filters(): - assert isinstance(HasArg(), CLIFilter) - assert isinstance(HasFocus('BUFFER_NAME'), CLIFilter) - assert isinstance(HasSelection(), CLIFilter) +from __future__ import unicode_literals +from prompt_toolkit.filters import Condition, Never, Always, Filter +from prompt_toolkit.filters.types import CLIFilter, SimpleFilter +from prompt_toolkit.filters.utils import to_cli_filter, to_simple_filter +from prompt_toolkit.filters.cli import HasArg, HasFocus, HasSelection + +import pytest + + +def test_condition_filter_args(): + c = Condition(lambda a, b, c: True) + assert c.test_args('a', 'b', 'c') + assert not c.test_args() + assert not c.test_args('a') + assert not c.test_args('a', 'b') + assert not c.test_args('a', 'b', 'c', 'd') + + c2 = Condition(lambda a, b=1: True) + assert c2.test_args('a') + assert c2.test_args('a', 'b') + assert not c2.test_args('a', 'b', 'c') + assert not c2.test_args() + + c3 = Condition(lambda *a: True) + assert c3.test_args() + assert c3.test_args('a') + assert c3.test_args('a', 'b') + + +def test_and_arg(): + c1 = Condition(lambda a: True) + c2 = Condition(lambda a: True) + c3 = c1 & c2 + + assert c3.test_args('a') + assert not c3.test_args() + assert not c3.test_args('a', 'b') + + +def test_or_arg(): + c1 = Condition(lambda a: True) + c2 = Condition(lambda a: True) + c3 = c1 | c2 + + assert c3.test_args('a') + assert not c3.test_args() + assert not c3.test_args('a', 'b') + + +def test_condition(): + c = Condition(lambda a: a % 2 == 0) + assert c(4) + assert c(6) + assert not c(5) + assert not c(3) + + +def test_never(): + assert not Never()() + + +def test_always(): + assert Always()() + + +def test_invert(): + assert not (~Always())() + assert (~Never()()) + + c = ~Condition(lambda: False) + assert c() + + +def test_or(): + for a in (True, False): + for b in (True, False): + c1 = Condition(lambda: a) + c2 = Condition(lambda: b) + c3 = c1 | c2 + + assert isinstance(c3, Filter) + assert c3() == a or b + + +def test_and(): + for a in (True, False): + for b in (True, False): + c1 = Condition(lambda: a) + c2 = Condition(lambda: b) + c3 = c1 & c2 + + assert isinstance(c3, Filter) + assert c3() == (a and b) + + +def test_cli_filter(): + c1 = Condition(lambda cli: True) + assert isinstance(c1, CLIFilter) + assert not isinstance(c1, SimpleFilter) + + c2 = Condition(lambda: True) + assert not isinstance(c2, CLIFilter) + assert isinstance(c2, SimpleFilter) + + c3 = c1 | c2 + assert not isinstance(c3, CLIFilter) + assert not isinstance(c3, SimpleFilter) + + c4 = Condition(lambda cli: True) + c5 = Condition(lambda cli: True) + c6 = c4 & c5 + c7 = c4 | c5 + assert isinstance(c6, CLIFilter) + assert isinstance(c7, CLIFilter) + assert not isinstance(c6, SimpleFilter) + assert not isinstance(c7, SimpleFilter) + + c8 = Condition(lambda *args: True) + assert isinstance(c8, CLIFilter) + assert isinstance(c8, SimpleFilter) + + +def test_to_cli_filter(): + f1 = to_cli_filter(True) + f2 = to_cli_filter(False) + f3 = to_cli_filter(Condition(lambda cli: True)) + f4 = to_cli_filter(Condition(lambda cli: False)) + + assert isinstance(f1, CLIFilter) + assert isinstance(f2, CLIFilter) + assert isinstance(f3, CLIFilter) + assert isinstance(f4, CLIFilter) + assert f1(None) + assert not f2(None) + assert f3(None) + assert not f4(None) + + with pytest.raises(TypeError): + to_cli_filter(4) + with pytest.raises(TypeError): + to_cli_filter(Condition(lambda: True)) + + +def test_to_simple_filter(): + f1 = to_simple_filter(True) + f2 = to_simple_filter(False) + f3 = to_simple_filter(Condition(lambda: True)) + f4 = to_simple_filter(Condition(lambda: False)) + + assert isinstance(f1, SimpleFilter) + assert isinstance(f2, SimpleFilter) + assert isinstance(f3, SimpleFilter) + assert isinstance(f4, SimpleFilter) + assert f1() + assert not f2() + assert f3() + assert not f4() + + with pytest.raises(TypeError): + to_simple_filter(4) + with pytest.raises(TypeError): + to_simple_filter(Condition(lambda cli: True)) + + +def test_cli_filters(): + assert isinstance(HasArg(), CLIFilter) + assert isinstance(HasFocus('BUFFER_NAME'), CLIFilter) + assert isinstance(HasSelection(), CLIFilter) diff --git a/contrib/python/prompt-toolkit/py2/tests/test_inputstream.py b/contrib/python/prompt-toolkit/py2/tests/test_inputstream.py index d3521be7108..de10c0f9a91 100644 --- a/contrib/python/prompt-toolkit/py2/tests/test_inputstream.py +++ b/contrib/python/prompt-toolkit/py2/tests/test_inputstream.py @@ -1,142 +1,142 @@ -from __future__ import unicode_literals - -from prompt_toolkit.terminal.vt100_input import InputStream -from prompt_toolkit.keys import Keys - -import pytest - - -class _ProcessorMock(object): - - def __init__(self): - self.keys = [] - - def feed_key(self, key_press): - self.keys.append(key_press) - - -def processor(): - return _ProcessorMock() - - -def stream(processor): - return InputStream(processor.feed_key) - - -def test_control_keys(processor, stream): - stream.feed('\x01\x02\x10') - - assert len(processor.keys) == 3 - assert processor.keys[0].key == Keys.ControlA - assert processor.keys[1].key == Keys.ControlB - assert processor.keys[2].key == Keys.ControlP - assert processor.keys[0].data == '\x01' - assert processor.keys[1].data == '\x02' - assert processor.keys[2].data == '\x10' - - -def test_arrows(processor, stream): - stream.feed('\x1b[A\x1b[B\x1b[C\x1b[D') - - assert len(processor.keys) == 4 - assert processor.keys[0].key == Keys.Up - assert processor.keys[1].key == Keys.Down - assert processor.keys[2].key == Keys.Right - assert processor.keys[3].key == Keys.Left - assert processor.keys[0].data == '\x1b[A' - assert processor.keys[1].data == '\x1b[B' - assert processor.keys[2].data == '\x1b[C' - assert processor.keys[3].data == '\x1b[D' - - -def test_escape(processor, stream): - stream.feed('\x1bhello') - - assert len(processor.keys) == 1 + len('hello') - assert processor.keys[0].key == Keys.Escape - assert processor.keys[1].key == 'h' - assert processor.keys[0].data == '\x1b' - assert processor.keys[1].data == 'h' - - -def test_special_double_keys(processor, stream): - stream.feed('\x1b[1;3D') # Should both send escape and left. - - assert len(processor.keys) == 2 - assert processor.keys[0].key == Keys.Escape - assert processor.keys[1].key == Keys.Left - assert processor.keys[0].data == '\x1b[1;3D' - assert processor.keys[1].data == '\x1b[1;3D' - - -def test_flush_1(processor, stream): - # Send left key in two parts without flush. - stream.feed('\x1b') - stream.feed('[D') - - assert len(processor.keys) == 1 - assert processor.keys[0].key == Keys.Left - assert processor.keys[0].data == '\x1b[D' - - -def test_flush_2(processor, stream): - # Send left key with a 'Flush' in between. - # The flush should make sure that we process evenything before as-is, - # with makes the first part just an escape character instead. - stream.feed('\x1b') - stream.flush() - stream.feed('[D') - - assert len(processor.keys) == 3 - assert processor.keys[0].key == Keys.Escape - assert processor.keys[1].key == '[' - assert processor.keys[2].key == 'D' - - assert processor.keys[0].data == '\x1b' - assert processor.keys[1].data == '[' - assert processor.keys[2].data == 'D' - - -def test_meta_arrows(processor, stream): - stream.feed('\x1b\x1b[D') - - assert len(processor.keys) == 2 - assert processor.keys[0].key == Keys.Escape - assert processor.keys[1].key == Keys.Left - - -def test_control_square_close(processor, stream): - stream.feed('\x1dC') - - assert len(processor.keys) == 2 - assert processor.keys[0].key == Keys.ControlSquareClose - assert processor.keys[1].key == 'C' - - -def test_invalid(processor, stream): - # Invalid sequence that has at two characters in common with other - # sequences. - stream.feed('\x1b[*') - - assert len(processor.keys) == 3 - assert processor.keys[0].key == Keys.Escape - assert processor.keys[1].key == '[' - assert processor.keys[2].key == '*' - - -def test_cpr_response(processor, stream): - stream.feed('a\x1b[40;10Rb') - assert len(processor.keys) == 3 - assert processor.keys[0].key == 'a' - assert processor.keys[1].key == Keys.CPRResponse - assert processor.keys[2].key == 'b' - - -def test_cpr_response_2(processor, stream): - # Make sure that the newline is not included in the CPR response. - stream.feed('\x1b[40;1R\n') - assert len(processor.keys) == 2 - assert processor.keys[0].key == Keys.CPRResponse - assert processor.keys[1].key == Keys.ControlJ +from __future__ import unicode_literals + +from prompt_toolkit.terminal.vt100_input import InputStream +from prompt_toolkit.keys import Keys + +import pytest + + +class _ProcessorMock(object): + + def __init__(self): + self.keys = [] + + def feed_key(self, key_press): + self.keys.append(key_press) + + +def processor(): + return _ProcessorMock() + + +def stream(processor): + return InputStream(processor.feed_key) + + +def test_control_keys(processor, stream): + stream.feed('\x01\x02\x10') + + assert len(processor.keys) == 3 + assert processor.keys[0].key == Keys.ControlA + assert processor.keys[1].key == Keys.ControlB + assert processor.keys[2].key == Keys.ControlP + assert processor.keys[0].data == '\x01' + assert processor.keys[1].data == '\x02' + assert processor.keys[2].data == '\x10' + + +def test_arrows(processor, stream): + stream.feed('\x1b[A\x1b[B\x1b[C\x1b[D') + + assert len(processor.keys) == 4 + assert processor.keys[0].key == Keys.Up + assert processor.keys[1].key == Keys.Down + assert processor.keys[2].key == Keys.Right + assert processor.keys[3].key == Keys.Left + assert processor.keys[0].data == '\x1b[A' + assert processor.keys[1].data == '\x1b[B' + assert processor.keys[2].data == '\x1b[C' + assert processor.keys[3].data == '\x1b[D' + + +def test_escape(processor, stream): + stream.feed('\x1bhello') + + assert len(processor.keys) == 1 + len('hello') + assert processor.keys[0].key == Keys.Escape + assert processor.keys[1].key == 'h' + assert processor.keys[0].data == '\x1b' + assert processor.keys[1].data == 'h' + + +def test_special_double_keys(processor, stream): + stream.feed('\x1b[1;3D') # Should both send escape and left. + + assert len(processor.keys) == 2 + assert processor.keys[0].key == Keys.Escape + assert processor.keys[1].key == Keys.Left + assert processor.keys[0].data == '\x1b[1;3D' + assert processor.keys[1].data == '\x1b[1;3D' + + +def test_flush_1(processor, stream): + # Send left key in two parts without flush. + stream.feed('\x1b') + stream.feed('[D') + + assert len(processor.keys) == 1 + assert processor.keys[0].key == Keys.Left + assert processor.keys[0].data == '\x1b[D' + + +def test_flush_2(processor, stream): + # Send left key with a 'Flush' in between. + # The flush should make sure that we process evenything before as-is, + # with makes the first part just an escape character instead. + stream.feed('\x1b') + stream.flush() + stream.feed('[D') + + assert len(processor.keys) == 3 + assert processor.keys[0].key == Keys.Escape + assert processor.keys[1].key == '[' + assert processor.keys[2].key == 'D' + + assert processor.keys[0].data == '\x1b' + assert processor.keys[1].data == '[' + assert processor.keys[2].data == 'D' + + +def test_meta_arrows(processor, stream): + stream.feed('\x1b\x1b[D') + + assert len(processor.keys) == 2 + assert processor.keys[0].key == Keys.Escape + assert processor.keys[1].key == Keys.Left + + +def test_control_square_close(processor, stream): + stream.feed('\x1dC') + + assert len(processor.keys) == 2 + assert processor.keys[0].key == Keys.ControlSquareClose + assert processor.keys[1].key == 'C' + + +def test_invalid(processor, stream): + # Invalid sequence that has at two characters in common with other + # sequences. + stream.feed('\x1b[*') + + assert len(processor.keys) == 3 + assert processor.keys[0].key == Keys.Escape + assert processor.keys[1].key == '[' + assert processor.keys[2].key == '*' + + +def test_cpr_response(processor, stream): + stream.feed('a\x1b[40;10Rb') + assert len(processor.keys) == 3 + assert processor.keys[0].key == 'a' + assert processor.keys[1].key == Keys.CPRResponse + assert processor.keys[2].key == 'b' + + +def test_cpr_response_2(processor, stream): + # Make sure that the newline is not included in the CPR response. + stream.feed('\x1b[40;1R\n') + assert len(processor.keys) == 2 + assert processor.keys[0].key == Keys.CPRResponse + assert processor.keys[1].key == Keys.ControlJ diff --git a/contrib/python/prompt-toolkit/py2/tests/test_key_binding.py b/contrib/python/prompt-toolkit/py2/tests/test_key_binding.py index 468ff9b0805..d706c4443b2 100644 --- a/contrib/python/prompt-toolkit/py2/tests/test_key_binding.py +++ b/contrib/python/prompt-toolkit/py2/tests/test_key_binding.py @@ -1,140 +1,140 @@ -from __future__ import unicode_literals - -from prompt_toolkit.key_binding.input_processor import InputProcessor, KeyPress -from prompt_toolkit.key_binding.registry import Registry -from prompt_toolkit.keys import Keys - -import pytest - - -class Handlers(object): - - def __init__(self): - self.called = [] - - def __getattr__(self, name): - def func(event): - self.called.append(name) - return func - - -def handlers(): - return Handlers() - - -def registry(handlers): - registry = Registry() - registry.add_binding( - Keys.ControlX, Keys.ControlC)(handlers.controlx_controlc) - registry.add_binding(Keys.ControlX)(handlers.control_x) - registry.add_binding(Keys.ControlD)(handlers.control_d) - registry.add_binding( - Keys.ControlSquareClose, Keys.Any)(handlers.control_square_close_any) - - return registry - - -def processor(registry): - return InputProcessor(registry, lambda: None) - - -def test_feed_simple(processor, handlers): - processor.feed(KeyPress(Keys.ControlX, '\x18')) - processor.feed(KeyPress(Keys.ControlC, '\x03')) - processor.process_keys() - - assert handlers.called == ['controlx_controlc'] - - -def test_feed_several(processor, handlers): - # First an unknown key first. - processor.feed(KeyPress(Keys.ControlQ, '')) - processor.process_keys() - - assert handlers.called == [] - - # Followed by a know key sequence. - processor.feed(KeyPress(Keys.ControlX, '')) - processor.feed(KeyPress(Keys.ControlC, '')) - processor.process_keys() - - assert handlers.called == ['controlx_controlc'] - - # Followed by another unknown sequence. - processor.feed(KeyPress(Keys.ControlR, '')) - processor.feed(KeyPress(Keys.ControlS, '')) - - # Followed again by a know key sequence. - processor.feed(KeyPress(Keys.ControlD, '')) - processor.process_keys() - - assert handlers.called == ['controlx_controlc', 'control_d'] - - -def test_control_square_closed_any(processor, handlers): - processor.feed(KeyPress(Keys.ControlSquareClose, '')) - processor.feed(KeyPress('C', 'C')) - processor.process_keys() - - assert handlers.called == ['control_square_close_any'] - - -def test_common_prefix(processor, handlers): - # Sending Control_X should not yet do anything, because there is - # another sequence starting with that as well. - processor.feed(KeyPress(Keys.ControlX, '')) - processor.process_keys() - - assert handlers.called == [] - - # When another key is pressed, we know that we did not meant the longer - # "ControlX ControlC" sequence and the callbacks are called. - processor.feed(KeyPress(Keys.ControlD, '')) - processor.process_keys() - - assert handlers.called == ['control_x', 'control_d'] - - -def test_previous_key_sequence(processor, handlers): - """ - test whether we receive the correct previous_key_sequence. - """ - events = [] - def handler(event): - events.append(event) - - # Build registry. - registry = Registry() - registry.add_binding('a', 'a')(handler) - registry.add_binding('b', 'b')(handler) - processor = InputProcessor(registry, lambda: None) - - # Create processor and feed keys. - processor.feed(KeyPress('a', 'a')) - processor.feed(KeyPress('a', 'a')) - processor.feed(KeyPress('b', 'b')) - processor.feed(KeyPress('b', 'b')) - processor.process_keys() - - # Test. - assert len(events) == 2 - assert len(events[0].key_sequence) == 2 - assert events[0].key_sequence[0].key == 'a' - assert events[0].key_sequence[0].data == 'a' - assert events[0].key_sequence[1].key == 'a' - assert events[0].key_sequence[1].data == 'a' - assert events[0].previous_key_sequence == [] - - assert len(events[1].key_sequence) == 2 - assert events[1].key_sequence[0].key == 'b' - assert events[1].key_sequence[0].data == 'b' - assert events[1].key_sequence[1].key == 'b' - assert events[1].key_sequence[1].data == 'b' - assert len(events[1].previous_key_sequence) == 2 - assert events[1].previous_key_sequence[0].key == 'a' - assert events[1].previous_key_sequence[0].data == 'a' - assert events[1].previous_key_sequence[1].key == 'a' - assert events[1].previous_key_sequence[1].data == 'a' +from __future__ import unicode_literals + +from prompt_toolkit.key_binding.input_processor import InputProcessor, KeyPress +from prompt_toolkit.key_binding.registry import Registry +from prompt_toolkit.keys import Keys + +import pytest + + +class Handlers(object): + + def __init__(self): + self.called = [] + + def __getattr__(self, name): + def func(event): + self.called.append(name) + return func + + +def handlers(): + return Handlers() + + +def registry(handlers): + registry = Registry() + registry.add_binding( + Keys.ControlX, Keys.ControlC)(handlers.controlx_controlc) + registry.add_binding(Keys.ControlX)(handlers.control_x) + registry.add_binding(Keys.ControlD)(handlers.control_d) + registry.add_binding( + Keys.ControlSquareClose, Keys.Any)(handlers.control_square_close_any) + + return registry + + +def processor(registry): + return InputProcessor(registry, lambda: None) + + +def test_feed_simple(processor, handlers): + processor.feed(KeyPress(Keys.ControlX, '\x18')) + processor.feed(KeyPress(Keys.ControlC, '\x03')) + processor.process_keys() + + assert handlers.called == ['controlx_controlc'] + + +def test_feed_several(processor, handlers): + # First an unknown key first. + processor.feed(KeyPress(Keys.ControlQ, '')) + processor.process_keys() + + assert handlers.called == [] + + # Followed by a know key sequence. + processor.feed(KeyPress(Keys.ControlX, '')) + processor.feed(KeyPress(Keys.ControlC, '')) + processor.process_keys() + + assert handlers.called == ['controlx_controlc'] + + # Followed by another unknown sequence. + processor.feed(KeyPress(Keys.ControlR, '')) + processor.feed(KeyPress(Keys.ControlS, '')) + + # Followed again by a know key sequence. + processor.feed(KeyPress(Keys.ControlD, '')) + processor.process_keys() + + assert handlers.called == ['controlx_controlc', 'control_d'] + + +def test_control_square_closed_any(processor, handlers): + processor.feed(KeyPress(Keys.ControlSquareClose, '')) + processor.feed(KeyPress('C', 'C')) + processor.process_keys() + + assert handlers.called == ['control_square_close_any'] + + +def test_common_prefix(processor, handlers): + # Sending Control_X should not yet do anything, because there is + # another sequence starting with that as well. + processor.feed(KeyPress(Keys.ControlX, '')) + processor.process_keys() + + assert handlers.called == [] + + # When another key is pressed, we know that we did not meant the longer + # "ControlX ControlC" sequence and the callbacks are called. + processor.feed(KeyPress(Keys.ControlD, '')) + processor.process_keys() + + assert handlers.called == ['control_x', 'control_d'] + + +def test_previous_key_sequence(processor, handlers): + """ + test whether we receive the correct previous_key_sequence. + """ + events = [] + def handler(event): + events.append(event) + + # Build registry. + registry = Registry() + registry.add_binding('a', 'a')(handler) + registry.add_binding('b', 'b')(handler) + processor = InputProcessor(registry, lambda: None) + + # Create processor and feed keys. + processor.feed(KeyPress('a', 'a')) + processor.feed(KeyPress('a', 'a')) + processor.feed(KeyPress('b', 'b')) + processor.feed(KeyPress('b', 'b')) + processor.process_keys() + + # Test. + assert len(events) == 2 + assert len(events[0].key_sequence) == 2 + assert events[0].key_sequence[0].key == 'a' + assert events[0].key_sequence[0].data == 'a' + assert events[0].key_sequence[1].key == 'a' + assert events[0].key_sequence[1].data == 'a' + assert events[0].previous_key_sequence == [] + + assert len(events[1].key_sequence) == 2 + assert events[1].key_sequence[0].key == 'b' + assert events[1].key_sequence[0].data == 'b' + assert events[1].key_sequence[1].key == 'b' + assert events[1].key_sequence[1].data == 'b' + assert len(events[1].previous_key_sequence) == 2 + assert events[1].previous_key_sequence[0].key == 'a' + assert events[1].previous_key_sequence[0].data == 'a' + assert events[1].previous_key_sequence[1].key == 'a' + assert events[1].previous_key_sequence[1].data == 'a' diff --git a/contrib/python/prompt-toolkit/py2/tests/test_layout.py b/contrib/python/prompt-toolkit/py2/tests/test_layout.py index 5d388e6400c..6c9e67b4dea 100644 --- a/contrib/python/prompt-toolkit/py2/tests/test_layout.py +++ b/contrib/python/prompt-toolkit/py2/tests/test_layout.py @@ -1,60 +1,60 @@ -from __future__ import unicode_literals - -from prompt_toolkit.layout.utils import split_lines -from prompt_toolkit.token import Token - - -def test_split_lines(): - lines = list(split_lines([(Token.A, 'line1\nline2\nline3')])) - - assert lines == [ - [(Token.A, 'line1')], - [(Token.A, 'line2')], - [(Token.A, 'line3')], - ] - - -def test_split_lines_2(): - lines = list(split_lines([ - (Token.A, 'line1'), - (Token.B, 'line2\nline3\nline4') - ])) - - assert lines == [ - [(Token.A, 'line1'), (Token.B, 'line2')], - [(Token.B, 'line3')], - [(Token.B, 'line4')], - ] - - -def test_split_lines_3(): - " Edge cases: inputs ending with newlines. " - # -1- - lines = list(split_lines([ - (Token.A, 'line1\nline2\n') - ])) - - assert lines == [ - [(Token.A, 'line1')], - [(Token.A, 'line2')], - [(Token.A, '')], - ] - - # -2- - lines = list(split_lines([ - (Token.A, '\n'), - ])) - - assert lines == [ - [], - [(Token.A, '')], - ] - - # -3- - lines = list(split_lines([ - (Token.A, ''), - ])) - - assert lines == [ - [(Token.A, '')], - ] +from __future__ import unicode_literals + +from prompt_toolkit.layout.utils import split_lines +from prompt_toolkit.token import Token + + +def test_split_lines(): + lines = list(split_lines([(Token.A, 'line1\nline2\nline3')])) + + assert lines == [ + [(Token.A, 'line1')], + [(Token.A, 'line2')], + [(Token.A, 'line3')], + ] + + +def test_split_lines_2(): + lines = list(split_lines([ + (Token.A, 'line1'), + (Token.B, 'line2\nline3\nline4') + ])) + + assert lines == [ + [(Token.A, 'line1'), (Token.B, 'line2')], + [(Token.B, 'line3')], + [(Token.B, 'line4')], + ] + + +def test_split_lines_3(): + " Edge cases: inputs ending with newlines. " + # -1- + lines = list(split_lines([ + (Token.A, 'line1\nline2\n') + ])) + + assert lines == [ + [(Token.A, 'line1')], + [(Token.A, 'line2')], + [(Token.A, '')], + ] + + # -2- + lines = list(split_lines([ + (Token.A, '\n'), + ])) + + assert lines == [ + [], + [(Token.A, '')], + ] + + # -3- + lines = list(split_lines([ + (Token.A, ''), + ])) + + assert lines == [ + [(Token.A, '')], + ] diff --git a/contrib/python/prompt-toolkit/py2/tests/test_print_tokens.py b/contrib/python/prompt-toolkit/py2/tests/test_print_tokens.py index a8d0c330481..c3b5826b36c 100644 --- a/contrib/python/prompt-toolkit/py2/tests/test_print_tokens.py +++ b/contrib/python/prompt-toolkit/py2/tests/test_print_tokens.py @@ -1,50 +1,50 @@ -""" -Test `shortcuts.print_tokens`. -""" -from __future__ import unicode_literals -from prompt_toolkit.shortcuts import print_tokens -from prompt_toolkit.token import Token -from prompt_toolkit.styles import style_from_dict - - -class _Capture: - " Emulate an stdout object. " - encoding = 'utf-8' - - def __init__(self): - self._data = [] - - def write(self, data): - self._data.append(data) - - @property - def data(self): - return b''.join(self._data) - - def flush(self): - pass - - def isatty(self): - return True - - -def test_print_tokens(): - f = _Capture() - print_tokens([(Token, 'hello'), (Token, 'world')], file=f) - assert b'hello' in f.data - assert b'world' in f.data - - -def test_with_style(): - f = _Capture() - style = style_from_dict({ - Token.Hello: '#ff0066', - Token.World: '#44ff44 italic', - }) - tokens = [ - (Token.Hello, 'Hello '), - (Token.World, 'world'), - ] - print_tokens(tokens, style=style, file=f) - assert b'\x1b[0;38;5;197mHello' in f.data - assert b'\x1b[0;38;5;83;3mworld' in f.data +""" +Test `shortcuts.print_tokens`. +""" +from __future__ import unicode_literals +from prompt_toolkit.shortcuts import print_tokens +from prompt_toolkit.token import Token +from prompt_toolkit.styles import style_from_dict + + +class _Capture: + " Emulate an stdout object. " + encoding = 'utf-8' + + def __init__(self): + self._data = [] + + def write(self, data): + self._data.append(data) + + @property + def data(self): + return b''.join(self._data) + + def flush(self): + pass + + def isatty(self): + return True + + +def test_print_tokens(): + f = _Capture() + print_tokens([(Token, 'hello'), (Token, 'world')], file=f) + assert b'hello' in f.data + assert b'world' in f.data + + +def test_with_style(): + f = _Capture() + style = style_from_dict({ + Token.Hello: '#ff0066', + Token.World: '#44ff44 italic', + }) + tokens = [ + (Token.Hello, 'Hello '), + (Token.World, 'world'), + ] + print_tokens(tokens, style=style, file=f) + assert b'\x1b[0;38;5;197mHello' in f.data + assert b'\x1b[0;38;5;83;3mworld' in f.data diff --git a/contrib/python/prompt-toolkit/py2/tests/test_regular_languages.py b/contrib/python/prompt-toolkit/py2/tests/test_regular_languages.py index beb976abcc1..6ece5cdeb53 100644 --- a/contrib/python/prompt-toolkit/py2/tests/test_regular_languages.py +++ b/contrib/python/prompt-toolkit/py2/tests/test_regular_languages.py @@ -1,110 +1,110 @@ -from __future__ import unicode_literals - -from prompt_toolkit.completion import CompleteEvent, Completer, Completion -from prompt_toolkit.contrib.regular_languages import compile -from prompt_toolkit.contrib.regular_languages.compiler import Match, Variables -from prompt_toolkit.contrib.regular_languages.completion import \ - GrammarCompleter -from prompt_toolkit.document import Document - - -def test_simple_match(): - g = compile('hello|world') - - m = g.match('hello') - assert isinstance(m, Match) - - m = g.match('world') - assert isinstance(m, Match) - - m = g.match('somethingelse') - assert m is None - - -def test_variable_varname(): - """ - Test `Variable` with varname. - """ - g = compile('((?P<varname>hello|world)|test)') - - m = g.match('hello') - variables = m.variables() - assert isinstance(variables, Variables) - assert variables.get('varname') == 'hello' - assert variables['varname'] == 'hello' - - m = g.match('world') - variables = m.variables() - assert isinstance(variables, Variables) - assert variables.get('varname') == 'world' - assert variables['varname'] == 'world' - - m = g.match('test') - variables = m.variables() - assert isinstance(variables, Variables) - assert variables.get('varname') is None - assert variables['varname'] is None - - -def test_prefix(): - """ - Test `match_prefix`. - """ - g = compile(r'(hello\ world|something\ else)') - - m = g.match_prefix('hello world') - assert isinstance(m, Match) - - m = g.match_prefix('he') - assert isinstance(m, Match) - - m = g.match_prefix('') - assert isinstance(m, Match) - - m = g.match_prefix('som') - assert isinstance(m, Match) - - m = g.match_prefix('hello wor') - assert isinstance(m, Match) - - m = g.match_prefix('no-match') - assert m.trailing_input().start == 0 - assert m.trailing_input().stop == len('no-match') - - m = g.match_prefix('hellotest') - assert m.trailing_input().start == len('hello') - assert m.trailing_input().stop == len('hellotest') - - -def test_completer(): - class completer1(Completer): - - def get_completions(self, document, complete_event): - yield Completion( - 'before-%s-after' % document.text, -len(document.text)) - yield Completion( - 'before-%s-after-B' % document.text, -len(document.text)) - - class completer2(Completer): - - def get_completions(self, document, complete_event): - yield Completion( - 'before2-%s-after2' % document.text, -len(document.text)) - yield Completion( - 'before2-%s-after2-B' % document.text, -len(document.text)) - - # Create grammar. "var1" + "whitespace" + "var2" - g = compile(r'(?P<var1>[a-z]*) \s+ (?P<var2>[a-z]*)') - - # Test 'get_completions()' - completer = GrammarCompleter( - g, {'var1': completer1(), 'var2': completer2()}) - completions = list(completer.get_completions( - Document('abc def', len('abc def')), - CompleteEvent())) - - assert len(completions) == 2 - assert completions[0].text == 'before2-def-after2' - assert completions[0].start_position == -3 - assert completions[1].text == 'before2-def-after2-B' - assert completions[1].start_position == -3 +from __future__ import unicode_literals + +from prompt_toolkit.completion import CompleteEvent, Completer, Completion +from prompt_toolkit.contrib.regular_languages import compile +from prompt_toolkit.contrib.regular_languages.compiler import Match, Variables +from prompt_toolkit.contrib.regular_languages.completion import \ + GrammarCompleter +from prompt_toolkit.document import Document + + +def test_simple_match(): + g = compile('hello|world') + + m = g.match('hello') + assert isinstance(m, Match) + + m = g.match('world') + assert isinstance(m, Match) + + m = g.match('somethingelse') + assert m is None + + +def test_variable_varname(): + """ + Test `Variable` with varname. + """ + g = compile('((?P<varname>hello|world)|test)') + + m = g.match('hello') + variables = m.variables() + assert isinstance(variables, Variables) + assert variables.get('varname') == 'hello' + assert variables['varname'] == 'hello' + + m = g.match('world') + variables = m.variables() + assert isinstance(variables, Variables) + assert variables.get('varname') == 'world' + assert variables['varname'] == 'world' + + m = g.match('test') + variables = m.variables() + assert isinstance(variables, Variables) + assert variables.get('varname') is None + assert variables['varname'] is None + + +def test_prefix(): + """ + Test `match_prefix`. + """ + g = compile(r'(hello\ world|something\ else)') + + m = g.match_prefix('hello world') + assert isinstance(m, Match) + + m = g.match_prefix('he') + assert isinstance(m, Match) + + m = g.match_prefix('') + assert isinstance(m, Match) + + m = g.match_prefix('som') + assert isinstance(m, Match) + + m = g.match_prefix('hello wor') + assert isinstance(m, Match) + + m = g.match_prefix('no-match') + assert m.trailing_input().start == 0 + assert m.trailing_input().stop == len('no-match') + + m = g.match_prefix('hellotest') + assert m.trailing_input().start == len('hello') + assert m.trailing_input().stop == len('hellotest') + + +def test_completer(): + class completer1(Completer): + + def get_completions(self, document, complete_event): + yield Completion( + 'before-%s-after' % document.text, -len(document.text)) + yield Completion( + 'before-%s-after-B' % document.text, -len(document.text)) + + class completer2(Completer): + + def get_completions(self, document, complete_event): + yield Completion( + 'before2-%s-after2' % document.text, -len(document.text)) + yield Completion( + 'before2-%s-after2-B' % document.text, -len(document.text)) + + # Create grammar. "var1" + "whitespace" + "var2" + g = compile(r'(?P<var1>[a-z]*) \s+ (?P<var2>[a-z]*)') + + # Test 'get_completions()' + completer = GrammarCompleter( + g, {'var1': completer1(), 'var2': completer2()}) + completions = list(completer.get_completions( + Document('abc def', len('abc def')), + CompleteEvent())) + + assert len(completions) == 2 + assert completions[0].text == 'before2-def-after2' + assert completions[0].start_position == -3 + assert completions[1].text == 'before2-def-after2-B' + assert completions[1].start_position == -3 diff --git a/contrib/python/prompt-toolkit/py2/tests/test_shortcuts.py b/contrib/python/prompt-toolkit/py2/tests/test_shortcuts.py index c6773068598..8c13510ea83 100644 --- a/contrib/python/prompt-toolkit/py2/tests/test_shortcuts.py +++ b/contrib/python/prompt-toolkit/py2/tests/test_shortcuts.py @@ -1,50 +1,50 @@ -from prompt_toolkit.shortcuts import _split_multiline_prompt -from prompt_toolkit.token import Token - - -def test_split_multiline_prompt(): - # Test 1: no newlines: - tokens = [(Token, 'ab')] - has_before_tokens, before, first_input_line = _split_multiline_prompt(lambda cli: tokens) - assert has_before_tokens(None) is False - assert before(None) == [] - assert first_input_line(None) == [ - (Token, 'a'), - (Token, 'b'), - ] - - # Test 1: multiple lines. - tokens = [(Token, 'ab\ncd\nef')] - has_before_tokens, before, first_input_line = _split_multiline_prompt(lambda cli: tokens) - assert has_before_tokens(None) is True - assert before(None) == [ - (Token, 'a'), - (Token, 'b'), - (Token, '\n'), - (Token, 'c'), - (Token, 'd'), - ] - assert first_input_line(None) == [ - (Token, 'e'), - (Token, 'f'), - ] - - # Edge case 1: starting with a newline. - tokens = [(Token, '\nab')] - has_before_tokens, before, first_input_line = _split_multiline_prompt(lambda cli: tokens) - assert has_before_tokens(None) is True - assert before(None) == [] - assert first_input_line(None) == [ - (Token, 'a'), - (Token, 'b') - ] - - # Edge case 2: starting with two newlines. - tokens = [(Token, '\n\nab')] - has_before_tokens, before, first_input_line = _split_multiline_prompt(lambda cli: tokens) - assert has_before_tokens(None) is True - assert before(None) == [(Token, '\n')] - assert first_input_line(None) == [ - (Token, 'a'), - (Token, 'b') - ] +from prompt_toolkit.shortcuts import _split_multiline_prompt +from prompt_toolkit.token import Token + + +def test_split_multiline_prompt(): + # Test 1: no newlines: + tokens = [(Token, 'ab')] + has_before_tokens, before, first_input_line = _split_multiline_prompt(lambda cli: tokens) + assert has_before_tokens(None) is False + assert before(None) == [] + assert first_input_line(None) == [ + (Token, 'a'), + (Token, 'b'), + ] + + # Test 1: multiple lines. + tokens = [(Token, 'ab\ncd\nef')] + has_before_tokens, before, first_input_line = _split_multiline_prompt(lambda cli: tokens) + assert has_before_tokens(None) is True + assert before(None) == [ + (Token, 'a'), + (Token, 'b'), + (Token, '\n'), + (Token, 'c'), + (Token, 'd'), + ] + assert first_input_line(None) == [ + (Token, 'e'), + (Token, 'f'), + ] + + # Edge case 1: starting with a newline. + tokens = [(Token, '\nab')] + has_before_tokens, before, first_input_line = _split_multiline_prompt(lambda cli: tokens) + assert has_before_tokens(None) is True + assert before(None) == [] + assert first_input_line(None) == [ + (Token, 'a'), + (Token, 'b') + ] + + # Edge case 2: starting with two newlines. + tokens = [(Token, '\n\nab')] + has_before_tokens, before, first_input_line = _split_multiline_prompt(lambda cli: tokens) + assert has_before_tokens(None) is True + assert before(None) == [(Token, '\n')] + assert first_input_line(None) == [ + (Token, 'a'), + (Token, 'b') + ] diff --git a/contrib/python/prompt-toolkit/py2/tests/test_style.py b/contrib/python/prompt-toolkit/py2/tests/test_style.py index 655237a24f5..fc839ec95f2 100644 --- a/contrib/python/prompt-toolkit/py2/tests/test_style.py +++ b/contrib/python/prompt-toolkit/py2/tests/test_style.py @@ -1,40 +1,40 @@ -from __future__ import unicode_literals - -from prompt_toolkit.styles import Attrs, style_from_dict -from prompt_toolkit.token import Token - - -def test_style_from_dict(): - style = style_from_dict({ - Token.A: '#ff0000 bold underline italic', - Token.B: 'bg:#00ff00 blink reverse', - }) - - expected = Attrs(color='ff0000', bgcolor=None, bold=True, - underline=True, italic=True, blink=False, reverse=False) - assert style.get_attrs_for_token(Token.A) == expected - - expected = Attrs(color=None, bgcolor='00ff00', bold=False, - underline=False, italic=False, blink=True, reverse=True) - assert style.get_attrs_for_token(Token.B) == expected - - -def test_style_inheritance(): - style = style_from_dict({ - Token: '#ff0000', - Token.A.B.C: 'bold', - Token.A.B.C.D: '#ansired', - Token.A.B.C.D.E: 'noinherit blink' - }) - - expected = Attrs(color='ff0000', bgcolor=None, bold=True, - underline=False, italic=False, blink=False, reverse=False) - assert style.get_attrs_for_token(Token.A.B.C) == expected - - expected = Attrs(color='ansired', bgcolor=None, bold=True, - underline=False, italic=False, blink=False, reverse=False) - assert style.get_attrs_for_token(Token.A.B.C.D) == expected - - expected = Attrs(color=None, bgcolor=None, bold=False, - underline=False, italic=False, blink=True, reverse=False) - assert style.get_attrs_for_token(Token.A.B.C.D.E) == expected +from __future__ import unicode_literals + +from prompt_toolkit.styles import Attrs, style_from_dict +from prompt_toolkit.token import Token + + +def test_style_from_dict(): + style = style_from_dict({ + Token.A: '#ff0000 bold underline italic', + Token.B: 'bg:#00ff00 blink reverse', + }) + + expected = Attrs(color='ff0000', bgcolor=None, bold=True, + underline=True, italic=True, blink=False, reverse=False) + assert style.get_attrs_for_token(Token.A) == expected + + expected = Attrs(color=None, bgcolor='00ff00', bold=False, + underline=False, italic=False, blink=True, reverse=True) + assert style.get_attrs_for_token(Token.B) == expected + + +def test_style_inheritance(): + style = style_from_dict({ + Token: '#ff0000', + Token.A.B.C: 'bold', + Token.A.B.C.D: '#ansired', + Token.A.B.C.D.E: 'noinherit blink' + }) + + expected = Attrs(color='ff0000', bgcolor=None, bold=True, + underline=False, italic=False, blink=False, reverse=False) + assert style.get_attrs_for_token(Token.A.B.C) == expected + + expected = Attrs(color='ansired', bgcolor=None, bold=True, + underline=False, italic=False, blink=False, reverse=False) + assert style.get_attrs_for_token(Token.A.B.C.D) == expected + + expected = Attrs(color=None, bgcolor=None, bold=False, + underline=False, italic=False, blink=True, reverse=False) + assert style.get_attrs_for_token(Token.A.B.C.D.E) == expected diff --git a/contrib/python/prompt-toolkit/py2/tests/test_utils.py b/contrib/python/prompt-toolkit/py2/tests/test_utils.py index b3b56eb738d..1e3d92cda69 100644 --- a/contrib/python/prompt-toolkit/py2/tests/test_utils.py +++ b/contrib/python/prompt-toolkit/py2/tests/test_utils.py @@ -1,39 +1,39 @@ -from __future__ import unicode_literals - -from prompt_toolkit.utils import take_using_weights - -import itertools - - -def test_using_weights(): - def take(generator, count): - return list(itertools.islice(generator, 0, count)) - - # Check distribution. - data = take(take_using_weights(['A', 'B', 'C'], [5, 10, 20]), 35) - assert data.count('A') == 5 - assert data.count('B') == 10 - assert data.count('C') == 20 - - assert data == [ - 'A', 'B', 'C', 'C', 'B', 'C', 'C', 'A', 'B', 'C', 'C', 'B', 'C', - 'C', 'A', 'B', 'C', 'C', 'B', 'C', 'C', 'A', 'B', 'C', 'C', - 'B', 'C', 'C', 'A', 'B', 'C', 'C', 'B', 'C', 'C'] - - # Another order. - data = take(take_using_weights(['A', 'B', 'C'], [20, 10, 5]), 35) - assert data.count('A') == 20 - assert data.count('B') == 10 - assert data.count('C') == 5 - - # Bigger numbers. - data = take(take_using_weights(['A', 'B', 'C'], [20, 10, 5]), 70) - assert data.count('A') == 40 - assert data.count('B') == 20 - assert data.count('C') == 10 - - # Negative numbers. - data = take(take_using_weights(['A', 'B', 'C'], [-20, 10, 0]), 70) - assert data.count('A') == 0 - assert data.count('B') == 70 - assert data.count('C') == 0 +from __future__ import unicode_literals + +from prompt_toolkit.utils import take_using_weights + +import itertools + + +def test_using_weights(): + def take(generator, count): + return list(itertools.islice(generator, 0, count)) + + # Check distribution. + data = take(take_using_weights(['A', 'B', 'C'], [5, 10, 20]), 35) + assert data.count('A') == 5 + assert data.count('B') == 10 + assert data.count('C') == 20 + + assert data == [ + 'A', 'B', 'C', 'C', 'B', 'C', 'C', 'A', 'B', 'C', 'C', 'B', 'C', + 'C', 'A', 'B', 'C', 'C', 'B', 'C', 'C', 'A', 'B', 'C', 'C', + 'B', 'C', 'C', 'A', 'B', 'C', 'C', 'B', 'C', 'C'] + + # Another order. + data = take(take_using_weights(['A', 'B', 'C'], [20, 10, 5]), 35) + assert data.count('A') == 20 + assert data.count('B') == 10 + assert data.count('C') == 5 + + # Bigger numbers. + data = take(take_using_weights(['A', 'B', 'C'], [20, 10, 5]), 70) + assert data.count('A') == 40 + assert data.count('B') == 20 + assert data.count('C') == 10 + + # Negative numbers. + data = take(take_using_weights(['A', 'B', 'C'], [-20, 10, 0]), 70) + assert data.count('A') == 0 + assert data.count('B') == 70 + assert data.count('C') == 0 diff --git a/contrib/python/prompt-toolkit/py2/tests/test_yank_nth_arg.py b/contrib/python/prompt-toolkit/py2/tests/test_yank_nth_arg.py index d7cc0aa8c95..1ccec7bf7b1 100644 --- a/contrib/python/prompt-toolkit/py2/tests/test_yank_nth_arg.py +++ b/contrib/python/prompt-toolkit/py2/tests/test_yank_nth_arg.py @@ -1,85 +1,85 @@ -from __future__ import unicode_literals -from prompt_toolkit.buffer import Buffer -from prompt_toolkit.history import InMemoryHistory - -import pytest - - -def _history(): - " Prefilled history. " - history = InMemoryHistory() - history.append('alpha beta gamma delta') - history.append('one two three four') - return history - - -# Test yank_last_arg. - - -def test_empty_history(): - buf = Buffer() - buf.yank_last_arg() - assert buf.document.current_line == '' - - -def test_simple_search(_history): - buff = Buffer(history=_history) - buff.yank_last_arg() - assert buff.document.current_line == 'four' - - -def test_simple_search_with_quotes(_history): - _history.append("""one two "three 'x' four"\n""") - buff = Buffer(history=_history) - buff.yank_last_arg() - assert buff.document.current_line == '''"three 'x' four"''' - - -def test_simple_search_with_arg(_history): - buff = Buffer(history=_history) - buff.yank_last_arg(n=2) - assert buff.document.current_line == 'three' - - -def test_simple_search_with_arg_out_of_bounds(_history): - buff = Buffer(history=_history) - buff.yank_last_arg(n=8) - assert buff.document.current_line == '' - - -def test_repeated_search(_history): - buff = Buffer(history=_history) - buff.yank_last_arg() - buff.yank_last_arg() - assert buff.document.current_line == 'delta' - - -def test_repeated_search_with_wraparound(_history): - buff = Buffer(history=_history) - buff.yank_last_arg() - buff.yank_last_arg() - buff.yank_last_arg() - assert buff.document.current_line == 'four' - - -# Test yank_last_arg. - - -def test_yank_nth_arg(_history): - buff = Buffer(history=_history) - buff.yank_nth_arg() - assert buff.document.current_line == 'two' - - -def test_repeated_yank_nth_arg(_history): - buff = Buffer(history=_history) - buff.yank_nth_arg() - buff.yank_nth_arg() - assert buff.document.current_line == 'beta' - - -def test_yank_nth_arg_with_arg(_history): - buff = Buffer(history=_history) - buff.yank_nth_arg(n=2) - assert buff.document.current_line == 'three' +from __future__ import unicode_literals +from prompt_toolkit.buffer import Buffer +from prompt_toolkit.history import InMemoryHistory + +import pytest + + +def _history(): + " Prefilled history. " + history = InMemoryHistory() + history.append('alpha beta gamma delta') + history.append('one two three four') + return history + + +# Test yank_last_arg. + + +def test_empty_history(): + buf = Buffer() + buf.yank_last_arg() + assert buf.document.current_line == '' + + +def test_simple_search(_history): + buff = Buffer(history=_history) + buff.yank_last_arg() + assert buff.document.current_line == 'four' + + +def test_simple_search_with_quotes(_history): + _history.append("""one two "three 'x' four"\n""") + buff = Buffer(history=_history) + buff.yank_last_arg() + assert buff.document.current_line == '''"three 'x' four"''' + + +def test_simple_search_with_arg(_history): + buff = Buffer(history=_history) + buff.yank_last_arg(n=2) + assert buff.document.current_line == 'three' + + +def test_simple_search_with_arg_out_of_bounds(_history): + buff = Buffer(history=_history) + buff.yank_last_arg(n=8) + assert buff.document.current_line == '' + + +def test_repeated_search(_history): + buff = Buffer(history=_history) + buff.yank_last_arg() + buff.yank_last_arg() + assert buff.document.current_line == 'delta' + + +def test_repeated_search_with_wraparound(_history): + buff = Buffer(history=_history) + buff.yank_last_arg() + buff.yank_last_arg() + buff.yank_last_arg() + assert buff.document.current_line == 'four' + + +# Test yank_last_arg. + + +def test_yank_nth_arg(_history): + buff = Buffer(history=_history) + buff.yank_nth_arg() + assert buff.document.current_line == 'two' + + +def test_repeated_yank_nth_arg(_history): + buff = Buffer(history=_history) + buff.yank_nth_arg() + buff.yank_nth_arg() + assert buff.document.current_line == 'beta' + + +def test_yank_nth_arg_with_arg(_history): + buff = Buffer(history=_history) + buff.yank_nth_arg(n=2) + assert buff.document.current_line == 'three' diff --git a/contrib/python/prompt-toolkit/py2/tests/ya.make b/contrib/python/prompt-toolkit/py2/tests/ya.make index c1db893e642..afd26fbfe72 100644 --- a/contrib/python/prompt-toolkit/py2/tests/ya.make +++ b/contrib/python/prompt-toolkit/py2/tests/ya.make @@ -1,28 +1,28 @@ -PY2TEST() - -OWNER(g:python-contrib) - -PEERDIR( - contrib/python/prompt-toolkit -) - -TEST_SRCS( - test_buffer.py - test_cli.py - test_contrib.py - test_document.py - test_filter.py - test_inputstream.py - test_key_binding.py - test_layout.py - test_print_tokens.py - test_regular_languages.py - test_shortcuts.py - test_style.py - test_utils.py - test_yank_nth_arg.py -) - -NO_LINT() - -END() +PY2TEST() + +OWNER(g:python-contrib) + +PEERDIR( + contrib/python/prompt-toolkit +) + +TEST_SRCS( + test_buffer.py + test_cli.py + test_contrib.py + test_document.py + test_filter.py + test_inputstream.py + test_key_binding.py + test_layout.py + test_print_tokens.py + test_regular_languages.py + test_shortcuts.py + test_style.py + test_utils.py + test_yank_nth_arg.py +) + +NO_LINT() + +END() |