from telethon._impl.client.parsers import (
    generate_html_message,
    generate_markdown_message,
    parse_html_message,
    parse_markdown_message,
)
from telethon._impl.tl import types
def test_parse_leading_markdown() -> None:
    markdown = "**Hello** world!"
    text, entities = parse_markdown_message(markdown)
    assert text == "Hello world!"
    assert entities == [types.MessageEntityBold(offset=0, length=5)]
def test_parse_trailing_markdown() -> None:
    markdown = "Hello **world!**"
    text, entities = parse_markdown_message(markdown)
    assert text == "Hello world!"
    assert entities == [types.MessageEntityBold(offset=6, length=6)]
def test_parse_emoji_markdown() -> None:
    markdown = "A **little 🦀** here"
    text, entities = parse_markdown_message(markdown)
    assert text == "A little 🦀 here"
    assert entities == [types.MessageEntityBold(offset=2, length=9)]
def test_parse_all_entities_markdown() -> None:
    markdown = "Some **bold** (__strong__), *italics* (_cursive_), inline `code`, a\n```rust\npre\n```\nblock, a [link](https://example.com), and [mentions](tg://user?id=12345678)"
    text, entities = parse_markdown_message(markdown)
    assert (
        text
        == "Some bold (strong), italics (cursive), inline code, a\npre\nblock, a link, and mentions"
    )
    assert entities == [
        types.MessageEntityBold(offset=5, length=4),
        types.MessageEntityBold(offset=11, length=6),
        types.MessageEntityItalic(offset=20, length=7),
        types.MessageEntityItalic(offset=29, length=7),
        types.MessageEntityCode(offset=46, length=4),
        types.MessageEntityPre(offset=54, length=4, language="rust"),
        types.MessageEntityTextUrl(offset=67, length=4, url="https://example.com"),
        types.MessageEntityTextUrl(offset=77, length=8, url="tg://user?id=12345678"),
    ]
def test_parse_nested_entities_markdown() -> None:
    # CommonMark won't allow the following="Some **bold _both** italics_"
    markdown = "Some **bold _both_** _italics_"
    text, entities = parse_markdown_message(markdown)
    assert text == "Some bold both italics"
    assert entities == [
        types.MessageEntityBold(offset=5, length=9),
        types.MessageEntityItalic(offset=10, length=4),
        types.MessageEntityItalic(offset=15, length=7),
    ]
def test_parse_then_unparse_markdown() -> None:
    markdown = "Some **bold 🤷🏽♀️**, _italics_, inline `🤷🏽♀️ code`, a\n\n```rust\npre\n```\nblock, a [link](https://example.com), and [mentions](tg://user?id=12345678)"
    text, entities = parse_markdown_message(markdown)
    generated = generate_markdown_message(text, entities)
    assert generated == markdown
def test_parse_leading_html() -> None:
    # Intentionally use different casing to make sure that is handled well
    html = "Hello world!"
    text, entities = parse_html_message(html)
    assert text == "Hello world!"
    assert entities == [types.MessageEntityBold(offset=0, length=5)]
def test_parse_trailing_html() -> None:
    html = "Hello world!"
    text, entities = parse_html_message(html)
    assert text == "Hello world!"
    assert entities == [types.MessageEntityBold(offset=6, length=6)]
def test_parse_emoji_html() -> None:
    html = "A little 🦀 here"
    text, entities = parse_html_message(html)
    assert text == "A little 🦀 here"
    assert entities == [types.MessageEntityBold(offset=2, length=9)]
def test_parse_all_entities_html() -> None:
    html = 'Some bold (strong), italics (cursive), inline code, a 
preblock, a link,
pre,
normal and rusty code'
    text, entities = parse_html_message(html)
    assert text == "Some pre, normal and rusty code"
    assert entities == [
        types.MessageEntityPre(offset=5, length=3, language=""),
        types.MessageEntityCode(offset=10, length=6),
        types.MessageEntityPre(offset=21, length=5, language="rust"),
    ]
def test_parse_empty_pre_and_lang_html() -> None:
    html = 'Some empty  and code'
    text, entities = parse_html_message(html)
    assert text == "Some empty  and code"
    assert entities == [types.MessageEntityCode(offset=16, length=4)]
def test_parse_link_no_href_html() -> None:
    html = "Some empty link, it does nothing"
    text, entities = parse_html_message(html)
    assert text == "Some empty link, it does nothing"
    assert entities == []
def test_parse_nested_entities_html() -> None:
    html = "Some bold both italics"
    text, entities = parse_html_message(html)
    assert text == "Some bold both italics"
    assert entities == [
        types.MessageEntityBold(offset=5, length=9),
        types.MessageEntityItalic(offset=10, length=12),
    ]
def test_parse_then_unparse_html() -> None:
    html = 'Some bold, italics inline code, a preblock
use rust;, a link,