tests/testthat/test-env.R

context("environment")

test_that("environment constructor works as expected", {
  expect_length(make_env(), 0)

  # from environment
  e <- new.env()
  e$a <- 1
  e$b <- 2
  expect_message(from_env <- make_env(e))
  expect_equal(from_env, e)
  expect_is(make_env(new.env()), "environment")

  # from named vector
  from_vec <- make_env(c(a = 1, b = 2))
  expect_length(from_vec, 2)
  expect_equal(from_vec$a, 1)
  expect_equal(from_vec$b, 2)
  expect_error(make_env(c(a = 1, b = 2, 3))) # empty last name
  expect_error(make_env(seq(10), seq(10)))
  expect_error(expect_warning(make_env(keys = seq(10), seq(10))))
  expect_error(make_env(keys = seq(10), values = seq(10)))

  # from a named list
  from_list <- make_env(list(a = 1, d = dict()))
  expect_length(from_list, 2)
  expect_equal(from_list$a, 1)
  expect_is(from_list$d, "dict")
  expect_error(make_env(list(a = 1, "x"))) # empty name for "x"

  # from explicit keys/values
  from_kv <- make_env(values = c(1, 3), keys = c("a", "b"))
  expect_length(from_kv, 2)
  expect_equal(from_kv$a, 1)
  expect_equal(from_kv$b, 3)
  expect_error(make_env(values = c(1, 3), keys = c("a", "b", "c"))) # unequal length
  expect_warning(make_env(keys = "x", values = 1, blah = 1))

  # from 2 arguments
  from_2args <- make_env(c("a", "b"), c(1, 3))
  expect_length(from_2args, 2)
  expect_equal(from_2args$a, 1)
  expect_equal(from_2args$b, 3)
  expect_error(make_env(c(1, 3), c("a", "b", "c"))) # unequal length
  expect_warning(make_env(keys = "x", 1))
  expect_warning(make_env("x", values = 1))

  # from named arguments
  from_nargs <- make_env(a = 1, b = 5L, c = new.env(), d = dict())
  expect_length(from_nargs, 4)
  expect_equal(from_nargs$a, 1)
  expect_equal(from_nargs$b, 5L)
  expect_is(from_nargs$c, "environment")
  expect_is(from_nargs$d, "dict")
  # get the nested dict
  d <- from_nargs[["d"]]
  d$set("out", "i was set outside")
  # set by reference - the nested dict affected
  expect_equal(from_nargs$d$get("out"), "i was set outside")

  # from a single named argument
  from_1arg <- make_env(x = c(single = "arg"))
  expect_length(from_1arg, 1)
  expect_equal(from_1arg$x, c(single = "arg"))

  # other cases should throw an error
  expect_error(make_env(1, 2, 3))
  expect_error(make_env("x" = 1, "y" = 2, "z"))
  expect_error(make_env(c("x" = 1, "y" = 2, "z")))
  expect_error(make_env(list(x = 1, y = 2, "z")))
  expect_error(make_env("x"))
  expect_error(make_env(seq(1), seq(2), seq(3)))
  expect_error(make_env(keys = seq(1), values = seq(2), seq(3)))
})

test_that("values correctly retrieved from an environment", {
  e <- new.env()
  e$x <- 1
  e[["y"]] <- 2

  expect_equal(get_from_env(e, "x", NULL), 1)
  expect_equal(get_from_env(e, "y", NULL), 2)
  expect_equal(get_from_env(e, c("x", "y"), NULL), list(1, 2))
  expect_equal(get_from_env(e, c("z", "y"), "default"), list("default", 2))
  expect_equal(get_from_env(e, c("z"), "szymon"), "szymon")
  expect_equal(get_from_env(e, "x", "szymon"), 1)

  expect_error(get_from_env(e, 1.5, NULL))
  expect_error(get_from_env(e, 1L, "x"))
  expect_error(get_from_env(e, sum, "szymon"))
})

test_that("values correctly set in an environment", {
  e <- new.env()

  set_in_env("x", 1L, e)
  expect_equal(e$x, 1L)

  set_in_env(c("y", "z"), c(2, 3), e)
  expect_equal(e$y, 2)
  expect_equal(e$z, 3)
  expect_error(set_in_env(c("x", "x", "y"), seq(3)))

  set_in_env(c("t", "szymon"), list("val", sum), e)
  expect_equal(e$t, "val")
  expect_equal(e$szymon, sum)

  set_in_env(c("lgl", "x"), c(TRUE, FALSE), e)
  expect_true(e$lgl, TRUE)
  expect_false(e$x) # overwritten from first set
})
skubicius/dictionary documentation built on May 7, 2019, 7:17 p.m.