2020-04-13 11:24:21 +00:00
|
|
|
import pytest
|
|
|
|
|
2020-08-01 20:23:51 +00:00
|
|
|
from rich.markup import escape, MarkupError, _parse, render, Tag, RE_TAGS
|
2020-04-13 11:24:21 +00:00
|
|
|
from rich.text import Span
|
|
|
|
|
|
|
|
|
2020-08-01 20:23:51 +00:00
|
|
|
def test_re_no_match():
|
|
|
|
assert RE_TAGS.match("[True]") == None
|
|
|
|
assert RE_TAGS.match("[False]") == None
|
|
|
|
assert RE_TAGS.match("[None]") == None
|
|
|
|
assert RE_TAGS.match("[1]") == None
|
|
|
|
assert RE_TAGS.match("[2]") == None
|
|
|
|
assert RE_TAGS.match("[]") == None
|
|
|
|
|
|
|
|
|
|
|
|
def test_re_match():
|
|
|
|
assert RE_TAGS.match("[true]")
|
|
|
|
assert RE_TAGS.match("[false]")
|
|
|
|
assert RE_TAGS.match("[none]")
|
|
|
|
assert RE_TAGS.match("[color(1)]")
|
|
|
|
assert RE_TAGS.match("[#ff00ff]")
|
|
|
|
assert RE_TAGS.match("[/]")
|
|
|
|
|
|
|
|
|
2020-05-08 12:36:12 +00:00
|
|
|
def test_escape():
|
2020-08-05 13:08:38 +00:00
|
|
|
assert escape("foo[bar]") == r"foo\[bar]"
|
2020-05-08 12:36:12 +00:00
|
|
|
|
|
|
|
|
2020-04-13 11:24:21 +00:00
|
|
|
def test_parse():
|
2020-08-05 13:08:38 +00:00
|
|
|
result = list(_parse(r"[foo]hello[/foo][bar]world[/]\[escaped]"))
|
2020-04-13 11:24:21 +00:00
|
|
|
expected = [
|
2020-05-10 11:22:22 +00:00
|
|
|
(0, None, Tag(name="foo", parameters=None)),
|
|
|
|
(10, "hello", None),
|
|
|
|
(10, None, Tag(name="/foo", parameters=None)),
|
|
|
|
(16, None, Tag(name="bar", parameters=None)),
|
|
|
|
(26, "world", None),
|
|
|
|
(26, None, Tag(name="/", parameters=None)),
|
2021-01-05 21:23:13 +00:00
|
|
|
(29, "[escaped]", None),
|
2020-05-10 11:22:22 +00:00
|
|
|
]
|
2021-01-05 21:23:13 +00:00
|
|
|
print(repr(result))
|
2020-05-10 11:22:22 +00:00
|
|
|
assert result == expected
|
|
|
|
|
|
|
|
|
|
|
|
def test_parse_link():
|
|
|
|
result = list(_parse("[link=foo]bar[/link]"))
|
|
|
|
expected = [
|
|
|
|
(0, None, Tag(name="link", parameters="foo")),
|
|
|
|
(13, "bar", None),
|
|
|
|
(13, None, Tag(name="/link", parameters=None)),
|
2020-04-13 11:24:21 +00:00
|
|
|
]
|
|
|
|
assert result == expected
|
|
|
|
|
|
|
|
|
|
|
|
def test_render():
|
|
|
|
result = render("[bold]FOO[/bold]")
|
|
|
|
assert str(result) == "FOO"
|
|
|
|
assert result.spans == [Span(0, 3, "bold")]
|
|
|
|
|
|
|
|
|
2020-08-01 16:45:40 +00:00
|
|
|
def test_render_not_tags():
|
2020-08-02 10:55:40 +00:00
|
|
|
result = render('[[1], [1,2,3,4], ["hello"], [None], [False], [True]] []')
|
|
|
|
assert str(result) == '[[1], [1,2,3,4], ["hello"], [None], [False], [True]] []'
|
2020-08-01 16:45:40 +00:00
|
|
|
assert result.spans == []
|
|
|
|
|
|
|
|
|
2020-05-10 11:22:22 +00:00
|
|
|
def test_render_link():
|
|
|
|
result = render("[link=foo]FOO[/link]")
|
|
|
|
assert str(result) == "FOO"
|
|
|
|
assert result.spans == [Span(0, 3, "link foo")]
|
|
|
|
|
|
|
|
|
2020-05-08 12:36:12 +00:00
|
|
|
def test_render_combine():
|
|
|
|
result = render("[green]X[blue]Y[/blue]Z[/green]")
|
|
|
|
assert str(result) == "XYZ"
|
|
|
|
assert result.spans == [
|
|
|
|
Span(0, 3, "green"),
|
|
|
|
Span(1, 2, "blue"),
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
|
|
def test_render_overlap():
|
|
|
|
result = render("[green]X[bold]Y[/green]Z[/bold]")
|
|
|
|
assert str(result) == "XYZ"
|
|
|
|
assert result.spans == [
|
|
|
|
Span(0, 2, "green"),
|
|
|
|
Span(1, 3, "bold"),
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
|
|
def test_render_close():
|
|
|
|
result = render("[bold]X[/]Y")
|
|
|
|
assert str(result) == "XY"
|
|
|
|
assert result.spans == [Span(0, 1, "bold")]
|
|
|
|
|
|
|
|
|
|
|
|
def test_render_close_ambiguous():
|
|
|
|
result = render("[green]X[bold]Y[/]Z[/]")
|
|
|
|
assert str(result) == "XYZ"
|
|
|
|
assert result.spans == [Span(0, 3, "green"), Span(1, 2, "bold")]
|
|
|
|
|
|
|
|
|
2020-04-13 11:24:21 +00:00
|
|
|
def test_markup_error():
|
|
|
|
with pytest.raises(MarkupError):
|
|
|
|
assert render("foo[/]")
|
|
|
|
with pytest.raises(MarkupError):
|
|
|
|
assert render("foo[/bar]")
|
|
|
|
with pytest.raises(MarkupError):
|
|
|
|
assert render("[foo]hello[/bar]")
|
2021-01-05 18:08:44 +00:00
|
|
|
|
|
|
|
|
|
|
|
def test_escape_escape():
|
|
|
|
# escaped escapes (i.e. double backslash)should be treated as literal
|
|
|
|
result = render(r"\\[bold]FOO[/bold]")
|
|
|
|
assert str(result) == "\\FOO"
|
|
|
|
|
|
|
|
result = render(r"\[bold]FOO\[/bold]")
|
|
|
|
assert str(result) == "[bold]FOO[/bold]"
|
|
|
|
|
|
|
|
result = render(r"\\[bold]some text[/]")
|
|
|
|
assert str(result) == "\\some text"
|
|
|
|
|
|
|
|
result = render(r"\\")
|
2021-01-05 21:23:13 +00:00
|
|
|
assert str(result) == r"\\"
|
2021-01-05 18:08:44 +00:00
|
|
|
|
|
|
|
result = render(r"\\\\")
|
2021-01-05 21:23:13 +00:00
|
|
|
assert str(result) == r"\\\\"
|