
context("interplay with emmeans")

test_that("ANOVA functions work with emmeans, univariate & multivariate", {
  skip_if_not_installed("emmeans")
  data(sk2011.1)
  a1 <- aov_ez("id", "response", sk2011.1, between = "instruction", 
               within = c("inference", "plausibility"), fun_aggregate = mean, 
               include_aov = TRUE)
  em1 <- emmeans::emmeans(a1, ~ inference, model = "univariate")
  em2 <- emmeans::emmeans(a1, ~ inference, model = "multivariate")
  expect_is(em1, "emmGrid")
  expect_is(em2, "emmGrid")
  expect_equal(as.data.frame(summary(em2))$emmean, 
               as.data.frame(summary(em1))$emmean)
  expect_false(isTRUE(all.equal(
    as.data.frame(summary(em2))$SE, 
    as.data.frame(summary(em1))$SE)))
  
  em1 <- emmeans::emmeans(a1, ~ inference*plausibility, model = "univariate")
  em2 <- emmeans::emmeans(a1, ~ inference*plausibility, model = "multivariate")
  expect_is(em1, "emmGrid")
  expect_is(em2, "emmGrid")
  expect_equal(as.data.frame(summary(em2))$emmean, 
               as.data.frame(summary(em1))$emmean)
  expect_false(isTRUE(all.equal(
    as.data.frame(summary(em2))$SE, 
    as.data.frame(summary(em1))$SE)))
  
  a1b <- aov_ez("id", "response", sk2011.1, between = "instruction", 
               within = c("plausibility", "inference"), fun_aggregate = mean, 
               include_aov = TRUE)
  em1 <- emmeans::emmeans(a1b, ~ inference, model = "univariate")
  em2 <- emmeans::emmeans(a1b, ~ inference, model = "multivariate")
  expect_is(em1, "emmGrid")
  expect_is(em2, "emmGrid")
  expect_equal(as.data.frame(summary(em2))$emmean, 
               as.data.frame(summary(em1))$emmean)
  expect_false(isTRUE(all.equal(
    as.data.frame(summary(em2))$SE, 
    as.data.frame(summary(em1))$SE)))
  
  a2 <- aov_ez("id", "response", sk2011.1, between = "instruction", 
               within = c("inference"), fun_aggregate = mean, 
               include_aov = TRUE)
  em1 <- emmeans::emmeans(a2, ~ inference, model = "univariate")
  em2 <- emmeans::emmeans(a2, ~ inference, model = "multivariate")
  expect_is(em1, "emmGrid")
  expect_is(em2, "emmGrid")
  expect_equal(as.data.frame(summary(em2))$emmean, 
               as.data.frame(summary(em1))$emmean)
  expect_false(isTRUE(all.equal(
    as.data.frame(summary(em2))$SE, 
    as.data.frame(summary(em1))$SE)))
  
  
  a3 <- aov_ez("id", "response", sk2011.1, within = c("inference"), 
               fun_aggregate = mean, include_aov = TRUE)
  em1 <- emmeans::emmeans(a3, ~ inference, model = "univariate")
  em2 <- emmeans::emmeans(a3, ~ inference, model = "multivariate")
  expect_is(em1, "emmGrid")
  expect_is(em2, "emmGrid")
  expect_equal(as.data.frame(summary(em2))$emmean, 
               as.data.frame(summary(em1))$emmean)
  expect_false(isTRUE(all.equal(
    as.data.frame(summary(em2))$SE, 
    as.data.frame(summary(em1))$SE)))
  
  a4 <- aov_ez("id", "response", sk2011.1, between = "instruction", 
               fun_aggregate = mean, include_aov = TRUE)
  em1 <- emmeans::emmeans(a4, ~ instruction, model = "univariate")
  em2 <- emmeans::emmeans(a4, ~ instruction, model = "multivariate")
  expect_is(em1, "emmGrid")
  expect_is(em2, "emmGrid")
  expect_equal(as.data.frame(summary(em2))$emmean, 
               as.data.frame(summary(em1))$emmean)
  expect_true(isTRUE(all.equal(
    as.data.frame(summary(em2))$SE, 
    as.data.frame(summary(em1))$SE)))
  
  #### 
  data("sk2011.2")
  ab1 <- aov_ez("id", "response", sk2011.2, between = "instruction", 
               within = c("what", "validity", "type"), fun_aggregate = mean, 
               include_aov = TRUE)
  em1 <- emmeans::emmeans(ab1, ~ what*validity*type, model = "univariate")
  em2 <- emmeans::emmeans(ab1, ~ what*validity*type, model = "multivariate")
  expect_is(em1, "emmGrid")
  expect_is(em2, "emmGrid")
  expect_equal(as.data.frame(summary(em2))$emmean, 
               as.data.frame(summary(em1))$emmean, tolerance = 0.1)
  expect_false(isTRUE(all.equal(
    as.data.frame(summary(em2))$SE, 
    as.data.frame(summary(em1))$SE)))
  
  em1 <- emmeans::emmeans(ab1, ~ validity*what*type, model = "univariate")
  em2 <- emmeans::emmeans(ab1, ~ validity*what*type, model = "multivariate")
  expect_is(em1, "emmGrid")
  expect_is(em2, "emmGrid")
  expect_equal(as.data.frame(summary(em2))$emmean, 
               as.data.frame(summary(em1))$emmean, tolerance = 0.1)
  expect_false(isTRUE(all.equal(
    as.data.frame(summary(em2))$SE, 
    as.data.frame(summary(em1))$SE)))
  
  em1 <- emmeans::emmeans(ab1, ~ type, model = "univariate")
  em2 <- emmeans::emmeans(ab1, ~ type, model = "multivariate")
  expect_is(em1, "emmGrid")
  expect_is(em2, "emmGrid")
  expect_equal(as.data.frame(summary(em2))$emmean, 
               as.data.frame(summary(em1))$emmean, tolerance = 0.1)
  expect_false(isTRUE(all.equal(
    as.data.frame(summary(em2))$SE, 
    as.data.frame(summary(em1))$SE)))
  
  
})

test_that("ANCOVA with emmeans is correct for univariate & multivariate", {
  skip_if_not_installed("emmeans")
  data(sk2011.1)
  # a1 <- aov_ez("id", "value", obk.long, between = c("treatment", "gender"),
  #              within = c("phase", "hour"), covariate = "age",
  #              observed = c("gender", "age"), factorize = FALSE)
  # emmeans(a1, ~ phase, model = "multivariate")
  # emmeans(a1, ~ phase, model = "univariate")
  # 
  # emmeans(a1, ~ treatment, model = "multivariate")
  # emmeans(a1, ~ treatment, model = "univariate")
  # deactivated, see: https://github.com/rvlenth/emmeans/issues/32
  
  a2 <- aov_ez("id", "value", obk.long, between = c("treatment", "gender"), 
               covariate = "age", fun_aggregate = mean,
               observed = c("gender", "age"), factorize = FALSE, 
               include_aov = TRUE)
  
  em1 <- emmeans::emmeans(a2, ~ treatment, model = "univariate")
  em2 <- emmeans::emmeans(a2, ~ treatment, model = "multivariate")
  expect_equal(summary(em1)$emmean, summary(em2)$emmean)
})

test_that("mixed works with emmeans", {
  skip_if_not_installed("emmeans")
  skip_on_cran()
  data(sk2011.1)
  emmeans::emm_options(lmer.df = "asymptotic")
  m1 <- mixed(response ~ instruction*inference*plausibility +(1|id), sk2011.1, progress = FALSE)
  expect_is(emmeans::emmeans(m1, ~ inference), "emmGrid")
  m2 <- mixed(response ~ inference +(inference|id), sk2011.1, progress = FALSE)
  expect_is(emmeans::emmeans(m2, ~ inference), "emmGrid")
  m3 <- mixed(response ~ instruction +(inference|id), sk2011.1, progress = FALSE)
  expect_is(emmeans::emmeans(m3, ~ instruction), "emmGrid")
})

test_that("mixed works with type=2 and all methods", {
  skip_if_not_installed("emmeans")
  emmeans::emm_options(lmer.df = "asymptotic")
  ## in all tests, data needs to be passed because of nested evaluation.
  
  data("sk2011.2")
  sk2_aff <- droplevels(sk2011.2[sk2011.2$what == "affirmation",])
  
  mixed_kr <- mixed(response ~ inference*type+(1|id), sk2_aff, type=2, 
                    method="KR", progress = FALSE)
  expect_is(emmeans::emmeans(mixed_kr, specs = c("type")), "emmGrid")
  
  mixed_s <- mixed(response ~ inference*type+(1|id), sk2_aff, type=2, 
                   method="S", progress = FALSE)
  expect_is(emmeans::emmeans(mixed_s, specs = c("type")), "emmGrid")
  
  mixed_lrt <- mixed(response ~ type+(1|id), sk2_aff, type=2, 
                     method="LRT", progress = FALSE)
  expect_is(emmeans::emmeans(mixed_lrt, specs = c("type")), "emmGrid")
  
  mixed_pb <- suppressWarnings(mixed(response ~ type+(1|id), sk2_aff, 
                                     type=2, method="PB", progress = FALSE, 
                                     args_test = list(nsim = 10)))
  expect_is(emmeans::emmeans(mixed_pb, specs = c("type")), "emmGrid")
  
  mixed_oldkr <- mixed(response ~ type+(1|id), sk2_aff, type=2, 
                       method="nested-KR", progress = FALSE)
  expect_is(emmeans::emmeans(mixed_oldkr, specs = c("type")), "emmGrid")
})

test_that("emmeans works with mixed and expand_er = TRUE", {
  skip_if_not_installed("emmeans")
  skip_if_not_installed("MEMSS")
  data("Machines", package = "MEMSS") 
  m2 <- mixed(score ~ Machine + (Machine||Worker), data=Machines, 
              expand_re = TRUE, progress = FALSE)
  t1 <- emmeans::emmeans(m2, "Machine", lmer.df = "asymptotic")
  t2 <- emmeans::emmeans(m2, "Machine", lmer.df = "Satterthwaite")
  t3 <- emmeans::emmeans(m2, "Machine", lmer.df = "kenward-roger")
  
  expect_is(t1, "emmGrid")
  expect_is(t2, "emmGrid")
  expect_is(t3, "emmGrid")
  
  expect_is(summary(t1), "data.frame")
  expect_is(summary(t2), "data.frame")
  expect_is(summary(t3), "data.frame")

})



test_that("emmeans with mixed & expand_re = TRUE with pre 3.0 lmerTest objects", {
  skip_if_not_installed("emmeans")
  skip_on_cran()
  load("m_machines_lmerTest-pre3.0.rda")
  # load("tests/testthat/m_machines_lmerTest-pre3.0.rda")
  t1 <- emmeans::emmeans(m_machines, "Machine", lmer.df = "asymptotic")
  t2 <- emmeans::emmeans(m_machines, "Machine", lmer.df = "Satterthwaite")
  t3 <- emmeans::emmeans(m_machines, "Machine", lmer.df = "kenward-roger")
  
  expect_is(t1, "emmGrid")
  expect_is(t2, "emmGrid")
  expect_is(t3, "emmGrid")
  
  expect_is(summary(t1), "data.frame")
  expect_is(summary(t2), "data.frame")
  expect_is(summary(t3), "data.frame")

})
