rxTest({
  ## To keep basename the same
  .rxWithOptions(list(
    "rxode2.basename.print" = "basename",
    "rxode2.dll.print" = "dll",
    "rxode2.c.print" = "cfile"
  ), {
    ## test_path("test-print.txt")
    .df <- expand.grid(color = c(TRUE, FALSE), unicode = c(TRUE, FALSE))
    lapply(seq_along(.df$color), function(.i) {
      .path <- test_path(sprintf(
        "test-print%s%s.txt", ifelse(.df$color[.i], "-color", ""),
        ifelse(.df$unicode[.i], "-unicode", "")
      ))
      test_that(paste0(.i, ":", .path), {
        verify_output(
          .path,
          {
            mod <- rxode2({
              a <- 6
              b <- 0.6 + a / 100
              kel <- b * 0.01
              V <- 10
              d / dt(intestine) <- -a * intestine
              d / dt(blood) <- a * intestine - b * blood
              l2 <- linCmt()
            })

            print(mod)

            summary(mod)
            str(mod) ## fragile

            print(mod$cmpMgr$rxDll())
            summary(mod$cmpMgr$rxDll())

            coef(mod)

            print(rxModelVars(mod))

            print(rxC(mod))
            summary(rxC(mod)) # too fragile

            print(mod$.rxDll)

            et <- eventTable(time.units = "days")
            et$add.sampling(seq(0, 10, by = 1 / 24))
            et$add.dosing(
              dose = 2 / 24, rate = 2, start.time = 0,
              nbr.doses = 10, dosing.interval = 1
            )

            print(et)
            summary(et)
            str(et)

            et2 <- et |> et(id = 1:10)
            print(et2)

            tmp <- class(et2)
            et2$matt <- 4
            class(et2) <- tmp
            print(et2)

            print(attr(class(et), ".rxode2.lst"))
            str(attr(class(et), ".rxode2.lst"))

            print(format(structure(0:7, class = "rxEvid")))
            print(structure(0:7, class = "rxEvid"))

            print(format(structure(c(-2, -1, 0, 1, 2), class = "rxRateDur")))
            print(structure(c(-2, -1, 0, 1, 2), class = "rxRateDur"))


            pk <- solve(mod, et)
            print(pk)

            print(pk, width = 40)

            print(pk, bound = "k")

            print(pk, n = 10)

            .rxWithOptions(
              list(rxode2.display.tbl = FALSE),
              print(pk)
            )

            summary(pk)
            str(pk)

            print(summary(pk, bound = "k"))


            modS <- rxode2(mod, calcSens = TRUE)

            print(coef(modS))

            ## Now "destroy" the rxode2 solved object and change the printout
            tmp <- class(pk)
            pk$matt <- 4
            class(tmp) <- tmp
            print(pk)
            class(pk) <- tmp
            summary(pk)

            noOde <- rxode2({
              matt <- a^2 + b^2
            })

            print(coef(noOde))


            rxUnload(mod)
            print(mod)
            print(mod$cmpMgr$rxDll())
            summary(mod)
            str(mod)

            rxDelete(mod)
            print(mod)
            print(mod$cmpMgr$rxDll())
            summary(mod)
            str(mod)

            mod <- rxode2(mod, indLin = TRUE)

            print(mod)
            summary(mod)
            str(mod)

            rxUnload(mod)
            print(mod)
            summary(mod)
            str(mod)

            rxDelete(mod)
            print(mod)
            summary(mod)
            str(mod)

            rxWithSeed(
              42,
              tmp <- matrix(rnorm(5^2), 5, 5)
            )
            mcov <- tcrossprod(tmp, tmp)
            v <- rxSymInvCholCreate(mcov, "sqrt")

            print(v)
            str(v)

            class(v) <- NULL
            v$env$theta <- NULL
            class(v) <- "rxSymInvCholEnv"
            print(v)

            mod <- rxode2("
a = 6
b = 0.6
d/dt(intestine) = -a*intestine
d/dt(blood)     = a*intestine - b*blood
")


            et <- eventTable()
            et$add.dosing(
              dose = 2 / 24, rate = 2, start.time = 0,
              nbr.doses = 10, dosing.interval = 1
            )
            et <- et |>
              et(0.05, evid = 2) |>
              et(amt = 3, time = 0.5, cmt = out) |>
              et(amt = 3, time = 0.1, cmt = intestine, ss = 1, ii = 3) |>
              et(amt = 3, time = 0.3, cmt = intestine, ss = 2, ii = 3) |>
              et(time = 0.2, cmt = "-intestine") |>
              as.data.frame()

            ett1 <- etTrans(et, mod, keepDosingOnly = TRUE)

            print(ett1)

            mod2 <- rxode2({
              ## the order of variables do not matter, the type of compartmental
              ## model is determined by the parameters specified.
              CL ~ TCL * exp(eta.Cl)
              C2 ~ linCmt(KA, CL, V2, Q, V3)
              eff(0) <- 1 + eff0^2 ## This specifies that the effect compartment starts at 1.
              d / dt(eff) ~ Kin - Kout * (1 - C2 / (EC50 + C2)) * eff
              ##
              resp <- eff + err1
              pk <- C2 * exp(err2)
            })


            ev <- eventTable(amount.units = "mg", time.units = "hours") |>
              add.dosing(dose = 10000, nbr.doses = 10, dosing.interval = 12, dosing.to = 2) |>
              add.dosing(dose = 20000, nbr.doses = 5, start.time = 120, dosing.interval = 24, dosing.to = 2) |>
              add.sampling(0:240)

            ## Add Residual differences
            sigma <- diag(2) * 0.05
            dimnames(sigma) <- list(c("err1", "err2"), c("err1", "err2"))

            pk3 <- rxSolve(mod2, c(
              KA = 2.94E-01, TCL = 1.86E+01, V2 = 4.02E+01, Q = 1.05E+01, V3 = 2.97E+02,
              Kin = 1, Kout = 1, EC50 = 200
            ),
            omega = matrix(0.2, dimnames = list("eta.Cl", "eta.Cl")),
            nSub = 4, ev, sigma = sigma, cores = 2
            )
            print(pk3)
            str(pk3)

            pk3a <- rxSolve(mod2, c(
              KA = 2.94E-01, TCL = 1.86E+01, V2 = 4.02E+01, Q = 1.05E+01, V3 = 2.97E+02,
              Kin = 1, Kout = 1, EC50 = 200
            ),
            omega = matrix(0.2, dimnames = list("eta.Cl", "eta.Cl")),
            nSub = 4, ev, sigma = sigma, cores = 2, addDosing = TRUE
            )
            print(pk3a)
            str(pk3a)

            ode <- rxode2({
              b <- -1
              d / dt(X) <- a * X + Y * Z
              d / dt(Y) <- b * (Y - Z)
              d / dt(Z) <- -X * Y + c * Y - Z
            })

            et <- eventTable(time.units = "hr") # default time units
            et$add.sampling(seq(from = 0, to = 100, by = 0.01))

            cov <- data.frame(c = et$get.EventTable()$time + units::set_units(1, h))

            et0 <- et

            et <- cbind(et, cov)

            et$extra <- 1

            out <- rxSolve(ode,
                           params = c(a = -8 / 3, b = -10),
                           events = et,
                           inits = c(X = 1, Y = 1, Z = 1),
                           covsInterpolation = "linear",
                           keep = "extra"
                           )
            print(out)
            str(out)

            mmModel <- rxode2(
            {
              ka <- 1
              Vc <- 1
              Vmax <- 0.00734
              Km <- 0.3672
              Cp <- center / Vc
              d / dt(center) <- -Vmax / (Km + Cp) * Cp + exp(-10 * t)
            },
            indLin = TRUE
            )

            print(mmModel)
            summary(mmModel)

            mmModel <- rxode2(
            {
              ka <- 1
              Vc <- 1
              Vmax <- 0.00734
              Km <- 0.3672
              Cp <- center / Vc
              d / dt(center) <- -Vmax / (Km + Cp) * Cp
            },
            indLin = TRUE
            )

            print(mmModel)
            summary(mmModel)

            mod2 <- rxode2({
              C2 <- centr / V2
              C3 ~ peri / V3
              CL ~ TCL * exp(eta.Cl)
              d / dt(depot) ~ -KA * depot
              d / dt(centr) ~ KA * depot - CL * C2 - Q * C2 + Q * C3
              d / dt(peri) ~ Q * C2 - Q * C3
              d / dt(eff) <- Kin - Kout * (1 - C2 / (EC50 + C2)) * eff
              eff(0) <- 1000
              e1 <- err1
              e2 <- err2
              resp <- eff + e1
              pk <- C2 * exp(e2)
            })


            thetaMat <- diag(3) * 0.01
            dimnames(thetaMat) <- list(NULL, c("KA", "TCL", "V2"))
            sigma <- diag(2) * 0.05
            dimnames(sigma) <- list(c("err1", "err2"), c("err1", "err2"))

            ev <- eventTable(amount.units = "mg", time.units = "hours") |>
              add.dosing(dose = 10000, nbr.doses = 10, dosing.interval = 12, dosing.to = 2) |>
              add.dosing(dose = 20000, nbr.doses = 5, start.time = 120, dosing.interval = 24, dosing.to = 2) |>
              add.sampling(0:240)


            pk4 <- rxSolve(mod2, c(
              KA = 2.94E-01, TCL = 1.86E+01, V2 = 4.02E+01, Q = 1.05E+01, V3 = 2.97E+02,
              Kin = 1, Kout = 1, EC50 = 200
            ),
            omega = matrix(0.2, dimnames = list("eta.Cl", "eta.Cl")),
            nSub = 4, nStud = 4, thetaMat = thetaMat, sigma = sigma, ev, cores = 1, method = "lsoda"
            )

            print(pk4)

            pk4 <- rxSolve(mod2, c(
              KA = 2.94E-01, TCL = 1.86E+01, V2 = 4.02E+01, Q = 1.05E+01, V3 = 2.97E+02,
              Kin = 1, Kout = 1, EC50 = 200
            ),
            omega = matrix(0.2, dimnames = list("eta.Cl", "eta.Cl")),
            nSub = 4, nStud = 4, dfObs = 4, dfSub = 4,
            thetaMat = thetaMat, sigma = sigma, ev,
            cores = 1, method = "lsoda"
            )

            print(pk4)

            pk4 <- rxSolve(mod2, c(
              KA = 2.94E-01, TCL = 1.86E+01, V2 = 4.02E+01, Q = 1.05E+01, V3 = 2.97E+02,
              Kin = 1, Kout = 1, EC50 = 200
            ),
            omega = matrix(0.2, dimnames = list("eta.Cl", "eta.Cl")),
            nSub = 4, nStud = 4,
            sigma = sigma, ev,
            cores = 1, method = "lsoda"
            )

            print(pk4)
          },
crayon = .df$color[.i],
unicode = .df$unicode[.i]
)
      })

      unlink(.path)
    })
  })
})
