test_that("distribution description works as expected", {
  # extract the "first element" to convert to character
  assume_ <- function(...) {
    assume(...)[1]
  }

  expect_equal(
    gss %>%
      specify(age ~ partyid) %>%
      hypothesize(null = "independence") %>%
      assume_(
       distribution = "F",
       df = c(length(unique(gss$partyid)) - 1, nrow(gss) - 4)
      ),
    "An F distribution with 3 and 496 degrees of freedom."
  )

  expect_equal(
    gss %>%
      specify(age ~ partyid) %>%
      hypothesize(null = "independence") %>%
      assume_(
        distribution = "F",
        df = c(length(unique(gss$partyid)) - 1, nrow(gss) - 4)
      ),
    gss %>%
      specify(age ~ partyid) %>%
      hypothesize(null = "independence") %>%
      assume_(distribution = "F")
  )

  expect_equal(
    gss %>%
      specify(response = finrela) %>%
      hypothesize(null = "point",
                  p = c("far below average" = 1/6,
                        "below average" = 1/6,
                        "average" = 1/6,
                        "above average" = 1/6,
                        "far above average" = 1/6,
                        "DK" = 1/6)) %>%
      assume_("Chisq", length(unique(gss$finrela)) - 1),
    "A Chi-squared distribution with 5 degrees of freedom."
  )

  expect_equal(
    gss %>%
      specify(response = finrela) %>%
      hypothesize(null = "point",
                  p = c("far below average" = 1/6,
                        "below average" = 1/6,
                        "average" = 1/6,
                        "above average" = 1/6,
                        "far above average" = 1/6,
                        "DK" = 1/6)) %>%
      assume_("Chisq"),
    "A Chi-squared distribution with 5 degrees of freedom."
  )

  expect_equal(
    gss %>%
      specify(formula = finrela ~ sex) %>%
      hypothesize(null = "independence") %>%
      assume_(
        distribution = "Chisq",
        df = (length(unique(gss$finrela)) - 1) *
          (length(unique(gss$sex)) - 1)
      ),
    "A Chi-squared distribution with 5 degrees of freedom."
  )

  expect_equal(
    gss %>%
      specify(formula = finrela ~ sex) %>%
      hypothesize(null = "independence") %>%
      assume_(distribution = "Chisq"),
    "A Chi-squared distribution with 5 degrees of freedom."
  )

  expect_equal(
    gss %>%
      specify(age ~ college) %>%
      hypothesize(null = "independence") %>%
      assume_("t"),
    "A T distribution with 423 degrees of freedom."
  )

  expect_equal(
    gss %>%
      specify(response = sex, success = "female") %>%
      hypothesize(null = "point", p = .5) %>%
      assume_("z"),
    "A Z distribution."
  )
})

test_that("assume errors with bad arguments", {
  # supply a bad distribution
  expect_snapshot(error = TRUE,
    gss %>%
      specify(age ~ college) %>%
      hypothesize(null = "independence") %>%
      assume("boop", nrow(gss) - 1)
  )

  # bad number of df arguments
  expect_snapshot(error = TRUE,
    gss %>%
      specify(age ~ college) %>%
      hypothesize(null = "independence") %>%
      assume("t", c(nrow(gss) - 1, 2))
   )

  expect_snapshot(error = TRUE,
    gss %>%
      specify(age ~ partyid) %>%
      hypothesize(null = "independence") %>%
      assume("F", nrow(gss) - 1)
  )

  # bad df argument type
  expect_snapshot(error = TRUE,
    gss %>%
      specify(age ~ partyid) %>%
      hypothesize(null = "independence") %>%
      assume("F", "boop")
  )

  # df argument possibly passed to dots
  expect_snapshot(error = TRUE,
    gss %>%
      specify(age ~ partyid) %>%
      hypothesize(null = "independence") %>%
      assume("F", nrow(gss) - 1, 1)
  )

  expect_snapshot(error = TRUE,
    gss %>%
      specify(age ~ partyid) %>%
      hypothesize(null = "independence") %>%
      assume("F", nrow(gss) - 1, 1, 2)
  )

  # supply `distribution`s that don't align with the supplied variables
  expect_snapshot(error = TRUE,
    gss %>%
      specify(age ~ finrela) %>%
      hypothesize(null = "independence") %>%
      assume("t", nrow(gss) - 1)
  )

  expect_snapshot(error = TRUE,
    gss %>%
      specify(age ~ finrela) %>%
      hypothesize(null = "independence") %>%
      assume("z", nrow(gss) - 1)
  )

  expect_snapshot(error = TRUE,
    gss %>%
      specify(age ~ NULL) %>%
      hypothesize(null = "point", mu = 40) %>%
      assume("z", nrow(gss) - 1)
  )

  # supply bad `x` arguments
  expect_snapshot(error = TRUE,
    gss %>%
      assume("z", nrow(gss) - 1)
  )

  expect_snapshot(error = TRUE,
    "boop" %>%
      assume("z", nrow(gss) - 1)
  )
})

test_that("assume() handles automatic df gracefully", {
  expect_equal(
    expect_silent(
      gss %>%
        specify(response = hours) %>%
        hypothesize(null = "point", mu = 40) %>%
        assume("t")
    ),
    expect_silent(
      gss %>%
        specify(response = hours) %>%
        hypothesize(null = "point", mu = 40) %>%
        assume("t")
    )
  )

  expect_snapshot(
    res_ <- gss %>%
      specify(response = hours) %>%
      hypothesize(null = "point", mu = 40) %>%
      assume("t", nrow(gss) - 2)
  )

  # t.test param with var.equal = FALSE
  expect_equal(
    expect_silent(
      gss %>%
        specify(age ~ college) %>%
        hypothesize(null = "independence") %>%
        assume(distribution = "t", 423) %>%
        attr("df")
    ),
    423
  )

  # t.test param with var.equal = TRUE
  expect_equal(
    expect_silent(
      gss %>%
        specify(age ~ college) %>%
        hypothesize(null = "independence") %>%
        assume(distribution = "t", 498) %>%
        attr("df")
    ),
    498
  )

  # min(n1 - 1, n2 - 1)
  expect_equal(
    expect_silent(
      gss %>%
        specify(age ~ college) %>%
        hypothesize(null = "independence") %>%
        assume(distribution = "t", 173) %>%
        attr("df")
    ),
    173
  )


  # n1 + n2 - 2
  expect_equal(
    expect_silent(
      gss %>%
        specify(age ~ college) %>%
        hypothesize(null = "independence") %>%
        assume(distribution = "t", 498) %>%
        attr("df")
    ),
    498
  )
})

test_that("assume() brings along supplied arguments", {
  t_dist <-  gss %>%
    specify(age ~ college) %>%
    hypothesize(null = "independence") %>%
    assume("t")

  expect_equal(
    round(attr(t_dist, "df")),
    423
  )

  expect_equal(
    attr(t_dist, "distribution"),
    "t"
  )

  expect_equal(
    attr(t_dist, "theory_type"),
    "Two sample t"
  )

  expect_equal(
    attr(t_dist, "df"),
    attr(t_dist, "distr_param")
  )

  f_dist <- gss %>%
    specify(age ~ partyid) %>%
    hypothesize(null = "independence") %>%
    assume(distribution = "F")

  expect_equal(
    attr(f_dist, "df"),
    c(attr(f_dist, "distr_param"), attr(f_dist, "distr_param2"))
  )
})

test_that("process_df works", {
  expect_equal(
    process_df(1),
    list(df = 1)
  )

  expect_equal(
    process_df(c(1, 2)),
    list(df1 = 1, df2 = 2)
  )

  expect_equal(
    process_df(NULL),
    list()
  )
})
