1# -*- coding: utf-8 -*- 2"""Tests foreign shells.""" 3from __future__ import unicode_literals, print_function 4import os 5import subprocess 6 7import pytest 8from tools import skip_if_on_windows, skip_if_on_unix 9 10from xonsh.foreign_shells import foreign_shell_data, parse_env, parse_aliases 11 12 13def test_parse_env(): 14 exp = {"X": "YES", "Y": "NO"} 15 s = ( 16 "some garbage\n" 17 "__XONSH_ENV_BEG__\n" 18 "Y=NO\n" 19 "X=YES\n" 20 "__XONSH_ENV_END__\n" 21 "more filth" 22 ) 23 obs = parse_env(s) 24 assert exp == obs 25 26 27def test_parse_env_newline(): 28 exp = {"X": "YES", "Y": "NO", "PROMPT": "why\nme "} 29 s = ( 30 "some garbage\n" 31 "__XONSH_ENV_BEG__\n" 32 "Y=NO\n" 33 "PROMPT=why\nme \n" 34 "X=YES\n" 35 "__XONSH_ENV_END__\n" 36 "more filth" 37 ) 38 obs = parse_env(s) 39 assert exp == obs 40 41 42def test_parse_env_equals(): 43 exp = {"X": "YES", "Y": "NO", "LS_COLORS": "*.tar=5"} 44 s = ( 45 "some garbage\n" 46 "__XONSH_ENV_BEG__\n" 47 "Y=NO\n" 48 "LS_COLORS=*.tar=5\n" 49 "X=YES\n" 50 "__XONSH_ENV_END__\n" 51 "more filth" 52 ) 53 obs = parse_env(s) 54 assert exp == obs 55 56 57def test_parse_aliases(): 58 exp = {"x": ["yes", "-1"], "y": ["echo", "no"]} 59 s = ( 60 "some garbage\n" 61 "__XONSH_ALIAS_BEG__\n" 62 "alias x='yes -1'\n" 63 "alias y='echo no'\n" 64 "__XONSH_ALIAS_END__\n" 65 "more filth" 66 ) 67 obs = parse_aliases(s) 68 assert exp == obs 69 70 71@skip_if_on_windows 72def test_foreign_bash_data(): 73 expenv = {"EMERALD": "SWORD", "MIGHTY": "WARRIOR"} 74 expaliases = {"l": ["ls", "-CF"], "la": ["ls", "-A"], "ll": ["ls", "-a", "-lF"]} 75 rcfile = os.path.join(os.path.dirname(__file__), "bashrc.sh") 76 try: 77 obsenv, obsaliases = foreign_shell_data( 78 "bash", currenv=(), extra_args=("--rcfile", rcfile), safe=False 79 ) 80 except (subprocess.CalledProcessError, FileNotFoundError): 81 return 82 for key, expval in expenv.items(): 83 assert expval == obsenv.get(key, False) 84 for key, expval in expaliases.items(): 85 assert expval == obsaliases.get(key, False) 86 87 88@skip_if_on_unix 89def test_foreign_cmd_data(): 90 env = (("ENV_TO_BE_REMOVED", "test"),) 91 batchfile = os.path.join(os.path.dirname(__file__), "batch.bat") 92 source_cmd = 'call "{}"\necho off'.format(batchfile) 93 try: 94 obsenv, _ = foreign_shell_data( 95 "cmd", 96 prevcmd=source_cmd, 97 currenv=env, 98 interactive=False, 99 sourcer="call", 100 envcmd="set", 101 use_tmpfile=True, 102 safe=False, 103 ) 104 except (subprocess.CalledProcessError, FileNotFoundError): 105 return 106 assert "ENV_TO_BE_ADDED" in obsenv 107 assert obsenv["ENV_TO_BE_ADDED"] == "Hallo world" 108 assert "ENV_TO_BE_REMOVED" not in obsenv 109