from __future__ import annotations from prompt_toolkit.styles import Attrs, Style, SwapLightAndDarkStyleTransformation def test_style_from_dict(): style = Style.from_dict( { "a": "#ff0000 bold underline strike italic", "b": "bg:#00ff00 blink reverse", } ) # Lookup of class:a. expected = Attrs( color="ff0000", bgcolor="", bold=True, underline=True, strike=True, italic=True, blink=False, reverse=False, hidden=False, ) assert style.get_attrs_for_style_str("class:a") == expected # Lookup of class:b. expected = Attrs( color="", bgcolor="00ff00", bold=False, underline=False, strike=False, italic=False, blink=True, reverse=True, hidden=False, ) assert style.get_attrs_for_style_str("class:b") == expected # Test inline style. expected = Attrs( color="ff0000", bgcolor="", bold=False, underline=False, strike=False, italic=False, blink=False, reverse=False, hidden=False, ) assert style.get_attrs_for_style_str("#ff0000") == expected # Combine class name and inline style (Whatever is defined later gets priority.) expected = Attrs( color="00ff00", bgcolor="", bold=True, underline=True, strike=True, italic=True, blink=False, reverse=False, hidden=False, ) assert style.get_attrs_for_style_str("class:a #00ff00") == expected expected = Attrs( color="ff0000", bgcolor="", bold=True, underline=True, strike=True, italic=True, blink=False, reverse=False, hidden=False, ) assert style.get_attrs_for_style_str("#00ff00 class:a") == expected def test_class_combinations_1(): # In this case, our style has both class 'a' and 'b'. # Given that the style for 'a b' is defined at the end, that one is used. style = Style( [ ("a", "#0000ff"), ("b", "#00ff00"), ("a b", "#ff0000"), ] ) expected = Attrs( color="ff0000", bgcolor="", bold=False, underline=False, strike=False, italic=False, blink=False, reverse=False, hidden=False, ) assert style.get_attrs_for_style_str("class:a class:b") == expected assert style.get_attrs_for_style_str("class:a,b") == expected assert style.get_attrs_for_style_str("class:a,b,c") == expected # Changing the order shouldn't matter. assert style.get_attrs_for_style_str("class:b class:a") == expected assert style.get_attrs_for_style_str("class:b,a") == expected def test_class_combinations_2(): # In this case, our style has both class 'a' and 'b'. # The style that is defined the latest get priority. style = Style( [ ("a b", "#ff0000"), ("b", "#00ff00"), ("a", "#0000ff"), ] ) expected = Attrs( color="00ff00", bgcolor="", bold=False, underline=False, strike=False, italic=False, blink=False, reverse=False, hidden=False, ) assert style.get_attrs_for_style_str("class:a class:b") == expected assert style.get_attrs_for_style_str("class:a,b") == expected assert style.get_attrs_for_style_str("class:a,b,c") == expected # Defining 'a' latest should give priority to 'a'. expected = Attrs( color="0000ff", bgcolor="", bold=False, underline=False, strike=False, italic=False, blink=False, reverse=False, hidden=False, ) assert style.get_attrs_for_style_str("class:b class:a") == expected assert style.get_attrs_for_style_str("class:b,a") == expected def test_substyles(): style = Style( [ ("a.b", "#ff0000 bold"), ("a", "#0000ff"), ("b", "#00ff00"), ("b.c", "#0000ff italic"), ] ) # Starting with a.* expected = Attrs( color="0000ff", bgcolor="", bold=False, underline=False, strike=False, italic=False, blink=False, reverse=False, hidden=False, ) assert style.get_attrs_for_style_str("class:a") == expected expected = Attrs( color="ff0000", bgcolor="", bold=True, underline=False, strike=False, italic=False, blink=False, reverse=False, hidden=False, ) assert style.get_attrs_for_style_str("class:a.b") == expected assert style.get_attrs_for_style_str("class:a.b.c") == expected # Starting with b.* expected = Attrs( color="00ff00", bgcolor="", bold=False, underline=False, strike=False, italic=False, blink=False, reverse=False, hidden=False, ) assert style.get_attrs_for_style_str("class:b") == expected assert style.get_attrs_for_style_str("class:b.a") == expected expected = Attrs( color="0000ff", bgcolor="", bold=False, underline=False, strike=False, italic=True, blink=False, reverse=False, hidden=False, ) assert style.get_attrs_for_style_str("class:b.c") == expected assert style.get_attrs_for_style_str("class:b.c.d") == expected def test_swap_light_and_dark_style_transformation(): transformation = SwapLightAndDarkStyleTransformation() # Test with 6 digit hex colors. before = Attrs( color="440000", bgcolor="888844", bold=True, underline=True, strike=True, italic=True, blink=False, reverse=False, hidden=False, ) after = Attrs( color="ffbbbb", bgcolor="bbbb76", bold=True, underline=True, strike=True, italic=True, blink=False, reverse=False, hidden=False, ) assert transformation.transform_attrs(before) == after # Test with ANSI colors. before = Attrs( color="ansired", bgcolor="ansiblack", bold=True, underline=True, strike=True, italic=True, blink=False, reverse=False, hidden=False, ) after = Attrs( color="ansibrightred", bgcolor="ansiwhite", bold=True, underline=True, strike=True, italic=True, blink=False, reverse=False, hidden=False, ) assert transformation.transform_attrs(before) == after