xonsh/tests/test_tools.py

517 lines
14 KiB
Python
Raw Normal View History

# -*- coding: utf-8 -*-
2015-03-13 21:43:18 -05:00
"""Tests the xonsh lexer."""
import os
2016-05-22 22:33:43 +02:00
import random
from tempfile import TemporaryDirectory
import stat
2015-03-13 21:43:18 -05:00
2015-03-25 18:32:10 -05:00
import nose
from nose.tools import assert_equal, assert_true, assert_false
2015-03-13 21:43:18 -05:00
from xonsh.lexer import Lexer
2016-05-22 22:33:43 +02:00
from xonsh.tools import (
subproc_toks, subexpr_from_unbalanced, is_int, always_true, always_false,
ensure_string, is_env_path, str_to_env_path, env_path_to_str,
escape_windows_cmd_string, is_bool, to_bool, bool_to_str,
ensure_int_or_slice, is_float, is_string, check_for_partial_string,
2016-05-22 22:33:43 +02:00
argvquote, executables_in)
2015-03-13 21:43:18 -05:00
LEXER = Lexer()
LEXER.build()
INDENT = ' '
2016-05-22 22:33:43 +02:00
2015-03-13 21:43:18 -05:00
def test_subproc_toks_x():
2016-04-09 00:12:25 -04:00
exp = '![x]'
2015-03-13 21:43:18 -05:00
obs = subproc_toks('x', lexer=LEXER, returnline=True)
assert_equal(exp, obs)
2016-05-22 22:33:43 +02:00
2015-03-13 21:43:18 -05:00
def test_subproc_toks_ls_l():
2016-04-09 00:12:25 -04:00
exp = '![ls -l]'
2015-03-13 21:43:18 -05:00
obs = subproc_toks('ls -l', lexer=LEXER, returnline=True)
assert_equal(exp, obs)
2016-05-22 22:33:43 +02:00
2015-03-13 21:43:18 -05:00
def test_subproc_toks_git():
s = 'git commit -am "hello doc"'
2016-04-09 00:12:25 -04:00
exp = '![{0}]'.format(s)
2015-03-13 21:43:18 -05:00
obs = subproc_toks(s, lexer=LEXER, returnline=True)
assert_equal(exp, obs)
2016-05-22 22:33:43 +02:00
2015-03-13 21:43:18 -05:00
def test_subproc_toks_git_semi():
s = 'git commit -am "hello doc"'
2016-04-09 00:12:25 -04:00
exp = '![{0}];'.format(s)
2015-03-13 21:43:18 -05:00
obs = subproc_toks(s + ';', lexer=LEXER, returnline=True)
assert_equal(exp, obs)
2016-05-22 22:33:43 +02:00
2015-03-13 21:43:18 -05:00
def test_subproc_toks_git_nl():
s = 'git commit -am "hello doc"'
2016-04-09 00:12:25 -04:00
exp = '![{0}]\n'.format(s)
2015-03-13 21:43:18 -05:00
obs = subproc_toks(s + '\n', lexer=LEXER, returnline=True)
assert_equal(exp, obs)
2016-05-22 22:33:43 +02:00
2015-03-13 21:43:18 -05:00
def test_subproc_toks_indent_ls():
s = 'ls -l'
2016-04-09 00:12:25 -04:00
exp = INDENT + '![{0}]'.format(s)
2015-07-29 23:58:25 +02:00
obs = subproc_toks(INDENT + s, mincol=len(INDENT), lexer=LEXER,
returnline=True)
assert_equal(exp, obs)
2016-05-22 22:33:43 +02:00
def test_subproc_toks_indent_ls_nl():
2015-03-13 21:43:18 -05:00
s = 'ls -l'
2016-04-09 00:12:25 -04:00
exp = INDENT + '![{0}]\n'.format(s)
2015-07-29 23:58:25 +02:00
obs = subproc_toks(INDENT + s + '\n', mincol=len(INDENT), lexer=LEXER,
2015-03-13 21:43:18 -05:00
returnline=True)
assert_equal(exp, obs)
2016-05-22 22:33:43 +02:00
2015-03-30 19:27:04 -05:00
def test_subproc_toks_indent_ls_no_min():
s = 'ls -l'
2016-04-09 00:12:25 -04:00
exp = INDENT + '![{0}]'.format(s)
2015-03-30 19:27:04 -05:00
obs = subproc_toks(INDENT + s, lexer=LEXER, returnline=True)
assert_equal(exp, obs)
2016-05-22 22:33:43 +02:00
2015-03-30 19:27:04 -05:00
def test_subproc_toks_indent_ls_no_min_nl():
s = 'ls -l'
2016-04-09 00:12:25 -04:00
exp = INDENT + '![{0}]\n'.format(s)
2015-03-30 19:27:04 -05:00
obs = subproc_toks(INDENT + s + '\n', lexer=LEXER, returnline=True)
assert_equal(exp, obs)
2016-05-22 22:33:43 +02:00
2015-03-31 11:02:36 -05:00
def test_subproc_toks_indent_ls_no_min_semi():
s = 'ls'
2016-04-09 00:12:25 -04:00
exp = INDENT + '![{0}];'.format(s)
2015-03-31 11:02:36 -05:00
obs = subproc_toks(INDENT + s + ';', lexer=LEXER, returnline=True)
assert_equal(exp, obs)
2016-05-22 22:33:43 +02:00
2015-03-31 19:40:35 -05:00
def test_subproc_toks_indent_ls_no_min_semi_nl():
s = 'ls'
2016-04-09 00:12:25 -04:00
exp = INDENT + '![{0}];\n'.format(s)
2015-03-31 19:40:35 -05:00
obs = subproc_toks(INDENT + s + ';\n', lexer=LEXER, returnline=True)
assert_equal(exp, obs)
2016-05-22 22:33:43 +02:00
2015-03-13 21:43:18 -05:00
def test_subproc_toks_ls_comment():
s = 'ls -l'
com = ' # lets list'
2016-04-09 00:12:25 -04:00
exp = '![{0}]{1}'.format(s, com)
2015-03-13 21:43:18 -05:00
obs = subproc_toks(s + com, lexer=LEXER, returnline=True)
assert_equal(exp, obs)
2016-05-22 22:33:43 +02:00
2015-03-13 21:43:18 -05:00
def test_subproc_toks_ls_42_comment():
s = 'ls 42'
com = ' # lets list'
2016-04-09 00:12:25 -04:00
exp = '![{0}]{1}'.format(s, com)
2015-03-13 21:43:18 -05:00
obs = subproc_toks(s + com, lexer=LEXER, returnline=True)
assert_equal(exp, obs)
2016-05-22 22:33:43 +02:00
2015-03-13 21:43:18 -05:00
def test_subproc_toks_ls_str_comment():
s = 'ls "wakka"'
com = ' # lets list'
2016-04-09 00:12:25 -04:00
exp = '![{0}]{1}'.format(s, com)
2015-03-13 21:43:18 -05:00
obs = subproc_toks(s + com, lexer=LEXER, returnline=True)
assert_equal(exp, obs)
2016-05-22 22:33:43 +02:00
def test_subproc_toks_indent_ls_comment():
ind = ' '
s = 'ls -l'
com = ' # lets list'
2016-04-09 00:12:25 -04:00
exp = '{0}![{1}]{2}'.format(ind, s, com)
obs = subproc_toks(ind + s + com, lexer=LEXER, returnline=True)
assert_equal(exp, obs)
2016-05-22 22:33:43 +02:00
def test_subproc_toks_indent_ls_str():
ind = ' '
s = 'ls "wakka"'
com = ' # lets list'
2016-04-09 00:12:25 -04:00
exp = '{0}![{1}]{2}'.format(ind, s, com)
obs = subproc_toks(ind + s + com, lexer=LEXER, returnline=True)
assert_equal(exp, obs)
2016-05-22 22:33:43 +02:00
2015-03-14 01:00:46 -05:00
def test_subproc_toks_ls_l_semi_ls_first():
2015-03-13 21:43:18 -05:00
lsdl = 'ls -l'
ls = 'ls'
s = '{0}; {1}'.format(lsdl, ls)
2016-04-09 00:12:25 -04:00
exp = '![{0}]; {1}'.format(lsdl, ls)
2015-03-14 00:40:32 -05:00
obs = subproc_toks(s, lexer=LEXER, maxcol=6, returnline=True)
2015-03-13 21:43:18 -05:00
assert_equal(exp, obs)
2016-05-22 22:33:43 +02:00
2015-03-13 21:43:18 -05:00
def test_subproc_toks_ls_l_semi_ls_second():
lsdl = 'ls -l'
ls = 'ls'
s = '{0}; {1}'.format(lsdl, ls)
2016-04-09 00:12:25 -04:00
exp = '{0}; ![{1}]'.format(lsdl, ls)
2015-03-13 21:43:18 -05:00
obs = subproc_toks(s, lexer=LEXER, mincol=7, returnline=True)
assert_equal(exp, obs)
2016-05-22 22:33:43 +02:00
2016-05-11 23:24:58 -04:00
def test_subproc_toks_hello_mom_first():
2015-03-14 01:00:46 -05:00
fst = "echo 'hello'"
sec = "echo 'mom'"
s = '{0}; {1}'.format(fst, sec)
2016-04-09 00:12:25 -04:00
exp = '![{0}]; {1}'.format(fst, sec)
2015-03-14 01:00:46 -05:00
obs = subproc_toks(s, lexer=LEXER, maxcol=len(fst)+1, returnline=True)
assert_equal(exp, obs)
2016-05-22 22:33:43 +02:00
2016-05-11 23:24:58 -04:00
def test_subproc_toks_hello_mom_second():
2015-03-14 01:00:46 -05:00
fst = "echo 'hello'"
sec = "echo 'mom'"
s = '{0}; {1}'.format(fst, sec)
2016-04-09 00:12:25 -04:00
exp = '{0}; ![{1}]'.format(fst, sec)
2015-03-14 01:00:46 -05:00
obs = subproc_toks(s, lexer=LEXER, mincol=len(fst), returnline=True)
assert_equal(exp, obs)
2016-05-22 22:33:43 +02:00
2015-03-18 20:14:53 -05:00
def test_subproc_toks_comment():
exp = None
obs = subproc_toks('# I am a comment', lexer=LEXER, returnline=True)
assert_equal(exp, obs)
2016-05-22 22:33:43 +02:00
2016-04-10 23:38:12 -04:00
def test_subproc_toks_not():
exp = 'not ![echo mom]'
obs = subproc_toks('not echo mom', lexer=LEXER, returnline=True)
assert_equal(exp, obs)
2016-05-22 22:33:43 +02:00
2016-04-10 23:38:12 -04:00
def test_subproc_toks_paren():
exp = '(![echo mom])'
obs = subproc_toks('(echo mom)', lexer=LEXER, returnline=True)
assert_equal(exp, obs)
2016-05-22 22:33:43 +02:00
2016-04-10 23:38:12 -04:00
def test_subproc_toks_paren_ws():
exp = '(![echo mom]) '
obs = subproc_toks('(echo mom) ', lexer=LEXER, returnline=True)
assert_equal(exp, obs)
2016-05-22 22:33:43 +02:00
2016-04-10 23:38:12 -04:00
def test_subproc_toks_not_paren():
exp = 'not (![echo mom])'
obs = subproc_toks('not (echo mom)', lexer=LEXER, returnline=True)
assert_equal(exp, obs)
2016-05-22 22:33:43 +02:00
2016-04-10 23:38:12 -04:00
def test_subproc_toks_and_paren():
exp = 'True and (![echo mom])'
obs = subproc_toks('True and (echo mom)', lexer=LEXER, returnline=True)
assert_equal(exp, obs)
2016-05-22 22:33:43 +02:00
2016-04-10 23:38:12 -04:00
def test_subproc_toks_paren_and_paren():
exp = '(![echo a]) and (echo b)'
obs = subproc_toks('(echo a) and (echo b)', maxcol=9, lexer=LEXER, returnline=True)
assert_equal(exp, obs)
2016-05-22 22:33:43 +02:00
def test_subproc_toks_semicolon_only():
exp = None
obs = subproc_toks(';', lexer=LEXER, returnline=True)
assert_equal(exp, obs)
2016-05-22 22:33:43 +02:00
2016-05-11 23:24:58 -04:00
def test_subproc_toks_pyeval():
s = 'echo @(1+1)'
exp = '![{0}]'.format(s)
obs = subproc_toks(s, lexer=LEXER, returnline=True)
assert_equal(exp, obs)
2016-05-22 22:33:43 +02:00
2016-05-11 23:24:58 -04:00
def test_subproc_toks_twopyeval():
s = 'echo @(1+1) @(40 + 2)'
exp = '![{0}]'.format(s)
obs = subproc_toks(s, lexer=LEXER, returnline=True)
assert_equal(exp, obs)
2016-05-22 22:33:43 +02:00
2016-05-11 23:24:58 -04:00
def test_subproc_toks_pyeval_parens():
s = 'echo @(1+1)'
inp = '({0})'.format(s)
exp = '(![{0}])'.format(s)
obs = subproc_toks(inp, lexer=LEXER, returnline=True)
assert_equal(exp, obs)
2016-05-22 22:33:43 +02:00
2016-05-11 23:24:58 -04:00
def test_subproc_toks_twopyeval_parens():
s = 'echo @(1+1) @(40+2)'
inp = '({0})'.format(s)
exp = '(![{0}])'.format(s)
obs = subproc_toks(inp, lexer=LEXER, returnline=True)
assert_equal(exp, obs)
2016-05-22 22:33:43 +02:00
2016-05-11 23:41:14 -04:00
def test_subproc_toks_pyeval_nested():
s = 'echo @(min(1, 42))'
exp = '![{0}]'.format(s)
obs = subproc_toks(s, lexer=LEXER, returnline=True)
assert_equal(exp, obs)
2016-05-22 22:33:43 +02:00
2016-05-11 23:41:14 -04:00
def test_subproc_toks_pyeval_nested_parens():
s = 'echo @(min(1, 42))'
inp = '({0})'.format(s)
exp = '(![{0}])'.format(s)
obs = subproc_toks(inp, lexer=LEXER, returnline=True)
assert_equal(exp, obs)
2016-05-22 22:33:43 +02:00
2016-05-11 23:41:14 -04:00
def test_subproc_toks_capstdout():
s = 'echo $(echo bat)'
exp = '![{0}]'.format(s)
obs = subproc_toks(s, lexer=LEXER, returnline=True)
assert_equal(exp, obs)
2016-05-22 22:33:43 +02:00
2016-05-11 23:41:14 -04:00
def test_subproc_toks_capproc():
s = 'echo !(echo bat)'
exp = '![{0}]'.format(s)
obs = subproc_toks(s, lexer=LEXER, returnline=True)
assert_equal(exp, obs)
2016-05-22 22:33:43 +02:00
2016-05-19 18:52:50 -04:00
def test_subproc_toks_pyeval_redirect():
s = 'echo @("foo") > bar'
inp = '{0}'.format(s)
exp = '![{0}]'.format(s)
obs = subproc_toks(inp, lexer=LEXER, returnline=True)
assert_equal(exp, obs)
2015-04-05 15:42:24 -05:00
def test_subexpr_from_unbalanced_parens():
cases = [
('f(x.', 'x.'),
('f(1,x.', 'x.'),
('f((1,10),x.y', 'x.y'),
]
for expr, exp in cases:
obs = subexpr_from_unbalanced(expr, '(', ')')
yield assert_equal, exp, obs
2016-05-22 22:33:43 +02:00
def test_is_int():
yield assert_true, is_int(42)
yield assert_false, is_int('42')
2016-05-22 22:33:43 +02:00
2015-10-11 14:00:38 -04:00
def test_is_float():
yield assert_true, is_float(42.0)
yield assert_false, is_float('42.0')
2016-05-22 22:33:43 +02:00
2015-10-31 13:31:52 -04:00
def test_is_string():
2015-10-31 14:31:17 -04:00
yield assert_true, is_string('42.0')
yield assert_false, is_string(42.0)
2015-10-31 13:31:52 -04:00
2016-05-22 22:33:43 +02:00
def test_always_true():
yield assert_true, always_true(42)
yield assert_true, always_true('42')
2016-05-22 22:33:43 +02:00
def test_always_false():
yield assert_false, always_false(42)
yield assert_false, always_false('42')
2016-05-22 22:33:43 +02:00
def test_ensure_string():
cases = [
(42, '42'),
('42', '42'),
]
for inp, exp in cases:
obs = ensure_string(inp)
yield assert_equal, exp, obs
2016-05-22 22:33:43 +02:00
def test_is_env_path():
cases = [
('/home/wakka', False),
(['/home/jawaka'], True),
]
for inp, exp in cases:
obs = is_env_path(inp)
yield assert_equal, exp, obs
2016-05-22 22:33:43 +02:00
def test_str_to_env_path():
cases = [
('/home/wakka', ['/home/wakka']),
2015-07-29 23:58:25 +02:00
('/home/wakka' + os.pathsep + '/home/jawaka',
['/home/wakka', '/home/jawaka']),
]
for inp, exp in cases:
obs = str_to_env_path(inp)
yield assert_equal, exp, obs
2016-05-22 22:33:43 +02:00
def test_env_path_to_str():
cases = [
(['/home/wakka'], '/home/wakka'),
2015-07-29 23:58:25 +02:00
(['/home/wakka', '/home/jawaka'],
'/home/wakka' + os.pathsep + '/home/jawaka'),
]
for inp, exp in cases:
obs = env_path_to_str(inp)
yield assert_equal, exp, obs
2015-03-14 01:00:46 -05:00
2015-08-02 15:36:55 -05:00
def test_is_bool():
yield assert_equal, True, is_bool(True)
yield assert_equal, True, is_bool(False)
yield assert_equal, False, is_bool(1)
yield assert_equal, False, is_bool('yooo hooo!')
def test_to_bool():
cases = [
(True, True),
(False, False),
(None, False),
('', False),
('0', False),
('False', False),
('NONE', False),
('TRUE', True),
('1', True),
(0, False),
(1, True),
]
for inp, exp in cases:
obs = to_bool(inp)
yield assert_equal, exp, obs
def test_bool_to_str():
yield assert_equal, '1', bool_to_str(True)
yield assert_equal, '', bool_to_str(False)
2015-08-23 11:30:07 -04:00
def test_ensure_int_or_slice():
cases = [
(42, 42),
(None, slice(None, None, None)),
('42', 42),
('-42', -42),
('1:2:3', slice(1, 2, 3)),
('1::3', slice(1, None, 3)),
('1:', slice(1, None, None)),
('[1:2:3]', slice(1, 2, 3)),
('(1:2:3)', slice(1, 2, 3)),
]
for inp, exp in cases:
obs = ensure_int_or_slice(inp)
yield assert_equal, exp, obs
def test_escape_windows_cmd_string():
cases = [
('', ''),
('foo', 'foo'),
('foo&bar', 'foo^&bar'),
('foo$?-/_"\\', 'foo$?-/_^"\\'),
('^&<>|', '^^^&^<^>^|'),
('this /?', 'this /.')
]
for st, esc in cases:
obs = escape_windows_cmd_string(st)
yield assert_equal, esc, obs
def test_argvquote():
cases = [
('', '""'),
('foo', 'foo'),
(r'arg1 "hallo, "world"" "\some\path with\spaces")',
r'"arg1 \"hallo, \"world\"\" \"\some\path with\spaces\")"'),
(r'"argument"2" argument3 argument4',
r'"\"argument\"2\" argument3 argument4"'),
(r'"\foo\bar bar\foo\" arg',
r'"\"\foo\bar bar\foo\\\" arg"')
]
for st, esc in cases:
obs = argvquote(st)
yield assert_equal, esc, obs
2015-12-18 15:30:46 -05:00
_leaders = ('', 'not empty')
_r = ('r', '')
_b = ('b', '')
_u = ('u', '')
_chars = set(i+j+k for i in _r for j in _b for k in _u)
_chars |= set(i+j+k for i in _r for j in _u for k in _b)
_chars |= set(i+j+k for i in _b for j in _u for k in _r)
_chars |= set(i+j+k for i in _b for j in _r for k in _u)
_chars |= set(i+j+k for i in _u for j in _r for k in _b)
_chars |= set(i+j+k for i in _u for j in _b for k in _r)
_squote = ('"""', '"', "'''", "'")
_startend = {c+s: s for c in _chars for s in _squote}
inners = "this is a string"
2016-05-22 22:33:43 +02:00
2015-12-18 15:30:46 -05:00
def test_partial_string():
# single string at start
yield assert_equal, check_for_partial_string('no strings here'), (None, None, None)
yield assert_equal, check_for_partial_string(''), (None, None, None)
2016-05-22 22:33:43 +02:00
for s, e in _startend.items():
2015-12-18 15:30:46 -05:00
_test = s + inners + e
for l in _leaders:
for f in _leaders:
# single string
_res = check_for_partial_string(l + _test + f)
yield assert_equal, _res, (len(l), len(l) + len(_test), s)
# single partial
_res = check_for_partial_string(l + f + s + inners)
yield assert_equal, _res, (len(l+f), None, s)
for s2, e2 in _startend.items():
_test2 = s2 + inners + e2
for l2 in _leaders:
for f2 in _leaders:
# two strings
_res = check_for_partial_string(l + _test + f + l2 + _test2 + f2)
yield assert_equal, _res, (len(l+_test+f+l2), len(l+_test+f+l2+_test2), s2)
# one string, one partial
_res = check_for_partial_string(l + _test + f + l2 + s2 + inners)
yield assert_equal, _res, (len(l+_test+f+l2), None, s2)
2016-05-22 22:33:43 +02:00
def test_executables_in():
expected = set()
with TemporaryDirectory() as test_path:
for i in range(random.randint(100, 200)):
_type = random.choice(('none', 'file', 'file', 'directory'))
if _type == 'none':
continue
executable = random.choice((True, True, False))
if _type == 'file' and executable:
expected.add(str(i))
path = os.path.join(test_path, str(i))
if _type == 'file':
open(path, 'w').close()
elif _type == 'directory':
os.mkdir(path)
if executable:
os.chmod(path, stat.S_IXUSR | stat.S_IRUSR | stat.S_IWUSR)
result = set(executables_in(test_path))
assert_equal(expected, result)
2015-03-13 21:43:18 -05:00
if __name__ == '__main__':
nose.runmodule()