test_that("is.instant/is.timepoint works as expected", {
  expect_false(is.instant(234))
  expect_true(is.instant(as.POSIXct("2008-08-03 13:01:59", tz = "UTC")))
  expect_true(is.instant(as.POSIXlt("2008-08-03 13:01:59", tz = "UTC")))
  expect_true(is.instant(Sys.Date()))
  expect_false(is.instant(minutes(1)))
  expect_true(is.timespan(interval(
    as.POSIXct("2008-08-03 13:01:59", tz = "UTC"),
    as.POSIXct("2009-08-03 13:01:59", tz = "UTC")
  )))
})

test_that("now() handles time zone input correctly", {
  nt <- now("UTC")
  st <- Sys.time()
  expect_identical(
    floor_date(nt, "minute"),
    floor_date(as.POSIXct(format(as.POSIXct(st), tz = "UTC"), tz = "UTC"), "minute")
  )
})

## test_that("today() works correctly", {
##   ## Sys.Date is not correct
##   ## expect_identical(today(), Sys.Date())
## })


test_that("make_datetime returns same values as ISOdatetime", {
  set.seed(1000)
  N <- 1e4
  y <- as.integer(runif(N, 1800, 2200))
  m <- as.integer(runif(N, 1, 12))
  d <- as.integer(runif(N, 1, 28))
  H <- as.integer(runif(N, 0, 23))
  M <- as.integer(runif(N, 0, 59))
  S <- runif(N, 0, 59)
  out1 <- ISOdatetime(y, m, d, H, M, S, tz = "UTC")
  out2 <- make_datetime(y, m, d, H, M, S)
  expect_equal(out1, out2)
  S <- as.integer(runif(N, 0, 59))
  out1 <- ISOdatetime(y, m, d, H, M, S, tz = "UTC")
  out2 <- make_datetime(y, m, d, H, M, S)
  expect_equal(out1, out2)
  out3 <- make_date(y, m, d)
  expect_equal(as.Date(out1), out3)
})

test_that("make_datetime replicates as expected", {
  expect_equal(
    make_datetime(year = 1999, month = c(11, 12), day = 22, sec = c(10, 11)),
    as.POSIXct(c("1999-11-22 00:00:10 UTC", "1999-12-22 00:00:11 UTC"), tz = "UTC")
  )
  expect_equal(
    make_datetime(year = c(1999, 2000, 3000), month = c(11, 12), day = 22, sec = c(10, 11, 13, 13)),
    ymd_hms(c("1999-11-22 00:00:10", "2000-12-22 00:00:11", "3000-11-22 00:00:13", "1999-12-22 00:00:13"), tz = "UTC")
  )
  expect_equal(
    make_datetime(
      year = c(1999, 2000, 3000), month = c(11, 12), day = 22, sec = c(10, 11, 13, 13),
      tz = "America/New_York"
    ),
    ymd_hms(c("1999-11-22 00:00:10", "2000-12-22 00:00:11", "3000-11-22 00:00:13", "1999-12-22 00:00:13"),
      tz = "America/New_York"
    )
  )
})

test_that("make_datetime propagates NAs as expected", {
  expect_equal(
    make_datetime(year = 1999, month = c(11, NA), day = 22, sec = c(10, 11, NA)),
    as.POSIXct(c("1999-11-22 00:00:10 UTC", NA, NA), tz = "UTC")
  )
})


test_that("make_datetime rolls over month boundary", {
  expect_equal(make_datetime(month = 1, day = 31, hour = 24), ymd("1970-02-01", tz = "UTC"))
  expect_equal(
    make_datetime(month = 1, day = 31, hour = 25, min = 61, sec = 61),
    ymd_hms("1970-02-01 02:02:01", tz = "UTC"))
})
