test_that("unweighted stats match unweighted function", {
  x <- c(0, 1, 2, 1, 2, 3, 4, 5)
  y <- 1:length(x)
  expect_equal(mean(x), weighted_mean(x))
  expect_equal(median(x), weighted_median(x))
  expect_equal(quantile(x, probs = 0.2), weighted_quantile(x, probs = 0.2))
  expect_equal(var(x), weighted_var(x))
  expect_equal(cor(x, y), weighted_cor(x, y))

  # Now with missing values
  x <- c(0, 1, 2, 1, 2, 3, 4, NA)
  y <- c(NA, 2:length(x))
  expect_equal(mean(x, na.rm = TRUE), weighted_mean(x, na.rm = TRUE))
  expect_equal(median(x, na.rm = TRUE), weighted_median(x, na.rm = TRUE))
  expect_equal(
    quantile(x, probs = 0.2, na.rm = TRUE),
    weighted_quantile(x, probs = 0.2, na.rm = TRUE)
  )
  expect_equal(var(x, na.rm = TRUE), weighted_var(x, na.rm = TRUE))
  expect_equal(cor(x, y, use = "p"), weighted_cor(x, y, na.rm = TRUE))
})

test_that("weight 1 gives same as unweighted", {
  x <- c(0, 1, 2, 1, 2, 3, 4, 5)
  y <- 1:length(x)
  w <- rep(1, length(x))
  expect_equal(weighted_mean(x), weighted_mean(x, w = w))
  expect_equal(weighted_median(x), weighted_median(x, w = w))
  expect_equal(
    weighted_quantile(x, probs = 0.2), weighted_quantile(x, probs = 0.2, w = w)
  )
  expect_equal(weighted_var(x), weighted_var(x, w = w))
  expect_equal(weighted_cor(x, y), weighted_cor(x, y, w = w))

  # Now with missing values
  x <- c(0, 1, 2, 1, 2, 3, 4, NA)
  y <- c(NA, 2:length(x))
  expect_equal(
    weighted_mean(x, na.rm = TRUE),
    weighted_mean(x, w = w, na.rm = TRUE)
  )
  expect_equal(
    weighted_median(x, na.rm = TRUE),
    weighted_median(x, w = w, na.rm = TRUE)
  )
  expect_equal(
    weighted_quantile(x, probs = 0.2, na.rm = TRUE),
    weighted_quantile(x, probs = 0.2, w = w, na.rm = TRUE)
  )
  expect_equal(
    weighted_var(x, na.rm = TRUE),
    weighted_var(x, w = w, na.rm = TRUE)
  )
  expect_equal(
    weighted_cor(x, y, na.rm = TRUE),
    weighted_cor(x, y, w = w, na.rm = TRUE)
  )
})

test_that("weight 1 gives same as weight 2", {
  x <- c(0, 1, 2, 1, 2, 3, 4, 5)
  y <- 1:length(x)
  w1 <- rep(1, length(x))
  w2 <- rep(2, length(x))
  expect_equal(weighted_mean(x, w = w2), weighted_mean(x, w = w1))
  expect_equal(weighted_median(x, w = w2), weighted_median(x, w = w1))
  expect_equal(
    weighted_quantile(x, w = w2, probs = 0.2), weighted_quantile(x, probs = 0.2, w = w1)
  )
  expect_equal(weighted_var(x, w = w2), weighted_var(x, w = w1))
  expect_equal(weighted_cor(x, y, w = w2), weighted_cor(x, y, w = w1))

  # Now with missing values
  x <- c(0, 1, 2, 1, 2, 3, 4, NA)
  y <- c(NA, 2:length(x))
  expect_equal(
    weighted_mean(x, w = w2, na.rm = TRUE),
    weighted_mean(x, w = w1, na.rm = TRUE)
  )
  expect_equal(
    weighted_median(x, w = w2, na.rm = TRUE),
    weighted_median(x, w = w1, na.rm = TRUE)
  )
  expect_equal(
    weighted_quantile(x, w = w2, probs = 0.2, na.rm = TRUE),
    weighted_quantile(x, probs = 0.2, w = w1, na.rm = TRUE)
  )
  expect_equal(
    weighted_var(x, w = w2, na.rm = TRUE),
    weighted_var(x, w = w1, na.rm = TRUE)
  )
  expect_equal(
    weighted_cor(x, y, w = w2, na.rm = TRUE),
    weighted_cor(x, y, w = w1, na.rm = TRUE)
  )
})

test_that("non-constant weights have an effect", {
  x <- c(0, 1, 2, 1, 2, 3, 4, 5)
  y <- 1:length(x)
  w <- 1:length(x)
  expect_false(weighted_mean(x) == weighted_mean(x, w = w))
  expect_false(weighted_median(x) == weighted_median(x, w = w))
  expect_false(
    weighted_quantile(x, probs = 0.2) == weighted_quantile(x, probs = 0.2, w = w)
  )
  expect_false(weighted_var(x) == weighted_var(x, w = w))
  expect_false(weighted_cor(x, y) == weighted_cor(x, y, w = w))

  # Now with missing values
  x <- c(0, 1, 2, 1, 2, 3, 4, 5, NA)
  y <- c(NA, 2:length(x))
  w <- 1:length(x)
  expect_false(
    weighted_mean(x, na.rm = TRUE) == weighted_mean(x, w = w, na.rm = TRUE)
  )
  expect_false(
    weighted_median(x, na.rm = TRUE) == weighted_median(x, w = w, na.rm = TRUE)
  )
  expect_false(
    weighted_quantile(x, probs = 0.2, na.rm = TRUE) ==
    weighted_quantile(x, probs = 0.2, w = w, na.rm = TRUE)
  )
  expect_false(weighted_var(x, na.rm = TRUE) == weighted_var(x, w = w, na.rm = TRUE))
  expect_false(
    weighted_cor(x, y, na.rm = TRUE) == weighted_cor(x, y, w = w, na.rm = TRUE)
  )
})

test_that("ML estimate of variance differs the usual one", {
  x <- c(0, 1, 2, 1, 2, 3, 4, 5)
  w <- 1:length(x)
  expect_false(weighted_var(x, method = "unbiased") == weighted_var(x, method = "ML"))
  expect_false(
    weighted_var(x, w = w, method = "unbiased") ==
    weighted_var(x, w = w, method = "ML")
  )
})
