This repository has been archived on 2024-06-20. You can view files and clone it, but you cannot make any changes to it's state, such as pushing and creating new issues, pull requests or comments.
coffee.pygments/tests/test_util.py
2023-03-29 21:11:12 +02:00

189 lines
5.9 KiB
Python

"""
Test suite for the util module
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
:copyright: Copyright 2006-2023 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']