<NME> test_util.py
<BEF> """
    Test suite for the util module
    Test suite for the util module
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    :copyright: Copyright 2006-2013 by the Pygments team, see AUTHORS.
    :license: BSD, see LICENSE for details.
"""


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">')
        r = re.compile(util.unirange(0x10000, 0x20000))
        m = r.match(first_non_bmp)
        self.assertTrue(m)
        self.assertEquals(m.end(), len(first_non_bmp))
        self.assertFalse(r.match(u'\uffff'))
        self.assertFalse(r.match(u'xxx'))
        # Tests that end is inclusive
    d = {}
    exec(output, d)
        # build
        m = r.match(first_non_bmp * 2)
        self.assertTrue(m)
        self.assertEquals(m.end(), len(first_non_bmp) * 2)
    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']

<MSG> Merged in __russ__/pygments-main (pull request #165)

<DFF> @@ -3,7 +3,7 @@
     Test suite for the util module
     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-    :copyright: Copyright 2006-2013 by the Pygments team, see AUTHORS.
+    :copyright: Copyright 2006-2014 by the Pygments team, see AUTHORS.
     :license: BSD, see LICENSE for details.
 """
 
@@ -123,7 +123,7 @@ class UtilTest(unittest.TestCase):
         r = re.compile(util.unirange(0x10000, 0x20000))
         m = r.match(first_non_bmp)
         self.assertTrue(m)
-        self.assertEquals(m.end(), len(first_non_bmp))
+        self.assertEqual(m.end(), len(first_non_bmp))
         self.assertFalse(r.match(u'\uffff'))
         self.assertFalse(r.match(u'xxx'))
         # Tests that end is inclusive
@@ -132,4 +132,12 @@ class UtilTest(unittest.TestCase):
         # build
         m = r.match(first_non_bmp * 2)
         self.assertTrue(m)
-        self.assertEquals(m.end(), len(first_non_bmp) * 2)
+        self.assertEqual(m.end(), len(first_non_bmp) * 2)
+
+    def test_format_lines(self):
+        lst = ['cat', 'dog']
+        output = util.format_lines('var', lst)
+        d = {}
+        exec(output, d)
+        self.assertTrue(isinstance(d['var'], tuple))
+        self.assertEqual(('cat', 'dog'), d['var'])

{'addition_count': 11, 'commit_subject': 'Merged in __russ__/pygments-main (pull request #165)', 'deletion_count': 3, 'file_extension': '.py', 'lang': 'py', 'license': 'bsd-2-clause', 'repo_name': 'pygments/pygments'}