Nothing
test_that("integer64 coercion to/from other types work for atomic vectors", {
# from integer64
i32 = 1:10
i64 = as.integer64(i32)
expect_identical(as.logical(as.integer64(0:1)), c(FALSE, TRUE))
expect_identical(as.integer(i64), i32)
expect_identical(as.character(i64), as.character(i32))
expect_identical(as.double(i64), as.double(i32))
expect_identical(as.numeric(i64), as.numeric(i32))
# to integer64
expect_identical(as.integer64(TRUE), as.integer64(1L))
expect_identical(as.integer64(as.character(1:10)), i64)
expect_identical(as.integer64(as.double(1:10)), i64)
expect_identical(as.integer64(as.complex(1:10)), i64)
expect_identical(as.integer64(as.raw(1:10)), i64)
expect_identical(as.integer64(NULL), as.integer64())
expect_identical(as.integer64(i64), i64)
})
test_that("integer64 coercion to/from other types works via S4 coercion", {
expect_identical(methods::as(as.character(1:10), "integer64"), as.integer64(1:10))
expect_identical(methods::as(as.factor(11:20), "integer64"), as.integer64(1:10))
expect_identical(methods::as(as.ordered(11:20), "integer64"), as.integer64(1:10))
expect_warning(
expect_identical(methods::as(as.complex(1:10) + 1.0i, "integer64"), as.integer64(1:10)),
"imaginary parts discarded in coercion"
)
expect_identical(methods::as(as.numeric(1:10), "integer64"), as.integer64(1:10))
expect_identical(methods::as(as.integer(1:10), "integer64"), as.integer64(1:10))
expect_identical(methods::as(as.raw(1:10), "integer64"), as.integer64(1:10))
expect_identical(methods::as(as.logical(0:2), "integer64"), as.integer64(c(0L, 1L, 1L)))
expect_identical(methods::as(as.integer64(1:10), "character"), as.character(1:10))
expect_identical(methods::as(as.integer64(1:10), "factor"), as.factor(1:10))
expect_identical(methods::as(as.integer64(1:10), "ordered"), as.ordered(1:10))
expect_identical(methods::as(as.integer64(1:10), "numeric"), as.numeric(1:10))
expect_identical(methods::as(as.integer64(1:10), "integer"), as.integer(1:10))
expect_identical(methods::as(as.integer64(1:10), "logical"), as.logical(1:10))
})
test_that("integer64 coercion to/from other types works for NA", {
expect_identical(as.logical(NA_integer64_), NA)
expect_identical(as.integer(NA_integer64_), NA_integer_)
expect_identical(as.double(NA_integer64_), NA_real_)
expect_identical(as.character(NA_integer64_), NA_character_)
expect_identical(as.integer64(NA), NA_integer64_)
expect_identical(as.integer64(NA_integer_), NA_integer64_)
expect_identical(as.integer64(NA_real_), NA_integer64_)
expect_identical(as.integer64(NA_character_), NA_integer64_)
})
test_that("integer64 coercion to/from factor types works", {
i32 = 1:10
i64 = as.integer64(i32)
expect_identical(as.factor(i64), as.factor(i32))
expect_identical(as.ordered(i64), as.ordered(i32))
expect_identical(as.integer64(as.factor(11:20)), as.integer64(1:10))
expect_identical(as.integer64(as.ordered(11:20)), as.integer64(1:10))
})
test_that("integer64 coercion to/from time types works", {
posixct = Sys.time()
posixct = c(posixct, posixct + 100)
posix_delta = difftime(posixct + 1000, posixct)
expect_identical(
as.integer64(posix_delta),
as.integer64(as.integer(posix_delta))
)
# as.integer.difftime does not work with `units`
expect_identical(
as.integer64(posix_delta, units="secs"),
as.integer64(as.numeric(posix_delta, units="secs"))
)
expect_identical(
as.integer64(posix_delta, units="mins"),
as.integer64(as.numeric(posix_delta, units="mins"))
)
expect_identical(as.integer64(posixct), as.integer64(as.integer(posixct)))
# as.integer.POSIXlt does not work properly
expect_identical(
as.integer64(as.POSIXlt(posixct)),
as.integer64(as.numeric(as.POSIXlt(posixct)))
)
expect_identical(
as.integer64(as.Date(posixct)),
as.integer64(as.integer(as.Date(posixct)))
)
# S4 version
expect_identical(methods::as(posix_delta, "integer64"), as.integer64(posix_delta))
expect_identical(methods::as(posixct, "integer64"), as.integer64(posixct))
expect_identical(methods::as(as.POSIXlt(posixct), "integer64"), as.integer64(as.POSIXlt(posixct)))
expect_identical(methods::as(as.Date(posixct), "integer64"), as.integer64(as.Date(posixct)))
})
test_that("integer64 coercion from generic object works", {
x = structure(
as.integer64(1:10),
class=c("otherClass", "integer64"),
dim=c(2L, 5L),
dimnames=list(LETTERS[1:2], letters[1:5]),
otherAttr="some other attribute"
)
expect_identical(as.integer64(x), as.integer64(1:10))
})
test_that("integer64 coercion to/from other types work for R >=4.0.0", {
skip_unless_r(">= 4.0.0")
# Strange behavior due to British Standard Time, as observed e.g. on r-universe runners (#233)
# Possibly an R bug: https://stat.ethz.ch/pipermail/r-devel/2026-January/084326.html
# See also https://github.com/r-lib/waldo/issues/230 to allow dropping 'else FALSE'
ignore_attr = if ("BST" %in% attr(as.POSIXlt(0), "tzone")) "tzone" else FALSE
# from integer64
i32 = 1:10
i64 = as.integer64(i32)
expect_identical(as.complex(i64), as.complex(i32))
expect_identical(as.raw(i64), as.raw(i32))
expect_identical(methods::as(as.integer64(1:10), "complex"), as.complex(1:10))
expect_identical(as.Date(i64), as.Date(as.numeric(i32)))
expect_identical(as.Date(i64, origin=10), as.Date(as.numeric(i32), origin=10))
expect_identical(as.POSIXct(i64), as.POSIXct(as.numeric(i32)))
expect_identical(as.POSIXct(i64, origin=10), as.POSIXct(as.numeric(i32), origin=10))
expect_identical(as.POSIXct(i64, tz="UTC", origin=10), as.POSIXct(as.numeric(i32), tz="UTC", origin=10))
expect_identical(as.POSIXct(i64, tz="CET", origin=10), as.POSIXct(as.numeric(i32), tz="CET", origin=10))
expect_identical(as.POSIXlt(i64), as.POSIXlt(i32), ignore_attr=ignore_attr)
expect_identical(as.POSIXlt(i64, origin=10), as.POSIXlt(i32, origin=10))
expect_identical(as.POSIXlt(i64, tz="UTC", origin=10), as.POSIXlt(i32, tz="UTC", origin=10))
expect_identical(as.POSIXlt(i64, tz="CET", origin=10), as.POSIXlt(i32, tz="CET", origin=10))
expect_error(as.difftime(i32), "need explicit units for numeric conversion", fixed=TRUE)
expect_error(as.difftime(i64), "need explicit units for numeric conversion", fixed=TRUE)
expect_identical(as.difftime(i64, units="secs"), as.difftime(i32, units="secs"))
# S4 version
expect_identical(methods::as(as.integer64(1:10), "raw"), as.raw(1:10))
expect_identical(methods::as(as.integer64(1:10), "difftime"), as.difftime(1:10, units="secs"))
expect_identical(methods::as(as.integer64(1:10), "POSIXct"), as.POSIXct(as.numeric(1:10)))
expect_identical(methods::as(as.integer64(1:10), "POSIXlt"), as.POSIXlt(1:10), ignore_attr=ignore_attr)
expect_identical(methods::as(as.integer64(1:10), "Date"), as.Date(as.numeric(1:10)))
})
test_that("integer64 coercion from character works for numbers near +/- 2^63", {
expect_identical(
as.character(as.integer64(c("-9223372036854775807", "-9223372036854775806", "9223372036854775806", "9223372036854775807", ""))),
c("-9223372036854775807", "-9223372036854775806", "9223372036854775806", "9223372036854775807", NA)
)
})
test_that("Conversion from hex is supported", {
expect_identical(
as.integer64(c("0x1", "0xF", "0x7FFFFFFFFFFFFFFF", "-0x1", "-0xF", "-0x7FFFFFFFFFFFFFFF", "0x0")),
as.integer64(c(1, 15, "9223372036854775807", -1, -15, "-9223372036854775807", 0))
)
})
test_that("as.integer64 can trim whitespace", {
expect_identical(as.integer64(" 123 "), as.integer64("123"))
expect_identical(as.integer64(" 123"), as.integer64("123"))
expect_identical(as.integer64("123 "), as.integer64("123"))
expect_identical(as.integer64(c(" 1", "2 ", " 3 ")), as.integer64(1:3))
expect_identical(as.integer64(" 0xAAA "), as.integer64("0xAAA"))
expect_identical(as.integer64(" 0xBBB"), as.integer64("0xBBB"))
expect_identical(as.integer64("0xCCC "), as.integer64("0xCCC"))
expect_identical(as.integer64(c(" 0x1", "0x2 ", " 0x3 ")), as.integer64(c("0x1", "0x2", "0x3")))
})
with_parameters_test_that(
"base-10 edge cases return missing",
expect_warning(
expect_identical(as.integer64(string), rep(NA_integer64_, length(string))),
"NAs introduced by coercion to integer64 range", fixed=TRUE
),
string = list(
strrep("9", 63L),
"9223372036854775808",
"-9223372036854775808",
"999x",
"-999x",
c("9223372036854775809", "-9223372036854775809") # vector case from #175
)
)
with_parameters_test_that(
"hex edge cases return missing",
expect_warning(
expect_identical(as.integer64(string), NA_integer64_),
"NAs introduced by coercion to integer64 range", fixed=TRUE
),
string = c(
"-0x8000000000000000",
"0x8000000000000000",
"0x",
"-0x",
"0xx",
" 0x",
"0x ",
"0x0Z"
)
)
test_that("as.integer64.double handles 2^63", {
expect_warning(
expect_identical(as.integer64(2^63), NA_integer64_),
"NAs produced by integer64 overflow"
)
})
test_that("S3 class basics work", {
x = as.integer64(1:10)
expect_s3_class(x, "integer64")
expect_true(is.integer64(x))
length(x) = 11L
expect_length(x, 11L)
expect_identical(x[11L], as.integer64(0L))
})
test_that("indexing works: [<-", {
x = as.integer64(1:10)
x_updated = as.integer64(c(2:3, 3:10))
local({
x[1.0] = 2.0
x[2L] = 3L
expect_identical(x, x_updated)
})
local({
x[1.0] = 2L
x[2L] = 3.0
expect_identical(x, x_updated)
})
local({
x[1.0] = 2L
x[2L] = 3.0 + 0.0i
expect_identical(x, as.complex(c(2:3, 3:10)))
})
# TODO(#44): remove this deprecated test
local({
x[1.0] = 2L
x[2L] = "3"
expect_identical(x, x_updated)
})
local({
# TODO(#44): remove the option
withr::local_options(list(bit64.promoteInteger64ToCharacter=TRUE))
x[1.0] = 2L
x[2L] = "3"
expect_identical(x, as.character(c(2:3, 3:10)))
})
# local writes didn't edit 'x'
expect_identical(x[1L], as.integer64(1L))
expect_identical(x[[2L]], as.integer64(2L))
})
test_that("indexing works: [[<-", {
x = as.integer64(1:10)
x_updated = as.integer64(c(3:4, 3:10))
local({
x[[1.0]] = 3.0
x[[2L]] = 4L
expect_identical(x, x_updated)
})
local({
x[[1.0]] = 3L
x[[2L]] = 4.0
expect_identical(x, x_updated)
})
local({
x[[1.0]] = 3L
x[[2L]] = 4.0 + 0.0i
expect_identical(x, as.complex(c(3:4, 3:10)))
})
# TODO(#44): remove this deprecated test
local({
x[[1.0]] = 3L
x[[2L]] = "4"
expect_identical(x, x_updated)
})
local({
# TODO(#44): remove `withr::local_options`
withr::local_options(list(bit64.promoteInteger64ToCharacter=TRUE))
x[[1.0]] = 3L
x[[2L]] = "4"
expect_identical(x, as.character(c(3:4, 3:10)))
})
# local writes didn't edit 'x'
expect_identical(x[1L], as.integer64(1L))
expect_identical(x[[2L]], as.integer64(2L))
})
test_that("indexing works: get", {
x = as.integer64(1:10)
names(x) = letters[1:10]
expect_identical(x[c("b", "c")], x[2:3])
expect_identical(x[["d"]], x[[4L]])
expect_no_warning(expect_identical(integer64()[integer()], integer64()))
expect_no_warning(expect_identical(structure(as.integer64(1L), dim=1L)[1L], as.integer64(1L)))
expect_no_warning(expect_identical(as.integer64(1L)[NA_integer_], NA_integer64_))
expect_no_warning(expect_identical(as.integer64(1L)[NA_integer64_], NA_integer64_))
})
test_that("arithmetic & basic math works", {
x = as.integer64(1:10)
y = as.integer64(10:1)
expect_identical(sign(x - 6L), as.integer64(rep(c(-1L, 0L, 1L), c(5L, 1L, 4L))))
expect_identical(abs(x - 6.0), as.integer64(c(5:0, 1:4)))
expect_identical(sqrt(as.integer64(c(0L, 1L, 4L, 9L))), as.numeric(0:3))
expect_identical(log(x), log(as.numeric(x)))
expect_identical(log(as.integer64(c(1L, 2L, 4L, 8L)), base=2L), as.numeric(0:3))
expect_identical(log2(as.integer64(c(1L, 2L, 4L, 8L))), as.numeric(0:3))
expect_identical(log10(as.integer64(c(1L, 10L, 100L, 1000L))), as.numeric(0:3), tolerance=1e-7)
expect_identical(trunc(x), x)
expect_identical(floor(x), x)
expect_identical(ceiling(x), x)
expect_identical(signif(x), x)
expect_identical(round(x), x)
expect_identical(round(x, -1L), as.integer64(rep(c(0L, 10L), each=5L)))
})
test_that("basic statistics work", {
x = as.integer64(1:10)
expect_identical(sum(x), as.integer64(55L))
expect_identical(sum(x, x), as.integer64(110L))
expect_identical(prod(x), as.integer64(factorial(10L)))
expect_identical(prod(x[1:5], x[6:10]), as.integer64(factorial(10L)))
expect_identical(diff(x), as.integer64(rep(1L, 9L)))
expect_identical(cummin(x), as.integer64(rep(1L, 10L)))
expect_identical(cummax(x), x)
expect_identical(cumsum(x), as.integer64(choose(2:11, 2L)))
expect_identical(cumprod(x), as.integer64(factorial(1:10)))
})
test_that("min, max, and range work", {
x = as.integer64(1:10)
expect_identical(min(x), x[1L])
expect_identical(max(x), x[10L])
expect_identical(range(x), x[c(1L, 10L)])
expect_identical(min(x, as.integer64(0L), as.integer64(11L)), as.integer64(0L))
expect_identical(max(x, as.integer64(0L), as.integer64(11L)), as.integer64(11L))
expect_identical(range(x, as.integer64(0L), as.integer64(11L)), as.integer64(c(0L, 11L)))
expect_identical(range(x, NA_integer64_, finite=TRUE), x[c(1L, 10L)])
expect_identical(min(x, integer64()), x[1L])
expect_identical(max(x, integer64()), x[10L])
expect_identical(range(x, integer64()), x[c(1L, 10L)])
expect_identical(min(x, integer64(), na.rm=TRUE), x[1L])
expect_identical(max(x, integer64(), na.rm=TRUE), x[10L])
expect_identical(range(x, integer64(), na.rm=TRUE), x[c(1L, 10L)])
})
test_that("min, max, and range work in edge cases", {
expect_warning(
expect_identical(min(integer64()), lim.integer64()[2L]),
"no non-NA value"
)
expect_warning(
expect_identical(max(integer64()), lim.integer64()[1L]),
"no non-NA value"
)
expect_warning(
expect_identical(range(integer64()), lim.integer64()[2:1]),
"no non-NA value"
)
expect_warning(
expect_identical(min(integer64(), na.rm=TRUE), lim.integer64()[2L]),
"no non-NA value"
)
expect_warning(
expect_identical(max(integer64(), na.rm=TRUE), lim.integer64()[1L]),
"no non-NA value"
)
expect_warning(
expect_identical(range(integer64(), na.rm=TRUE), lim.integer64()[2:1]),
"no non-NA value"
)
expect_no_warning(
expect_identical(min(lim.integer64()[2L]), lim.integer64()[2L])
)
expect_no_warning(
expect_identical(max(lim.integer64()[1L]), lim.integer64()[1L])
)
expect_no_warning(
expect_identical(range(lim.integer64()), lim.integer64())
)
expect_no_warning(
expect_identical(min(lim.integer64()[2L], NA_integer64_, na.rm=TRUE), lim.integer64()[2L])
)
expect_no_warning(
expect_identical(max(lim.integer64()[1L], NA_integer64_, na.rm=TRUE), lim.integer64()[1L])
)
expect_no_warning(
expect_identical(range(lim.integer64(), NA_integer64_, na.rm=TRUE), lim.integer64())
)
expect_no_warning(
expect_identical(min(integer64(), NA_integer64_), NA_integer64_)
)
expect_no_warning(
expect_identical(max(integer64(), NA_integer64_), NA_integer64_)
)
expect_no_warning(
expect_identical(range(integer64(), NA_integer64_), rep(NA_integer64_, 2L))
)
expect_warning(
expect_identical(min(integer64(), NA_integer64_, na.rm=TRUE), lim.integer64()[2L]),
"no non-NA value"
)
expect_warning(
expect_identical(max(integer64(), NA_integer64_, na.rm=TRUE), lim.integer64()[1L]),
"no non-NA value"
)
expect_warning(
expect_identical(range(integer64(), NA_integer64_, na.rm=TRUE), lim.integer64()[2:1]),
"no non-NA value"
)
expect_no_warning(
expect_identical(min(integer64(1), NA_integer64_), NA_integer64_)
)
expect_no_warning(
expect_identical(max(integer64(1), NA_integer64_), NA_integer64_)
)
expect_no_warning(
expect_identical(range(integer64(1), NA_integer64_), rep(NA_integer64_, 2L))
)
expect_no_warning(
expect_identical(min(integer64(1), NA_integer64_, na.rm=TRUE), as.integer64(0L))
)
expect_no_warning(
expect_identical(max(integer64(1), NA_integer64_, na.rm=TRUE), as.integer64(0L))
)
expect_no_warning(
expect_identical(range(integer64(1), NA_integer64_, na.rm=TRUE), rep(as.integer64(0L), 2L))
)
expect_no_warning(
expect_identical(min(integer64(1), integer64(), NA_integer64_), NA_integer64_)
)
expect_no_warning(
expect_identical(max(integer64(1), integer64(), NA_integer64_), NA_integer64_)
)
expect_no_warning(
expect_identical(range(integer64(1), integer64(), NA_integer64_), rep(NA_integer64_, 2L))
)
expect_no_warning(
expect_identical(min(integer64(1), integer64(), NA_integer64_, na.rm=TRUE), as.integer64(0L))
)
expect_no_warning(
expect_identical(max(integer64(1), integer64(), NA_integer64_, na.rm=TRUE), as.integer64(0L))
)
expect_no_warning(
expect_identical(range(integer64(1), integer64(), NA_integer64_, na.rm=TRUE), rep(as.integer64(0L), 2L))
)
expect_no_warning(
expect_identical(min(integer64(1), integer64()), as.integer64(0L))
)
expect_no_warning(
expect_identical(max(integer64(1), integer64()), as.integer64(0L))
)
expect_no_warning(
expect_identical(range(integer64(1), integer64()), as.integer64(c(0L, 0L)))
)
expect_no_warning(
expect_identical(min(integer64(1), integer64(), na.rm=TRUE), as.integer64(0L))
)
expect_no_warning(
expect_identical(max(integer64(1), integer64(), na.rm=TRUE), as.integer64(0L))
)
expect_no_warning(
expect_identical(range(integer64(1), integer64(), na.rm=TRUE), rep(as.integer64(0L), 2L))
)
})
test_that("display methods work", {
x = as.integer64(1:3)
expect_identical(format(x), as.character(1:3))
expect_output(print(x), "integer64.*\\s*1\\s*2\\s*3")
expect_output(print(x[0L]), "integer64(0)", fixed=TRUE)
expect_output(str(x), "integer64 [1:3] 1 2 3", fixed=TRUE)
})
test_that("vector builders of integer64 work", {
x = as.integer64(1:3)
expect_identical(c(x, FALSE), as.integer64(c(1:3, 0L)))
expect_identical(c(x, 4:6), as.integer64(1:6))
expect_identical(c(x, 4.0, 5.0, 6.0), as.integer64(1:6))
expect_identical(c(x, as.integer64(4:6)), as.integer64(1:6))
expect_identical(cbind(x, FALSE), matrix64(c(1:3, 0L, 0L, 0L), nrow=3L, ncol=2L, dimnames=list(NULL, c("x", ""))))
expect_identical(cbind(x, 4:6), matrix64(1:6, nrow=3L, ncol=2L, dimnames=list(NULL, c("x", ""))))
expect_identical(cbind(x, 0.0), matrix64(c(1:3, 0L, 0L, 0L), nrow=3L, ncol=2L, dimnames=list(NULL, c("x", ""))))
expect_identical(cbind(x, as.integer64(4:6)), matrix64(1:6, nrow=3L, ncol=2L, dimnames=list(NULL, c("x", ""))))
expect_identical(rbind(x, FALSE), matrix64(c(1:3, 0L, 0L, 0L), nrow=2L, ncol=3L, byrow=TRUE, dimnames=list(c("x", ""), NULL)))
expect_identical(rbind(x, 4:6), matrix64(1:6, nrow=2L, ncol=3L, byrow=TRUE, dimnames=list(c("x", ""), NULL)))
expect_identical(rbind(x, 0.0), matrix64(c(1:3, 0L, 0L, 0L), nrow=2L, ncol=3L, byrow=TRUE, dimnames=list(c("x", ""), NULL)))
expect_identical(rbind(x, as.integer64(4:6)), matrix64(1:6, nrow=2L, ncol=3L, byrow=TRUE, dimnames=list(c("x", ""), NULL)))
expect_identical(rep(x, 2L), c(x, x))
expect_identical(rep(x, each=2L), as.integer64(c(1L, 1L, 2L, 2L, 3L, 3L)))
expect_identical(x[1L]:x[3L], x)
expect_identical(x[3L]:x[1L], x[3:1]) # rev() a separate method
})
with_parameters_test_that(
"seq method works analogously to integer: 1 argument (except along.with);",
{
n64 = as.integer64(n)
expect_identical(seq(n64), as.integer64(seq(n)))
expect_identical(seq(from=n64), as.integer64(seq(from=n)))
expect_identical(seq(to=n64), as.integer64(seq(to=n)))
expect_identical(seq(by=n64), as.integer64(seq(by=n)))
if (n < 0L) {
expect_error(seq(length.out=n64), "'length.out' must be a non-negative number")
} else {
expect_identical(seq(length.out=n64), as.integer64(seq(length.out=n)))
}
},
n = c(0L, 5L, -1L)
)
with_parameters_test_that(
"seq method works analogously to integer: 2 arguments (except along.with)",
{
# be sure to coerce (truncate) consistently across actual/expected
n1_32 = as.integer(n1)
n2_32 = as.integer(n2)
n1_64 = as.integer64(n1)
n2_64 = as.integer64(n2)
# TODO(#211): restore parity to seq() here
if (n2 %% 1L == 0L) expect_identical(seq(n1_64, n2), as.integer64(seq(n1_32, n2)))
expect_identical(seq(n1_64, n2_64), as.integer64(seq(n1_32, n2_32)))
if (n2 == 0L) {
err_msg = "invalid '(to - from)/by'"
expect_error(seq(n1_64, by=n2), err_msg, fixed=TRUE)
expect_error(seq(to=n1_64, by=n2), err_msg, fixed=TRUE)
} else if (sign(1L - n1) == sign(n2)) {
if (n2 %% 1L == 0L) expect_identical(seq(n1_64, by=n2), as.integer64(seq(n1, by=n2)))
expect_identical(seq(n1_64, by=n2_64), as.integer64(seq(n1, by=n2_32)))
expect_error(seq(to=n1_64, by=n2), "wrong sign in 'by' argument", fixed=TRUE)
} else {
expect_error(seq(n1_64, by=n2), "wrong sign in 'by' argument", fixed=TRUE)
# TODO(#211): restore parity to seq() here
if (n2 %% 1L == 0L) expect_identical(seq(to=n1_64, by=n2), as.integer64(seq(to=n1, by=n2)))
expect_identical(seq(to=n1_64, by=n2_64), as.integer64(seq(to=n1, by=n2_32)))
}
if (n2 >= 0L) {
expect_identical(seq(n1_64, length.out=n2), as.integer64(seq(n1_32, length.out=n2)))
expect_identical(seq(n1_64, length.out=n2_64), as.integer64(seq(n1_32, length.out=n2_32)))
expect_identical(seq(to=n1_64, length.out=n2), as.integer64(seq(to=n1_32, length.out=n2)))
expect_identical(seq(to=n1_64, length.out=n2_64), as.integer64(seq(to=n1_32, length.out=n2_32)))
expect_identical(seq(by=n1_64, length.out=n2), as.integer64(seq(by=n1_32, length.out=n2)))
expect_identical(seq(by=n1_64, length.out=n2_64), as.integer64(seq(by=n1_32, length.out=n2_32)))
} else {
err_msg = "'length.out' must be a non-negative number"
expect_error(seq(n1_64, length.out=n2), err_msg, fixed=TRUE)
expect_error(seq(to=n1_64, length.out=n2), err_msg, fixed=TRUE)
expect_error(seq(by=n1_64, length.out=n2), err_msg, fixed=TRUE)
}
},
.cases = expand.grid(n1=c(0L, 5L, -1L), n2=c(0.0, 5.0, -1.0, 1.5))
)
with_parameters_test_that(
"seq method works analogously to integer: 3 arguments (except along.with)",
{
# be sure to coerce (truncate) consistently across actual/expected
n1_32 = as.integer(n1)
n2_32 = as.integer(n2)
n3_32 = as.integer(n3)
n1_64 = as.integer64(n1)
n2_64 = as.integer64(n2)
n3_64 = as.integer64(n3)
# TODO(#211): restore parity to seq() here
if (n2 == n1 || sign(n2 - n1) == sign(n3)) {
# TODO(#211): restore parity to seq() here
if (n2 %% 1L == 0L && n3 %% 1L == 0L) {
expect_identical(seq(n1_64, n2, by=n3), as.integer64(seq(n1_32, n2, by=n3)))
expect_identical(seq(n1_64, n2_64, by=n3), as.integer64(seq(n1_32, n2_32, by=n3)))
expect_identical(seq(n1_64, n2, by=n3_64), as.integer64(seq(n1_32, n2, by=n3_32)))
expect_identical(seq(n1_64, n2_64, by=n3_64), as.integer64(seq(n1_32, n2_32, by=n3_32)))
}
} else {
err_msg <- if (n3 == 0L) "invalid '(to - from)/by'" else "wrong sign in 'by' argument"
expect_error(seq(n1_64, n2, by=n3), err_msg, fixed=TRUE)
}
if (n3 < 0L) {
err_msg = "'length.out' must be a non-negative"
expect_error(seq(n1_64, n2, length.out=n3), err_msg, fixed=TRUE)
expect_error(seq(n1_64, by=n2, length.out=n3), err_msg, fixed=TRUE)
expect_error(seq(to=n1_64, by=n2, length.out=n3), err_msg, fixed=TRUE)
} else {
# TODO(#211): restore parity to seq() here
if (((n2 - n1) / (n3 - 1L)) %% 1L == 0L) {
expect_identical(seq(n1_64, n2, length.out=n3), as.integer64(seq(n1_32, n2, length.out=n3)))
expect_identical(seq(n1_64, n2_64, length.out=n3), as.integer64(seq(n1_32, n2_32, length.out=n3)))
expect_identical(seq(n1_64, n2, length.out=n3_64), as.integer64(seq(n1_32, n2, length.out=n3_32)))
expect_identical(seq(n1_64, n2_64, length.out=n3_64), as.integer64(seq(n1_32, n2_32, length.out=n3_32)))
}
# TODO(#211): restore parity to seq() here
if (n2 %% 1L == 0L) {
expect_identical(seq(n1_64, by=n2, length.out=n3), as.integer64(seq(n1_32, by=n2, length.out=n3)))
expect_identical(seq(n1_64, by=n2_64, length.out=n3), as.integer64(seq(n1_32, by=n2_32, length.out=n3)))
expect_identical(seq(n1_64, by=n2, length.out=n3_64), as.integer64(seq(n1_32, by=n2, length.out=n3_32)))
expect_identical(seq(n1_64, by=n2_64, length.out=n3_64), as.integer64(seq(n1_32, by=n2_32, length.out=n3_32)))
expect_identical(seq(to=n1_64, by=n2, length.out=n3), as.integer64(seq(to=n1_32, by=n2, length.out=n3)))
expect_identical(seq(to=n1_64, by=n2_64, length.out=n3), as.integer64(seq(to=n1_32, by=n2_32, length.out=n3)))
expect_identical(seq(to=n1_64, by=n2, length.out=n3_64), as.integer64(seq(to=n1_32, by=n2, length.out=n3_32)))
expect_identical(seq(to=n1_64, by=n2_64, length.out=n3_64), as.integer64(seq(to=n1_32, by=n2_32, length.out=n3_32)))
}
}
},
.cases = expand.grid(n1=c(0L, 5L, -1L), n2=c(0.0, 5.0, -1.0, 1.5), n3=c(0.0, 5.0, -1.0, 1.5))
)
test_that("seq method works analogously to integer: 4 arguments", {
n = as.integer64(5L)
expect_error(seq(n, n, by=n, length.out=n), "too many arguments")
expect_error(seq(n, n, by=n, along.with=n), "too many arguments")
})
test_that("seq() works back-compatibly w.r.t. mixed integer+double inputs", {
one = as.integer64(1L)
expect_identical(seq(one, 10L, by=1.5), as.integer64(1:10))
expect_identical(seq(to=one, from=10L, by=-1.5), as.integer64(10:1))
expect_identical(seq(one, 10L, by=10.0/3.0), as.integer64(c(1L, 4L, 7L, 10L)))
expect_identical(seq(to=one, from=10L, by=-10.0/3.0), as.integer64(c(10L, 7L, 4L, 1L)))
expect_error(seq(one, 10L, by=0.1), "invalid '(to - from)/by'", fixed=TRUE)
expect_error(seq(to=one, from=10L, by=-0.1), "invalid '(to - from)/by'", fixed=TRUE)
expect_identical(seq(one, 2.5), as.integer64(1:2))
expect_identical(seq(to=one, from=2.5), as.integer64(2:1))
expect_identical(seq(one, 5.5, by=1.5), as.integer64(1:5))
expect_identical(seq(to=one, from=5.5, by=-1.5), as.integer64(5:1))
})
# These tests were previously kept as tests under \examples{\dontshow{...}}.
# Converted to "proper" unit tests for clarity, after making them more
# canonical within {testthat}, e.g. better capturing expected warnings,
# changing stopifnot(identical(...)) to expect_identical(...).
local({
i <- -999:999
with_parameters_test_that(
"Old \\dontshow{} tests in ?format.integer64 continue working",
{
r <- as.integer64(round(as.integer(i), s))
r64 <- round(as.integer64(i), s)
expect_identical(r, r64)
},
s = -3:3,
.interpret_glue = FALSE
)
})
test_that("Old \\dontshow{} tests in ?extract.replace.integer64 continue working", {
r <- c(runif64(1000L, lim.integer64()[1L], lim.integer64()[2L]), NA, -2:2)
expect_identical(r, as.integer64(as.bitstring(r)))
})
test_that("empty inputs give empty outputs for arithmetic", {
x = integer64(1L)
empty = integer64(0L)
expect_identical(log(x, base=empty), double())
expect_identical(log(empty, base=x), double())
expect_identical(
log(`attr<-`(empty, "asdf", "jkl")),
`attr<-`(double(), "asdf", "jkl")
)
})
test_that("all.equal.integer64 reflects changes for vector scale= from all.equal.numeric", {
# same test as for base R, multiplied by 1000 so the inputs are all integer64
expect_identical(
all.equal(
as.integer64(c(1000L, 1000L)),
as.integer64(c(1010L, 1010L)),
scale = c(10.0, 10.0)
),
"Mean scaled difference: 1"
)
# same test as for base R, multiplied by 1e9
one_e9 = as.integer64(1000000000L)
expect_true(all.equal(
rep(one_e9, 5L),
one_e9 + (-1L:3), # TODO(r-lib/lintr#): no 'L'
scale = (1:5)*one_e9
))
})
test_that("all.equal works", {
x = y = as.integer64(1L)
expect_true(all.equal(x, x))
class(y) = c("xx", "integer64")
expect_match(all.equal(x, y), "target is integer64, current is xx", fixed=TRUE, all=FALSE)
expect_match(all.equal(x[0L], x[1L]), "integer64: lengths.*differ", all=FALSE)
class(y) = "integer64"
attr(y, "xx") = "zz"
expect_match(all.equal(x, y), "Attributes", fixed=TRUE)
expect_no_match(
expect_match(all.equal(x[0L], y), "integer64: lengths.*differ", all=FALSE),
"Lengths:", fixed = TRUE
)
y = NA_integer64_
expect_match(all.equal(x, y), "'is.NA' value mismatch", fixed=TRUE)
x = as.integer64(1000000000L)
expect_true(all.equal(x, x+1L))
expect_true(all.equal(x, x+1L, tolerance=1.0e9)) # forcing scale=1
expect_match(all.equal(x, x+100L), "Mean relative difference", fixed=TRUE)
expect_match(all.equal(x, x+1L, scale=1.0), "Mean absolute difference", fixed=TRUE)
})
test_that("anyNA method", {
expect_identical(anyNA(as.integer64(c(1L, 1L))), anyNA(c(1L, 1L)))
expect_identical(anyNA(as.integer64(c(1L, NA))), anyNA(c(1L, NA)))
expect_identical(anyNA(as.integer64(c(NA, NA))), anyNA(c(NA, NA)))
expect_identical(anyNA(integer64()), anyNA(integer()))
})
test_that("match works with zero length input", {
x32 = 1:10
x64 = as.integer64(1:10)
expect_identical(match(x64, integer()), match(x32, integer()))
expect_identical(match(x64, integer(), nomatch=NULL), match(x32, integer(), nomatch=NULL))
expect_identical(match(x64, integer(), nomatch=integer()), match(x32, integer(), nomatch=integer()))
expect_identical(match(x64, integer(), nomatch=10L), match(x32, integer(), nomatch=10L))
expect_identical(match(integer(), x64), match(integer(), x32))
})
test_that("factor and order for integer64 are still necessary", {
skip_unless_r(">= 4.1.0") # skip implementing "expect_failure" for ancient R
skip_on_cran()
skip_on_covr() # covr edits the function bodies
x = c(132724613L, -2143220989L, -1L, NA, 1L)
expect_failure(expect_identical(base::factor(as.integer64(x)), base::factor(x)))
expect_failure(expect_identical(factor(as.integer64(x)), base::factor(as.integer64(x))))
expect_identical(factor(as.integer64(x)), base::factor(x))
expect_identical(formals(factor), formals(base::factor))
expect_identical(formals(ordered), formals(base::ordered))
expect_identical(body(ordered), body(base::ordered))
})
with_parameters_test_that("factor and order work analogously to integer:", {
x = c(132724613L, -2143220989L, -1L, NA, 1L)
# test factor() for integer64 with short (< 4000) and long (>= 4000) vectors, because of the different code paths for the two cases
if (isTRUE(long_input))
x = rep_len(x, 5000L)
expect_identical(factor(as.integer64(x)), factor(x))
expect_identical(
tryCatch(factor(as.integer64(x), levels=levels, labels=labels, exclude=exclude, ordered=ordered), error=conditionMessage),
tryCatch(factor(x, levels=levels, labels=labels, exclude=exclude, ordered=ordered), error=conditionMessage)
)
if (isTRUE(ordered))
expect_identical(
tryCatch(ordered(as.integer64(x), levels=levels, labels=labels, exclude=exclude), error=conditionMessage),
tryCatch(ordered(x, levels=levels, labels=labels, exclude=exclude), error=conditionMessage)
)
},
.cases = expand.grid(
levels=I(list(NULL, NA, 1L, c(-1L, 1L), "1")),
labels=I(list(levels, NULL, letters[1L], letters[1:2])),
exclude=I(list(NULL, NA, 1L, c(-1L, 1L))),
ordered=c(TRUE, FALSE),
long_input=c(FALSE, TRUE)
)
)
test_that("factor() overwrite doesn't oversample (#274)", {
expect_identical(
withr::with_seed(1, factor(sample(10))),
withr::with_seed(1, base::factor(sample(10)))
)
expected_result = withr::with_seed(1, base::factor(exclude = sample(1:10, 1L), sample(1:10)))
expect_identical(
withr::with_seed(1, factor(exclude = sample(1:10, 1L), sample(as.integer64(1:10)))),
expected_result
)
expect_identical(
withr::with_seed(1, factor(exclude = sample(1:10, 1L), sample(1:10))),
expected_result
)
expected_result = withr::with_seed(1, base::factor(sample(1:10), exclude = sample(1:10, 1L)))
expect_identical(
withr::with_seed(1, factor(sample(as.integer64(1:10)), exclude = sample(1:10, 1L))),
expected_result
)
expect_identical(
withr::with_seed(1, factor(sample(1:10), exclude = sample(1:10, 1L))),
expected_result
)
})
test_that("extraction works consistent to integer: vector[", {
x = 1:10
names(x) = letters[seq_along(x)]
y = as.integer64(x)
names(y) = letters[seq_along(y)]
sel = c(TRUE, FALSE, NA, TRUE)
expect_identical(y[sel], setNames(as.integer64(x[sel]), names(x)[sel]))
sel = c(1L, NA, 3L, 11L)
expect_identical(y[sel], setNames(as.integer64(x[sel]), names(x)[sel]))
sel = c(1, NA, 3, 11)
expect_identical(y[sel], setNames(as.integer64(x[sel]), names(x)[sel]))
expect_identical(y[as.integer64(sel)], setNames(as.integer64(x[sel]), names(x)[sel]))
sel = c(-1L, -3L, 0L, -11L)
expect_identical(y[sel], setNames(as.integer64(x[sel]), names(x)[sel]))
sel = c(-1, -3, 0, -11)
expect_identical(y[sel], setNames(as.integer64(x[sel]), names(x)[sel]))
# `only 0's may be mixed with negative subscripts`
sel = c(-1, -3, 0, -11, NA)
expect_same_error(x[sel], y[sel])
expect_identical(
as.integer64(c("9218868437227407266", "1"))[c(1,NA,3,4)],
as.integer64(c("9218868437227407266", NA, NA, NA))
)
sel = c("d", "", "b", NA_character_)
expect_identical(y[sel], setNames(as.integer64(x[sel]), names(x[sel])))
expect_identical(lapply(list(integer64()), `[`, 0L), list(integer64()))
getter = function(x, ...) x[...]
i64 = integer64(1)
names(i64) = "a"
expect_identical(getter(i64), i64)
expect_identical(getter(i64, 1L), i64)
expect_identical(getter(i64, "a"), i64)
i32 = integer(1)
names(i32) = "a"
expect_identical(getter(i32), i32)
expect_identical(getter(i32, 1L), i32)
expect_identical(getter(i32, "a"), i32)
l = list(integer(1L), integer(2L), integer(3L))
expect_identical(
lapply(l, getter, 1L),
list(integer(1L), integer(1L), integer(1L))
)
})
test_that("replacement works consistent to integer: vector[<-", {
x = as.integer(1:10)
names(x) = letters[seq_along(x)]
y = as.integer64(x)
names(y) = letters[seq_along(y)]
sel = c("d", "", "b", NA_character_)
x[sel] = 100L
y[sel] = 100L
expect_identical(y, setNames(as.integer64(x), names(x)))
})
test_that("extraction works consistent to integer: vector[[", {
x = as.integer(1:10)
names(x) = letters[seq_along(x)]
y = as.integer64(x)
names(y) = letters[seq_along(y)]
expect_identical(y[[3]], as.integer64(x[[3]]))
expect_identical(y[["d"]], as.integer64(x[["d"]]))
})
test_that("replacement works consistent to integer: vector[[<-", {
x = as.integer(1:10)
names(x) = letters[seq_along(x)]
y = as.integer64(x)
names(y) = letters[seq_along(y)]
x[["e"]] = 100L
y[["e"]] = 100L
expect_identical(y, setNames(as.integer64(x), names(x)))
})
test_that("extraction works consistent to integer: matrix[", {
m32 = matrix(1:10, nrow=2L)
m64 = matrix64(as.integer64(m32), nrow=dim(m32)[1L], ncol=dim(m32)[2L])
expect_identical(m32[integer(), 1:2, drop=TRUE], structure(integer(), dim=c(0L, 2L)))
expect_identical(m64[integer(), 1:2, drop=TRUE], structure(integer64(), dim=c(0L, 2L)))
expect_identical(m32[1:2, integer(), drop=TRUE], structure(integer(), dim=c(2L, 0L)))
expect_identical(m64[1:2, integer(), drop=TRUE], structure(integer64(), dim=c(2L, 0L)))
expect_identical(m32[integer(), 1:2, drop=FALSE], structure(integer(), dim=c(0L, 2L)))
expect_identical(m64[integer(), 1:2, drop=FALSE], structure(integer64(), dim=c(0L, 2L)))
expect_identical(m32[1:2, integer(), drop=FALSE], structure(integer(), dim=c(2L, 0L)))
expect_identical(m64[1:2, integer(), drop=FALSE], structure(integer64(), dim=c(2L, 0L)))
expect_identical(m32[1:2, 1:3, drop=TRUE], structure(1:6, dim=c(2L, 3L)))
expect_identical(m64[1:2, 1:3, drop=TRUE], structure(as.integer64(1:6), dim=c(2L, 3L)))
expect_identical(m32[1:2], 1:2)
expect_identical(m64[1:2], as.integer64(1:2))
expect_identical(m32[1:2, drop=TRUE], 1:2)
expect_identical(m64[1:2, drop=TRUE], as.integer64(1:2))
expect_identical(m32[j = 1:3, drop=TRUE], 1:3)
expect_identical(m64[j = 1:3, drop=TRUE], as.integer64(1:3))
expect_identical(m32[1:2, , drop=TRUE], structure(as.integer(1:10), dim=c(2L, 5L)))
expect_identical(m64[1:2, , drop=TRUE], structure(as.integer64(1:10), dim=c(2L, 5L)))
expect_identical(m32[, 1:3, drop=TRUE], structure(as.integer(1:6), dim=c(2L, 3L)))
expect_identical(m64[, 1:3, drop=TRUE], structure(as.integer64(1:6), dim=c(2L, 3L)))
expect_identical(m32[1, , drop=TRUE], c(1L, 3L, 5L, 7L, 9L))
expect_identical(m64[1, , drop=TRUE], as.integer64(c(1L, 3L, 5L, 7L, 9L)))
expect_identical(m32[1, , drop=FALSE], structure(c(1L, 3L, 5L, 7L, 9L), dim=c(1L, 5L)))
expect_identical(m64[1, , drop=FALSE], structure(as.integer64(c(1L, 3L, 5L, 7L, 9L)), dim=c(1L, 5L)))
expect_identical(m32[, 1, drop=TRUE], 1:2)
expect_identical(m64[, 1, drop=TRUE], as.integer64(1:2))
expect_identical(m32[, 1, drop=FALSE], structure(1:2, dim=2:1))
expect_identical(m64[, 1, drop=FALSE], structure(as.integer64(1:2), dim=2:1))
expect_identical(m32[c(9, NA, 11, 12), drop=FALSE], c(9L, NA, NA, NA))
expect_identical(m64[c(9, NA, 11, 12), drop=FALSE], as.integer64(c(9L, NA, NA, NA)))
expect_identical(m32[integer(), c(1:2, 0, NA), drop=TRUE], structure(integer(), dim=c(0L, 3L)))
expect_identical(m64[integer(), c(1:2, 0, NA), drop=TRUE], structure(integer64(), dim=c(0L, 3L)))
expect_identical(m64[integer64(), c(1:2, 0, NA), drop=TRUE], structure(integer64(), dim=c(0L, 3L)))
expect_identical(m32[, c(1:2, 0, NA), drop=TRUE], structure(c(1:4, NA, NA), dim=c(2L, 3L)))
expect_identical(m64[, c(1:2, 0, NA), drop=TRUE], structure(as.integer64(c(1:4, NA, NA)), dim=c(2L, 3L)))
expect_identical(m32[c(1, NA, 2), 1:3, drop=TRUE], structure(c(1L, NA, 2L, 3L, NA, 4L, 5L, NA, 6L), dim=c(3L, 3L)))
expect_identical(m64[c(1, NA, 2), 1:3, drop=TRUE], structure(as.integer64(c(1L, NA, 2L, 3L, NA, 4L, 5L, NA, 6L)), dim=c(3L, 3L)))
m32 = matrix(1:10, 2L, dimnames = list(LETTERS[1:2], letters[1:5]))
m64 = matrix64(as.integer64(1:10), nrow=2L, ncol=5L, dimnames = list(LETTERS[1:2], letters[1:5]))
# `subscript out of bounds`
expect_same_error(
m32[c("B", "D", "A"), c("d", "a")],
m64[c("B", "D", "A"), c("d", "a")]
)
expect_identical(m32[c("B", "D", "A")], rep(NA_integer_, 3L))
expect_identical(m64[c("B", "D", "A")], rep(NA_integer64_, 3L))
})
test_that("replacement works consistent to integer: matrix[<-", {
m32 = matrix(1:10, nrow=2L)
m64 = matrix64(as.integer64(m32), nrow=dim(m32)[1L], ncol=dim(m32)[2L])
local({
m32[1, c(1, 3, NA)] = 100L
m64[1, c(1, 3, NA)] = as.integer64(100L)
expect_identical(m64, structure(as.integer64(m32), dim=dim(m32), dimnames=dimnames(m32)))
})
local({
m32[1, c(1, 4, NA)] = 101L
m64[1, c(1, 4, NA)] = 101L
expect_identical(m64, structure(as.integer64(m32), dim=dim(m32), dimnames=dimnames(m32)))
})
local({
m32[1, c(1, 5, NA)] = 102
m64[1, c(1, 5, NA)] = 102
expect_identical(m64, structure(as.integer64(m32), dim=dim(m32), dimnames=dimnames(m32)))
})
local({
m32[1, c(1, 5, NA)] = 102.0 + 0.0i
m64[1, c(1, 5, NA)] = 102.0 + 0.0i
expect_identical(m64, m32)
})
# TODO(#44): remove this deprecated test
local({
m32[1, c(1, 3, NA)] = 103L
m64[1, c(1, 3, NA)] = "103"
expect_identical(m64, structure(as.integer64(m32), dim=dim(m32), dimnames=dimnames(m32)))
})
local({
# TODO(#44): remove `withr::local_options`
withr::local_options(list(bit64.promoteInteger64ToCharacter=TRUE))
m32[1, c(1, 3, NA)] = "103"
m64[1, c(1, 3, NA)] = "103"
expect_identical(m64, m32)
})
local({
m32[1, c(1, 3, NA)] = 101L
m64[1, as.integer64(c(1, 3, NA))] = 101L
expect_identical(m64, structure(as.integer64(m32), dim=dim(m32), dimnames=dimnames(m32)))
})
local({
m32[, -(1:3)] = 102L
m64[, -(1:3)] = 102L
expect_identical(m64, structure(as.integer64(m32), dim=dim(m32), dimnames=dimnames(m32)))
})
})
test_that("extraction works consistent to integer: matrix[[", {
m32 = matrix(1:10, 2L, dimnames = list(LETTERS[1:2], letters[1:5]))
m64 = matrix64(as.integer64(1:10), nrow=2L, ncol=5L, dimnames=list(LETTERS[1:2], letters[1:5]))
expect_identical(m64[[1, 2]], as.integer64(m32[[1, 2]]))
expect_identical(m64[[as.integer64(1L), as.integer64(2L)]], as.integer64(m32[[1, 2]]))
expect_identical(m64[["A", "d"]], as.integer64(m32[["A", "d"]]))
expect_identical(m64[[1]], as.integer64(m32[[1]]))
expect_identical(m64[[as.integer64(1L)]], as.integer64(m32[[1]]))
# `subscript out of bounds`
expect_same_error(m32[[NA]], m64[[NA]])
expect_same_error(m32[[NA]], m64[[NA_integer64_]])
# `attempt to select less than one element in integerOneIndex`
expect_same_error(m32[[0L]], m64[[0L]])
expect_same_error(m32[[0L]], m64[[as.integer64(0L)]])
# `attempt to select less than one element in get1index`
expect_same_error(m32[[integer()]], m64[[integer()]])
expect_same_error(m32[[integer()]], m64[[integer64()]])
})
test_that("replacement works consistent to integer: matrix[[<-", {
m32 = matrix(1:10, 2L, dimnames = list(LETTERS[1:2], letters[1:5]))
m64 = matrix64(as.integer64(1:10), nrow=2L, ncol=5L, dimnames=list(LETTERS[1:2], letters[1:5]))
local({
m32[[1, 3]] = 110L
m64[[1, 3]] = 110L
expect_identical(m64, structure(as.integer64(m32), dim=dim(m32), dimnames=dimnames(m32)))
})
local({
m32[["A", "e"]] = 112L
m64[["A", "e"]] = 112L
expect_identical(m64, structure(as.integer64(m32), dim=dim(m32), dimnames=dimnames(m32)))
})
local({
m32[[1, 3]] = 111
m64[[1, 3]] = 111
expect_identical(m64, structure(as.integer64(m32), dim=dim(m32), dimnames=dimnames(m32)))
})
local({
m32[[1, 3]] = 111.0 + 0.0i
m64[[1, 3]] = 111.0 + 0.0i
expect_identical(m64, m32)
})
# TODO(#44): remove this deprecated test
local({
m32[[1, 4]] = 112L
m64[[1, 4]] = "112"
expect_identical(m64, structure(as.integer64(m32), dim=dim(m32), dimnames=dimnames(m32)))
})
local({
# TODO(#44): remove `withr::local_options`
withr::local_options(list(bit64.promoteInteger64ToCharacter=TRUE))
m32[[1, 4]] = "112"
m64[[1, 4]] = "112"
expect_identical(m64, m32)
})
})
test_that("extraction consistent to integer: array[", {
a32 = array(1:27, c(3,3,3))
a64 = array64(as.integer64(1:27), c(3,3,3))
expect_identical(a32[2, , 3, drop=FALSE], structure(c(20L, 23L, 26L), dim = c(1L, 3L, 1L)))
expect_identical(a64[2, , 3, drop=FALSE], structure(as.integer64(c(20L, 23L, 26L)), dim = c(1L, 3L, 1L)))
expect_identical(a32[2, , 3, drop=TRUE], c(20L, 23L, 26L))
expect_identical(a64[2, , 3, drop=TRUE], as.integer64(c(20L, 23L, 26L)))
expect_identical(a32[1, c(1, 3, 2), 2:3, drop=TRUE], structure(c(10L, 16L, 13L, 19L, 25L, 22L), dim = 3:2))
expect_identical(a64[1, c(1, 3, 2), 2:3, drop=TRUE], structure(as.integer64(c(10L, 16L, 13L, 19L, 25L, 22L)), dim = 3:2))
expect_identical(a32[, c(1, 2, 0, 3, NA, 1), c(TRUE, FALSE, NA), drop=FALSE], structure(c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, NA, NA, NA, 1L, 2L, 3L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), dim = c(3L, 5L, 2L)))
expect_identical(a64[, c(1, 2, 0, 3, NA, 1), c(TRUE, FALSE, NA), drop=FALSE], structure(as.integer64(c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, NA, NA, NA, 1L, 2L, 3L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA)), dim = c(3L, 5L, 2L)))
expect_identical(a32[, c(1, 2, 0, 3, NA, 1), c(TRUE, FALSE, NA), drop=TRUE], structure(c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, NA, NA, NA, 1L, 2L, 3L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), dim = c(3L, 5L, 2L)))
expect_identical(a64[, c(1, 2, 0, 3, NA, 1), c(TRUE, FALSE, NA), drop=TRUE], structure(as.integer64(c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, NA, NA, NA, 1L, 2L, 3L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA)), dim = c(3L, 5L, 2L)))
expect_identical(a32[c(1, 0, 7, NA, 27, 28), drop=FALSE], c(1L, 7L, NA, 27L, NA))
expect_identical(a64[c(1, 0, 7, NA, 27, 28), drop=FALSE], as.integer64(c(1L, 7L, NA, 27L, NA)))
expect_identical(a32[c(TRUE, FALSE, NA, TRUE), drop=FALSE], c(1L, NA, 4L, 5L, NA, 8L, 9L, NA, 12L, 13L, NA, 16L, 17L, NA, 20L, 21L, NA, 24L, 25L, NA))
expect_identical(a64[c(TRUE, FALSE, NA, TRUE), drop=FALSE], as.integer64(c(1L, NA, 4L, 5L, NA, 8L, 9L, NA, 12L, 13L, NA, 16L, 17L, NA, 20L, 21L, NA, 24L, 25L, NA)))
expect_identical(a32[-1, , -c(0, 2:3), drop=FALSE], structure(c(2L, 3L, 5L, 6L, 8L, 9L), dim = c(2L, 3L, 1L)))
expect_identical(a64[-1, , -c(0, 2:3), drop=FALSE], structure(as.integer64(c(2L, 3L, 5L, 6L, 8L, 9L)), dim = c(2L, 3L, 1L)))
expect_identical(a32[-1, 2, -c(0, 2:3), drop=FALSE], structure(5:6, dim = c(2L, 1L, 1L)))
expect_identical(a64[-1, 2, -c(0, 2:3), drop=FALSE], structure(as.integer64(5:6), dim = c(2L, 1L, 1L)))
expect_identical(a32[-1, 2, -c(0, 2:3), drop=TRUE], 5:6)
expect_identical(a64[-1, 2, -c(0, 2:3), drop=TRUE], as.integer64(5:6))
})
test_that("extraction from subclass retains inheritance structure", {
x = as.integer64(1:2)
class(x) = c("subclass", "integer64")
expect_identical(x[1:2], x)
y = x
y[2L] = as.integer64(3L)
expect_identical(y, structure(unclass(as.integer64(c(1L, 3L))), class=class(x)))
x1 = x[[1L]]
expect_identical(x1, structure(unclass(x)[1L], class=class(x)))
y[[2L]] = as.integer64(4L)
expect_identical(y, structure(unclass(as.integer64(c(1L, 4L))), class=class(x)))
})
test_that("c works consistent to R", {
convert_x32_result_to_integer64 = function(x, x32=x, recursive=FALSE) {
if (isTRUE(recursive))
ret = as.integer64(x)
else
ret = lapply(seq_along(x), function(el) if (el <= length(x32)) as.integer64(x[[el]]) else x[[el]])
names(ret) = names(x)
ret
}
x32 = 1:10
x64 = as.integer64(x32)
expect_identical(c(A=integer64(), B=as.raw(x32)), convert_x32_result_to_integer64(c(A=integer(), B=as.raw(x32)), recursive=TRUE))
expect_identical(c(A=integer64(), B=as.logical(x32)), convert_x32_result_to_integer64(c(A=integer(), B=as.logical(x32)), recursive=TRUE))
expect_identical(c(A=integer64(), B=as.difftime(x32, units="secs")), convert_x32_result_to_integer64(c(A=integer(), B=as.difftime(x32, units="secs")), recursive=TRUE))
expect_identical(c(A=integer64(), B=as.POSIXct(x32, origin="2026-01-27")), convert_x32_result_to_integer64(c(A=integer(), B=as.POSIXct(x32, origin="2026-01-27")), recursive=TRUE))
expect_identical(c(A=integer64(), B=as.Date(x32, origin="2026-01-27")), convert_x32_result_to_integer64(c(A=integer(), B=as.Date(x32, origin="2026-01-27")), recursive=TRUE))
expect_identical(c(A=integer64(), B=as.factor(x32)), convert_x32_result_to_integer64(c(A=integer(), B=as.factor(x32)), recursive=TRUE))
expect_identical(c(A=integer64(), B=as.ordered(x32)), convert_x32_result_to_integer64(c(A=integer(), B=as.ordered(x32)), recursive=TRUE))
expect_identical(c(A=integer64(), B=as.double(x32)), convert_x32_result_to_integer64(c(A=integer(), B=as.double(x32)), recursive=TRUE))
expect_identical(c(A=integer64(), B=x32), convert_x32_result_to_integer64(c(A=integer(), B=x32), recursive=TRUE))
expect_identical(c(A=integer64(), B=as.complex(x32)), c(A=integer(), B=as.complex(x32)))
# TODO(#44): adjust tests accordingly
expect_identical(c(A=integer64(), B=as.character(x32)), convert_x32_result_to_integer64(c(A=integer(), B=as.character(x32)), recursive=TRUE))
withr::with_options(list(bit64.promoteInteger64ToCharacter=TRUE), {
expect_identical(c(A=integer64(), B=as.character(x32)), c(A=integer(), B=as.character(x32)))
})
expect_identical(c(A=x64, B=as.raw(x32)), convert_x32_result_to_integer64(c(A=x32, B=as.raw(x32)), recursive=TRUE))
expect_identical(c(A=x64, B=as.logical(x32)), convert_x32_result_to_integer64(c(A=x32, B=as.logical(x32)), recursive=TRUE))
expect_identical(c(A=x64, B=as.difftime(x32, units="secs")), convert_x32_result_to_integer64(c(A=x32, B=as.difftime(x32, units="secs")), recursive=TRUE))
expect_identical(c(A=x64, B=as.POSIXct(x32, origin="2026-01-27")), convert_x32_result_to_integer64(c(A=x32, B=as.POSIXct(x32, origin="2026-01-27")), recursive=TRUE))
expect_identical(c(A=x64, B=as.Date(x32, origin="2026-01-27")), convert_x32_result_to_integer64(c(A=x32, B=as.Date(x32, origin="2026-01-27")), recursive=TRUE))
expect_identical(c(A=x64, B=as.factor(x32)), convert_x32_result_to_integer64(c(A=x32, B=as.factor(x32)), recursive=TRUE))
expect_identical(c(A=x64, B=as.ordered(x32)), convert_x32_result_to_integer64(c(A=x32, B=as.ordered(x32)), recursive=TRUE))
expect_identical(c(A=x64, B=as.double(x32)), convert_x32_result_to_integer64(c(A=x32, B=as.double(x32)), recursive=TRUE))
expect_identical(c(A=x64, B=x32), convert_x32_result_to_integer64(c(A=x32, B=x32), recursive=TRUE))
expect_identical(c(A=x64, B=as.complex(x32)), c(A=x32, B=as.complex(x32)))
# TODO(#44): adjust tests accordingly
expect_identical(c(A=x64, B=as.character(x32)), convert_x32_result_to_integer64(c(A=x32, B=as.character(x32)), recursive=TRUE))
withr::with_options(list(bit64.promoteInteger64ToCharacter=TRUE), {
expect_identical(c(A=x64, B=as.character(x32)), c(A=x32, B=as.character(x32)))
})
# regarding lists
expect_identical(c(A=integer64(), B=list()), convert_x32_result_to_integer64(c(A=integer(), B=list()), integer()))
expect_identical(c(A=integer64(), B=list(), recursive=TRUE), convert_x32_result_to_integer64(c(A=integer64(), B=list(), recursive=TRUE), integer(), recursive=TRUE))
expect_identical(c(A=integer64(), B=list(), C=1:2), convert_x32_result_to_integer64(c(A=integer(), B=list(), C=1:2), integer()))
expect_identical(c(A=integer64(), B=list(), C=1:2, recursive=TRUE), convert_x32_result_to_integer64(c(A=integer(), B=list(), C=1:2, recursive=TRUE), integer(), recursive=TRUE))
expect_identical(c(A=x64, B=list()), convert_x32_result_to_integer64(c(A=x32, B=list()), x32))
expect_identical(c(A=x64, B=list(), recursive=TRUE), convert_x32_result_to_integer64(c(A=x32, B=list(), recursive=TRUE), x32, recursive=TRUE))
expect_identical(c(A=x64, B=list(), C=1:2), convert_x32_result_to_integer64(c(A=x32, B=list(), C=1:2), x32))
expect_identical(c(A=x64, B=list(), C=1:2, recursive=TRUE), convert_x32_result_to_integer64(c(A=x32, B=list(), C=1:2, recursive=TRUE), x32, recursive=TRUE))
expect_identical(c(A=x64, B=list(a=1:2, b=3, c="4")), convert_x32_result_to_integer64(c(A=x32, B=list(a=1:2, b=3, c="4")), x32))
# TODO(#44): adjust tests accordingly
expect_identical(c(A=x64, B=list(a=1:2, b=3, c="4"), recursive=TRUE), convert_x32_result_to_integer64(c(A=x32, B=list(a=1:2, b=3, c="4"), recursive=TRUE), x32, recursive=TRUE))
withr::with_options(list(bit64.promoteInteger64ToCharacter=TRUE), {
expect_identical(c(A=x64, B=list(a=1:2, b=3, c="4"), recursive=TRUE), c(A=x32, B=list(a=1:2, b=3, c="4"), recursive=TRUE))
})
expect_identical(c(A=x64, B=data.frame(a=1:2, b=3, c="4", stringsAsFactors=FALSE)), convert_x32_result_to_integer64(c(A=x32, B=data.frame(a=1:2, b=3, c="4", stringsAsFactors=FALSE)), x32))
# TODO(#44): adjust tests accordingly
expect_identical(c(A=x64, B=data.frame(a=1:2, b=3, c="4", stringsAsFactors=FALSE), recursive=TRUE), convert_x32_result_to_integer64(c(A=x32, B=data.frame(a=1:2, b=3, c="4", stringsAsFactors=FALSE), recursive=TRUE), x32, recursive=TRUE))
withr::with_options(list(bit64.promoteInteger64ToCharacter=TRUE), {
expect_identical(c(A=x64, B=data.frame(a=1:2, b=3, c="4", stringsAsFactors=FALSE), recursive=TRUE), c(A=x32, B=data.frame(a=1:2, b=3, c="4", stringsAsFactors=FALSE), recursive=TRUE))
})
expect_identical(c(x64, as.POSIXlt(x32, origin="2026-01-27")), convert_x32_result_to_integer64(c(x32, as.POSIXlt(x32, origin="2026-01-27")), x32))
if (getRversion() >= "4.0.0" ) # in my tests on R 3.5.0 this is identical
expect_identical(c(x64, as.POSIXlt(x32, origin="2026-01-27"), recursive=TRUE), c(x32, as.POSIXlt(x32, origin="2026-01-27"), recursive=TRUE))
expect_identical(
c(A=x64, B=list(aa=x64, bb=list(bba=x64, bbb=x32, bbc=as.character(x32))), C=data.frame(a=x64, b=x32)),
convert_x32_result_to_integer64(c(A=x32, B=list(aa=x64, bb=list(bba=x64, bbb=x32, bbc=as.character(x32))), C=data.frame(a=x64, b=x32)), x32)
)
# TODO(#44): adjust tests accordingly
expect_identical(
c(A=x64, B=list(aa=x64, bb=list(bba=x64, bbb=x32, bbc=as.character(x32))), C=data.frame(a=x64, b=x32), recursive=TRUE),
convert_x32_result_to_integer64(c(A=x32, B=list(aa=x32, bb=list(bba=x32, bbb=x32, bbc=as.character(x32))), C=data.frame(a=x32, b=x32), recursive=TRUE), recursive=TRUE)
)
withr::with_options(list(bit64.promoteInteger64ToCharacter=TRUE), {
expect_identical(
c(A=x64, B=list(aa=x64, bb=list(bba=x64, bbb=x32, bbc=as.character(x32))), C=data.frame(a=x64, b=x32), recursive=TRUE),
c(A=x32, B=list(aa=x32, bb=list(bba=x32, bbb=x32, bbc=as.character(x32))), C=data.frame(a=x32, b=x32), recursive=TRUE)
)
})
})
test_that("c works on extended integer64 objects (#298)", {
x = y = as.integer64(1L)
class(x) = c('foo', 'integer64')
expect_identical(c(x, y), as.integer64(c(1L, 1L)))
expect_identical(c(a=x, b=y), setNames(as.integer64(c(1L, 1L)), c("a", "b")))
expect_identical(cbind(x, y), matrix64(c(1L, 1L), nrow=1L, ncol=2L, dimnames=list(NULL, c("x", "y"))))
expect_identical(rbind(x, y), matrix64(c(1L, 1L), nrow=2L, ncol=1L, dimnames=list(c("x", "y"), NULL)))
})
replace_dimnames = function(x, old, new) {
if (!is.null(dn <- dimnames(x)))
dimnames(x) = lapply(dn, function(el) {el[el == old] = new; el})
x
}
test_that("cbind works consistent to R", {
convert_x32_result_to_integer64 = function(x, colsToConvert=NULL) {
if (!is.matrix(x) && !is.data.frame(x)) return(x)
if (is.data.frame(x)) {
for (col in colsToConvert)
x[[col]] = as.integer64(x[[col]])
return(x)
}
if (is.list(x)) {
nrow_x = nrow(x)
for (col in colsToConvert)
for (ii in seq_len(nrow_x))
x[[(col - 1L)*nrow_x + ii]] = as.integer64(x[[(col - 1L)*nrow_x + ii]])
x = replace_dimnames(x, "x32", "x64")
} else { # is.matrix(x)
x = replace_dimnames(matrix(as.integer64(x), nrow=nrow(x), ncol=ncol(x), dimnames=dimnames(x)), "x32", "x64")
oldClass(x) = "integer64"
}
x
}
x32 = 1:10
x64 = as.integer64(x32)
expect_identical(cbind(x64, as.raw(5L)), convert_x32_result_to_integer64(cbind(x32, as.raw(5L))))
expect_identical(cbind(x64, FALSE), convert_x32_result_to_integer64(cbind(x32, FALSE)))
expect_identical(cbind(x64, 0L), convert_x32_result_to_integer64(cbind(x32, 0L)))
expect_identical(cbind(x64, 0.0), convert_x32_result_to_integer64(cbind(x32, 0.0)))
expect_identical(cbind(x64, 0.0+0.0i), replace_dimnames(cbind(x32, 0.0+0.0i), "x32", "x64"))
expect_identical(cbind(x64, as.difftime(0.0, units="secs")), convert_x32_result_to_integer64(cbind(x32, as.difftime(0.0, units="secs"))))
expect_identical(cbind(x64, as.POSIXct(0.0, origin="2026-01-27")), convert_x32_result_to_integer64(cbind(x32, as.POSIXct(0.0, origin="2026-01-27"))))
suppressWarnings(expect_identical(cbind(x64, as.POSIXlt(0.0, origin="2026-01-27")), convert_x32_result_to_integer64(cbind(x32, as.POSIXlt(0.0, origin="2026-01-27")), 1L)))
expect_identical(cbind(x64, as.Date(0.0, origin="2026-01-27")), convert_x32_result_to_integer64(cbind(x32, as.Date(0.0, origin="2026-01-27"))))
expect_identical(cbind(x64, as.factor(1L)), convert_x32_result_to_integer64(cbind(x32, as.factor(1L))))
expect_identical(cbind(x64, as.ordered(1L)), convert_x32_result_to_integer64(cbind(x32, as.ordered(1L))))
expect_identical(cbind(x64, as.integer64(0L)), replace_dimnames(cbind(x32, as.integer64(0L)), "x32", "x64"))
expect_identical(cbind(integer64()), convert_x32_result_to_integer64(cbind(integer())))
expect_identical(cbind(NA_integer64_), convert_x32_result_to_integer64(cbind(NA_integer_)))
expect_identical(cbind(rep(NA_integer64_, 2)), convert_x32_result_to_integer64(cbind(rep(NA_integer_, 2))))
expect_identical(cbind(x64), convert_x32_result_to_integer64(cbind(x32)))
expect_identical(cbind(x64, c(TRUE, NA)), convert_x32_result_to_integer64(cbind(x32, c(TRUE, NA))))
expect_identical(cbind(x64, c(42L, NA)), convert_x32_result_to_integer64(cbind(x32, c(42L, NA))))
expect_identical(cbind(x64, c(42.0, NA)), convert_x32_result_to_integer64(cbind(x32, c(42.0, NA))))
expect_identical(cbind(x64, c(42.0+42.0i, NA)), replace_dimnames(cbind(x32, c(42.0+42.0i, NA)), "x32", "x64"))
# TODO(#44): adjust tests accordingly
expect_identical(cbind(x64, c("42", NA)), convert_x32_result_to_integer64(cbind(x32, c("42", NA))))
expect_identical(cbind(x64, character()), convert_x32_result_to_integer64(cbind(x32, character())))
withr::with_options(list(bit64.promoteInteger64ToCharacter=TRUE), {
expect_identical(cbind(x64, c("42", NA)), replace_dimnames(cbind(x32, c("42", NA)), "x32", "x64"))
expect_identical(cbind(x64, character()), replace_dimnames(cbind(x32, character()), "x32", "x64"))
})
expect_identical(cbind(x64, complex()), replace_dimnames(cbind(x32, complex()), "x32", "x64"))
expect_identical(
cbind(A=x64, B=list()),
convert_x32_result_to_integer64(cbind(A=x32, B=list()), 1L)
)
expect_identical(
cbind(A=x64, B=list(a=1:10, b=1:2)),
convert_x32_result_to_integer64(cbind(A=x32, B=list(a=1:10, b=1:2)), 1L)
)
expect_identical(
cbind(A=matrix(x64, 5), B=list()),
convert_x32_result_to_integer64(cbind(A=matrix(x32, 5), B=list()), 1:2)
)
expect_identical(
cbind(A=matrix(x64, 5), B=list(), C=1:5),
convert_x32_result_to_integer64(cbind(A=matrix(x32, 5), B=list(), C=1:5), 1:3)
)
suppressWarnings(expect_identical(
cbind(A=matrix(x64, 5), B=list(a=1:10, b=1:2), C=1:5),
convert_x32_result_to_integer64(cbind(A=matrix(x32, 5), B=list(a=1:10, b=1:2), C=1:5), c(1, 2, 4))
))
skip_unless_r(">= 4.0.0") # in my tests on R 3.5.0 this is identical
expect_same_error(
cbind(matrix(x64, 5), list(), NULL, matrix(1:10, 2)),
cbind(matrix(x32, 5), list(), NULL, matrix(1:10, 2))
)
expect_same_error(
cbind(matrix(x64, 5), list(), NULL, data.frame(a=10:1, b=LETTERS[1:10]), stringsAsFactors=FALSE),
cbind(matrix(x32, 5), list(), NULL, data.frame(a=10:1, b=LETTERS[1:10]), stringsAsFactors=FALSE)
)
expect_identical(
cbind(matrix(x64, 5), data.frame(a=5:1, b=LETTERS[1:5], stringsAsFactors=FALSE)),
convert_x32_result_to_integer64(cbind(matrix(x32, 5), data.frame(a=5:1, b=LETTERS[1:5], stringsAsFactors=FALSE)), colsToConvert=1:2)
)
expect_same_error(
cbind(matrix(x64, 5), data.frame(a=9:1, b=LETTERS[1:9], stringsAsFactors=FALSE)),
cbind(matrix(x32, 5), data.frame(a=9:1, b=LETTERS[1:9], stringsAsFactors=FALSE))
)
expect_identical(
cbind(matrix(x64, 5), data.frame(a=10:1, b=LETTERS[1:10], stringsAsFactors=FALSE)),
convert_x32_result_to_integer64(cbind(matrix(x32, 5), data.frame(a=10:1, b=LETTERS[1:10], stringsAsFactors=FALSE)), 1:2)
)
expect_identical(
cbind(matrix(x64, 5), data.frame(a=10:1, b=LETTERS[1:10], stringsAsFactors=FALSE), yy=as.integer64(-(1:10))),
convert_x32_result_to_integer64(cbind(matrix(x32, 5), data.frame(a=10:1, b=LETTERS[1:10], stringsAsFactors=FALSE), yy=as.integer(-(1:10))), c(1:2, 5))
)
expect_identical(
cbind(matrix(x64, 5), data.frame(a=10:1, b=LETTERS[1:10], stringsAsFactors=FALSE), yy=as.integer64(-(1:2))),
convert_x32_result_to_integer64(cbind(matrix(x32, 5), data.frame(a=10:1, b=LETTERS[1:10], stringsAsFactors=FALSE), yy=-(1:2)), c(1:2, 5))
)
expect_identical(
cbind(matrix(x64, 5), data.frame(a=as.integer64(10:1), b=LETTERS[1:10], stringsAsFactors=FALSE), yy=as.integer64(-(1:2))),
convert_x32_result_to_integer64(cbind(matrix(x32, 5), data.frame(a=as.integer64(10:1), b=LETTERS[1:10], stringsAsFactors=FALSE), yy=-(1:2)), c(1:2, 5))
)
expect_identical(
tryCatch(cbind(as.integer64(1:2), matrix(x64, 5)), warning=conditionMessage),
tryCatch(cbind(1:2, matrix(x32, 5)), warning=conditionMessage)
)
suppressWarnings(expect_identical(
cbind(as.integer64(1:2), matrix(x64, 5)),
convert_x32_result_to_integer64(cbind(1:2, matrix(x32, 5)))
))
})
with_parameters_test_that("cbind deparse.level works consistent to R", {
skip_unless_r(">= 4.0.0")
x = 1L
expected_result = base::cbind(a=x, x, x + 1L, deparse.level=deparse.level)
expected_result = structure(as.integer64(expected_result), dim = dim(expected_result), dimnames = dimnames(expected_result))
FUN = cbind
x = as.integer64(x)
expect_identical(cbind(a=x, x, x + 1L, deparse.level=deparse.level), expected_result)
expect_identical(FUN(a=x, x, x + 1L, deparse.level=deparse.level), expected_result)
}, deparse.level = -1:3)
test_that("rbind works consistent to R", {
convert_x32_result_to_integer64 = function(x, rowsToConvert=NULL) {
if (!is.matrix(x) && !is.data.frame(x)) return(x)
if (is.data.frame(x)) {
for (row in rowsToConvert)
x[[row]] = as.integer64(x[[row]])
return(x)
}
if (is.list(x)) {
nrow_x = nrow(x)
for (row in rowsToConvert)
for (ii in seq_len(ncol(x)))
x[[(ii - 1L)*nrow_x + row]] = as.integer64(x[[(ii - 1L)*nrow_x + row]])
x = replace_dimnames(x, "x32", "x64")
} else { # is.matrix(x)
x = replace_dimnames(matrix(as.integer64(x), nrow=nrow(x), ncol=ncol(x), dimnames=dimnames(x)), "x32", "x64")
oldClass(x) = "integer64"
}
x
}
x32 = 1:10
x64 = as.integer64(x32)
expect_identical(rbind(x64, as.raw(5L)), convert_x32_result_to_integer64(rbind(x32, as.raw(5L))))
expect_identical(rbind(x64, FALSE), convert_x32_result_to_integer64(rbind(x32, FALSE)))
expect_identical(rbind(x64, 0L), convert_x32_result_to_integer64(rbind(x32, 0L)))
expect_identical(rbind(x64, 0.0), convert_x32_result_to_integer64(rbind(x32, 0.0)))
expect_identical(rbind(x64, 0.0+0.0i), replace_dimnames(rbind(x32, 0.0+0.0i), "x32", "x64"))
expect_identical(rbind(x64, as.difftime(0.0, units="secs")), convert_x32_result_to_integer64(rbind(x32, as.difftime(0.0, units="secs"))))
expect_identical(rbind(x64, as.POSIXct(0.0, origin="2026-01-27")), convert_x32_result_to_integer64(rbind(x32, as.POSIXct(0.0, origin="2026-01-27"))))
suppressWarnings(expect_identical(rbind(x64, as.POSIXlt(0.0, origin="2026-01-27")), convert_x32_result_to_integer64(rbind(x32, as.POSIXlt(0.0, origin="2026-01-27")), 1L)))
expect_identical(rbind(x64, as.Date(0.0, origin="2026-01-27")), convert_x32_result_to_integer64(rbind(x32, as.Date(0.0, origin="2026-01-27"))))
expect_identical(rbind(x64, as.factor(1L)), convert_x32_result_to_integer64(rbind(x32, as.factor(1L))))
expect_identical(rbind(x64, as.ordered(1L)), convert_x32_result_to_integer64(rbind(x32, as.ordered(1L))))
expect_identical(rbind(x64, as.integer64(0L)), replace_dimnames(rbind(x32, as.integer64(0L)), "x32", "x64"))
expect_identical(rbind(integer64()), convert_x32_result_to_integer64(rbind(integer())))
expect_identical(rbind(NA_integer64_), convert_x32_result_to_integer64(rbind(NA_integer_)))
expect_identical(rbind(rep(NA_integer64_, 2)), convert_x32_result_to_integer64(rbind(rep(NA_integer_, 2))))
expect_identical(rbind(x64), convert_x32_result_to_integer64(rbind(x32)))
expect_identical(rbind(x64, c(TRUE, NA)), convert_x32_result_to_integer64(rbind(x32, c(TRUE, NA))))
expect_identical(rbind(x64, c(42L, NA)), convert_x32_result_to_integer64(rbind(x32, c(42L, NA))))
expect_identical(rbind(x64, c(42.0, NA)), convert_x32_result_to_integer64(rbind(x32, c(42.0, NA))))
expect_identical(rbind(x64, c(42.0+42.0i, NA)), replace_dimnames(rbind(x32, c(42.0+42.0i, NA)), "x32", "x64"))
# TODO(#44): adjust tests accordingly
expect_identical(rbind(x64, c("42", NA)), convert_x32_result_to_integer64(rbind(x32, c("42", NA))))
expect_identical(rbind(x64, character()), convert_x32_result_to_integer64(rbind(x32, character())))
withr::with_options(list(bit64.promoteInteger64ToCharacter=TRUE), {
expect_identical(rbind(x64, c("42", NA)), replace_dimnames(rbind(x32, c("42", NA)), "x32", "x64"))
expect_identical(rbind(x64, character()), replace_dimnames(rbind(x32, character()), "x32", "x64"))
})
expect_identical(rbind(x64, complex()), replace_dimnames(rbind(x32, complex()), "x32", "x64"))
expect_identical(
rbind(A=x64, B=list()),
convert_x32_result_to_integer64(rbind(A=x32, B=list()), 1L)
)
expect_identical(
rbind(A=x64, B=list(a=1:10, b=1:2)),
convert_x32_result_to_integer64(rbind(A=x32, B=list(a=1:10, b=1:2)), 1L)
)
expect_identical(
rbind(A=matrix(x64, 5), B=list()),
convert_x32_result_to_integer64(rbind(A=matrix(x32, 5), B=list()), 1:5)
)
suppressWarnings(expect_identical(
rbind(A=matrix(x64, 5), B=list(), C=1:5),
convert_x32_result_to_integer64(rbind(A=matrix(x32, 5), B=list(), C=1:5), 1:6)
))
suppressWarnings(expect_identical(
rbind(A=matrix(x64, 5), B=list(a=1:10, b=1:2), C=1:5),
convert_x32_result_to_integer64(rbind(A=matrix(x32, 5), B=list(a=1:10, b=1:2), C=1:5), c(1:5, 7))
))
skip_unless_r(">= 4.0.0") # in my tests on R 3.5.0 this is identical, except the one with as.complex() and "bit64.promoteInteger64ToCharacter=TRUE", because a factor instead of character is returned.
expect_same_error( # mismatch column count
rbind(matrix(x64, 5), list(), NULL, matrix(1:10, 2)),
rbind(matrix(x32, 5), list(), NULL, matrix(1:10, 2))
)
# suppressWarnings(): character->integer64 coercion because of bit64.promoteInteger64ToCharacter=FALSE prior to error.
# TODO(#44): remove suppression.
expect_same_error( # no column names in matrix
suppressWarnings(rbind(matrix(x64, 5), list(), NULL, data.frame(a=10:1, b=LETTERS[1:10], stringsAsFactors=FALSE))),
rbind(matrix(x32, 5), list(), NULL, data.frame(a=10:1, b=LETTERS[1:10], stringsAsFactors=FALSE))
)
expect_same_error( # ditto w/o intermediate empty inputs
suppressWarnings(rbind(matrix(x64, 5), data.frame(a=5:1, b=LETTERS[1:5], stringsAsFactors=FALSE))),
rbind(matrix(x32, 5), data.frame(a=5:1, b=LETTERS[1:5], stringsAsFactors=FALSE))
)
# TODO(#44): adjust tests accordingly
expect_identical(
rbind(matrix(x64, 5, dimnames=list(NULL, c("a", "b"))), data.frame(a=5:1, b=as.character(1:5), stringsAsFactors=FALSE)),
convert_x32_result_to_integer64(rbind(matrix(x32, 5, dimnames=list(NULL, c("a", "b"))), data.frame(a=5:1, b=1:5)), 1:2)
)
withr::with_options(list(bit64.promoteInteger64ToCharacter=TRUE), {
expect_identical(
rbind(matrix(x64, 5, dimnames=list(NULL, c("a", "b"))), data.frame(a=5:1, b=as.character(1:5), stringsAsFactors=FALSE)),
rbind(matrix(x32, 5, dimnames=list(NULL, c("a", "b"))), data.frame(a=as.character(5:1), b=as.character(1:5), stringsAsFactors=FALSE))
# This would be consistent with base R, but it requires additional logic to determine the columns to convert from the input in advance to have them coerced accordingly.
# convert_x32_result_to_integer64(rbind(matrix(x32, 5, dimnames=list(NULL, c("a", "b"))), data.frame(a=5:1, b=as.character(1:5), stringsAsFactors=FALSE)), 1L)
)
})
expect_identical(
rbind(matrix(x64, 5, dimnames=list(NULL, c("a", "b"))), data.frame(a=5:1, b=as.complex(1:5))),
rbind(matrix(x32, 5, dimnames=list(NULL, c("a", "b"))), data.frame(a=as.complex(5:1), b=as.complex(1:5)))
# This would be consistent with base R, but it requires additional logic to determine the columns to convert from the input in advance to have them coerced accordingly.
# convert_x32_result_to_integer64(rbind(matrix(x32, 5, dimnames=list(NULL, c("a", "b"))), data.frame(a=5:1, b=as.complex(1:5))), 1L)
)
# TODO(#44): remove supression (as above).
expect_same_error( # no column names in matrix
suppressWarnings(rbind(matrix(x64, 5), data.frame(a=10:1, b=LETTERS[1:10], stringsAsFactors=FALSE), yy=as.integer64(-(1:10)))),
rbind(matrix(x32, 5), data.frame(a=10:1, b=LETTERS[1:10], stringsAsFactors=FALSE), yy=as.integer64(-(1:10)))
)
expect_identical(
tryCatch(rbind(as.integer64(1:5), matrix(x64, 5)), warning=conditionMessage),
tryCatch(rbind(1:5, matrix(x32, 5)), warning=conditionMessage)
)
suppressWarnings(expect_identical(
rbind(as.integer64(1:5), matrix(x64, 5)),
convert_x32_result_to_integer64(rbind(1:5, matrix(x32, 5)))
))
expect_identical(rbind(integer64(), data.frame(a=1:2, b=10:11)), convert_x32_result_to_integer64(rbind(integer(), data.frame(a=1:2, b=10:11)), 1:2))
expect_identical(rbind(integer64(1), data.frame(a=1:2, b=10:11)), convert_x32_result_to_integer64(rbind(integer(1), data.frame(a=1:2, b=10:11)), 1:2))
suppressWarnings(expect_identical(rbind(integer64(3), data.frame(a=1:2, b=10:11)), convert_x32_result_to_integer64(rbind(integer(3), data.frame(a=1:2, b=10:11)), 1:2)))
expect_identical(
tryCatch(rbind(integer64(3), data.frame(a=1:2, b=10:11)), warning=conditionMessage),
tryCatch(convert_x32_result_to_integer64(rbind(integer(3), data.frame(a=1:2, b=10:11)), 1:2), warning=conditionMessage)
)
})
with_parameters_test_that("rbind deparse.level works consistent to R", {
skip_unless_r(">= 4.0.0")
x = 1L
expected_result = base::rbind(a=x, x, x + 1L, deparse.level=deparse.level)
expected_result = structure(as.integer64(expected_result), dim = dim(expected_result), dimnames = dimnames(expected_result))
FUN = rbind
x = as.integer64(x)
expect_identical(rbind(a=x, x, x + 1L, deparse.level=deparse.level), expected_result)
expect_identical(FUN(a=x, x, x + 1L, deparse.level=deparse.level), expected_result)
}, deparse.level = -1:3)
test_that("seq.integer64 works with S4 subclasses inheriting from integer64", {
# Use a unique class name to avoid conflicts
className <- "test64_seq_regression"
if (!methods::isClass(className)) {
methods::setClass(className, contains = "integer64")
withr::defer(methods::removeClass(className))
}
from <- as.integer64(1L)
to <- as.integer64(10L)
by <- methods::new(className, as.integer64(2))
expect_identical(seq(from=from, to=to, by=by), as.integer64(c(1L, 3L, 5L, 7L, 9L)))
expect_identical(seq(to=to, by=by, length.out=5L), as.integer64(c(2L, 4L, 6L, 8L, 10L)))
expect_identical(seq(from=from, by=by, length.out=5L), as.integer64(c(1L, 3L, 5L, 7L, 9L)))
})
test_that("back-compatible keep.names=TRUE is supported for limited input classes", {
x = as.integer64(1L)
names(x) = "a"
expect_named(as.integer64(x, keep.names=TRUE), "a")
y = c(a = 1.0)
expect_named(as.integer64(y, keep.names=TRUE), "a")
})
test_that("bitstring class meshes with R's own (from 4.6.0)", {
expect_no_error(print(as.bitstring(lim.integer64())))
})
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.