library(dplyr)
library(lubridate)
idx_day <- seq.Date(ymd("2017-01-01"), ymd("2017-01-20"), by = 4)
dat_x <- tibble(
  date = idx_day,
  value = rnorm(5)
)

test_that("a tbl_df/data.frame", {
  expect_error(append_row(dat_x), "`tbl_df`")
})

test_that("unknown interval", {
  tsbl <- as_tsibble(dat_x[1, ], index = date)
  expect_error(append_row(tsbl), "tsibble of unknown interval.")
})

test_that("an irregular tbl_ts", {
  tsbl <- as_tsibble(dat_x, index = date, regular = FALSE)
  expect_error(append_row(tsbl), "irregular")
})

test_that("4 day interval", {
  tsbl <- as_tsibble(dat_x, index = date)
  ref_tbl <- tibble(date = ymd("2017-01-21"), value = NA_real_)
  expect_equal(append_row(tsbl)[6, ], ref_tbl, ignore_attr = TRUE)
  ref_tbl2 <- tibble(date = ymd("2016-12-28"), value = NA_real_)
  expect_equal(append_row(tsbl, n = -1)[1, ], ref_tbl2, ignore_attr = TRUE)
  expect_error(append_row(tsbl, 1:3), "an integer")
})

tourism <- tourism %>%
  group_by_key() %>%
  slice(1:3) %>%
  ungroup()

test_that("custom index class", {
  new_t <- append_row(tourism)
  expect_equal(NROW(new_t), NROW(tourism) + n_keys(tourism))
  expect_equal(new_t[["Trips"]][4], NA_real_)
})

test_that("ordered?", {
  expect_warning(unord_t <- tourism %>% arrange(Trips))
  expect_warning(new_t <- append_row(unord_t))
  expect_equal(
    new_t[["Trips"]][(NROW(tourism) + 1):NROW(new_t)],
    rep(NA_real_, n_keys(tourism))
  )
})

test_that("`keep_all = TRUE", {
  expect_equal(interval(new_data(tourism, n = 2)), new_interval(quarter = 1))
  new_t <- new_data(tourism, keep_all = TRUE)
  expect_equal(dim(new_t), c(n_keys(tourism), NCOL(tourism)))
})

test_that("yearweek #199", {
  tsbl <- tsibble(yw = yearweek(0:9), grp = rep(1:2, each = 5), key = grp)
  expect_s3_class(new_data(tsbl, n = 5)$yw, "yearweek")
})
