1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189
|
"""
Test suite for the util module
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
:copyright: Copyright 2006-2022 by the Pygments team, see AUTHORS.
:license: BSD, see LICENSE for details.
"""
from pytest import raises
from pygments import util, console
class FakeLexer:
def analyse(text):
return text
analyse = util.make_analysator(analyse)
def test_getoptions():
assert util.get_bool_opt({}, 'a', True) is True
assert util.get_bool_opt({}, 'a', 1) is True
assert util.get_bool_opt({}, 'a', 'true') is True
assert util.get_bool_opt({}, 'a', 'no') is False
assert raises(util.OptionError, util.get_bool_opt, {}, 'a', [])
assert raises(util.OptionError, util.get_bool_opt, {}, 'a', 'foo')
assert util.get_int_opt({}, 'a', 1) == 1
assert raises(util.OptionError, util.get_int_opt, {}, 'a', [])
assert raises(util.OptionError, util.get_int_opt, {}, 'a', 'bar')
assert util.get_list_opt({}, 'a', [1]) == [1]
assert util.get_list_opt({}, 'a', '1 2') == ['1', '2']
assert raises(util.OptionError, util.get_list_opt, {}, 'a', 1)
assert util.get_choice_opt({}, 'a', ['foo', 'bar'], 'bar') == 'bar'
assert util.get_choice_opt({}, 'a', ['foo', 'bar'], 'Bar', True) == 'bar'
assert raises(util.OptionError, util.get_choice_opt, {}, 'a',
['foo', 'bar'], 'baz')
def test_docstring_headline():
def f1():
"""
docstring headline
other text
"""
def f2():
"""
docstring
headline
other text
"""
def f3():
pass
assert util.docstring_headline(f1) == 'docstring headline'
assert util.docstring_headline(f2) == 'docstring headline'
assert util.docstring_headline(f3) == ''
def test_analysator_returns_float():
# If an analysator wrapped by make_analysator returns a floating point
# number, then that number will be returned by the wrapper.
assert FakeLexer.analyse('0.5') == 0.5
def test_analysator_returns_boolean():
# If an analysator wrapped by make_analysator returns a boolean value,
# then the wrapper will return 1.0 if the boolean was True or 0.0 if
# it was False.
assert FakeLexer.analyse(True) == 1.0
assert FakeLexer.analyse(False) == 0.0
def test_analysator_raises_exception():
# If an analysator wrapped by make_analysator raises an exception,
# then the wrapper will return 0.0.
class ErrorLexer:
def analyse(text):
raise RuntimeError('something bad happened')
analyse = util.make_analysator(analyse)
assert ErrorLexer.analyse('') == 0.0
def test_analysator_value_error():
# When converting the analysator's return value to a float a
# ValueError may occur. If that happens 0.0 is returned instead.
assert FakeLexer.analyse('bad input') == 0.0
def test_analysator_type_error():
# When converting the analysator's return value to a float a
# TypeError may occur. If that happens 0.0 is returned instead.
assert FakeLexer.analyse('xxx') == 0.0
def test_shebang_matches():
assert util.shebang_matches('#!/usr/bin/env python\n', r'python(2\.\d)?')
assert util.shebang_matches('#!/usr/bin/python2.4', r'python(2\.\d)?')
assert util.shebang_matches('#!/usr/bin/startsomethingwith python',
r'python(2\.\d)?')
assert util.shebang_matches('#!C:\\Python2.4\\Python.exe', r'python(2\.\d)?')
assert not util.shebang_matches('#!/usr/bin/python-ruby', r'python(2\.\d)?')
assert not util.shebang_matches('#!/usr/bin/python/ruby', r'python(2\.\d)?')
assert not util.shebang_matches('#!', r'python')
def test_doctype_matches():
assert util.doctype_matches('<!DOCTYPE html> <html>', 'html.*')
assert not util.doctype_matches(
'<?xml ?> <DOCTYPE html PUBLIC "a"> <html>', 'html.*')
assert util.html_doctype_matches(
'<?xml ?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN">')
def test_xml():
assert util.looks_like_xml(
'<?xml ?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN">')
assert util.looks_like_xml('<html xmlns>abc</html>')
assert not util.looks_like_xml('<html>')
def test_format_lines():
lst = ['cat', 'dog']
output = util.format_lines('var', lst)
d = {}
exec(output, d)
assert isinstance(d['var'], tuple)
assert ('cat', 'dog') == d['var']
def test_duplicates_removed_seq_types():
# tuple
x = util.duplicates_removed(('a', 'a', 'b'))
assert ['a', 'b'] == x
# list
x = util.duplicates_removed(['a', 'a', 'b'])
assert ['a', 'b'] == x
# iterator
x = util.duplicates_removed(iter(('a', 'a', 'b')))
assert ['a', 'b'] == x
def test_duplicates_removed_nonconsecutive():
# keeps first
x = util.duplicates_removed(('a', 'b', 'a'))
assert ['a', 'b'] == x
def test_guess_decode():
# UTF-8 should be decoded as UTF-8
s = util.guess_decode('\xff'.encode())
assert s == ('\xff', 'utf-8')
# otherwise, it could be latin1 or the locale encoding...
import locale
s = util.guess_decode(b'\xff')
assert s[1] in ('latin1', locale.getpreferredencoding())
def test_guess_decode_from_terminal():
class Term:
encoding = 'utf-7'
s = util.guess_decode_from_terminal('\xff'.encode('utf-7'), Term)
assert s == ('\xff', 'utf-7')
s = util.guess_decode_from_terminal('\xff'.encode(), Term)
assert s == ('\xff', 'utf-8')
def test_console_ansiformat():
f = console.ansiformat
c = console.codes
all_attrs = f('+*_blue_*+', 'text')
assert c['blue'] in all_attrs and c['blink'] in all_attrs
assert c['bold'] in all_attrs and c['underline'] in all_attrs
assert c['reset'] in all_attrs
assert raises(KeyError, f, '*mauve*', 'text')
def test_console_functions():
assert console.reset_color() == console.codes['reset']
assert console.colorize('blue', 'text') == \
console.codes['blue'] + 'text' + console.codes['reset']
|