
data("gene_expression", package = "ggpubr")
data("ToothGrowth")


test_that("compare_means works for One-sample test", {
  results <- compare_means(len ~ 1, ToothGrowth, mu = 0)
  results <- results %>%
    dplyr::select(.y., group1, group2, p.format, p.signif, method)
  expected <- tibble::tribble(
      ~.y., ~group1,      ~group2, ~p.format, ~p.signif,    ~method,
     "len",       1, "null model", "1.7e-11",    "****", "Wilcoxon"
     )
  expect_equal(results, expected)
})


test_that("compare_means works for Two-samples unpaired test", {
  results <- compare_means(len ~ supp, ToothGrowth)
  results <- results %>%
    dplyr::select(.y., group1, group2, p.format, p.signif, method)
  expected <- tibble::tribble(
      ~.y., ~group1, ~group2, ~p.format, ~p.signif,    ~method,
     "len",    "OJ",    "VC",   "0.064",      "ns", "Wilcoxon"
     )
  expect_equal(results, expected)
})


test_that("compare_means works for Two-samples paired test", {
  results <- compare_means(len ~ supp, ToothGrowth, paired = TRUE)
  results <- results %>%
    dplyr::select(.y., group1, group2, p.format, p.signif, method)
  expected <- tibble::tribble(
      ~.y., ~group1, ~group2, ~p.format, ~p.signif,    ~method,
     "len",    "OJ",    "VC",  "0.0043",      "**", "Wilcoxon"
     )
  expect_equal(results, expected)
})


test_that("compare_means works for pairwise comparisons", {
  results <- compare_means(len ~ dose, ToothGrowth)
  results <- results %>%
    dplyr::select(.y., group1, group2, p.format, p.signif, method)
  expected <- tibble::tribble(
      ~.y., ~group1, ~group2, ~p.format, ~p.signif,    ~method,
     "len",   "0.5",     "1", "7.0e-06",    "****", "Wilcoxon",
     "len",   "0.5",     "2", "8.4e-08",    "****", "Wilcoxon",
     "len",     "1",     "2", "0.00018",     "***", "Wilcoxon"
     )
  expect_equal(results, expected)
})

test_that("compare_means works for comparison against reference groups", {
  results <- compare_means(len ~ dose, ToothGrowth, ref.group = "0.5")
  results <- results %>%
    dplyr::select(.y., group1, group2, p.format, p.signif, method)
  expected <- tibble::tribble(
      ~.y., ~group1, ~group2, ~p.format, ~p.signif,    ~method,
     "len",   "0.5",     "1", "7.0e-06",    "****", "Wilcoxon",
     "len",   "0.5",     "2", "8.4e-08",    "****", "Wilcoxon"
     )
  expect_equal(results, expected)
})



test_that("compare_means works when using formula with multiple variables", {
  results <- compare_means(c(GATA3, XBP1, PTEN) ~ dataset, data = gene_expression)
  results <- results %>%
    dplyr::select(.y., group1, group2, p.format, p.signif, method)
  expected <- tibble::tribble(
        ~.y., ~group1, ~group2, ~p.format, ~p.signif,    ~method,
     "GATA3",  "BRCA",    "OV", "< 2e-16",    "****", "Wilcoxon",
     "GATA3",  "BRCA",  "LUSC", "< 2e-16",    "****", "Wilcoxon",
     "GATA3",    "OV",  "LUSC", "3.0e-08",    "****", "Wilcoxon",
      "XBP1",  "BRCA",    "OV", "< 2e-16",    "****", "Wilcoxon",
      "XBP1",  "BRCA",  "LUSC", "< 2e-16",    "****", "Wilcoxon",
      "XBP1",    "OV",  "LUSC", "4.2e-11",    "****", "Wilcoxon",
      "PTEN",  "BRCA",    "OV", "6.8e-05",    "****", "Wilcoxon",
      "PTEN",  "BRCA",  "LUSC", "< 2e-16",    "****", "Wilcoxon",
      "PTEN",    "OV",  "LUSC", "1.3e-07",    "****", "Wilcoxon"
     ) %>%
    dplyr::mutate(.y. = factor(.y., levels = c("GATA3", "XBP1", "PTEN")))
  expect_equal(results, expected)
})


test_that("compare_means works when using ref.group = '.all.'", {
  results <- compare_means(len ~ dose, ToothGrowth, ref.group = ".all.")
  results <- results %>%
    dplyr::select(.y., group1, group2, p.format, p.signif, method)
  expected <- tibble::tribble(
      ~.y., ~group1, ~group2, ~p.format, ~p.signif,    ~method,
     "len", ".all.",   "0.5", "5.1e-05",    "****", "Wilcoxon",
     "len", ".all.",     "1", "0.76404",      "ns", "Wilcoxon",
     "len", ".all.",     "2", "0.00018",     "***", "Wilcoxon"
     )
  expect_equal(results, expected)
})


test_that("compare_means works for Anova", {
  results <- compare_means(len ~ dose, ToothGrowth, method = "anova")
  results <- results %>%
    dplyr::select(.y., p.format, p.signif, method)
  expected <- tibble::tribble(
      ~.y., ~p.format, ~p.signif, ~method,
     "len", "9.5e-16",    "****", "Anova"
     )
  expect_equal(results, expected)
})


test_that("compare_means works for kruskal.test", {
  results <- compare_means(len ~ dose, ToothGrowth, method = "kruskal.test")
  results <- results %>%
    dplyr::select(.y., p.format, p.signif, method)
  expected <- tibble::tribble(
      ~.y., ~p.format, ~p.signif,          ~method,
     "len", "1.5e-09",    "****", "Kruskal-Wallis"
     )
  expect_equal(results, expected)
})


test_that("compare_means works when grouping variable levels contain group2", {
  tibble::tribble(
    ~val,    ~gp,  ~by,
    923 , 'group4','V1',
    1252, 'group4','V1',
    1442, 'group4','V1',
    1398, 'group2','V1',
    1858, 'group2','V1',
    1330, 'group2','V1',
    2593, 'group2','V1',
    23 ,  'group4','V2',
    252,  'group4','V2',
    442,  'group4','V2',
    398,  'group2','V2',
    858,  'group2','V2',
    330,  'group2','V2',
    593,  'group2','V2'
  ) %>% dplyr::mutate(gp=factor(gp, levels = c('group2','group4'))) -> dat

  results <- compare_means(val ~ gp, data = dat, group.by = 'by', paired = F)
  results <- results %>%
    dplyr::select(.y., group1, group2, p.format, p.signif, method)
  expected <- tibble::tribble(
      ~.y.,  ~group1,  ~group2, ~p.format, ~p.signif,    ~method,
     "val", "group2", "group4",    "0.23",      "ns", "Wilcoxon",
     "val", "group2", "group4",    "0.23",      "ns", "Wilcoxon"
     )
  expect_equal(results, expected)
})

