testthat::test_that("spread and move accept deep subelement paths", {
    library(grid)
    library(checkmate)
    make_stub_box <- function(label, x = 0.5, y = 0.5) {
        b <- list(label = label)
        class(b) <- "box"
        vp <- list(x = unit(x, "npc"), y = unit(y, "npc"), just = c("center", "center"))
        coords <- list(
            left = unit(x, "npc"), right = unit(x, "npc"),
            top = unit(y, "npc"), bottom = unit(y, "npc"),
            x = unit(x, "npc"), y = unit(y, "npc"),
            width = unit(0, "npc"), height = unit(0, "npc"),
            half_width = unit(0, "npc"), half_height = unit(0, "npc")
        )
        attr(b, "viewport_data") <- vp
        attr(b, "coords") <- structure(coords, class = c("box_coords", "list"))
        b
    }

    # create a nested structure of simple placeholders (we don't need real boxGrob properties)
    nested <- list(
        grp = list(
            sub = list(
                make_stub_box("A", x = 0.1, y = 0.9),
                make_stub_box("B", x = 0.1, y = 0.7)
            )
        ),
        other = list(make_stub_box("C", x = 0.8, y = 0.5))
    )

    # If a path does not exist we get informative error
    expect_error(moveBox(nested, x = 0.5, subelement = c("no", "such")), "The subelement 'no/such' was not found", fixed = TRUE)

    # Multiple paths: if the first path is missing we get an informative error
    expect_error(moveBox(nested, x = 0.5, subelement = list(c("missing", "x"), c("grp", "sub", 1))), "The subelement 'missing/x' was not found", fixed = TRUE)

    # Spread: attempting to target missing path raises same informative error
    expect_error(spreadVertical(nested, subelement = c("no", "pe")), "The subelement 'no -> pe' was not found", fixed = TRUE)
})
