context("dict") test_that("push and pop", { d <- dict() d$set("b", 2) d$set("a", 1) d$set("c", 3) expect_equal(d$size(), 3) expect_equal(d$get("b"), 2) expect_equal(d$get("a"), 1) expect_equal(d$get("c"), 3) expect_error(d$get("d"), "not found") expect_error(d$pop("d"), "not found") expect_equal(d$get("d", 1), 1) expect_equal(d$pop("d", 1), 1) d$remove("b") expect_equal(d$size(), 2) expect_equal(d$pop("a"), 1) expect_equal(d$size(), 1) d$set("c", 5) expect_equal(d$get("c"), 5) expect_equal(d$size(), 1) expect_equal(d$pop("c"), 5) }) test_that("push and pop with items", { d <- dict(list(b = 2, a = 1, c = 3)) expect_equal(d$size(), 3) expect_equal(d$get("b"), 2) expect_equal(d$get("a"), 1) expect_equal(d$get("c"), 3) expect_error(d$get("d"), "not found") expect_error(d$pop("d"), "not found") d$remove("b") expect_equal(d$size(), 2) expect_equal(d$pop("a"), 1) expect_equal(d$size(), 1) d$set("c", 5) expect_equal(d$get("c"), 5) expect_equal(d$size(), 1) expect_equal(d$pop("c"), 5) }) test_that("push and pop with items and keys", { d <- dict(list(2, 1, 3), list("b", "a", "c")) expect_equal(d$size(), 3) expect_equal(d$get("b"), 2) expect_equal(d$get("a"), 1) expect_equal(d$get("c"), 3) expect_error(d$get("d"), "not found") expect_error(d$pop("d"), "not found") d$remove("b") expect_equal(d$size(), 2) expect_equal(d$pop("a"), 1) expect_equal(d$size(), 1) d$set("c", 5) expect_equal(d$get("c"), 5) expect_equal(d$size(), 1) expect_equal(d$pop("c"), 5) }) test_that("clear", { d <- dict() d$set("b", 2) d$set("a", 1) d$set("c", 3) d$clear() expect_equal(d$size(), 0) }) test_that("NULL and default", { d <- dict() d$set("b", NULL) expect_equal(d$get("b"), NULL) expect_equal(d$get("a", "default"), "default") }) test_that("size is correctly calculated after remove", { d <- dict() for (l in LETTERS) { d$set(l, 1) } expect_equal(d$size(), 26) for (l in LETTERS) { d$remove(l) } expect_equal(d$size(), 0) d$set("A", 1) expect_equal(d$size(), 1) }) test_that("set a key twice", { d <- dict() d$set("a", 1) d$set("b", 2) d$set("a", 3) expect_equal(d$get("a"), 3) expect_length(d$keys(), 2) expect_length(d$values(), 2) }) test_that("serialize and unserialized", { d <- dict() d$set("b", 2) d$set("a", 1) d$set("c", 3) d$remove("c") d2 <- unserialize(serialize(d, NULL)) expect_equal(d2$get("a"), 1) d$remove("a") d2 <- unserialize(serialize(d, NULL)) expect_error(d2$get("a"), "not found") }) # test_that("hole is not popped if key error", { # d <- dict() # d$set("a", 1)$set("b", 2)$set("c", 3) # d$remove("b") # expect_equal(d$size(), 2) # expect_equal(tryCatch( # d$set("", 2), # error = function(e) NULL # ), NULL) # expect_equal(d$size(), 2) # d$set("b", 2) # expect_equal(d$vs[[2]], 2L) # }) test_that("grow and shrink", { d <- dict() for (i in 1:100) d$set(paste0("key", i), i) len <- d$size() expect_gt(length(d$ks), len) for (i in 1:99) d$remove(paste0("key", i)) expect_lt(length(d$ks), len) expect_length(d$keys(), 1) }) test_that("object indexing works", { d <- dict() s <- stack() q <- queue() f <- function() { NULL } g <- function(x) { x } d$set(s, 1)$set(q, 2)$set(f, 3)$set(g, 4) expect_equal(d$size(), 4) expect_equal(d$get(s), 1) expect_equal(d$get(q), 2) expect_equal(d$get(f), 3) expect_equal(d$get(g), 4) expect_equal(d$keys(), list(s, q, f, g)) }) test_that("vector indexing works", { d <- dict() a <- c(1L, 2L) b <- list(key1 = "value1", key2 = 2) d$set(a, 1)$set(b, 2) c <- list(key1 = "value1", key2 = 2, key3 = list(1, 2, LETTERS)) d$set(a, 1)$set(b, 2)$set(c, 3) expect_equal(d$size(), 3) expect_equal(d$get(c(1L, 2L)), 1) expect_equal(d$get(list(key1 = "value1", key2 = 2)), 2) expect_error(d$get(c(1, 2))) expect_equal(d$get(c), 3) }) test_that("attributes must be hashable", { d <- dict() a <- 1:4 e <- new.env() d$set(a, 1) expect_equal(d$get(a), 1) attr(a, "e") <- e expect_error(d$set(a, 2), "not hashable") }) test_that("test altrep", { # see #22 d <- dict() a <- sort(c(1L, 2L, 4L, 3L)) b <- c(1L, 2L, 3L, 4L) d$set(a, TRUE) expect_true(d$has(b)) })