|
|
import pytest |
|
|
import subprocess |
|
|
import json |
|
|
import sys |
|
|
|
|
|
from numpy.distutils import _shell_utils |
|
|
from numpy.testing import IS_WASM |
|
|
|
|
|
argv_cases = [ |
|
|
[r'exe'], |
|
|
[r'path/exe'], |
|
|
[r'path\exe'], |
|
|
[r'\\server\path\exe'], |
|
|
[r'path to/exe'], |
|
|
[r'path to\exe'], |
|
|
|
|
|
[r'exe', '--flag'], |
|
|
[r'path/exe', '--flag'], |
|
|
[r'path\exe', '--flag'], |
|
|
[r'path to/exe', '--flag'], |
|
|
[r'path to\exe', '--flag'], |
|
|
|
|
|
|
|
|
[r'path to/exe', '--flag-"quoted"'], |
|
|
[r'path to\exe', '--flag-"quoted"'], |
|
|
[r'path to/exe', '"--flag-quoted"'], |
|
|
[r'path to\exe', '"--flag-quoted"'], |
|
|
] |
|
|
|
|
|
|
|
|
@pytest.fixture(params=[ |
|
|
_shell_utils.WindowsParser, |
|
|
_shell_utils.PosixParser |
|
|
]) |
|
|
def Parser(request): |
|
|
return request.param |
|
|
|
|
|
|
|
|
@pytest.fixture |
|
|
def runner(Parser): |
|
|
if Parser != _shell_utils.NativeParser: |
|
|
pytest.skip('Unable to run with non-native parser') |
|
|
|
|
|
if Parser == _shell_utils.WindowsParser: |
|
|
return lambda cmd: subprocess.check_output(cmd) |
|
|
elif Parser == _shell_utils.PosixParser: |
|
|
|
|
|
return lambda cmd: subprocess.check_output(cmd, shell=True) |
|
|
else: |
|
|
raise NotImplementedError |
|
|
|
|
|
|
|
|
@pytest.mark.skipif(IS_WASM, reason="Cannot start subprocess") |
|
|
@pytest.mark.parametrize('argv', argv_cases) |
|
|
def test_join_matches_subprocess(Parser, runner, argv): |
|
|
""" |
|
|
Test that join produces strings understood by subprocess |
|
|
""" |
|
|
|
|
|
cmd = [ |
|
|
sys.executable, '-c', |
|
|
'import json, sys; print(json.dumps(sys.argv[1:]))' |
|
|
] |
|
|
joined = Parser.join(cmd + argv) |
|
|
json_out = runner(joined).decode() |
|
|
assert json.loads(json_out) == argv |
|
|
|
|
|
|
|
|
@pytest.mark.skipif(IS_WASM, reason="Cannot start subprocess") |
|
|
@pytest.mark.parametrize('argv', argv_cases) |
|
|
def test_roundtrip(Parser, argv): |
|
|
""" |
|
|
Test that split is the inverse operation of join |
|
|
""" |
|
|
try: |
|
|
joined = Parser.join(argv) |
|
|
assert argv == Parser.split(joined) |
|
|
except NotImplementedError: |
|
|
pytest.skip("Not implemented") |
|
|
|