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