Source code for tests.tools_formatter_tests

#!/usr/bin/env python3
"""Tests for the ``pywikibot.tools.formatter`` module."""
#
# (C) Pywikibot team, 2015-2022
#
# Distributed under the terms of the MIT license.
#
from __future__ import annotations

import unittest
from contextlib import suppress

from pywikibot.tools import formatter
from tests.aspects import DeprecationTestCase, TestCase


[docs] class TestListOutputter(TestCase): """Test ListFormatter class.""" net = False
[docs] def test_SequenceOutputter(self): """Test format method.""" options = ['foo', 'bar'] outputter = formatter.SequenceOutputter(options) self.assertEqual(outputter.out, '\n 1 - foo\n 2 - bar\n') outputter.format_string = '({index} {width} {item})' self.assertEqual(outputter.out, '\n(1 1 foo)\n(2 1 bar)\n') outputter.format_string = '{item}' self.assertEqual(outputter.out, '\nfoo\nbar\n')
[docs] class TestColorFormat(DeprecationTestCase): """Test color_format function in bot module."""
[docs] class DummyUnicode: """Dummy class that __str__ returns a non-ASCII Unicode value.""" def __str__(self): """Return ä.""" return 'ä'
net = False
[docs] def assert_format(self, format_string, expected, *args, **kwargs): """Assert that color_format returns the expected string and type.""" result = formatter.color_format(format_string, *args, **kwargs) self.assertEqual(result, expected) self.assertIsInstance(result, type(expected)) self.assertOneDeprecation()
[docs] def test_no_colors(self): """Test without colors in template string.""" self.assert_format('', '') self.assert_format('42', '42') self.assert_format('{0}', '42', 42) self.assert_format('before {0} after', 'before 42 after', 42) self.assert_format('{ans}', '42', ans=42)
[docs] def test_colors(self): """Test with colors in template string.""" self.assert_format('{0}{black}', '42<<black>>', 42) self.assert_format('{ans}{black}', '42<<black>>', ans=42) with self.assertRaisesRegex(ValueError, r'.*conversion.*'): formatter.color_format('{0}{black!r}', 42) with self.assertRaisesRegex(ValueError, r'.*format spec.*'): formatter.color_format('{0}{black:03}', 42)
[docs] def test_marker(self): r"""Test that the \03 marker is only allowed in front of colors.""" self.assert_format('{0}\03{black}', '42<<black>>', 42) # literal before a normal field with self.assertRaisesRegex(ValueError, r'.*\\03'): formatter.color_format('\03{0}{black}', 42) # literal before a color field with self.assertRaisesRegex(ValueError, r'.*\\03'): formatter.color_format('{0}\03before{black}', 42)
[docs] def test_color_kwargs(self): """Test with a color as keyword argument.""" with self.assertRaises(ValueError): formatter.color_format('{aqua}{black}', aqua=42)
[docs] def test_non_ascii(self): """Test non-ASCII replacements.""" self.assert_format('{0}', 'ä', 'ä') self.assert_format('{black}{0}', '<<black>>ä', 'ä') self.assert_format('{0}', 'ä', self.DummyUnicode()) self.assert_format('{black}{0}', '<<black>>ä', self.DummyUnicode())
[docs] def test_bytes_format(self): """Test that using `bytes` is not allowed.""" with self.assertRaises(TypeError): formatter.color_format(b'{0}', 'a') with self.assertRaises(TypeError): formatter.color_format(b'{black}{0}', 'a')
[docs] def test_variant_colors(self): """Test variant colors with {color} parameter.""" self.assert_format('{0}{color}', '42<<black>>', 42, color='black') self.assert_format('{ans}{color}', '42<<black>>', ans=42, color='black') self.assert_format('{color}', '42', color=42)
if __name__ == '__main__': with suppress(SystemExit): unittest.main()