tests/testthat/test-import.R

test_that("Import of default packages: #31", {

  # we get errors on some old r release on windows and macos. I can't reproduce
  # and do not have access to these OSs.
  testthat::skip_on_cran()

  # import default packages, e.g. stats, utils, etc
  m <- module(topEncl = baseenv(), {
    suppressPackageStartupMessages(importDefaultPackages())
    findsStats <- function() exists("median")
    findsUtils <- function() exists("data")
    findsGraphics <- function() exists("plot")
    findsDatasets <- function() exists("iris")
  })

  for (fun in m) {
    testthat::expect_true(fun())
  }

  # now exclude datasets and utils
  m <- module(topEncl = baseenv(), {
    suppressPackageStartupMessages(importDefaultPackages(
      c("datasets", "utils")
    ))
    findsStats <- function() exists("median")
    findsUtils <- function() !exists("data")
    findsGraphics <- function() exists("plot")
    findsDatasets <- function() !exists("iris")
  })

  for (fun in m) {
    testthat::expect_true(fun())
  }
})

test_that("Import of datasets: #29", {
  # import all datasets from a package
  m <- module({
    import("datasets")
    getIris <- function() iris
  })
  data("iris", envir = environment())
  expect_equal(m$getIris(), iris)
  expect_true("iris" %in% getSearchPathContent(m)[["modules:datasets"]])
  # import just one dataset, like any other object
  m <- module({
    import("datasets", "iris")
    getIris <- function() iris
  })
  data("iris", envir = environment())
  expect_equal(m$getIris(), iris)
  expect_true("iris" %in% getSearchPathContent(m)[["modules:datasets"]])
})

test_that("Imports of module", {
  # import and related functions are part of the parent scope. Not the module
  # itself.
  m <- module({
    fun <- function() 1
  })
  expect_true(Negate(exists)("import", environment(m$fun), inherits = FALSE))
  expect_true(exists("import", environment(m$fun)))
  expect_true(Negate(exists)("export", environment(m$fun), inherits = FALSE))
  expect_true(exists("export", environment(m$fun)))
  expect_true(Negate(exists)("use", environment(m$fun), inherits = FALSE))
  expect_true(exists("use", environment(m$fun)))

  # imported objects are only available to module
  m <- module({
    import(modules, module)
    localModule <- module({
      fun <- function(x) x
    })
  })
  expect_equal(m$localModule$fun(1), 1)
  expect_true(exists("module", environment(m$fun)))
  expect_true(Negate(exists)("module", environment(m$fun), inherits = FALSE))

  m <- module({
    here <- environment()
    m <- import("utils", ".S3methods", attach = FALSE)
    importPackage <- function() names(m) == ".S3methods"
    importPackageAttach <- function() !exists(".S3methods", where = here, inherits = FALSE)
  })

  testthat::expect_true(m$importPackage())
  testthat::expect_true(m$importPackageAttach())
})

test_that("delayed assignment", {
  # test for delayed assignment
  m <- module({
    import("base", "assignment") # does not exist!
    temp <- function() assignment
    checkExistens <- function() exists("assignment")
  })
  # When 'temp' is called, it should not find 'assignment'
  expect_error(m$temp())
  expect_true(m$checkExistens())
})

test_that("package dependencies", {
  m <- module({
    import("utils")
    deps <- function() exists("packageDescription")
  })

  testthat::expect_true(m$deps())
  testthat::expect_error(module({
    import("DoesNotExist")
  }), "'package:DoesNotExist' is not installed!")
})

test_that("duplications on search path", {
  expectEqual <- function(a, b) {
    testthat::expect_equal(a, b)
  }

  "%without%" <- function(x, set) {
    x[!(x %in% set)]
  }

  expectMessage <- function(obj) {
    testthat::expect_message(obj)
  }

  sp0 <- getSearchPathNames()

  m <- module({ })
  use(m, attach = TRUE)
  expectMessage(use(m, attach = TRUE))

  sp1 <- getSearchPathNames()

  tmp <- tempfile()
  writeLines("import(stats)
             fun <- function(x) median(x)", tmp)
  use(tmp, attach = TRUE)

  sp2 <- getSearchPathNames()

  import(stats)

  sp3 <- getSearchPathNames()

  expectMessage(use(m, attach = TRUE))

  sp4 <- getSearchPathNames()

  expectEqual(sp1[-1], c("modules:m", sp0[-1]))
  expectEqual(sp2[-1], c(paste0("modules:", tmp), sp1[-1]))
  expectEqual(sp3[-1], c("modules:stats", sp2[-1]))
  expectEqual(sp4[-1], c("modules:m", sp3[-1] %without% "modules:m"))
})

Try the modules package in your browser

Any scripts or data that you put into this service are public.

modules documentation built on Aug. 25, 2023, 5:17 p.m.