test_that("flexsurvreg + predict() works", {
  skip_on_cran()
  skip_if_not_installed("flexsurv")
  suppressPackageStartupMessages(library(flexsurv))
  fit <- flexsurvreg(Surv(futime, fustat) ~ age, data = ovarian, dist = "exp")
  x <- axe_call(fit)
  expect_equal(x$call, rlang::expr(dummy_call()))
  x <- axe_env(fit)
  expect_identical(attr(attributes(x$data$m)$terms, ".Environment"), rlang::base_env())
  expect_identical(attr(x$concat.formula, ".Environment"), rlang::base_env())
  expect_identical(attr(x$all.formulae$rate, ".Environment"), rlang::base_env())
})

test_that("flexsurvreg markov + predict() works", {
  skip_on_cran()
  skip_if_not_installed("flexsurv")
  suppressPackageStartupMessages(library(flexsurv))
  fit <- flexsurvreg(Surv(years, status) ~ trans + shape(trans),
                     data = bosms3,
                     dist = "weibull")
  x <- axe_call(fit)
  expect_equal(x$call, rlang::expr(dummy_call()))
  x <- axe_env(fit)
  expect_identical(attr(attributes(x$data$m)$terms, ".Environment"), rlang::base_env())
  expect_identical(attr(x$concat.formula, ".Environment"), rlang::base_env())
  expect_identical(attr(x$all.formulae$scale, ".Environment"), rlang::base_env())
  x <- butcher(fit)
  # Obtain cumulative transition-specific hazards
  tmat <- rbind(c(NA, 1, 2), c(NA, NA, 3), c(NA, NA, NA))
  tgrid <- seq(0, 14, by = 0.1)
  expected_cul <- flexsurv::msfit.flexsurvreg(fit, t = tgrid, trans = tmat)
  expected_output <- expected_cul$Haz$Haz[1:3]
  expect_equal(flexsurv::msfit.flexsurvreg(x, t = tgrid, trans = tmat)$Haz$Haz[1:3],
               expected_output)
  # Prediction from parametric multi-state models
  set.seed(123)
  expected_output <- flexsurv::pmatrix.simfs(fit, trans = tmat, t = 5)
  set.seed(123)
  expect_equal(flexsurv::pmatrix.simfs(x, trans = tmat, t = 5), expected_output)
})

test_that("flexsurvreg + custom distribution + predict() works", {
  skip_on_cran()
  skip_if_not_installed("flexsurv")
  suppressPackageStartupMessages(library(flexsurv))
  fit <- flexsurvreg(Surv(futime, fustat) ~ 1, data = ovarian, dist = "weibull")
  x <- butcher(fit)
  expect_equal(model.matrix(x), model.matrix(fit))
})
