1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
|
test_that("we can create weak references", {
g <- new.env()
g$foo <- "bar"
value <- "foobar"
vs <- make_weak_ref(key = g, value = value)
expect_identical(typeof(vs), "weakref")
expect_identical(weak_ref_key(vs), g)
expect_identical(weak_ref_value(vs), value)
})
test_that("weak references are weak", {
g <- new.env()
g$foo <- "bar"
value <- "foobar"
vs <- make_weak_ref(key = g, value = value)
rm(g)
gc()
expect_null(weak_ref_key(vs))
expect_null(weak_ref_value(vs))
})
test_that("weak reference finalizer is called", {
g <- new.env()
g$foo <- "bar"
value <- "foobar"
hello <- ""
fin <- function(env) hello <<- "world"
vs <- make_weak_ref(key = g, value = value, finalizer = fin)
rm(g)
gc()
expect_equal(hello, "world")
})
test_that("weak reference on an embedded env", {
g <- list(yes = new.env())
g[[1]]$foo <- "bar"
value <- "foobar"
vs <- make_weak_ref(key = g[[1]], value = value)
rm(g)
gc()
expect_null(weak_ref_key(vs))
expect_null(weak_ref_value(vs))
})
test_that("embed myself, and weak ref", {
g <- list(yes = new.env())
assign("foo", g, envir = g[[1]])
value <- "foobar"
hello <- ""
fin <- function(env) hello <<- "world"
vs <- make_weak_ref(key = g[[1]], value = value, finalizer = fin)
rm(g)
gc()
expect_null(weak_ref_key(vs))
expect_null(weak_ref_value(vs))
expect_equal(hello, "world")
})
test_that("embed myself, and weak ref as attribute", {
g <- list(yes = new.env())
assign("foo", g, envir = g[[1]])
value <- "foobar"
hello <- ""
fin <- function(env) hello <<- "world"
z <- "footoo"
attr(z, "env") <- make_weak_ref(
key = g[[1]],
value = value,
finalizer = fin
)
rm(g)
gc()
expect_null(weak_ref_key(attr(z, "env")))
expect_null(weak_ref_value(attr(z, "env")))
expect_equal(hello, "world")
})
test_that("weak refs work for vs", {
g <- make_ring(10)
vs <- V(g)
expect_true(!is.null(get_vs_ref(g)))
expect_true(!is.null(weak_ref_key(attr(vs, "env"))))
rm(g)
gc()
expect_null(weak_ref_key(attr(vs, "env")))
})
|