test_that("SSM parameters are correct", {
  data("aw2009")
  scores <- colMeans(aw2009)
  res <- ssm_parameters_cpp(scores, as_radian(octants()))

  expect_equal(round(res[[1]], 3), 0.423)
  expect_equal(round(res[[2]], 3), 0.945)
  expect_equal(round(res[[3]], 3), -0.264)
  expect_equal(round(res[[4]], 3), 0.981)
  expect_equal(round(res[[5]], 3), 6.010)
  expect_equal(round(res[[6]], 3), 0.954)
})

test_that("Column means are correct even with missing", {
  mat <- matrix(runif(200), ncol = 2)
  idx <- sample(1:200, 50, replace = FALSE)
  mat[idx] <- NA
  rcm <- colMeans(mat, na.rm = TRUE)
  ccm <- col_means(mat)
  expect_equal(rcm[1], ccm[[1]])
  expect_equal(rcm[2], ccm[[2]])
})

test_that("Pairwise r is correct even with missing", {
  x <- runif(100)
  y <- runif(100)
  xidx <- sample(1:100, 10, replace = FALSE)
  x[xidx] <- NA
  yidx <- sample(1:100, 10, replace = FALSE)
  y[yidx] <- NA
  rcor <- stats::cor(x, y, use = "pairwise.complete.obs")
  ccor <- pairwise_r(x, y)
  expect_equal(rcor, ccor)
})

test_that("Angular mean is correct", {
  am <- angle_mean(c(0, 0, pi / 2))
  expect_equal(round(am, 3), 0.464)

  am <- angle_mean(as_radian(octants()))
  expect_true(is.na(am))
})

test_that("Angular median is correct", {
  # In the case of a single median candidate
  amdn <- angle_median(c(0, pi / 2, pi))
  expect_equal(amdn, pi / 2)
  # In the case of multiple median candidates
  amdn <- angle_median(c(0, pi / 2, pi, pi))
  expect_equal(round(amdn, 3), 2.678)
})

test_that("Angluar deviation from mean is correct", {
  angles <- c(0, pi / 2, pi, pi)
  ad <- angle_dev(angles, angle_mean(angles))
  expect_equal(round(ad, 3), 1.178)
})
