# library(radiant.basics)
# library(testthat)

trim <- function(x) gsub("^\\s+|\\s+$", "", x)

context("Compare means")

test_that("compare_means 1", {
  result <- compare_means(diamonds, "cut", "price")
  res1 <- capture.output(summary(result))[9] %>% trim()
  # cat(paste0(res1, "\n"))
  res2 <- "Fair 4,505.238   101         0 3,749.540 373.093 740.206"
  expect_equal(res1, res2)
  res1 <- capture.output(summary(result))[16] %>% trim()
  # cat(paste0(res1, "\n"))
  res2 <- "Fair = Good           Fair not equal to Good            374.805 0.391"
  expect_equal(res1, res2)
})

test_that("compare_means 2", {
  result <- compare_means(diamonds, "cut", "price")
  res1 <- capture_output(summary(result, show = TRUE))
  # dput(res1)
  res2 <- "Pairwise mean comparisons (t-test)\nData      : diamonds \nVariables : cut, price \nSamples   : independent \nConfidence: 0.95 \nAdjustment: None \n\n       cut      mean     n n_missing        sd      se      me\n      Fair 4,505.238   101         0 3,749.540 373.093 740.206\n      Good 4,130.433   275         0 3,730.354 224.949 442.848\n Very Good 3,959.916   677         0 3,895.899 149.732 293.995\n   Premium 4,369.409   771         0 4,236.977 152.591 299.544\n     Ideal 3,470.224 1,176         0 3,827.423 111.610 218.977\n\n Null hyp.             Alt. hyp.                        diff     p.value\n Fair = Good           Fair not equal to Good            374.805 0.391  \n Fair = Very Good      Fair not equal to Very Good       545.322 0.177  \n Fair = Premium        Fair not equal to Premium         135.829 0.737  \n Fair = Ideal          Fair not equal to Ideal          1035.014 0.009  \n Good = Very Good      Good not equal to Very Good       170.517 0.528  \n Good = Premium        Good not equal to Premium        -238.976 0.38   \n Good = Ideal          Good not equal to Ideal           660.209 0.009  \n Very Good = Premium   Very Good not equal to Premium   -409.493 0.056  \n Very Good = Ideal     Very Good not equal to Ideal      489.692 0.009  \n Premium = Ideal       Premium not equal to Ideal        899.185 < .001 \n se      t.value df       2.5%     97.5%       \n 435.661  0.860   177.365 -484.941 1234.551    \n 402.018  1.356   134.291 -249.783 1340.427    \n 403.091  0.337   135.759 -661.321  932.979    \n 389.429  2.658   118.618  263.879 1806.149 ** \n 270.225  0.631   528.529 -360.330  701.364    \n 271.820 -0.879   543.242 -772.922  294.971    \n 251.115  2.629   419.577  166.609 1153.809 ** \n 213.784 -1.915  1442.922 -828.853    9.868 .  \n 186.752  2.622  1389.163  123.346  856.039 ** \n 189.052  4.756  1527.729  528.355 1270.015 ***\n\nSignif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1"
  expect_equal(res1, res2)
})

context("Compare proportions")

test_that("compare_props 1", {
  result <- compare_props(titanic, "pclass", "survived")
  res1 <- capture.output(summary(result))[9] %>% trim()
  # cat(paste0(res1, "\n"))
  res2 <- "1st 179 103 0.635 282         0 0.481 0.029 0.056"
  expect_equal(res1, res2)
})

test_that("compare_props 2", {
  result <- compare_props(titanic, "pclass", "survived")
  res1 <- capture_output(summary(result, show = TRUE))
  # dput(res1)
  res2 <- "Pairwise proportion comparisons\nData      : titanic \nVariables : pclass, survived \nLevel     :  in survived \nConfidence: 0.95 \nAdjustment: None \n\n pclass Yes  No     p   n n_missing    sd    se    me\n    1st 179 103 0.635 282         0 0.481 0.029 0.056\n    2nd 115 146 0.441 261         0 0.496 0.031 0.060\n    3rd 131 369 0.262 500         0 0.440 0.020 0.039\n\n Null hyp.   Alt. hyp.              diff  p.value chisq.value df 2.5%  97.5%\n 1st = 2nd   1st not equal to 2nd   0.194 < .001  20.576      1  0.112 0.277\n 1st = 3rd   1st not equal to 3rd   0.373 < .001  104.704     1  0.305 0.441\n 2nd = 3rd   2nd not equal to 3rd   0.179 < .001  25.008      1  0.107 0.250\n    \n ***\n ***\n ***\n\nSignif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1"
  expect_equal(res1, res2)
})

context("Single proportion")

test_that("single_prop 1", {
  result <- single_prop(diamonds, "color")
  expect_equal(result$lev, "D")
  res1 <- capture_output(summary(result))
  # dput(res1)
  res2 <- "Single proportion test (binomial exact)\nData      : diamonds \nVariable  : color \nLevel     : D in color \nConfidence: 0.95 \nNull hyp. : the proportion of D in color = 0.5 \nAlt. hyp. : the proportion of D in color not equal to 0.5 \n\n     p  ns     n n_missing    sd    se    me\n 0.127 382 3,000         0 0.333 0.006 0.012\n\n   diff  ns p.value  2.5% 97.5%    \n -0.373 382  < .001 0.116 0.140 ***\n\nSignif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1"
  expect_equal(res1, res2)
})

test_that("single_prop 2", {
  result <- single_prop(diamonds, "clarity", lev = "IF", comp_value = 0.05)
  expect_equal(result$lev, "IF")
  res1 <- capture_output(summary(result))
  # dput(res1)
  res2 <- "Single proportion test (binomial exact)\nData      : diamonds \nVariable  : clarity \nLevel     : IF in clarity \nConfidence: 0.95 \nNull hyp. : the proportion of IF in clarity = 0.05 \nAlt. hyp. : the proportion of IF in clarity not equal to 0.05 \n\n     p ns     n n_missing    sd    se    me\n 0.033 99 3,000         0 0.179 0.003 0.006\n\n   diff ns p.value  2.5% 97.5%    \n -0.017 99  < .001 0.027 0.040 ***\n\nSignif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1"
  expect_equal(res1, res2)
})

context("Single mean")

test_that("single_mean 1", {
  result <- single_mean(diamonds, "carat")
  res1 <- capture.output(summary(result))[12] %>% trim()
  # cat(paste0(res1, "\n"))
  res2 <- "0.794 0.009  91.816  < .001 2999 0.777 0.811 ***"
  expect_equal(res1, res2)
})

test_that("single_mean 2", {
  result <- single_mean(titanic, "age", comp_value = 40)
  res1 <- capture.output(summary(result))[12] %>% trim()
  # cat(paste0(res1, "\n"))
  res2 <- "-10.187 0.445   -22.9  < .001 1042 28.94 30.686 ***"
  expect_equal(res1, res2)
})
