## Automatically generated from redux:tests/testthat/test-interface.R: do not edit by hand
context("interface")
## Multiple args OK:
test_that("MSET / MGET / DEL", {
skip_if_no_rlite()
r <- hirlite()
expect_equal(r$MSET(letters, LETTERS), redis_status("OK"))
expect_equal(vapply(letters, r$EXISTS, integer(1), USE.NAMES=FALSE),
rep(1L, length(letters)))
expect_equal(r$MGET(letters), as.list(LETTERS))
expect_equal(r$DEL(letters), length(letters))
expect_equal(vapply(letters, r$EXISTS, integer(1), USE.NAMES=FALSE),
rep(0L, length(letters)))
})
## SORT is the most complicated, so lets nail that
test_that("SORT", {
skip_if_no_rlite()
key <- rand_str()
i <- sample(20)
r <- hirlite()
expect_equal(r$RPUSH(key, i), 20)
on.exit(r$DEL(key))
res <- r$SORT(key)
cmp <- as.list(as.character(sort(i)))
expect_equal(res, cmp)
## NOTE: this is a different behaviour to the examples because order
## *must* be given as a kw argument here, whereas there it's done
## positionally. Not sure how to implement that, or if it's
## worthwhile.
expect_equal(r$SORT(key, order="DESC"), rev(cmp))
expect_equal(r$SORT(key, order="ASC"), cmp)
expect_error(r$SORT(key, order="A"), "order must be one of")
expect_equal(r$SORT(key, LIMIT=c(0, 10)),
cmp[1:10])
expect_equal(r$SORT(key, LIMIT=c(5, 10)),
cmp[6:15])
cmp_alpha <- as.list(sort(as.character(i)))
expect_equal(r$SORT(key, sorting="ALPHA"), cmp_alpha)
expect_equal(r$SORT(key, sorting="ALPHA", order="DESC"),
rev(cmp_alpha))
key2 <- rand_str()
on.exit(r$DEL(key2))
expect_equal(r$SORT(key, STORE=key2), length(i))
## TODO: rlite doesn't return a redis_status here, which seems like a bug.
## expect_equal(r$TYPE(key2), redis_status("list")))
## A fix would be substituting
## createStringObject -> createStatusObject in hirlite.c:typeCommand()
expect_equal(as.character(r$TYPE(key2)), "list")
expect_equal(r$LRANGE(key2, 0, -1), cmp)
})
## SCAN does some cool things; let's try that, too.
test_that("SCAN", {
skip_if_no_rlite()
r <- hirlite()
skip_if_no_scan(r)
prefix <- paste0(rand_str(), ":")
str <- replicate(50, rand_str(prefix=prefix))
r$MSET(str, str)
on.exit(r$DEL(str))
## The stupid way:
pat <- paste0(prefix, "*")
all <- as.character(r$KEYS(pat))
expect_equal(sort(all), sort(str))
## The better way:
seen <- setNames(integer(length(str)), str)
cursor <- 0L
for (i in 1:50) {
res <- r$SCAN(cursor, pat)
cursor <- res[[1]]
i <- as.character(res[[2]])
seen[i] <- seen[i] + 1L
if (cursor == "0") {
break
}
}
expect_equal(cursor, "0")
expect_true(all(seen > 0))
## Try to do it in one big jump:
res <- r$SCAN(0L, pat, 1000)
if (res[[1]] == "0") {
expect_equal(length(res[[2]]), length(str))
expect_equal(sort(unlist(res[[2]])), sort(str))
}
})
test_that("serialisation", {
skip_if_no_rlite()
r <- hirlite()
key <- rand_str()
on.exit(r$DEL(key))
expect_equal(r$SET(key, object_to_bin(1:10)), redis_status("OK"))
expect_is(r$GET(key), "raw")
expect_equal(bin_to_object(r$GET(key)), 1:10)
## And vectorised:
expect_equal(r$MSET(key, object_to_bin(1:10)), redis_status("OK"))
expect_equal(bin_to_object(r$GET(key)), 1:10)
expect_equal(r$MSET(key, list(object_to_bin(1:10))), redis_status("OK"))
expect_equal(bin_to_object(r$GET(key)), 1:10)
str <- replicate(10, rand_str(prefix=paste0(rand_str(), ":")))
on.exit(r$DEL(str), add=TRUE)
expect_equal(r$MSET(str, 1:10), redis_status("OK"))
expect_equal(r$MGET(str), as.list(as.character(1:10)))
expect_error(r$MSET(str, object_to_bin(1:10)),
"b must be length 10")
expect_equal(r$MSET(str, lapply(1:10, object_to_bin)), redis_status("OK"))
tmp <- r$MGET(str)
expect_true(all(vapply(tmp, is.raw, logical(1))))
expect_equal(lapply(tmp, bin_to_object), as.list(1:10))
})
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.