Before:
  let g:complete_parameter_py_keep_value = 0
  let g:complete_parameter_py_remove_default = 0

" {{{ ycm
Execute (error menu):
  let completed_item = {'menu': 'module:func', 'info': 'func()'}
  let result = cm_parser#python#parameters(completed_item)
  AssertEqual [], result

Execute (error info):
  let completed_item = {'menu': 'function:func', 'info': ''}
  let result = cm_parser#python#parameters(completed_item)
  AssertEqual [], result

Execute (foo()):
  let completed_item = {'menu': 'function:foo', 'info': "foo()\nfoo function"}
  let result = cm_parser#python#parameters(completed_item)
  AssertEqual ['()'], result

Execute (foo() -> int):
  let completed_item = {'menu': 'function:foo', 'info': "foo() -> int \nfoo function"}
  let result = cm_parser#python#parameters(completed_item)
  AssertEqual ['()'], result

Execute (foo(a) -> int):
  let completed_item = {'menu': 'function:foo', 'info': "foo(a) -> int \nfoo function"}
  let result = cm_parser#python#parameters(completed_item)
  AssertEqual ['(a)'], result

Execute (foo(a, b) -> int):
  let completed_item = {'menu': 'function:foo', 'info': "foo(a, b) -> int \nfoo function"}
  let result = cm_parser#python#parameters(completed_item)
  AssertEqual ['(a, b)'], result

Execute (foo(a, b = 1) -> int):
  let completed_item = {'menu': 'function:foo', 'info': "foo(a, b = 1) -> int \nfoo function"}
  let result = cm_parser#python#parameters(completed_item)
  AssertEqual ['(a, b)'], result

Execute (foo(a, b = []) -> int):
  let completed_item = {'menu': 'function:foo', 'info': "foo(a, b = []) -> int \nfoo function"}
  let result = cm_parser#python#parameters(completed_item)
  AssertEqual ['(a, b)'], result

Execute (foo(a, b = []) -> (int, True):
  let completed_item = {'menu': 'function:foo', 'info': "foo(a, b = []) -> (int, True) \nfoo function"}
  let result = cm_parser#python#parameters(completed_item)
  AssertEqual ['(a, b)'], result

Execute (add(a, b), omni):
  let completed_item = {'word': '(', 'menu': '', 'info': ' ', 'kind': '', 'abbr': 'add(a,b)'}
  let result = cm_parser#python#parameters(completed_item)
  AssertEqual ['(a, b)'], result

Execute (remove `[]`):
  let g:complete_parameter_py_keep_value = 1
  let completed_item = {'word': 'mkdir', 'menu': 'def mkdir', 'info': 'mkdir(path [, mode=0777])^@^@Create a directory.', 'kind': '', 'abbr': ''}
  let result = cm_parser#python#parameters(completed_item)
  AssertEqual ['(path, mode=0777)'], result

Execute (remove default 1):
  let g:complete_parameter_py_keep_value = 0
  let g:complete_parameter_py_remove_default = 1
  let completed_item = {'word': 'mkdir', 'menu': 'def mkdir', 'info': 'mkdir(path , mode=0777)^@^@Create a directory.', 'kind': '', 'abbr': ''}
  let result = cm_parser#python#parameters(completed_item)
  AssertEqual ['(path)'], result
  let g:complete_parameter_py_remove_default = 0

" interact(self, escape_character=chr(29),             input_filter=None,
" output_filter=None)
Execute (interact(self, excape_character=ch(29)):
  let completed_item = {'menu': 'function:interact', 'info': "interact(self, escape_character=chr(29),             input_filter=None,\noutput_filter=None)"}
  let result = cm_parser#python#parameters(completed_item)
  AssertEqual ['(escape_character, input_filter, output_filter)'], result

Execute (interact(self, excape_character=ch(29) -> int):
  let completed_item = {'menu': 'function:interact', 'info': "interact(self, escape_character=chr(29),             input_filter=None,\noutput_filter=None) -> int"}
  let result = cm_parser#python#parameters(completed_item)
  AssertEqual ['(escape_character, input_filter, output_filter)'], result

Execute (interact(self, excape_character=ch(29) -> (int, int)):
  let completed_item = {'menu': 'function:interact', 'info': "interact(self, escape_character=chr(29),             input_filter=None,\noutput_filter=None) -> (int, int)"}
  let result = cm_parser#python#parameters(completed_item)
  AssertEqual ['(escape_character, input_filter, output_filter)'], result

Execute (interact(self, excape_character=ch(29) -> (int, int)):
  let g:complete_parameter_py_keep_value = 1
  let completed_item = {'menu': 'function:interact', 'info': "interact(self, escape_character=chr(29),             input_filter=None,\noutput_filter=None) -> (int, int)"}
  let result = cm_parser#python#parameters(completed_item)
  AssertEqual ['(escape_character=chr(29), input_filter=None, output_filter=None)'], result

Execute (no parameter):
  let completed_item =  {'word': 'mkdir', 'menu': 'def mkdir', 'info': 'Create a directory.\n\nif dir_fd is not None, it should be a file descriptor open to a directory,\n and path should be relative; path will then be relative to that directory.\ndir_fd may not be implemented on your platform.\n If it is unavailable, using it will raise a NotImplementedError.\n\nthe mode argument is ignored on Windows.', 'kind': '', 'abbr': ''}
  let result = cm_parser#python#parameters(completed_item)
  AssertEqual ['()'], result
"}}}

" {{{ def
Execute (error menu):
  let completed_item = {'menu': 'module:func', 'info': 'func()'}
  let result = cm_parser#python#parameters(completed_item)
  AssertEqual [], result

Execute (error info):
  let completed_item = {'menu': 'def func', 'info': ''}
  let result = cm_parser#python#parameters(completed_item)
  AssertEqual [], result

Execute (foo()):
  let completed_item = {'menu': 'def foo', 'info': "foo()\nfoo function"}
  let result = cm_parser#python#parameters(completed_item)
  AssertEqual ['()'], result

Execute (foo() -> int):
  let completed_item = {'menu': 'def foo', 'info': "foo() -> int \nfoo function"}
  let result = cm_parser#python#parameters(completed_item)
  AssertEqual ['()'], result

Execute (foo(a) -> int):
  let completed_item = {'menu': 'def foo', 'info': "foo(a) -> int \nfoo function"}
  let result = cm_parser#python#parameters(completed_item)
  AssertEqual ['(a)'], result

Execute (foo(a, b) -> int):
  let completed_item = {'menu': 'def foo', 'info': "foo(a, b) -> int \nfoo function"}
  let result = cm_parser#python#parameters(completed_item)
  AssertEqual ['(a, b)'], result

Execute (foo(a, b = 1) -> int):
  let completed_item = {'menu': 'def foo', 'info': "foo(a, b = 1) -> int \nfoo function"}
  let result = cm_parser#python#parameters(completed_item)
  AssertEqual ['(a, b)'], result

Execute (foo(a, b = []) -> int):
  let completed_item = {'menu': 'def foo', 'info': "foo(a, b = []) -> int \nfoo function"}
  let result = cm_parser#python#parameters(completed_item)
  AssertEqual ['(a, b)'], result

Execute (foo(a, b = []) -> (int, True):
  let completed_item = {'menu': 'def foo', 'info': "foo(a, b = []) -> (int, True) \nfoo function"}
  let result = cm_parser#python#parameters(completed_item)
  AssertEqual ['(a, b)'], result

Execute (multi line, with self, ', )'):
  let completed_item = {'menu': 'def exec_command', 'info': "exec_command(         self,         command,         bufsize=-1,\ntimeout=None,         get_pty=False,         environment=None,     )"}
  let result = cm_parser#python#parameters(completed_item)
  AssertEqual ['(command, bufsize, timeout, get_pty, environment)'], result

Execute (multi line, with cls, ', )'):
  let completed_item = {'menu': 'def exec_command', 'info': "exec_command(         cls,         command,         bufsize=-1,\ntimeout=None,         get_pty=False,         environment=None,     )"}
  let result = cm_parser#python#parameters(completed_item)
  AssertEqual ['(command, bufsize, timeout, get_pty, environment)'], result

Execute (multi line, ', )'):
  let completed_item = {'menu': 'def exec_command', 'info': "exec_command(         command,         bufsize=-1,\ntimeout=None,         get_pty=False,         environment=None,     )"}
  let result = cm_parser#python#parameters(completed_item)
  AssertEqual ['(command, bufsize, timeout, get_pty, environment)'], result

Execute (multi line):
  let completed_item = {'menu': 'def exec_command', 'info': "exec_command(         command,         bufsize=-1,\ntimeout=None,         get_pty=False,         environment=None)"}
  let result = cm_parser#python#parameters(completed_item)
  AssertEqual ['(command, bufsize, timeout, get_pty, environment)'], result

" interact(self, escape_character=chr(29),             input_filter=None,
" output_filter=None)
Execute (interact(self, excape_character=ch(29)):
  let completed_item = {'menu': 'def interact', 'info': "interact(self, escape_character=chr(29),             input_filter=None,\noutput_filter=None)"}
  let result = cm_parser#python#parameters(completed_item)
  AssertEqual ['(escape_character, input_filter, output_filter)'], result

Execute (interact(self, excape_character=ch(29) -> int):
  let completed_item = {'menu': 'def interact', 'info': "interact(self, escape_character=chr(29),             input_filter=None,\noutput_filter=None) -> int"}
  let result = cm_parser#python#parameters(completed_item)
  AssertEqual ['(escape_character, input_filter, output_filter)'], result

Execute (interact(self, excape_character=ch(29) -> (int, int)):
  let completed_item = {'menu': 'def interact', 'info': "interact(self, escape_character=chr(29),             input_filter=None,\noutput_filter=None) -> (int, int)"}
  let result = cm_parser#python#parameters(completed_item)
  AssertEqual ['(escape_character, input_filter, output_filter)'], result
"}}}

" {{{ deoplete
Execute (foo()):
  let completed_item = {'word': 'foo(', 'info': "foo()\nfoo function"}
  let result = cm_parser#python#parameters(completed_item)
  AssertEqual ['()'], result

Execute (foo() -> int):
  let completed_item = {'word': 'foo(', 'info': "foo() -> int \nfoo function"}
  let result = cm_parser#python#parameters(completed_item)
  AssertEqual ['()'], result

Execute (foo(a) -> int):
  let completed_item = {'word': 'foo(', 'info': "foo(a) -> int \nfoo function"}
  let result = cm_parser#python#parameters(completed_item)
  AssertEqual ['(a)'], result

Execute (foo(a, b) -> int):
  let completed_item = {'word': 'foo(', 'info': "foo(a, b) -> int \nfoo function"}
  let result = cm_parser#python#parameters(completed_item)
  AssertEqual ['(a, b)'], result

Execute (foo(a, b = 1) -> int):
  let completed_item = {'word': 'foo(', 'info': "foo(a, b = 1) -> int \nfoo function"}
  let result = cm_parser#python#parameters(completed_item)
  AssertEqual ['(a, b)'], result

Execute (foo(a, b = []) -> int):
  let completed_item = {'word': 'foo(', 'info': "foo(a, b = []) -> int \nfoo function"}
  let result = cm_parser#python#parameters(completed_item)
  AssertEqual ['(a, b)'], result

Execute (foo(a, b = []) -> (int, True):
  let completed_item = {'word': 'foo(', 'info': "foo(a, b = []) -> (int, True) \nfoo function"}
  let result = cm_parser#python#parameters(completed_item)
  AssertEqual ['(a, b)'], result

Execute (multi line, with self, ', )'):
  let completed_item = {'word': 'exec_command(', 'info': "exec_command(         self,         command,         bufsize=-1,\ntimeout=None,         get_pty=False,         environment=None,     )"}
  let result = cm_parser#python#parameters(completed_item)
  AssertEqual ['(command, bufsize, timeout, get_pty, environment)'], result

Execute (multi line, with cls, ', )'):
  let completed_item = {'word': 'exec_command(', 'info': "exec_command(         cls,         command,         bufsize=-1,\ntimeout=None,         get_pty=False,         environment=None,     )"}
  let result = cm_parser#python#parameters(completed_item)
  AssertEqual ['(command, bufsize, timeout, get_pty, environment)'], result

Execute (multi line, ', )'):
  let completed_item = {'word': 'exec_command(', 'info': "exec_command(         command,         bufsize=-1,\ntimeout=None,         get_pty=False,         environment=None,     )"}
  let result = cm_parser#python#parameters(completed_item)
  AssertEqual ['(command, bufsize, timeout, get_pty, environment)'], result

Execute (multi line):
  let completed_item = {'word': 'exec_command(', 'info': "exec_command(         command,         bufsize=-1,\ntimeout=None,         get_pty=False,         environment=None)"}
  let result = cm_parser#python#parameters(completed_item)
  AssertEqual ['(command, bufsize, timeout, get_pty, environment)'], result

" interact(self, escape_character=chr(29),             input_filter=None,
" output_filter=None)
Execute (interact(self, excape_character=ch(29)):
  let completed_item = {'word': 'interact(', 'menu': 'def interact', 'info': "interact(self, escape_character=chr(29),             input_filter=None,\noutput_filter=None)"}
  let result = cm_parser#python#parameters(completed_item)
  AssertEqual ['(escape_character, input_filter, output_filter)'], result

Execute (interact(self, excape_character=ch(29) -> int):
  let completed_item = {'word': 'interact(', 'menu': 'def interact', 'info': "interact(self, escape_character=chr(29),             input_filter=None,\noutput_filter=None) -> int"}
  let result = cm_parser#python#parameters(completed_item)
  AssertEqual ['(escape_character, input_filter, output_filter)'], result

Execute (interact(self, excape_character=ch(29) -> (int, int)):
  let completed_item = {'word': 'interact(', 'menu': 'def interact', 'info': "interact(self, escape_character=chr(29),             input_filter=None,\noutput_filter=None) -> (int, int)"}
  let result = cm_parser#python#parameters(completed_item)
  AssertEqual ['(escape_character, input_filter, output_filter)'], result
"}}}

Execute (jedi):
  let completed_item = {'word': 'test_func', 'menu': '[jedi] ', 'info': 'test_func(arg1, arg2)', 'kind': 'function', 'abbr': 'test_func(arg1, arg2)'} 
  let result = cm_parser#python#parameters(completed_item)
  AssertEqual ['(arg1, arg2)'], result

Execute (coc.nvim + coc-pyhon[MPLS]):
  let completed_item = {'word': 'fun', 'menu': '[LS]', 'user_data': '{"cid":1578967439,"source":"python","index":8}', 'info': '```\nfun(x, y)\n```', 'kind': 'v', 'abbr': 'fun'}
  let result = cm_parser#python#parameters(completed_item)
  AssertEqual ['(x, y)'], result

" echos
Execute (echos, foo):
  let completed_item = {'menu': 'function:foo', 'info': "foo()\nfoo function"}
  let result = cm_parser#python#echos(completed_item)
  AssertEqual ['foo()'], result

Execute (echos, foo(a) -> int):
  let completed_item = {'menu': 'function:foo', 'info': "foo(a) -> int \nfoo function"}
  let result = cm_parser#python#echos(completed_item)
  AssertEqual ['foo(a)'], result

Execute (echos, foo(a, b = []) -> int):
  let completed_item = {'menu': 'function:foo', 'info': "foo(a, b = []) -> int \nfoo function"}
  let result = cm_parser#python#echos(completed_item)
  AssertEqual ['foo(a, b = [])'], result