test_that("free_space() sets attribute on ggplot", {
    p <- ggplot(mtcars, aes(mpg, wt)) +
        geom_point()
    p2 <- free_space(p, "tb")
    expect_s3_class(p2, "ggalign_free_space")
    expect_equal(attr(p2, "ggalign_free_spaces"), "tb")
})

test_that("free_space() on free_space appends positions", {
    p <- ggplot(mtcars, aes(mpg, wt)) +
        geom_point()
    p <- free_space(p, "t")
    p2 <- free_space(p, "b")
    expect_equal(attr(p2, "ggalign_free_spaces"), union_position("t", "b"))
})

test_that("free_space() on free_align excludes free_axes", {
    p <- ggplot(mtcars, aes(mpg, wt)) +
        geom_point()
    class(p) <- c("ggalign_free_align", class(p))
    attr(p, "ggalign_free_axes") <- "t"
    out <- free_space(p, "tb")
    expect_equal(attr(out, "ggalign_free_spaces"), "b")
})

test_that("free_space() works with alignpatch objects", {
    p <- ggplot(mtcars, aes(mpg, wt)) +
        geom_point()
    class(p) <- c("alignpatches", class(p))
    out <- free_space(p, "r")
    expect_s3_class(out, "ggalign_free_space")
    expect_equal(attr(out, "ggalign_free_spaces"), "r")
})

test_that("patch.free_space() returns a ggproto object with spaces", {
    p <- ggplot(mtcars, aes(mpg, wt)) +
        geom_point()
    p <- free_space(p, "lr")
    proto <- patch(p)
    expect_s3_class(proto, "PatchFreeSpace")
})
