test_that("decompress various file types", {

  types <- c("zip", "tar", "tar.gz", "tgz")

  for (type in types) {

    fname <- paste0("foo.", type)
    archive <- file.path("archives", fname)
    dec <- tempfile()
    decompress(archive, dec)

    expect_true(
      file.exists(file.path(dec, "foo", "R", "foo.R")),
      info = type
    )
  }

})

test_that("decompress with internal unzip", {

  types <- c("zip", "tar", "tar.gz", "tgz")

  for (type in types) {

    fname <- paste0("foo.", type)
    archive <- file.path("archives", fname)

    dec <- tempfile()
    on.exit(unlink(dec, recursive = TRUE), add = TRUE)

    mockery::stub(
      decompress,
      "getOption",
      function(x, default = NULL) {
        if (x == "unzip") {
          "internal"
        } else {
          if (missing(default) || x %in% names(options())) {
            options()[[x]]
          } else {
            default
          }
        }
      }
    )

    decompress(archive, dec)

    expect_true(
      file.exists(file.path(dec, "foo", "R", "foo.R")),
      info = type
    )
  }

})

test_that("decompress errors on unknown file types", {

  tmp <- tempfile(fileext = ".foobar")
  on.exit(unlink(tmp, recursive = TRUE), add = TRUE)
  cat("surprise!", file = tmp)
  expect_error(
    decompress(tmp, tempdir()),
    "Don't know how to decompress"
  )

})

test_that("source_pkg", {

  foo_dir <- file.path("archives", "foo")
  expect_equal(source_pkg(foo_dir), foo_dir)

  bad_dir <- "archives"
  expect_error(
    source_pkg(bad_dir),
    "Does not appear to be an R package"
  )

  foo_tgz <- file.path("archives", "foo.tar.gz")
  pkg_dir <- source_pkg(foo_tgz)
  on.exit(unlink(pkg_dir, recursive = TRUE), add = TRUE)
  expect_true(file.exists(file.path(pkg_dir, "R", "foo.R")))
  expect_true(file.exists(file.path(pkg_dir, "configure")))

  skip_on_os("windows")

  expect_match(
    as.character(file.info(file.path(pkg_dir, "configure"))$mode),
    "7.."
  )
})

test_that("getrootdir",  {
  cases <- list(
    list(c("foo/bar", "foo/"), "foo"),
    list(c("/foo/bar/baz", "/foo/bar"), "/foo"),
    list(c("this/foo/bar", "this/that"), "this"),
    list(c("", "yes"), ".")
  )

  for (c in seq_along(cases)) {
    expect_identical(getrootdir(cases[[c]][[1]]), cases[[c]][[2]], info = c)
  }

  expect_error(getrootdir(character()))
})

test_that("my_unzip respects options('unzip')", {
  mockery::stub(my_unzip, "utils::unzip", function(...) int <<- TRUE)
  mockery::stub(my_unzip, "system_check", function(...) int <<- FALSE)

  int <- NULL
  withr::with_options(c("unzip" = "internal"), my_unzip("blah", "tg"))
  expect_true(int)

  int <- NULL
  withr::with_options(c("unzip" = ""), my_unzip("blah", "tg"))
  expect_true(int)

  int <- NULL
  withr::with_options(c("unzip" = "somethingelse"), my_unzip("blah", "tg"))
  expect_false(int)
})
