123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- import sys
- import re
- from unittest import TestCase
- try:
- from StringIO import StringIO
- except ImportError:
- from io import StringIO # doesn't accept 'str' in Py2
- from .. import Options
- from ..CmdLine import parse_command_line
- def check_global_options(expected_options, white_list=[]):
- """
- returns error message of "" if check Ok
- """
- no_value = object()
- for name, orig_value in expected_options.items():
- if name not in white_list:
- if getattr(Options, name, no_value) != orig_value:
- return "error in option " + name
- return ""
- class CmdLineParserTest(TestCase):
- def setUp(self):
- backup = {}
- for name, value in vars(Options).items():
- backup[name] = value
- self._options_backup = backup
- def tearDown(self):
- no_value = object()
- for name, orig_value in self._options_backup.items():
- if getattr(Options, name, no_value) != orig_value:
- setattr(Options, name, orig_value)
- def check_default_global_options(self, white_list=[]):
- self.assertEqual(check_global_options(self._options_backup, white_list), "")
- def check_default_options(self, options, white_list=[]):
- from ..Main import CompilationOptions, default_options
- default_options = CompilationOptions(default_options)
- no_value = object()
- for name in default_options.__dict__.keys():
- if name not in white_list:
- self.assertEqual(getattr(options, name, no_value), getattr(default_options, name), msg="error in option " + name)
- def test_short_options(self):
- options, sources = parse_command_line([
- '-V', '-l', '-+', '-t', '-v', '-v', '-v', '-p', '-D', '-a', '-3',
- ])
- self.assertFalse(sources)
- self.assertTrue(options.show_version)
- self.assertTrue(options.use_listing_file)
- self.assertTrue(options.cplus)
- self.assertTrue(options.timestamps)
- self.assertTrue(options.verbose >= 3)
- self.assertTrue(Options.embed_pos_in_docstring)
- self.assertFalse(Options.docstrings)
- self.assertTrue(Options.annotate)
- self.assertEqual(options.language_level, 3)
- options, sources = parse_command_line([
- '-f', '-2', 'source.pyx',
- ])
- self.assertTrue(sources)
- self.assertTrue(len(sources) == 1)
- self.assertFalse(options.timestamps)
- self.assertEqual(options.language_level, 2)
- def test_long_options(self):
- options, sources = parse_command_line([
- '--version', '--create-listing', '--cplus', '--embed', '--timestamps',
- '--verbose', '--verbose', '--verbose',
- '--embed-positions', '--no-docstrings', '--annotate', '--lenient',
- ])
- self.assertFalse(sources)
- self.assertTrue(options.show_version)
- self.assertTrue(options.use_listing_file)
- self.assertTrue(options.cplus)
- self.assertEqual(Options.embed, 'main')
- self.assertTrue(options.timestamps)
- self.assertTrue(options.verbose >= 3)
- self.assertTrue(Options.embed_pos_in_docstring)
- self.assertFalse(Options.docstrings)
- self.assertTrue(Options.annotate)
- self.assertFalse(Options.error_on_unknown_names)
- self.assertFalse(Options.error_on_uninitialized)
- options, sources = parse_command_line([
- '--force', 'source.pyx',
- ])
- self.assertTrue(sources)
- self.assertTrue(len(sources) == 1)
- self.assertFalse(options.timestamps)
- def test_options_with_values(self):
- options, sources = parse_command_line([
- '--embed=huhu',
- '-I/test/include/dir1', '--include-dir=/test/include/dir2',
- '--include-dir', '/test/include/dir3',
- '--working=/work/dir',
- 'source.pyx',
- '--output-file=/output/dir',
- '--pre-import=/pre/import',
- '--cleanup=3',
- '--annotate-coverage=cov.xml',
- '--gdb-outdir=/gdb/outdir',
- '--directive=wraparound=false',
- ])
- self.assertEqual(sources, ['source.pyx'])
- self.assertEqual(Options.embed, 'huhu')
- self.assertEqual(options.include_path, ['/test/include/dir1', '/test/include/dir2', '/test/include/dir3'])
- self.assertEqual(options.working_path, '/work/dir')
- self.assertEqual(options.output_file, '/output/dir')
- self.assertEqual(Options.pre_import, '/pre/import')
- self.assertEqual(Options.generate_cleanup_code, 3)
- self.assertTrue(Options.annotate)
- self.assertEqual(Options.annotate_coverage_xml, 'cov.xml')
- self.assertTrue(options.gdb_debug)
- self.assertEqual(options.output_dir, '/gdb/outdir')
- def test_module_name(self):
- options, sources = parse_command_line([
- 'source.pyx'
- ])
- self.assertEqual(options.module_name, None)
- self.check_default_global_options()
- self.check_default_options(options)
- options, sources = parse_command_line([
- '--module-name', 'foo.bar',
- 'source.pyx'
- ])
- self.assertEqual(options.module_name, 'foo.bar')
- self.check_default_global_options()
- self.check_default_options(options, ['module_name'])
- def test_errors(self):
- def error(args, regex=None):
- old_stderr = sys.stderr
- stderr = sys.stderr = StringIO()
- try:
- self.assertRaises(SystemExit, parse_command_line, list(args))
- finally:
- sys.stderr = old_stderr
- msg = stderr.getvalue().strip()
- self.assertTrue(msg)
- if regex:
- self.assertTrue(re.search(regex, msg),
- '"%s" does not match search "%s"' %
- (msg, regex))
- error(['-1'],
- 'Unknown compiler flag: -1')
- error(['-I'])
- error(['--version=-a'])
- error(['--version=--annotate=true'])
- error(['--working'])
- error(['--verbose=1'])
- error(['--cleanup'])
- error(['--debug-disposal-code-wrong-name', 'file3.pyx'],
- "Unknown debug flag: debug_disposal_code_wrong_name")
- error(['--module-name', 'foo.pyx'])
- error(['--module-name', 'foo.bar'])
- error(['--module-name', 'foo.bar', 'foo.pyx', 'bar.pyx'],
- "Only one source file allowed when using --module-name")
- error(['--module-name', 'foo.bar', '--timestamps', 'foo.pyx'],
- "Cannot use --module-name with --timestamps")
|