#-----------------------------------
### Testing sfTDist function
#-----------------------------------


testthat::test_that("Test: alpha - incorrect variable type", {
  testthat::expect_error(gsDesign::sfTDist(
    alpha = "abc", t = c(.1, .4),
    param = c(0.1, 0.2)
  ),
  info = "Checking for incorrect variable type"
  )

  testthat::expect_error(gsDesign::sfTDist(
    alpha = 0, t = c(.1, .4),
    param = c(0.1, 0.2)
  ),
  info = "Checking for out-of-range variable value"
  )


  testthat::expect_error(gsDesign::sfTDist(
    alpha = -1, t = c(.1, .4),
    param = c(0.1, 0.2)
  ),
  info = "Checking for out-of-range variable value"
  )
})


testthat::test_that("Test: t - Checking Variable Type, 
                    Out-of-Range, Order-of-List", {
  testthat::expect_error(gsDesign::sfTDist(alpha = .025, t = "a", param = c(0.1, 0.2)),
    info = "Checking for incorrect variable type"
  )

  testthat::expect_error(gsDesign::sfTDist(
    alpha = .025, t = c("a", "b"),
    param = c(0.1, 0.2)
  ),
  info = "Checking for incorrect variable type"
  )


  testthat::expect_error(gsDesign::sfTDist(
    alpha = .025, t = c(-.5, .75),
    param = c(0.1, 0.2)
  ),
  info = "Checking for out-of-range variable value"
  )

  testthat::expect_error(gsDesign::sfTDist(
    alpha = .025, t = c(.5, -.75),
    param = c(0.1, 0.2)
  ),
  info = "Checking for out-of-range variable value"
  )

  testthat::expect_error(gsDesign::sfTDist(
    alpha = .025, t = c(1, 6),
    param = c(0.1, 0.2)
  ),
  info = "Checking for out-of-range variable value"
  )
  testthat::expect_error(gsDesign::sfTDist(
    alpha = .025, t = c(6, 1),
    param = c(0.1, 0.2)
  ),
  info = "Checking for out-of-range variable value"
  )

  testthat::expect_error(gsDesign::sfTDist(
    alpha = .025, t = c(1, -5),
    param = c(0.1, 0.2)
  ),
  info = "Checking for out-of-range variable value"
  )
  testthat::expect_error(gsDesign::sfTDist(
    alpha = .025, t = c(-1, 5),
    param = c(0.1, 0.2)
  ),
  info = "Checking for out-of-range variable value"
  )
})



testthat::test_that("Test: param - Checking Variable Type, Out-of-Range, 
                    Order-of-List", {
  testthat::expect_error(gsDesign::sfTDist(
    alpha = .025, t = c(.1, .4),
    param = c("a", "b")
  ),
  info = "Checking for incorrect variable type"
  )

  testthat::expect_error(gsDesign::sfTDist(alpha = .025, t = c(.1, .4), param = "a"),
    info = "Checking for incorrect variable type"
  )


  testthat::expect_error(gsDesign::sfTDist(alpha = .025, t = c(.1, .4), param = 4),
    info = "Checking for incorrect variable type"
  )



  testthat::expect_error(gsDesign::sfTDist(
    alpha = .025, t = c(.1, .4),
    param = c(.2, .55, .75)
  ),
  info = "Checking for length of the variable"
  )

  testthat::expect_error(gsDesign::sfTDist(
    alpha = .025, t = c(.1, .4),
    param = c(.2, .45, .55, 0.75, 0.85)
  ),
  info = "Checking for length of the variable"
  )

  testthat::expect_error(gsDesign::sfTDist(
    alpha = .025, t = c(.1, .4),
    param = c(1, 0)
  ),
  info = "Checking for out-of-range of the variable"
  )

  testthat::expect_error(gsDesign::sfTDist(
    alpha = .025, t = c(.1, .4),
    param = c(1, -5)
  ),
  info = "Checking for out-of-range of the variable"
  )

  testthat::expect_error(gsDesign::sfTDist(
    alpha = .025, t = c(.1, .4),
    param = c(-3, -1)
  ),
  info = "Checking for out-of-range of the variable"
  )

  testthat::expect_error(gsDesign::sfTDist(
    alpha = .025, t = c(.1, .4),
    param = c(NULL, 0.2, 0.05, .4)
  ),
  info = "Checking for out-of-range of the variable"
  )

  testthat::expect_error(gsDesign::sfTDist(
    alpha = .025, t = c(.1, .4),
    param = c(0.2, NULL, 0.05, .4)
  ),
  info = "Checking for out-of-range of the variable"
  )


  testthat::expect_error(gsDesign::sfTDist(
    alpha = .025, t = c(.1, .4),
    param = c(0.1, 0.01, 0.1, 0.4)
  ),
  info = "Checking for out-of-range of the variable"
  )

  testthat::expect_error(gsDesign::sfTDist(
    alpha = .025, t = c(.1, .4),
    param = c(0.01, 0.1, 0.4, 0.1)
  ),
  info = "Checking for out-of-range of the variable"
  )

  testthat::expect_error(gsDesign::sfTDist(
    alpha = .025, t = c(.1, .4),
    param = c(0.01, -0.1, 0.1, 0.4)
  ),
  info = "Checking for out-of-range of the variable"
  )
})



testthat::test_that("Test: output validation param of length 3, 
                    Source: helper.R)", {
  t <- c(.01, .05, .1, .25, .5, 1, 1.02)
  alpha <- 0.025
  param <- c(.25, .1, 1)

  spend <- gsDesign::sfTDist(alpha, t, param)$spend
  expected_spend <- validate_sfTDist(alpha, t, param)
  expect_equal(spend, expected_spend)
})


testthat::test_that("Test: output validation param of length 5, 
                    Source: helper.R", {
  t <- c(.01, .05, .1, .25, .5, 1, 1.02)
  alpha <- 0.025
  param <- c(.1, .25, 0.3, 0.5, 2)


  spend <- sfTDist(alpha, t, param)$spend
  expected_spend <- validate_sfTDist(alpha, t, param)
  expect_equal(spend, expected_spend)
})