1# Tests invocation of the interpreter with various command line arguments 2# All tests are executed with environment variables ignored 3# See test_cmd_line_script.py for testing of script execution 4 5import test.test_support, unittest 6import sys 7from test.script_helper import spawn_python, kill_python, python_exit_code 8 9 10class CmdLineTest(unittest.TestCase): 11 def start_python(self, *args): 12 p = spawn_python(*args) 13 return kill_python(p) 14 15 def exit_code(self, *args): 16 return python_exit_code(*args) 17 18 def test_directories(self): 19 self.assertNotEqual(self.exit_code('.'), 0) 20 self.assertNotEqual(self.exit_code('< .'), 0) 21 22 def verify_valid_flag(self, cmd_line): 23 data = self.start_python(cmd_line) 24 self.assertTrue(data == '' or data.endswith('\n')) 25 self.assertNotIn('Traceback', data) 26 27 def test_optimize(self): 28 self.verify_valid_flag('-O') 29 self.verify_valid_flag('-OO') 30 31 def test_q(self): 32 self.verify_valid_flag('-Qold') 33 self.verify_valid_flag('-Qnew') 34 self.verify_valid_flag('-Qwarn') 35 self.verify_valid_flag('-Qwarnall') 36 37 def test_site_flag(self): 38 self.verify_valid_flag('-S') 39 40 def test_usage(self): 41 self.assertIn('usage', self.start_python('-h')) 42 43 def test_version(self): 44 version = 'Python %d.%d' % sys.version_info[:2] 45 self.assertTrue(self.start_python('-V').startswith(version)) 46 47 def test_run_module(self): 48 # Test expected operation of the '-m' switch 49 # Switch needs an argument 50 self.assertNotEqual(self.exit_code('-m'), 0) 51 # Check we get an error for a nonexistent module 52 self.assertNotEqual( 53 self.exit_code('-m', 'fnord43520xyz'), 54 0) 55 # Check the runpy module also gives an error for 56 # a nonexistent module 57 self.assertNotEqual( 58 self.exit_code('-m', 'runpy', 'fnord43520xyz'), 59 0) 60 # All good if module is located and run successfully 61 self.assertEqual( 62 self.exit_code('-m', 'timeit', '-n', '1'), 63 0) 64 65 def test_run_module_bug1764407(self): 66 # -m and -i need to play well together 67 # Runs the timeit module and checks the __main__ 68 # namespace has been populated appropriately 69 p = spawn_python('-i', '-m', 'timeit', '-n', '1') 70 p.stdin.write('Timer\n') 71 p.stdin.write('exit()\n') 72 data = kill_python(p) 73 self.assertTrue(data.startswith('1 loop')) 74 self.assertIn('__main__.Timer', data) 75 76 def test_run_code(self): 77 # Test expected operation of the '-c' switch 78 # Switch needs an argument 79 self.assertNotEqual(self.exit_code('-c'), 0) 80 # Check we get an error for an uncaught exception 81 self.assertNotEqual( 82 self.exit_code('-c', 'raise Exception'), 83 0) 84 # All good if execution is successful 85 self.assertEqual( 86 self.exit_code('-c', 'pass'), 87 0) 88 89 90def test_main(): 91 test.test_support.run_unittest(CmdLineTest) 92 test.test_support.reap_children() 93 94if __name__ == "__main__": 95 test_main() 96