// This test checks the position of the `i` for the notable traits.
goto: "file://" + |DOC_PATH| + "/test_docs/struct.NotableStructWithLongName.html"
show-text: true
// We start with a wide screen.
size: (1100, 600)
// Checking they have the same y position.
compare-elements-position: (
    "//*[@id='method.create_an_iterator_from_read']//a[text()='NotableStructWithLongName']",
    "//*[@id='method.create_an_iterator_from_read']//*[@class='notable-traits']",
    ("y"),
)
// Checking they don't have the same x position.
compare-elements-position-false: (
    "//*[@id='method.create_an_iterator_from_read']//a[text()='NotableStructWithLongName']",
    "//*[@id='method.create_an_iterator_from_read']//*[@class='notable-traits']",
    ("x"),
)
// The `i` should be *after* the type.
assert-position: (
    "//*[@id='method.create_an_iterator_from_read']//a[text()='NotableStructWithLongName']",
    {"x": 677},
)
assert-position: (
    "//*[@id='method.create_an_iterator_from_read']//*[@class='notable-traits']",
    {"x": 955},
)
// The tooltip should be below the `i`
// Also, clicking the tooltip should bring its text into the DOM
assert-count: ("//*[@class='notable popover']", 0)
click: "//*[@id='method.create_an_iterator_from_read']//*[@class='notable-traits']"
assert-count: ("//*[@class='notable popover']", 1)
compare-elements-position-near: (
    "//*[@id='method.create_an_iterator_from_read']//*[@class='notable-traits']",
    "//*[@class='notable popover']",
    {"y": 30}
)
compare-elements-position-false: (
    "//*[@id='method.create_an_iterator_from_read']//*[@class='notable-traits']",
    "//*[@class='notable popover']",
    ("x")
)
click: "//*[@id='method.create_an_iterator_from_read']//*[@class='notable-traits']"
move-cursor-to: "//h1"
assert-count: ("//*[@class='notable popover']", 0)

// Now only the `i` should be on the next line.
size: (1055, 600)
compare-elements-position-false: (
    "//*[@id='method.create_an_iterator_from_read']//a[text()='NotableStructWithLongName']",
    "//*[@id='method.create_an_iterator_from_read']//*[@class='notable-traits']",
    ("y", "x"),
)

// Now both the `i` and the struct name should be on the next line.
size: (980, 600)
// Checking they have the same y position.
compare-elements-position: (
    "//*[@id='method.create_an_iterator_from_read']//a[text()='NotableStructWithLongName']",
    "//*[@id='method.create_an_iterator_from_read']//*[@class='notable-traits']",
    ("y"),
)
// Checking they don't have the same x position.
compare-elements-position-false: (
    "//*[@id='method.create_an_iterator_from_read']//a[text()='NotableStructWithLongName']",
    "//*[@id='method.create_an_iterator_from_read']//*[@class='notable-traits']",
    ("x"),
)
// The `i` should be *after* the type.
assert-position: (
    "//*[@id='method.create_an_iterator_from_read']//a[text()='NotableStructWithLongName']",
    {"x": 245},
)
assert-position: (
    "//*[@id='method.create_an_iterator_from_read']//*[@class='notable-traits']",
    {"x": 523},
)

// Checking on mobile now.
size: (650, 600)
// Checking they have the same y position.
compare-elements-position: (
    "//*[@id='method.create_an_iterator_from_read']//a[text()='NotableStructWithLongName']",
    "//*[@id='method.create_an_iterator_from_read']//*[@class='notable-traits']",
    ("y"),
)
// Checking they don't have the same x position.
compare-elements-position-false: (
    "//*[@id='method.create_an_iterator_from_read']//a[text()='NotableStructWithLongName']",
    "//*[@id='method.create_an_iterator_from_read']//*[@class='notable-traits']",
    ("x"),
)
// The `i` should be *after* the type.
assert-position: (
    "//*[@id='method.create_an_iterator_from_read']//a[text()='NotableStructWithLongName']",
    {"x": 15},
)
assert-position: (
    "//*[@id='method.create_an_iterator_from_read']//*[@class='notable-traits']",
    {"x": 293},
)
// The tooltip should STILL be below `i`
click: "//*[@id='method.create_an_iterator_from_read']//*[@class='notable-traits']"
assert-count: ("//*[@class='notable popover']", 1)
compare-elements-position-near: (
    "//*[@id='method.create_an_iterator_from_read']//*[@class='notable-traits']",
    "//*[@class='notable popover']",
    {"y": 30}
)
compare-elements-position-false: (
    "//*[@id='method.create_an_iterator_from_read']//*[@class='notable-traits']",
    "//*[@class='notable popover']",
    ("x")
)
assert-position: (
    "//*[@class='notable popover']",
    {"x": 0}
)
click: "//*[@id='method.create_an_iterator_from_read']//*[@class='notable-traits']"
move-cursor-to: "//h1"
assert-count: ("//*[@class='notable popover']", 0)

// Now check the colors.
define-function: (
    "check-colors",
    (theme, header_color, content_color, type_color, trait_color),
    block {
        goto: "file://" + |DOC_PATH| + "/test_docs/struct.NotableStructWithLongName.html"
        // This is needed to ensure that the text color is computed.
        show-text: true

        // Setting the theme.
        local-storage: {"rustdoc-theme": |theme|, "rustdoc-use-system-theme": "false"}
        // We reload the page so the local storage settings are being used.
        reload:

        move-cursor-to: "//*[@id='method.create_an_iterator_from_read']//*[@class='notable-traits']"
        assert-count: (".notable.popover", 1)

        assert-css: (
             ".notable.popover h3",
             {"color": |header_color|},
             ALL,
        )
        assert-css: (
             ".notable.popover pre",
             {"color": |content_color|},
             ALL,
        )
        assert-css: (
             ".notable.popover pre a.struct",
             {"color": |type_color|},
             ALL,
        )
        assert-css: (
             ".notable.popover pre a.trait",
             {"color": |trait_color|},
             ALL,
        )
    },
)

call-function: (
    "check-colors",
    {
        "theme": "ayu",
        "content_color": "rgb(230, 225, 207)",
        "header_color": "rgb(255, 255, 255)",
        "type_color": "rgb(255, 160, 165)",
        "trait_color": "rgb(57, 175, 215)",
    },
)

call-function: (
    "check-colors",
    {
        "theme": "dark",
        "content_color": "rgb(221, 221, 221)",
        "header_color": "rgb(221, 221, 221)",
        "type_color": "rgb(45, 191, 184)",
        "trait_color": "rgb(183, 140, 242)",
    },
)

call-function: (
    "check-colors",
    {
        "theme": "light",
        "content_color": "rgb(0, 0, 0)",
        "header_color": "rgb(0, 0, 0)",
        "type_color": "rgb(173, 55, 138)",
        "trait_color": "rgb(110, 79, 201)",
    },
)

reload:

// Check that pressing escape works
click: "//*[@id='method.create_an_iterator_from_read']//*[@class='notable-traits']"
move-cursor-to: "//*[@class='notable popover']"
assert-count: ("//*[@class='notable popover']", 1)
press-key: "Escape"
assert-count: ("//*[@class='notable popover']", 0)
assert: "#method\.create_an_iterator_from_read .notable-traits:focus"

// Check that clicking outside works.
click: "//*[@id='method.create_an_iterator_from_read']//*[@class='notable-traits']"
assert-count: ("//*[@class='notable popover']", 1)
click: ".search-input"
assert-count: ("//*[@class='notable popover']", 0)
assert-false: "#method\.create_an_iterator_from_read .notable-traits:focus"

// Check that pressing tab over and over works.
click: "//*[@id='method.create_an_iterator_from_read']//*[@class='notable-traits']"
move-cursor-to: "//*[@class='notable popover']"
assert-count: ("//*[@class='notable popover']", 1)
press-key: "Tab"
press-key: "Tab"
press-key: "Tab"
press-key: "Tab"
press-key: "Tab"
press-key: "Tab"
press-key: "Tab"
assert-count: ("//*[@class='notable popover']", 0)
assert: "#method\.create_an_iterator_from_read .notable-traits:focus"

// Now we check that the focus isn't given back to the wrong item when opening
// another popover.
store-window-property: (scroll, "scrollY")
click: "#method\.create_an_iterator_from_read .fn"
// We ensure that the scroll position changed.
assert-window-property-false: {"scrollY": |scroll|}
// Store the new position.
store-window-property: (scroll, "scrollY")
click: "//*[@id='method.create_an_iterator_from_read']//*[@class='notable-traits']"
wait-for: "//*[@class='notable popover']"
click: "#settings-menu a"
click: ".search-input"
// We ensure we didn't come back to the previous focused item.
assert-window-property-false: {"scrollY": |scroll|}

// Same but with Escape handling.
store-window-property: (scroll, "scrollY")
click: "#method\.create_an_iterator_from_read .fn"
// We ensure that the scroll position changed.
assert-window-property-false: {"scrollY": |scroll|}
// Store the new position.
store-window-property: (scroll, "scrollY")
click: "//*[@id='method.create_an_iterator_from_read']//*[@class='notable-traits']"
wait-for: "//*[@class='notable popover']"
click: "#settings-menu a"
press-key: "Escape"
// We ensure we didn't come back to the previous focused item.
assert-window-property-false: {"scrollY": |scroll|}

// Opening the mobile sidebar should close the popover.
size: (650, 600)
click: "//*[@id='method.create_an_iterator_from_read']//*[@class='notable-traits']"
assert-count: ("//*[@class='notable popover']", 1)
click: ".sidebar-menu-toggle"
assert: "//*[@class='sidebar shown']"
assert-count: ("//*[@class='notable popover']", 0)
assert-false: "#method\.create_an_iterator_from_read .notable-traits:focus"
// Clicking a notable popover should close the sidebar.
click: "//*[@id='method.create_an_iterator_from_read']//*[@class='notable-traits']"
assert-count: ("//*[@class='notable popover']", 1)
assert-false: "//*[@class='sidebar shown']"

// Also check the focus handling for the help button.
size: (1100, 600)
reload:
assert-count: ("//*[@class='notable popover']", 0)
click: "//*[@id='method.create_an_iterator_from_read']//*[@class='notable-traits']"
assert-count: ("//*[@class='notable popover']", 1)
click: "#help-button a"
assert-count: ("//*[@class='notable popover']", 0)
assert-false: "#method\.create_an_iterator_from_read .notable-traits:focus"