## -----------------------------------------------------------------------------
## test-plots.R
##
## Author: Ha Truong
## Created: 12 Nov 2025
## Purpose: Test all plot functions
## -----------------------------------------------------------------------------



# Tests for plot.AttrPlan()
# -----------------------------------------------------------------------------

test_that("plot.AttrPlan runs without error", {
  plan <- optAttrPlan(PRQ = 0.01, CRQ = 0.05)
  
  expect_silent({
    plot(plan)
  })
})

test_that("plot.AttrPlan runs with custom pd", {
  plan <- optAttrPlan(PRQ = 0.01, CRQ = 0.05)
  pd <- seq(0, 0.1, length.out = 20)
  
  expect_silent({
    plot(plan, pd = pd)
  })
})


test_that("plot.AttrPlan produces a plot object", {
  plan <- optAttrPlan(PRQ = 0.01, CRQ = 0.05)
  
  expect_silent({
    plot(plan)
  })
  
  p <- recordPlot()
  expect_true(inherits(p, "recordedplot"))
})


test_that("accProb agrees with binomial pbinom", {
  plan <- optAttrPlan(PRQ = 0.01, CRQ = 0.05)
  p <- 0.03
  
  expect_equal(
    accProb(plan, p),
    pbinom(plan$c, plan$n, p),
    tolerance = 1e-6
  )
})


# Tests for plot.VarPlan()
# --------------------------------------------------------------------

test_that("plot.VarPlan (by='pd') runs without error", {
  plan <- optVarPlan(PRQ = 0.005, CRQ = 0.03,
                     alpha = 0.05, beta = 0.10,
                     distribution = "normal", sigma_type = "known")
  
  expect_silent({
    plot(plan, by = "pd")
  })
})

test_that("plot.VarPlan (by='pd') works with custom pd", {
  plan <- optVarPlan(PRQ = 0.005, CRQ = 0.03,
                     alpha = 0.05, beta = 0.10,
                     distribution = "normal", sigma_type = "known")
  
  pd <- seq(0, 0.1, length.out = 20)
  
  expect_silent({
    plot(plan, pd = pd, by = "pd")
  })
})

test_that("plot.VarPlan produces a recordedplot (by='pd')", {
  plan <- optVarPlan(PRQ = 0.005, CRQ = 0.03,
                     alpha = 0.05, beta = 0.10,
                     distribution = "normal", sigma_type = "known")
  
  plot(plan, by = "pd")
  p <- recordPlot()
  
  expect_true(inherits(p, "recordedplot"))
})

test_that("plot.VarPlan errors when sigma_type missing", {
  plan <- list(
    PRQ = 0.01, CRQ = 0.05,
    distribution = "normal",
    sigma = 1, USL = 10, LSL = 0
  )
  class(plan) <- "VarPlan"
  
  expect_error(plot(plan), "sigma_type")
})

test_that("plot.VarPlan errors when sigma missing", {
  plan <- list(PRQ = 0.01, CRQ = 0.05, distribution = "normal")
  class(plan) <- "VarPlan"
  
  expect_error(plot(plan), "sigma")
})


test_that("plot.VarPlan errors for invalid by argument", {
  plan <- optVarPlan(PRQ = 0.005, CRQ = 0.03,
                     alpha = 0.05, beta = 0.10,
                     distribution = "normal", sigma_type = "known",
                     USL = 0.05)
  
  expect_error(plot(plan, by="xyz"), "should be one of")
})

test_that("plot.VarPlan supports every unknown-theta Beta method", {
  pd <- seq(0.005, 0.08, length.out = 12)
  for (method in c("delta_mle", "delta_mom", "gk_adjustment")) {
    plan <- manualPlan(
      distribution = "beta", n = 45, k = 2.2,
      theta = 300, theta_type = "unknown", method = method,
      USL = 0.05
    )
    plan$PRQ <- 0.01
    plan$CRQ <- 0.05
    plan$PR <- 0.05
    plan$CR <- 0.10

    expect_silent(plot(plan, pd = pd, by = "pd"))
    expect_silent(plot(plan, pd = pd, by = "mean"))
  }
})
