def test_runner_config(): """ pytest testing/test_runner.py::test_runner_config -s """ from xdoctest import runner source = utils.codeblock(''' def foo(): """ Example: >>> print('i wanna see this') """ ''') config = { 'default_runtime_state': { 'SKIP': True }, } with utils.TempDir() as temp: dpath = temp.dpath modpath = join(dpath, 'test_example_run.py') with open(modpath, 'w') as file: file.write(source) with utils.CaptureStdout() as cap: runner.doctest_module(modpath, 'foo', argv=[''], config=config) assert 'SKIPPED' in cap.text
def _run_case(source): from xdoctest import utils COLOR = 'yellow' def cprint(msg, color=COLOR): print(utils.color_text(str(msg), COLOR)) cprint('\n\n' '\n <RUN CASE> ' '\n ======== ' '\n', COLOR) cprint('DOCTEST SOURCE:') cprint('---------------') print( utils.indent( utils.add_line_numbers(utils.highlight_code(source, 'python')))) print('') import hashlib hasher = hashlib.sha1() hasher.update(source.encode('utf8')) hashid = hasher.hexdigest()[0:8] with utils.TempDir() as temp: dpath = temp.dpath modpath = join(dpath, 'test_linenos_' + hashid + '.py') with open(modpath, 'w') as file: file.write(source) with utils.CaptureStdout(supress=False) as cap: runner.doctest_module(modpath, 'all', argv=['']) cprint('\n\n --- </END RUN CASE> --- \n\n', COLOR) return cap.text
def test_global_exec(): """ pytest testing/test_runner.py::test_global_exec -s """ from xdoctest import runner source = utils.codeblock( ''' def foo(): """ Example: >>> print(a) """ ''') config = { 'global_exec': 'a=1', } with utils.TempDir() as temp: dpath = temp.dpath modpath = join(dpath, 'test_example_run.py') with open(modpath, 'w') as file: file.write(source) with utils.CaptureStdout() as cap: runner.doctest_module(modpath, 'foo', argv=[''], config=config) assert '1 passed' in cap.text
def test_run_binary_doctests(): """ Tests that we can run doctests in a compiled pybind11 module CommandLine: python ~/code/xdoctest/testing/test_binary_ext.py test_run_binary_doctests Notes: xdoctest -m $HOME/code/xdoctest/testing/pybind11_test/install/my_ext.cpython-38-x86_64-linux-gnu.so list --analysis=dynamic """ extmod_fpath = build_demo_extmod() print('extmod_fpath = {!r}'.format(extmod_fpath)) from xdoctest import runner # results = runner.doctest_module(extmod_fpath, analysis='auto') results = runner.doctest_module(extmod_fpath, analysis='dynamic', command='list', argv=[], verbose=3) print('results = {!r}'.format(results)) results = runner.doctest_module(extmod_fpath, analysis='dynamic', command='all', argv=[], verbose=3) print('results = {!r}'.format(results)) assert results['n_passed'] == 1
def test_run_zero_arg(): """ pytest testing/test_runner.py::test_run_zero_arg -s """ from xdoctest import runner source = utils.codeblock( ''' def zero_arg_print(): print('running zero arg') ''') with utils.TempDir() as temp: dpath = temp.dpath modpath = join(dpath, 'test_run_zero_arg.py') with open(modpath, 'w') as file: file.write(source) # disabled tests dont run in "all" mode with utils.CaptureStdout() as cap: try: runner.doctest_module(modpath, 'all', argv=[''], verbose=3) except Exception: pass assert 'running zero arg' not in cap.text with utils.CaptureStdout() as cap: try: runner.doctest_module(modpath, 'zero_arg_print', argv=[''], verbose=3) except Exception: pass # print(cap.text) assert 'running zero arg' in cap.text
def test_runner_syntax_error(): """ python testing/test_errors.py test_runner_syntax_error """ source = utils.codeblock( ''' def test_parsetime_syntax_error1(): """ Example: >>> from __future__ import print_function >>> print 'Parse-Time Syntax Error' """ def test_parsetime_syntax_error2(): """ Example: >>> def bad_syntax() return for """ def test_runtime_error(): """ Example: >>> print('Runtime Error {}'.format(5 / 0)) """ def test_runtime_name_error(): """ Example: >>> print('Name Error {}'.format(foo)) """ def test_runtime_warning(): """ Example: >>> import warnings >>> warnings.warn('in-code warning') """ ''') temp = utils.TempDir(persist=True) temp.ensure() dpath = temp.dpath modpath = join(dpath, 'test_runner_syntax_error.py') open(modpath, 'w').write(source) with utils.CaptureStdout() as cap: runner.doctest_module(modpath, 'all', argv=[''], style='freeform', verbose=0) print(utils.indent(cap.text)) assert '1 run-time warnings' in cap.text assert '2 parse-time warnings' in cap.text # Assert summary line assert '3 warnings' in cap.text assert '2 failed' in cap.text assert '1 passed' in cap.text
def test_list(): from xdoctest import runner source = utils.codeblock( ''' # --- HELPERS --- def real_test1(a=1): """ Example: >>> pass """ pass def fake_test1(a=1): pass def real_test2(): """ Example: >>> pass """ pass def fake_test2(): pass ''') with utils.TempDir() as temp: dpath = temp.dpath modpath = join(dpath, 'test_list.py') with open(modpath, 'w') as file: file.write(source) with utils.CaptureStdout() as cap: runner.doctest_module(modpath, 'list', argv=['']) assert 'real_test1' in cap.text assert 'real_test2' in cap.text assert 'fake_test1' not in cap.text assert 'fake_test2' not in cap.text # test command=None with utils.CaptureStdout() as cap: runner.doctest_module(modpath, None, argv=['']) assert 'real_test1' in cap.text assert 'real_test2' in cap.text assert 'fake_test1' not in cap.text assert 'fake_test2' not in cap.text
def test_hack_the_sys_argv(): """ Tests hacky solution to issue #76 pytest testing/test_runner.py::test_global_exec -s References: https://github.com/Erotemic/xdoctest/issues/76 """ from xdoctest import runner source = utils.codeblock( ''' def foo(): """ Example: >>> # xdoctest: +REQUIRES(--hackedflag) >>> print('This will run if global_exec specified') """ ''') import sys NEEDS_FIX = '--hackedflag' not in sys.argv config = { 'global_exec': 'import sys; sys.argv.append("--hackedflag")' } with utils.TempDir() as temp: dpath = temp.dpath modpath = join(dpath, 'test_example_run.py') with open(modpath, 'w') as file: file.write(source) with utils.CaptureStdout() as cap: runner.doctest_module(modpath, 'foo', argv=[''], config=config) if NEEDS_FIX: # Fix the global state sys.argv.remove('--hackedflag') # print(cap.text) assert '1 passed' in cap.text
def _run_case(source, style='auto'): """ Runs all doctests in a source block Args: source (str): source code of an entire file TODO: run case is over-duplicated and should be separated into a test utils directory """ from xdoctest import utils from xdoctest import runner COLOR = 'yellow' def cprint(msg, color=COLOR): print(utils.color_text(str(msg), COLOR)) cprint('\n\n' '\n <RUN CASE> ' '\n ======== ' '\n', COLOR) cprint('CASE SOURCE:') cprint('------------') print(utils.indent( utils.add_line_numbers(utils.highlight_code(source, 'python')))) print('') import hashlib hasher = hashlib.sha1() hasher.update(source.encode('utf8')) hashid = hasher.hexdigest()[0:8] with utils.TempDir() as temp: dpath = temp.dpath modpath = join(dpath, 'test_linenos_' + hashid + '.py') with open(modpath, 'w') as file: file.write(source) with utils.CaptureStdout(supress=False) as cap: runner.doctest_module(modpath, 'all', argv=[''], style=style) cprint('\n\n --- </END RUN CASE> --- \n\n', COLOR) return cap.text
def test_all_disabled(): """ pytest testing/test_runner.py::test_all_disabled -s -vv python testing/test_runner.py test_all_disabled """ from xdoctest import runner source = utils.codeblock( ''' def foo(): """ Example: >>> # DISABLE_DOCTEST >>> print('all will' + ' not print this') """ def bar(): """ Example: >>> print('all will' + ' print this') """ ''') with utils.TempDir() as temp: dpath = temp.dpath modpath = join(dpath, 'test_all_disabled.py') with open(modpath, 'w') as file: file.write(source) # disabled tests dont run in "all" mode with utils.CaptureStdout() as cap: runner.doctest_module(modpath, 'all', argv=['']) assert 'all will print this' in cap.text # print(' ' + cap.text.replace('\n', '\n ')) assert 'all will not print this' not in cap.text # Running an disabled example explicitly should work with utils.CaptureStdout() as cap: runner.doctest_module(modpath, 'foo', argv=['']) # print(' ' + cap.text.replace('\n', '\n ')) assert 'all will not print this' in cap.text
def test_example_run(): from xdoctest import runner source = utils.codeblock(''' def foo(): """ Example: >>> print('i wanna see this') """ ''') with utils.TempDir() as temp: dpath = temp.dpath modpath = join(dpath, 'test_example_run.py') with open(modpath, 'w') as file: file.write(source) with utils.CaptureStdout() as cap: runner.doctest_module(modpath, 'foo', argv=['']) assert 'i wanna see this' in cap.text
def test_runner_failures(): """ python testing/test_runner.py test_runner_failures pytest testing/test_runner.py::test_runner_failures -s pytest testing/test_runner.py::test_all_disabled -s """ from xdoctest import runner source = utils.codeblock(''' def test1(): """ Example: >>> pass """ def test2(): """ Example: >>> assert False, 'test 2.1' Example: >>> assert False, 'test 2.2' """ def test3(): """ Example: >>> pass Example: >>> pass """ def test4(): """ Example: >>> assert False, 'test 3' """ ''') temp = utils.TempDir() temp.ensure() # with utils.TempDir() as temp: dpath = temp.dpath modpath = join(dpath, 'test_runner_failures.py') with open(modpath, 'w') as file: file.write(source) # disabled tests dont run in "all" mode with utils.CaptureStdout(supress=True) as cap: try: runner.doctest_module(modpath, 'all', argv=[''], verbose=1) except Exception: pass print('\nNOTE: the following output is part of a test') print(utils.indent(cap.text, '... ')) print('NOTE: above output is part of a test') # assert '.FFF' in cap.text assert '3 / 6 passed' in cap.text assert '3 failed 3 passed' in cap.text
def test_runner_syntax_error(): """ python testing/test_errors.py test_runner_syntax_error xdoctest -m testing/test_errors.py test_runner_syntax_error """ source = utils.codeblock(r''' def demo_parsetime_syntax_error1(): """ Example: >>> from __future__ import print_function >>> print 'Parse-Time Syntax Error' """ def demo_parsetime_syntax_error2(): """ Example: >>> def bad_syntax() return for """ def demo_runtime_error(): """ Example: >>> print('Runtime Error {}'.format(5 / 0)) """ def demo_runtime_name_error(): """ Example: >>> print('Name Error {}'.format(foo)) """ def demo_runtime_warning(): """ Example: >>> import warnings >>> warnings.warn('in-code warning') """ ''') temp = utils.TempDir(persist=True) temp.ensure() dpath = temp.dpath modpath = join(dpath, 'demo_runner_syntax_error.py') with open(modpath, 'w') as file: file.write(source) with utils.CaptureStdout() as cap: runner.doctest_module(modpath, 'all', argv=[''], style='freeform', verbose=1) print('CAPTURED [[[[[[[[') print(utils.indent(cap.text)) print(']]]]]]]] # CAPTURED') if six.PY2: captext = utils.ensure_unicode(cap.text) else: captext = cap.text if True or not six.PY2: # Why does this have issues on the dashboards? assert '1 run-time warnings' in captext assert '2 parse-time warnings' in captext # Assert summary line assert '3 warnings' in captext assert '2 failed' in captext assert '1 passed' in captext