80 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
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'],
 | 
						|
 | 
						|
    # flags containing literal quotes in their name
 | 
						|
    [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:
 | 
						|
        # posix has no non-shell string parsing
 | 
						|
        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
 | 
						|
    """
 | 
						|
    # invoke python to return its arguments as json
 | 
						|
    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")
 |