import pytest from rich.segment import Segment from rich.style import Style from textual._segment_tools import NoCellPositionForIndex from textual.filter import Monochrome from textual.strip import Strip def test_cell_length() -> None: strip = Strip([Segment("foo"), Segment("πŸ’©"), Segment("bar")]) assert strip._cell_length is None assert strip.cell_length == 8 assert strip._cell_length == 8 def test_repr() -> None: strip = Strip([Segment("foo")]) assert repr(strip) == "Strip([Segment('foo')], 3)" def test_join() -> None: strip1 = Strip([Segment("foo")]) strip2 = Strip([Segment("bar")]) strip = Strip.join([strip1, strip2]) assert len(strip) == 2 assert strip.cell_length == 6 assert list(strip) == [Segment("foo"), Segment("bar")] def test_bool() -> None: assert not Strip([]) assert Strip([Segment("foo")]) def test_iter() -> None: assert list(Strip([])) == [] assert list(Strip([Segment("foo")])) == [Segment("foo")] assert list(Strip([Segment("foo"), Segment("bar")])) == [ Segment("foo"), Segment("bar"), ] def test_len(): assert len(Strip([])) == 0 assert len(Strip([Segment("foo")])) == 1 assert len(Strip([Segment("foo"), Segment("bar")])) == 2 def test_reversed(): assert list(reversed(Strip([]))) == [] assert list(reversed(Strip([Segment("foo")]))) == [Segment("foo")] assert list(reversed(Strip([Segment("foo"), Segment("bar")]))) == [ Segment("bar"), Segment("foo"), ] def test_eq(): assert Strip([]) == Strip([]) assert Strip([Segment("foo")]) == Strip([Segment("foo")]) assert Strip([Segment("foo")]) != Strip([Segment("bar")]) def test_adjust_cell_length(): for repeat in range(3): assert Strip([]).adjust_cell_length(3) == Strip([Segment(" ")]) assert Strip([Segment("f")]).adjust_cell_length(3) == Strip( [Segment("f"), Segment(" ")] ) assert Strip([Segment("πŸ’©")]).adjust_cell_length(3) == Strip( [Segment("πŸ’©"), Segment(" ")] ) assert Strip([Segment("πŸ’©πŸ’©")]).adjust_cell_length(3) == Strip([Segment("πŸ’© ")]) assert Strip([Segment("πŸ’©πŸ’©")]).adjust_cell_length(4) == Strip([Segment("πŸ’©πŸ’©")]) assert Strip([Segment("πŸ’©"), Segment("πŸ’©πŸ’©")]).adjust_cell_length(2) == Strip( [Segment("πŸ’©")] ) assert Strip([Segment("πŸ’©"), Segment("πŸ’©πŸ’©")]).adjust_cell_length(4) == Strip( [Segment("πŸ’©"), Segment("πŸ’©")] ) def test_extend_cell_length(): strip = Strip([Segment("foo"), Segment("bar")]) assert strip.extend_cell_length(3).text == "foobar" assert strip.extend_cell_length(6).text == "foobar" assert strip.extend_cell_length(7).text == "foobar " assert strip.extend_cell_length(9).text == "foobar " def test_simplify(): assert Strip([Segment("foo"), Segment("bar")]).simplify() == Strip( [Segment("foobar")] ) def test_apply_filter(): strip = Strip([Segment("foo", Style.parse("red"))]) expected = Strip([Segment("foo", Style.parse("#1b1b1b"))]) print(repr(strip)) print(repr(expected)) assert strip.apply_filter(Monochrome()) == expected def test_style_links(): link_style = Style.on(click="clicked") strip = Strip( [ Segment("foo"), Segment("bar", link_style), Segment("baz"), ] ) hover_style = Style(underline=True) new_strip = strip.style_links(link_style._link_id, hover_style) expected = Strip( [ Segment("foo"), Segment("bar", link_style + hover_style), Segment("baz"), ] ) assert new_strip == expected def test_crop(): for repeat in range(3): assert Strip([Segment("foo")]).crop(0, 3) == Strip([Segment("foo")]) assert Strip([Segment("foo")]).crop(0, 2) == Strip([Segment("fo")]) assert Strip([Segment("foo")]).crop(0, 1) == Strip([Segment("f")]) assert Strip([Segment("foo")]).crop(1, 3) == Strip([Segment("oo")]) assert Strip([Segment("foo")]).crop(1, 2) == Strip([Segment("o")]) assert Strip([Segment("foo")]).crop(1, 1) == Strip([Segment("")]) assert Strip([Segment("fooπŸ’©"), Segment("bπŸ’©ar"), Segment("baπŸ’©z")]).crop( 1, 6 ) == Strip([Segment("ooπŸ’©"), Segment("b")]) def test_divide(): for repeat in range(3): assert Strip([Segment("foo")]).divide([1, 2]) == [ Strip([Segment("f")]), Strip([Segment("o")]), ] @pytest.mark.parametrize( "index,cell_position", [ (0, 0), (1, 1), (2, 2), (3, 3), (4, 4), (5, 6), (6, 8), (7, 10), (8, 11), (9, 12), (10, 13), (11, 14), ], ) def test_index_to_cell_position(index, cell_position): strip = Strip([Segment("ab"), Segment("cdζ—₯本θͺžef"), Segment("gh")]) assert cell_position == strip.index_to_cell_position(index) def test_index_cell_position_no_segments(): strip = Strip([]) with pytest.raises(NoCellPositionForIndex): strip.index_to_cell_position(2) def test_index_cell_position_index_too_large(): strip = Strip([Segment("abcdef"), Segment("ghi")]) with pytest.raises(NoCellPositionForIndex): strip.index_to_cell_position(100) def test_text(): assert Strip([]).text == "" assert Strip([Segment("foo")]).text == "foo" assert Strip([Segment("foo"), Segment("bar")]).text == "foobar"