# between-subjects design --------------------------------------------------

test_that(desc = "`pairwise_comparisons()` works for between-subjects design", code = {
  # student's t
  set.seed(123)
  df1 <- pairwise_comparisons(
    data = msleep,
    x = vore,
    y = brainwt,
    type = "p",
    var.equal = TRUE,
    paired = FALSE,
    p.adjust.method = "bonferroni"
  )

  expect_snapshot(df1)
  expect_snapshot(df1[["expression"]])

  # games-howell
  df_msleep <- msleep

  # adding empty factor level (shouldn't change results)
  df_msleep <- df_msleep |> dplyr::mutate(vore = as.factor(vore))

  df_msleep$vore <- factor(
    df_msleep$vore,
    levels = c(levels(df_msleep$vore), "Random")
  )

  set.seed(123)
  df2 <- pairwise_comparisons(
    data = df_msleep,
    x = vore,
    y = brainwt,
    type = "p",
    var.equal = FALSE,
    paired = FALSE,
    p.adjust.method = "bonferroni"
  )

  expect_snapshot(df2)
  expect_snapshot(df2[["expression"]])

  # Dunn test
  set.seed(123)
  df3 <- pairwise_comparisons(
    data = msleep,
    x = vore,
    y = brainwt,
    type = "np",
    paired = FALSE,
    p.adjust.method = "none"
  )

  expect_snapshot(df3)
  expect_snapshot(df3[["expression"]])

  # robust t test
  set.seed(123)
  df4 <- pairwise_comparisons(
    data = msleep,
    x = vore,
    y = brainwt,
    type = "r",
    paired = FALSE,
    p.adjust.method = "fdr"
  )

  expect_snapshot(df4)
  expect_snapshot(df4[["expression"]])

  # checking the edge case where factor level names contain `-`
  set.seed(123)
  df5 <- pairwise_comparisons(
    data = movies_long,
    x = mpaa,
    y = rating,
    var.equal = TRUE
  )

  expect_snapshot(df5)
  expect_snapshot(df5[["expression"]])

  # bayes test
  set.seed(123)
  df6 <- pairwise_comparisons(
    data = df_msleep,
    x = vore,
    y = brainwt
  )

  expect_snapshot(df6)
  expect_snapshot(df6[["expression"]])
})

# dropped levels --------------------------------------------------

test_that(desc = "dropped levels are not included", code = {
  # drop levels
  msleep2 <- dplyr::filter(.data = msleep, vore %in% c("carni", "omni"))

  # check those levels are not included
  set.seed(123)
  df1 <- pairwise_comparisons(
    data = msleep2,
    x = vore,
    y = brainwt,
    p.adjust.method = "none"
  )

  expect_snapshot(df1)
  expect_snapshot(df1[["expression"]])

  set.seed(123)
  df2 <- pairwise_comparisons(
    data = msleep,
    x = vore,
    y = brainwt,
    p.adjust.method = "none"
  ) |>
    dplyr::filter(group2 == "omni", group1 == "carni")

  expect_equal(df1$statistic, df2$statistic, tolerance = 0.01)
})

# data without NAs --------------------------------------------------

test_that(desc = "data without NAs", code = {
  set.seed(123)
  df <- pairwise_comparisons(
    data = iris,
    x = Species,
    y = Sepal.Length,
    type = "p",
    p.adjust.method = "fdr",
    var.equal = TRUE
  )

  expect_snapshot(df)
  expect_snapshot(df[["expression"]])
})


# within-subjects design - NAs --------------------------------------------

test_that(desc = "`pairwise_comparisons()` works for within-subjects design - NAs", code = {
  # student's t test
  set.seed(123)
  df1 <- pairwise_comparisons(
    data = bugs_long,
    x = condition,
    y = desire,
    type = "p",
    digits = 3L,
    paired = TRUE,
    p.adjust.method = "bonferroni"
  )

  expect_snapshot(df1)
  expect_snapshot(df1[["expression"]])

  # Durbin-Conover test
  set.seed(123)
  df2 <- pairwise_comparisons(
    data = bugs_long,
    x = condition,
    y = desire,
    type = "np",
    digits = 3L,
    paired = TRUE,
    p.adjust.method = "BY"
  )

  expect_snapshot(df2)
  expect_snapshot(df2[["expression"]])

  # robust t test
  set.seed(123)
  df3 <- pairwise_comparisons(
    data = bugs_long,
    x = condition,
    y = desire,
    type = "r",
    digits = 3L,
    paired = TRUE,
    p.adjust.method = "hommel"
  )

  expect_snapshot(df3)
  expect_snapshot(df3[["expression"]])

  # Bayesian
  set.seed(123)
  df4 <- pairwise_comparisons(
    data = bugs_long,
    x = condition,
    y = desire,
    type = "bf",
    paired = TRUE
  )

  expect_snapshot(df4)
  expect_snapshot(df4[["expression"]])
})


# within-subjects design - no NAs -----------------------------------------

test_that(desc = "`pairwise_comparisons()` works for within-subjects design - without NAs", code = {
  # student's t test
  set.seed(123)
  df1 <- pairwise_comparisons(
    data = WRS2::WineTasting,
    x = Wine,
    y = Taste,
    type = "p",
    digits = 3L,
    paired = TRUE,
    p.adjust.method = "none"
  )

  expect_snapshot(df1)
  expect_snapshot(df1[["expression"]])

  # Durbin-Conover test
  set.seed(123)
  df2 <- pairwise_comparisons(
    data = WRS2::WineTasting,
    x = Wine,
    y = Taste,
    type = "np",
    digits = 3L,
    paired = TRUE,
    p.adjust.method = "none"
  )

  expect_snapshot(df2)
  expect_snapshot(df2[["expression"]])

  # robust t test
  set.seed(123)
  df3 <- pairwise_comparisons(
    data = WRS2::WineTasting,
    x = Wine,
    y = Taste,
    type = "r",
    digits = 3L,
    paired = TRUE,
    p.adjust.method = "none"
  )

  expect_snapshot(df3)
  expect_snapshot(df3[["expression"]])

  set.seed(123)
  df4 <- pairwise_comparisons(
    data = WRS2::WineTasting,
    x = Wine,
    y = Taste,
    type = "bf",
    paired = TRUE
  )

  expect_snapshot(df4)
  expect_snapshot(df4[["expression"]])
})

test_that(desc = "works with subject id", code = {
  set.seed(123)
  df1 <- purrr::pmap_dfr(
    .f = pairwise_comparisons,
    .l = list(
      data = list(WRS2::WineTasting),
      x = list("Wine"),
      y = list("Taste"),
      type = list("p", "np", "r", "bf"),
      digits = 3L,
      subject.id = list("Taster"),
      paired = TRUE
    )
  )

  set.seed(123)
  df2 <- purrr::pmap_dfr(
    .f = pairwise_comparisons,
    .l = list(
      data = list(dplyr::arrange(WRS2::WineTasting, Taster)),
      x = list("Wine"),
      y = list("Taste"),
      type = list("p", "np", "r", "bf"),
      digits = 3L,
      paired = TRUE
    )
  )

  # columns should be same no matter the test
  expect_equal(
    dplyr::select(df1, -expression),
    dplyr::select(df2, -expression),
    ignore_attr = TRUE
  )
  expect_equal(
    dplyr::select(df1, expression),
    dplyr::select(df2, expression),
    ignore_attr = TRUE
  )
})

# additional arguments are passed ---------------------------------------

test_that(desc = "additional arguments are passed to underlying methods", code = {
  set.seed(123)
  df1 <- pairwise_comparisons(
    data = bugs_long,
    x = condition,
    y = desire,
    paired = TRUE,
    p.adjust.method = "none",
    alternative = "less"
  )

  expect_snapshot(df1)
  expect_snapshot(df1[["expression"]])

  set.seed(123)
  df2 <- pairwise_comparisons(
    data = bugs_long,
    x = condition,
    y = desire,
    paired = TRUE,
    p.adjust.method = "none",
    alternative = "greater"
  )

  expect_snapshot(df2)
  expect_snapshot(df2[["expression"]])

  set.seed(123)
  df3 <- pairwise_comparisons(
    data = mtcars,
    x = cyl,
    y = wt,
    var.equal = TRUE,
    p.adjust.method = "none",
    alternative = "less"
  )

  expect_snapshot(df3)
  expect_snapshot(df3[["expression"]])

  set.seed(123)
  df4 <- pairwise_comparisons(
    data = mtcars,
    x = cyl,
    y = wt,
    var.equal = TRUE,
    p.adjust.method = "none",
    alternative = "greater"
  )

  expect_snapshot(df4)
  expect_snapshot(df4[["expression"]])
})
