import pytest

from textual.widget import MountError, Widget


class Content(Widget):
    pass


class Body(Widget):
    pass


async def test_find_dom_spot():
    # Build up a "fake" DOM for an application.
    screen = Widget(name="Screen")
    header = Widget(name="Header", id="header")
    body = Body(id="body")
    content = [Content(id=f"item{n}") for n in range(1000)]
    body._add_children(*content)
    footer = Widget(name="Footer", id="footer")
    screen._add_children(header, body, footer)

    # Just as a quick double-check, make sure the main components are in
    # their intended place.
    assert list(screen._nodes) == [header, body, footer]

    # Now check that we find what we're looking for in the places we expect
    # to find them.
    assert screen._find_mount_point(1) == (screen, 1)
    assert screen._find_mount_point(body) == screen._find_mount_point(1)
    assert screen._find_mount_point("Body") == screen._find_mount_point(body)
    assert screen._find_mount_point("#body") == screen._find_mount_point(1)

    # Finally, let's be sure that we get an error if, for some odd reason,
    # we go looking for a widget that isn't actually part of the DOM we're
    # looking in.
    with pytest.raises(MountError):
        _ = screen._find_mount_point(Widget())
