inst/tinytest/test-align.time.R

# make.index.unique

info_msg <- "make.index.unique() uses 1 microsecond epsilon by default"
x <- .xts(1:5, rep(1e-6, 5))
y <- make.index.unique(x)
expect_equivalent(target = cumsum(rep(1e-6, 5)),
                  current = .index(y),
                  info = info_msg)

info_msg <- "make.index.unique() warns when index value will be overwritten"
x <- .xts(1:5, c(rep(1e-6, 4), 3e-6))
expect_warning(make.index.unique(x, eps = 1e-6),
               pattern = "index value is unique but will be replaced",
               info = info_msg)

info_msg <- "make.index.unique() returns unique and sorted index"
expect_equivalent(target = cumsum(rep(1e-6, 5)),
                  current = .index(y),
                  info = info_msg)

info_msg <- "test.make.index.unique_adds_eps_to_duplicates"
epsilon <- c(1e-6, 1e-7, 1e-8)
for (eps in epsilon) {
    x <- .xts(1:5, rep(eps, 5))
    y <- make.index.unique(x, eps = eps)
    expect_equivalent(target = .index(y),
                      current = cumsum(rep(eps, 5)),
                      info = info_msg)
}

info_msg <- "test.make.index.unique_no_warn_if_unique_timestamps_unchanged"
x <- .xts(1:10, c(rep(1e-6, 9), 1e-5))
y <- make.index.unique(x, eps = 1e-6)
expect_equivalent(target = .index(y),
                  current = cumsum(rep(1e-6, 10)),
                  info = info_msg)

# There should be a warning if the cumulative epsilon for a set of duplicate
# index values is larger than the first unique index value that follows.
# When this happens, we will overwrite that non-duplicate index value with
# the prior index value + eps.
info_msg <- "test.make.index.unique_warns_if_unique_timestamp_changes"
x <- .xts(1:5, c(rep(0, 4), 2e-6))
expect_warning(make.index.unique(x, eps = 1e-6))

# There should be a warning if the cumulative epsilon for a set of duplicate
# index values is larger than the first unique index value that follows.
# When this happens, we will overwrite that non-duplicate index value with
# the prior index value + eps.
info_msg <- "test.make.index.unique_warns_ONCE_if_unique_timestamp_changes"
x <- .xts(1:5, c(rep(0, 3), 2, 3) * 1e-6)
count <- 0L
expect_warning(make.index.unique(x, eps = 1e-6))

info_msg <- "test.make.index.unique_converts_date_index_to_POSIXct"
# It doesn't make sense to add a small epsilon to a date index. The C code
# converts the integer index to a double, but it keeps the same index class.
# The index class should be converted to POSIXct.

Try the xts package in your browser

Any scripts or data that you put into this service are public.

xts documentation built on April 17, 2023, 1:07 a.m.