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")
 |