weechat-matrix/tests/color_test.py
Denis Kasak 42f34f749b Handle combination of strikethrough and other attributes.
Strikethrough has to be done first, before handling any other attribute,
because otherwise it doesn't render correctly.

The following changes were made:

1. When striking due to redaction, we simply strip all the other
   attributes and then do the strikethrough, because this is the only
   practical option.
2. When rendering rich text received from the server, we ensure we
   handle strikethrough first, before any other attribute.
2018-03-23 09:51:58 +01:00

44 lines
1.4 KiB
Python

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import webcolors
from collections import OrderedDict
from hypothesis import given
from hypothesis.strategies import sampled_from
from matrix.colors import (Formatted, FormattedString,
color_html_to_weechat, color_weechat_to_html)
html_prism = ("<font color=maroon>T</font><font color=red>e</font><font "
"color=olive>s</font><font color=yellow>t</font>")
weechat_prism = (
u"\x1b[038;5;1mT\x1b[039m\x1b[038;5;9me\x1b[039m\x1b[038;5;3ms\x1b[039m\x1b[038;5;11mt\x1b[039m"
)
first_16_html_colors = list(webcolors.HTML4_HEX_TO_NAMES.values())
def test_prism():
formatted = Formatted.from_html(html_prism)
assert formatted.to_weechat() == weechat_prism
@given(sampled_from(first_16_html_colors))
def test_color_conversion(color_name):
hex_color = color_weechat_to_html(color_html_to_weechat(color_name))
new_color_name = webcolors.hex_to_name(hex_color, spec='html4')
assert new_color_name == color_name
def test_handle_strikethrough_first():
valid_result = '\x1b[038;5;1mf̶o̶o̶\x1b[039m'
d1 = OrderedDict([('fgcolor', 'red'), ('strikethrough', True)])
d2 = OrderedDict([('strikethrough', True), ('fgcolor', 'red'), ])
f1 = Formatted([FormattedString('foo', d1)])
f2 = Formatted([FormattedString('foo', d2)])
assert f1.to_weechat() == valid_result
assert f2.to_weechat() == valid_result