rxTest({

  lmat <- lotri({
    ## You may label each parameter with a comment
    tka <- 0.45 # Log Ka
    tcl <- log(c(0, 2.7, 100)) # Log Cl
    ## This works with interactive models
    ## You may also label the preceding line with label("label text")
    tv <- 3.45; label("log V")
    tvp <- 3.45; label("log V")
    cl.wt <- 0.1
    v.wt <- 0.1
    cl.sex <- 0.1
    v.sex <- 0.1
    cl.age <- 0.1
    v.age <- 0.1
    vp.wt <- 1
    vp.sex <- 1
    vp.age <- 1
    ## the label("Label name") works with all models
    eta.ka ~ 0.6
    eta.cl ~ 0.3
    eta.v ~ 0.1
    add.sd <- 0.7
    pow.sd <- 0.2
    pow  <- 1
    lambda  <- 0.5
  })

  expect_err2 <- function(x, extra=FALSE) {
    if (is.na(extra)){
      expect_false(x$hasErrors)
    } else {
      expect_true(x$hasErrors)
    }
  }

  test_that("log-likelihood variables are captured", {
    expect_error(
      .errProcessExpression(quote({
        ka <- exp(tka)
        cl <- exp(tcl)
        v <- exp(tv)
        cp <- linCmt()
        ll(err) ~ -log(add.sd) - 0.5*log(2*pi) - 0.5*((DV-cp)/add.sd)^2
      }),
      lotri({
        ## You may label each parameter with a comment
        tka <- 0.45 # Ka
        tcl <- log(c(0, 2.7, 100)) # Log Cl
        ## This works with interactive models
        ## You may also label the preceding line with label("label text")
        tv <- 3.45; label("log V")
        ## the label("Label name") works with all models
        add.sd <- 0.7
      })),
      NA
    )
  })

  test_that("When checking for distributions, don't consider if the parameter is defined", {
    expect_true(.isErrorExpression(ipre ~ add(f2) + propF(prop.sd, f2)))
  })

  test_that("error when errors have too many arguments", {
    expect_err2(.errProcessExpression(quote({
      ka <- exp(tka + eta.ka)
      cl <- exp(tcl + eta.cl + log(wt / 70) * cl.wt + sex * cl.sex + age * cl.age + 3)
      v  <- exp(tv + eta.v + wt * v.wt + sex * v.sex + age * v.age + 2)
      vp <- exp(tvp + wt * vp.wt + sex * vp.sex + age * vp.age)
      d/dt(depot) = -ka * depot
      d/dt(center) = ka * depot - cl/v * center
      cp = center/v
      cp ~ add(add.sd, pow1) + pow(pow.sd, pow2) + boxCox(lambda) | cond
    }), lmat))
  })

  test_that("error when adding distributions that do not support the additive notation", {
    expect_err2(.errProcessExpression(quote({
      ka <- exp(tka + eta.ka)
      cl <- exp(tcl + eta.cl + log(wt / 70) * cl.wt + sex * cl.sex + age * cl.age + 3)
      v  <- exp(tv + eta.v + wt * v.wt + sex * v.sex + age * v.age + 2)
      vp <- exp(tvp + wt * vp.wt + sex * vp.sex + age * vp.age)
      d/dt(depot) = -ka * depot
      d/dt(center) = ka * depot - cl/v * center
      cp = center/v
      cp ~ dbinom(add.sd, pow) + pow(pow.sd, pow) + boxCox(lambda) | cond
    }), lmat))
  })

  test_that("error for specifying distributions that have multiple numbers of arguments", {
    expect_err2(.errProcessExpression(quote({
      ka <- exp(tka + eta.ka)
      cl <- exp(tcl + eta.cl + log(wt / 70) * cl.wt + sex * cl.sex + age * cl.age + 3)
      v  <- exp(tv + eta.v + wt * v.wt + sex * v.sex + age * v.age + 2)
      vp <- exp(tvp + wt * vp.wt + sex * vp.sex + age * vp.age)
      d/dt(depot) = -ka * depot
      d/dt(center) = ka * depot - cl/v * center
      cp = center/v
      p <- pow
      l <- lamba
      cp ~ dbinom(add.sd, p, l)
      center ~ pow(pow.sd, p) + boxCox(l) | cond
    }), lmat))
  })

  test_that("error when adding algebraic expressions to known distributional abbreviations", {
    expect_error(.errProcessExpression(quote({
      ka <- exp(tka + eta.ka)
      cl <- exp(tcl + eta.cl + log(wt / 70) * cl.wt + sex * cl.sex + age * cl.age + 3)
      v  <- exp(tv + eta.v + wt * v.wt + sex * v.sex + age * v.age + 2)
      vp <- exp(tvp + wt * vp.wt + sex * vp.sex + age * vp.age)
      d/dt(depot) = -ka * depot
      d/dt(center) = ka * depot - cl/v * center
      cp = center/v
      cp ~ add(add.sd) + pow(pow.sd, pow) + boxCox(lambda) + tan(vp)| cond
    }), lmat))
  })

  test_that("The distribution names will transform to the preferred distributions", {
    expect_equal(rxPreferredDistributionName("add"), "add")
    expect_equal(rxPreferredDistributionName("logitNorm"), "logitNorm")
  })

  test_that("non-numeric bounds for logitNorm and probitNorm", {

    expect_err2(.errProcessExpression(quote({
      ka <- exp(tka + eta.ka)
      cl <- exp(tcl + eta.cl + log(wt / 70) * cl.wt + sex * cl.sex + age * cl.age + 3)
      v  <- exp(tv + eta.v + wt * v.wt + sex * v.sex + age * v.age + 2)
      vp <- exp(tvp + wt * vp.wt + sex * vp.sex + age * vp.age)
      d/dt(depot) = -ka * depot
      d/dt(center) = ka * depot - cl/v * center
      cp = center/v
      cp ~ logitNorm(add.sd, lower, upper) + pow(pow.sd, pow) + boxCox(lambda) | cond
    }), lmat))

    expect_err2(.errProcessExpression(quote({
      ka <- exp(tka + eta.ka)
      cl <- exp(tcl + eta.cl + log(wt / 70) * cl.wt + sex * cl.sex + age * cl.age + 3)
      v  <- exp(tv + eta.v + wt * v.wt + sex * v.sex + age * v.age + 2)
      vp <- exp(tvp + wt * vp.wt + sex * vp.sex + age * vp.age)
      d/dt(depot) = -ka * depot
      d/dt(center) = ka * depot - cl/v * center
      cp = center/v
      cp ~ logitNorm(add.sd) + pow(pow.sd, pow) + boxCox(lambda) | cond
    }), lmat), NA)

    expect_err2(.errProcessExpression(quote({
      ka <- exp(tka + eta.ka)
      cl <- exp(tcl + eta.cl + log(wt / 70) * cl.wt + sex * cl.sex + age * cl.age + 3)
      v  <- exp(tv + eta.v + wt * v.wt + sex * v.sex + age * v.age + 2)
      vp <- exp(tvp + wt * vp.wt + sex * vp.sex + age * vp.age)
      d/dt(depot) = -ka * depot
      d/dt(center) = ka * depot - cl/v * center
      cp = center/v
      cp ~ logitNorm(add.sd, 0) + pow(pow.sd, pow) + boxCox(lambda) | cond
    }), lmat), NA)

    expect_err2(.errProcessExpression(quote({
      ka <- exp(tka + eta.ka)
      cl <- exp(tcl + eta.cl + log(wt / 70) * cl.wt + sex * cl.sex + age * cl.age + 3)
      v  <- exp(tv + eta.v + wt * v.wt + sex * v.sex + age * v.age + 2)
      vp <- exp(tvp + wt * vp.wt + sex * vp.sex + age * vp.age)
      d/dt(depot) = -ka * depot
      d/dt(center) = ka * depot - cl/v * center
      cp = center/v
      cp ~ logitNorm(add.sd, 0, 5) + pow(pow.sd, pow) + boxCox(lambda) | cond
    }), lmat), NA)

    expect_err2(.errProcessExpression(quote({
      ka <- exp(tka + eta.ka)
      cl <- exp(tcl + eta.cl + log(wt / 70) * cl.wt + sex * cl.sex + age * cl.age + 3)
      v  <- exp(tv + eta.v + wt * v.wt + sex * v.sex + age * v.age + 2)
      vp <- exp(tvp + wt * vp.wt + sex * vp.sex + age * vp.age)
      d/dt(depot) = -ka * depot
      d/dt(center) = ka * depot - cl/v * center
      cp = center/v
      cp ~ logitNorm(add.sd, -5, 5) + pow(pow.sd, pow) + boxCox(lambda) | cond
    }), lmat), NA)

    expect_err2(.errProcessExpression(quote({
      ka <- exp(tka + eta.ka)
      cl <- exp(tcl + eta.cl + log(wt / 70) * cl.wt + sex * cl.sex + age * cl.age + 3)
      v  <- exp(tv + eta.v + wt * v.wt + sex * v.sex + age * v.age + 2)
      vp <- exp(tvp + wt * vp.wt + sex * vp.sex + age * vp.age)
      d/dt(depot) = -ka * depot
      d/dt(center) = ka * depot - cl/v * center
      cp = center/v
      cp ~ logitNorm(add.sd, -Inf, Inf) + pow(pow.sd, pow) + boxCox(lambda) | cond
    }), lmat), NA)

    expect_err2(.errProcessExpression(quote({
      ka <- exp(tka + eta.ka)
      cl <- exp(tcl + eta.cl + log(wt / 70) * cl.wt + sex * cl.sex + age * cl.age + 3)
      v  <- exp(tv + eta.v + wt * v.wt + sex * v.sex + age * v.age + 2)
      vp <- exp(tvp + wt * vp.wt + sex * vp.sex + age * vp.age)
      d/dt(depot) = -ka * depot
      d/dt(center) = ka * depot - cl/v * center
      cp = center/v
      cp ~ probitNorm(add.sd, lower, upper) + pow(pow.sd, pow) + boxCox(lambda) | cond
    }), lmat))

  })

  test_that("rxTransformCombine", {

    testCombine0 <- function(transforms) {
      .cmb <- rxErrTypeCombine("matt")
      for (i in transforms) {
        .cmb <- rxErrTypeCombine(.cmb, i)
      }
      .cmb
    }

    testCombine <- function(transforms) {
      .cmb <- testCombine0(transforms)
      .cmb2 <- testCombine0(rev(transforms))
      expect_equal(.cmb, .cmb2)
      .cmb
    }

    ## add + prop
    expect_equal(testCombine(c("add", "prop"))$errType,
                 testCombine(c("add", "propT"))$errType)

    expect_equal(testCombine(c("add", "prop"))$errType,
                 testCombine(c("add", "propF"))$errType)

    expect_equal(testCombine(c("logitNorm", "prop"))$errType,
                 testCombine(c("add", "prop"))$errType)

    expect_equal(testCombine(c("logitNorm", "propT"))$errType,
                 testCombine(c("add", "prop"))$errType)

    expect_equal(testCombine(c("logitNorm", "propF"))$errType,
                 testCombine(c("add", "prop"))$errType)

    expect_equal(testCombine(c("probitNorm", "prop"))$errType,
                 testCombine(c("add", "prop"))$errType)

    expect_equal(testCombine(c("probitNorm", "propT"))$errType,
                 testCombine(c("add", "prop"))$errType)

    expect_equal(testCombine(c("probitNorm", "propF"))$errType,
                 testCombine(c("add", "prop"))$errType)

    ## add + pow
    expect_equal(testCombine(c("add", "pow"))$errType,
                 testCombine(c("add", "powF"))$errType)

    expect_equal(testCombine(c("lnorm", "pow"))$errType,
                 testCombine(c("add", "pow"))$errType)

    expect_equal(testCombine(c("logitNorm", "pow"))$errType,
                 testCombine(c("add", "pow"))$errType)

    expect_equal(testCombine(c("probitNorm", "pow"))$errType,
                 testCombine(c("add", "pow"))$errType)

    # Test Error type F
    expect_equal(testCombine(c("add", "powF"))$errTypeF,
                 testCombine(c("add", "propF"))$errTypeF)

    expect_equal(testCombine(c("add", "powT"))$errTypeF,
                 testCombine(c("add", "propT"))$errTypeF)

    expect_equal(testCombine(c("add", "pow"))$errTypeF,
                 testCombine(c("add", "prop"))$errTypeF)

    expect_equal(testCombine("powF")$errTypeF,
                 testCombine("propF")$errTypeF)

    expect_equal(testCombine("powT")$errTypeF,
                 testCombine("propT")$errTypeF)

    expect_equal(testCombine("pow")$errTypeF,
                 testCombine("prop")$errTypeF)

    # Test Transformation Type
    expect_equal(testCombine(c("add", "prop", "boxCox"))$transform,
                 testCombine(c("add", "propT", "boxCox"))$transform)

    expect_equal(testCombine(c("add", "prop", "boxCox"))$transform,
                 testCombine(c("add", "propF", "boxCox"))$transform)

    expect_equal(testCombine(c("add", "pow", "boxCox"))$transform,
                 testCombine(c("add", "propF", "boxCox"))$transform)

    expect_equal(testCombine(c("pow", "boxCox"))$transform,
                 testCombine(c("add", "boxCox"))$transform)

    expect_equal(testCombine(c("prop", "boxCox"))$transform,
                 testCombine(c("add", "boxCox"))$transform)

    expect_equal(testCombine(c("lnorm", "prop", "boxCox")),
                 testCombine(c("lnorm", "propT", "boxCox")))

    expect_equal(testCombine(c("lnorm", "prop", "boxCox")),
                 testCombine(c("lnorm", "propF", "boxCox")))

    expect_equal(testCombine(c("lnorm", "pow", "boxCox")),
                 testCombine(c("lnorm", "propF", "boxCox")))

    expect_equal(testCombine(c("logitNorm", "prop"))$transform,
                 testCombine(c("logitNorm", "propT"))$transform)

    expect_equal(testCombine(c("logitNorm", "add"))$transform,
                 testCombine(c("logitNorm", "propT"))$transform)

    expect_equal(testCombine(c("logitNorm", "prop", "boxCox"))$transform,
                 testCombine(c("logitNorm", "propT", "boxCox"))$transform)

    expect_equal(testCombine(c("logitNorm", "prop", "boxCox"))$transform,
                 testCombine(c("logitNorm", "propF", "boxCox"))$transform)

    expect_equal(testCombine(c("logitNorm", "pow", "boxCox"))$transform,
                 testCombine(c("logitNorm", "propF", "boxCox"))$transform)

    expect_equal(testCombine(c("probitNorm", "prop", "boxCox"))$transform,
                 testCombine(c("probitNorm", "propT", "boxCox"))$transform)

    expect_equal(testCombine(c("probitNorm", "prop", "boxCox"))$transform,
                 testCombine(c("probitNorm", "propF", "boxCox"))$transform)

    expect_equal(testCombine(c("probitNorm", "pow", "boxCox"))$transform,
                 testCombine(c("probitNorm", "propF", "boxCox"))$transform)

    # Yeo Johnson
    expect_equal(testCombine(c("add", "prop", "yeoJohnson"))$transform,
                 testCombine(c("add", "propT", "yeoJohnson"))$transform)

    expect_equal(testCombine(c("add", "prop", "yeoJohnson"))$transform,
                 testCombine(c("add", "propF", "yeoJohnson"))$transform)

    expect_equal(testCombine(c("add", "pow", "yeoJohnson"))$transform,
                 testCombine(c("add", "propF", "yeoJohnson"))$transform)

    expect_equal(testCombine(c("pow", "yeoJohnson"))$transform,
                 testCombine(c("add", "yeoJohnson"))$transform)

    expect_equal(testCombine(c("prop", "yeoJohnson"))$transform,
                 testCombine(c("add", "yeoJohnson"))$transform)

    expect_equal(testCombine(c("lnorm", "prop", "yeoJohnson")),
                 testCombine(c("lnorm", "propT", "yeoJohnson")))

    expect_equal(testCombine(c("lnorm", "prop", "yeoJohnson")),
                 testCombine(c("lnorm", "propF", "yeoJohnson")))

    expect_equal(testCombine(c("lnorm", "pow", "yeoJohnson")),
                 testCombine(c("lnorm", "propF", "yeoJohnson")))

    expect_equal(testCombine(c("logitNorm", "prop", "yeoJohnson"))$transform,
                 testCombine(c("logitNorm", "propT", "yeoJohnson"))$transform)

    expect_equal(testCombine(c("logitNorm", "prop", "yeoJohnson"))$transform,
                 testCombine(c("logitNorm", "propF", "yeoJohnson"))$transform)

    expect_equal(testCombine(c("logitNorm", "pow", "yeoJohnson"))$transform,
                 testCombine(c("logitNorm", "propF", "yeoJohnson"))$transform)

    expect_equal(testCombine(c("probitNorm", "prop", "yeoJohnson"))$transform,
                 testCombine(c("probitNorm", "propT", "yeoJohnson"))$transform)

    expect_equal(testCombine(c("probitNorm", "prop", "yeoJohnson"))$transform,
                 testCombine(c("probitNorm", "propF", "yeoJohnson"))$transform)

    expect_equal(testCombine(c("probitNorm", "pow", "yeoJohnson"))$transform,
                 testCombine(c("probitNorm", "propF", "yeoJohnson"))$transform)

    # Box Cox and Yeo Johnson are not compatible
    expect_equal(testCombine(c("boxCox", "prop", "yeoJohnson")),
                 testCombine(c("boxCox", "propT", "yeoJohnson")))

    # Prop and pow are not compatible
    expect_equal(testCombine(c("pow", "prop")),
                 testCombine(c("pow", "prop")))

    # Make sure demotion works
    expect_equal(rxDemoteAddErr(testCombine(c("add", "prop"))),
                 testCombine("prop"))

    expect_equal(rxDemoteAddErr(testCombine(c("add", "pow"))),
                 testCombine("pow"))

    .errProcessExpression(quote({
      ka <- exp(tka + eta.ka)
      cl <- exp(tcl + eta.cl + log(wt / 70) * cl.wt + sex * cl.sex + age * cl.age + 3)
      v  <- exp(tv + eta.v + wt * v.wt + sex * v.sex + age * v.age + 2)
      vp <- exp(tvp + wt * vp.wt + sex * vp.sex + age * vp.age)
      d/dt(depot) = -ka * depot
      d/dt(center) = ka * depot - cl/v * center
      cp = center/v
      cp ~ logitNorm(add.sd) + pow(pow.sd, pow) + boxCox(lambda) | cond
    }), lmat) -> mod

    expect_equal(mod$predDf$errType, testCombine(c("pow", "add"))$errType)

    .errProcessExpression(quote({
      ka <- exp(tka + eta.ka)
      cl <- exp(tcl + eta.cl + log(wt / 70) * cl.wt + sex * cl.sex + age * cl.age + 3)
      v  <- exp(tv + eta.v + wt * v.wt + sex * v.sex + age * v.age + 2)
      vp <- exp(tvp + wt * vp.wt + sex * vp.sex + age * vp.age)
      d/dt(depot) = -ka * depot
      d/dt(center) = ka * depot - cl/v * center
      cp = center/v + add.sd
      cp ~ logitNorm(NA) + pow(pow.sd, pow) + boxCox(lambda) | cond
    }), lmat) -> mod

    expect_equal(mod$predDf$errType, testCombine("pow")$errType)

    .errProcessExpression(quote({
      ka <- exp(tka + eta.ka)
      cl <- exp(tcl + eta.cl + log(wt / 70) * cl.wt + sex * cl.sex + age * cl.age + 3)
      v  <- exp(tv + eta.v + wt * v.wt + sex * v.sex + age * v.age + 2)
      vp <- exp(tvp + wt * vp.wt + sex * vp.sex + age * vp.age)
      d/dt(depot) = -ka * depot
      d/dt(center) = ka * depot - cl/v * center
      cp = center/v + add.sd + lambda
      cp ~ lnorm(NA) + pow(pow.sd, pow) | cond
    }), lmat) -> mod

    expect_equal(mod$predDf$errType, testCombine("pow")$errType)

    .errProcessExpression(quote({
      ka <- exp(tka + eta.ka)
      cl <- exp(tcl + eta.cl + log(wt / 70) * cl.wt + sex * cl.sex + age * cl.age + 3)
      v  <- exp(tv + eta.v + wt * v.wt + sex * v.sex + age * v.age + 2)
      vp <- exp(tvp + wt * vp.wt + sex * vp.sex + age * vp.age)
      d/dt(depot) = -ka * depot
      d/dt(center) = ka * depot - cl/v * center
      cp = center/v + add.sd + lambda
      cp ~ lnorm(add.sd) + pow(pow.sd, pow)  | cond
    }), lmat) -> mod

    expect_equal(mod$predDf$errType, testCombine(c("add", "pow"))$errType)

    .errProcessExpression(quote({
      ka <- exp(tka + eta.ka)
      cl <- exp(tcl + eta.cl + log(wt / 70) * cl.wt + sex * cl.sex + age * cl.age + 3)
      v  <- exp(tv + eta.v + wt * v.wt + sex * v.sex + age * v.age + 2)
      vp <- exp(tvp + wt * vp.wt + sex * vp.sex + age * vp.age)
      d/dt(depot) = -ka * depot
      d/dt(center) = ka * depot - cl/v * center
      cp = center/v + add.sd
      cp ~ probitNorm(NA) + pow(pow.sd, pow) + boxCox(lambda) | cond
    }), lmat) -> mod

    expect_equal(mod$predDf$errType, testCombine("pow")$errType)

    .errProcessExpression(quote({
      ka <- exp(tka + eta.ka)
      cl <- exp(tcl + eta.cl + log(wt / 70) * cl.wt + sex * cl.sex + age * cl.age + 3)
      v  <- exp(tv + eta.v + wt * v.wt + sex * v.sex + age * v.age + 2)
      vp <- exp(tvp + wt * vp.wt + sex * vp.sex + age * vp.age)
      d/dt(depot) = -ka * depot
      d/dt(center) = ka * depot - cl/v * center
      cp = center/v
      cp ~ probitNorm(add.sd) + pow(pow.sd, pow) + boxCox(lambda) | cond
    }), lmat) -> mod

    expect_err2(.errProcessExpression(quote({
      ka <- exp(tka + eta.ka)
      cl <- exp(tcl + eta.cl + log(wt / 70) * cl.wt + sex * cl.sex + age * cl.age + 3)
      v  <- exp(tv + eta.v + wt * v.wt + sex * v.sex + age * v.age + 2)
      vp <- exp(tvp + wt * vp.wt + sex * vp.sex + age * vp.age)
      d/dt(depot) = -ka * depot
      d/dt(center) = ka * depot - cl/v * center
      cp = center/v
      cp ~ probitNorm(add.sd) + pow(pow.sd, pow) + boxCox(lambda) + var() | cond
    }), lmat), NA)

    expect_equal(mod$predDf$errType, testCombine(c("add", "pow"))$errType)

    expect_err2(.errProcessExpression(quote({
      ka <- exp(tka + eta.ka)
      cl <- exp(tcl + eta.cl + log(wt / 70) * cl.wt + sex * cl.sex + age * cl.age + 3)
      v  <- exp(tv + eta.v + wt * v.wt + sex * v.sex + age * v.age + 2)
      vp <- exp(tvp + wt * vp.wt + sex * vp.sex + age * vp.age)
      d/dt(depot) = -ka * depot
      d/dt(center) = ka * depot - cl/v * center
      cp = center/v
      cp ~ probitNorm(add.sd) + pow(pow.sd, pow) + boxCox(lambda) + var() | cond
    }), lmat), NA)

  })

  test_that("categorical expressions", {

    expect_err2(.errProcessExpression(quote({
      ka <- exp(tka + eta.ka)
      cl <- exp(tcl + eta.cl + log(wt / 70) * cl.wt + sex * cl.sex + age * cl.age + 3)
      v  <- exp(tv + eta.v + wt * v.wt + sex * v.sex + age * v.age + 2)
      vp <- exp(tvp + wt * vp.wt + sex * vp.sex + age * vp.age)
      d/dt(depot) = -ka * depot
      d/dt(center) = ka * depot - cl/v * center
      cp = center/v
      cp ~ c(add.sd, pow.sd, pow, lambda) | cond
    }), lmat), NA)

    .errProcessExpression(quote({
      ka <- exp(tka + eta.ka)
      cl <- exp(tcl + eta.cl + log(wt / 70) * cl.wt + sex * cl.sex + age * cl.age + 3)
      v  <- exp(tv + eta.v + wt * v.wt + sex * v.sex + age * v.age + 2)
      vp <- exp(tvp + wt * vp.wt + sex * vp.sex + age * vp.age)
      d/dt(depot) = -ka * depot
      d/dt(center) = ka * depot - cl/v * center
      cp = center/v
      cp ~ c(add.sd, pow.sd, pow, lambda) | cond
    }), lmat) -> mod

    testOrd <- mod$iniDf[which(mod$iniDf$condition == "cond"),c("name","err")]
    row.names(testOrd) <- NULL

    expect_equal(
      testOrd,
      structure(
        list(
          name = c("add.sd", "pow.sd", "pow", "lambda"),
          err = c("ordinal", "ordinal2", "ordinal3", "ordinal4")),
        row.names = c(NA, -4L),
        class = "data.frame")
    )

  })

  test_that("theta/eta/eps problems", {

    .errProcessExpression(quote({
      ka <- exp(tka + eta.ka)
      cl <- exp(tcl + eta.cl + log(wt / 70) * cl.wt + sex * cl.sex + age * cl.age + 3)
      v  <- exp(tv + eta.v + wt * v.wt + sex * v.sex + age * v.age + 2)
      vp <- exp(tvp + wt * vp.wt + sex * vp.sex + age * vp.age)
      d/dt(depot) = -ka * depot
      d/dt(center) = ka * depot - cl/v * center
      cp = center/v + add.sd + pow.sd + pow + lambda
      # Nonsense parameters just to check calculated parameters being used in the error expression
      a = tka + eta.ka
      b = tka + eta.ka
      c = tka + eta.ka
      d = tka + eta.ka
      e = tka + eta.ka
      f = tka + eta.ka
      l = tka + eta.ka
      cp ~ add(a) + powF(b, c, f) + t(d, e) + boxCox(l)| cond
    }), lmat) -> mod

    expect_equal(mod$predDf[, c("a", "b", "c", "d", "e", "lambda")],
                 structure(list(a = "a", b = "b", c = "c", d = "d", e = "e", lambda = "l"), class = "data.frame", row.names = c(NA, -1L)))

    .errProcessExpression(quote({
      ka <- exp(tka + eta.ka)
      cl <- exp(tcl + eta.cl + log(wt / 70) * cl.wt + sex * cl.sex + age * cl.age + 3)
      v  <- exp(tv + eta.v + wt * v.wt + sex * v.sex + age * v.age + 2)
      vp <- exp(tvp + wt * vp.wt + sex * vp.sex + age * vp.age)
      d/dt(depot) = -ka * depot
      d/dt(center) = ka * depot - cl/v * center
      cp = center/v+ add.sd + pow.sd + pow + lambda
      cp ~ add(a) + powF(b, c, f) + t(d, e) + boxCox(l)| cond
    }), lmat) -> mod

  })

  test_that("multiple endpoint parsing", {

    lmat <- lotri({
      tktr <- log(1)
      tka <- log(1)
      tcl <- log(0.1)
      tv <- log(10)
      ##
      eta.ktr ~ 1
      eta.ka ~ 1
      eta.cl ~ 2
      eta.v ~ 1
      prop.err <- 0.1
      pkadd.err <- 0.1
      ##
      temax <- logit(0.8)
      #temax <- 7.5
      tec50 <- log(0.5)
      tkout <- log(0.05)
      te0 <- log(100)
      ##
      eta.emax ~ .5
      eta.ec50  ~ .5
      eta.kout ~ .5
      eta.e0 ~ .5
      ##
      pdadd.err <- 10
    })

    .errProcessExpression(quote({
      ktr <- exp(tktr + eta.ktr)
      ka <- exp(tka + eta.ka)
      cl <- exp(tcl + eta.cl)
      v <- exp(tv + eta.v)
      ##
      #poplogit = log(temax/(1-temax))
      emax=expit(temax+eta.emax)
      #logit=temax+eta.emax
      ec50 =  exp(tec50 + eta.ec50)
      kout = exp(tkout + eta.kout)
      e0 = exp(te0 + eta.e0)
      ##
      DCP = center/v
      PD=1-emax*DCP/(ec50+DCP)
      ##
      effect(0) = e0
      kin = e0*kout
      ##
      d/dt(depot) = -ktr * depot
      d/dt(gut) =  ktr * depot -ka * gut
      d/dt(center) =  ka * gut - cl / v * center
      d/dt(effect) = kin*PD -kout*effect
      ##
      cp = center / v
      cp ~ prop(prop.err) + add(pkadd.err)
      effect ~ add(pdadd.err)
    }), lmat) -> mod

    expect_equal(mod$predDf[, c("cond", "var", "dvid", "cmt")],
                 structure(list(cond = c("cp", "effect"), var = c("cp", "effect"), dvid = 1:2, cmt = 5:4), class = "data.frame", row.names = c(NA, -2L)))

    .errProcessExpression(quote({
      ktr <- exp(tktr + eta.ktr)
      ka <- exp(tka + eta.ka)
      cl <- exp(tcl + eta.cl)
      v <- exp(tv + eta.v)
      ##
      emax=expit(temax+eta.emax)
      ec50 =  exp(tec50 + eta.ec50)
      kout = exp(tkout + eta.kout)
      e0 = exp(te0 + eta.e0)
      ##
      DCP = center/v
      PD=1-emax*DCP/(ec50+DCP)
      ##
      effect(0) = e0
      kin = e0*kout
      ##
      d/dt(depot) = -ktr * depot
      d/dt(gut) =  ktr * depot -ka * gut
      d/dt(center) =  ka * gut - cl / v * center
      d/dt(effect) = kin*PD -kout*effect
      ##
      cp = center / v
      cp ~ prop(prop.err) + add(pkadd.err) | center
      effect ~ add(pdadd.err)
    }), lmat) -> mod

    expect_equal(mod$predDf[, c("cond", "var", "dvid", "cmt")],
                 structure(list(cond = c("center", "effect"), var = c("cp", "effect"), dvid = 1:2, cmt = 3:4),
                           class = "data.frame", row.names = c(NA, -2L)))

    .errProcessExpression(quote({
      ktr <- exp(tktr + eta.ktr)
      ka <- exp(tka + eta.ka)
      cl <- exp(tcl + eta.cl)
      v <- exp(tv + eta.v)
      emax = expit(temax+eta.emax)
      ec50 =  exp(tec50 + eta.ec50)
      kout = exp(tkout + eta.kout)
      e0 = exp(te0 + eta.e0)
      ##
      DCP = center/v
      PD=1-emax*DCP/(ec50+DCP)
      ##
      effect(0) = e0
      kin = e0*kout
      ##
      d/dt(depot) = -ktr * depot
      d/dt(gut) =  ktr * depot -ka * gut
      d/dt(center) =  ka * gut - cl / v * center
      d/dt(effect) = kin*PD -kout*effect
      ##
      cp = center / v
      cp ~ prop(prop.err) + add(pkadd.err)
      effect ~ add(pdadd.err) | pca
    }), lmat) -> mod

    expect_equal(mod$predDf[, c("cond", "var", "dvid", "cmt")],
                 structure(list(cond = c("cp", "pca"), var = c("cp", "effect"), dvid = 1:2, cmt = 5:6),
                           class = "data.frame", row.names = c(NA, -2L)))

  })

  # Try hidden expressions combined with error expression
  test_that("test expressions that are hidden with ~ vs error expressions with ~", {

    lmat <- lotri({
      tktr <- log(1)
      tka <- log(1)
      tcl <- log(0.1)
      tv <- log(10)
      ##
      eta.ktr ~ 1
      eta.ka ~ 1
      eta.cl ~ 2
      eta.v ~ 1
      prop.err <- 0.1
      pkadd.err <- 0.1
      ##
      temax <- logit(0.8)
      #temax <- 7.5
      tec50 <- log(0.5)
      tkout <- log(0.05)
      te0 <- log(100)
      ##
      eta.emax ~ .5
      eta.ec50  ~ .5
      eta.kout ~ .5
      eta.e0 ~ .5
      ##
      pdadd.err <- 10
    })

    .errProcessExpression(quote({
      ktr ~ exp(tktr + eta.ktr)
      ka <- exp(tka + eta.ka)
      cl <- exp(tcl + eta.cl)
      v <- exp(tv + eta.v)
      emax = expit(temax+eta.emax)
      ec50 =  exp(tec50 + eta.ec50)
      kout = exp(tkout + eta.kout)
      e0 = exp(te0 + eta.e0)
      ##
      DCP = center/v
      PD=1-emax*DCP/(ec50+DCP)
      ##
      effect(0) = e0
      kin ~ e0*kout
      ##
      d/dt(depot) = -ktr * depot
      d/dt(gut) =  ktr * depot -ka * gut
      d/dt(center) =  ka * gut - cl / v * center
      d/dt(effect) = kin*PD -kout*effect
      ##
      cp = center / v
      cp ~ prop(prop.err) + add(pkadd.err)
      effect ~ add(pdadd.err) | pca
    }), lmat) -> mod

    expect_equal(mod$predDf[, c("cond", "var", "dvid", "cmt")],
                 structure(list(cond = c("cp", "pca"), var = c("cp", "effect"), dvid = 1:2, cmt = 5:6),
                           class = "data.frame", row.names = c(NA, -2L)))

    .errProcessExpression(quote({
      ktr ~ exp(tktr + eta.ktr)
      ka <- exp(tka + eta.ka)
      cl <- exp(tcl + eta.cl)
      v <- exp(tv + eta.v)
      emax = expit(temax+eta.emax)
      ec50 =  exp(tec50 + eta.ec50)
      kout = exp(tkout + eta.kout)
      e0 = exp(te0 + eta.e0)
      ##
      DCP = center/v
      tmp ~ exp(DCP)
      PD=1-emax*DCP/(ec50+DCP)
      ##
      effect(0) = e0
      kin ~ e0*kout
      ##
      d/dt(depot) = -ktr * depot
      d/dt(gut) =  ktr * depot -ka * gut
      d/dt(center) =  ka * gut - cl / v * center
      d/dt(effect) = kin*PD -kout*effect
      ##
      cp = center / v
      cp ~ prop(prop.err) + add(pkadd.err)
      effect ~ add(pdadd.err) | pca
    }), lmat) -> mod

    expect_equal(mod$predDf[, c("cond", "var", "dvid", "cmt")],
                 structure(list(cond = c("cp", "pca"), var = c("cp", "effect"), dvid = 1:2, cmt = 5:6),
                           class = "data.frame", row.names = c(NA, -2L)))

    .errProcessExpression(quote({
      ktr ~ exp(tktr + eta.ktr)
      ka <- exp(tka + eta.ka)
      cl <- exp(tcl + eta.cl)
      v <- exp(tv + eta.v)
      emax = expit(temax+eta.emax)
      ec50 =  exp(tec50 + eta.ec50)
      kout = exp(tkout + eta.kout)
      e0 = exp(te0 + eta.e0)
      ##
      DCP = center/v
      tmp ~ exp(eta.tr)
      PD=1-emax*DCP/(ec50+DCP)
      ##
      effect(0) = e0
      kin ~ e0*kout
      ##
      d/dt(depot) = -ktr * depot
      d/dt(gut) =  ktr * depot -ka * gut
      d/dt(center) =  ka * gut - cl / v * center
      d/dt(effect) = kin*PD -kout*effect
      ##
      cp = center / v
      cp ~ prop(prop.err) + add(pkadd.err)
      effect ~ add(pdadd.err) | pca
    }), lmat) -> mod

    expect_equal(
      mod$predDf[, c("cond", "var", "dvid", "cmt")],
      structure(
        list(cond = c("cp", "pca"),
             var = c("cp", "effect"),
             dvid = 1:2,
             cmt = 5:6
             ),
        class = "data.frame", row.names = c(NA, -2L)
      )
    )

  })

  test_that("test different distributions", {

    lmat <- lotri({
      tktr <- log(1)
      tka <- log(1)
      tcl <- log(0.1)
      tv <- log(10)
      ##
      eta.ktr ~ 1
      eta.ka ~ 1
      eta.cl ~ 2
      eta.v ~ 1
      prop.err <- 0.1
      pkadd.err <- 0.1
      ##
      temax <- logit(0.8)
      #temax <- 7.5
      tec50 <- log(0.5)
      tkout <- log(0.05)
      te0 <- log(100)
      ##
      eta.emax ~ .5
      eta.ec50  ~ .5
      eta.kout ~ .5
      eta.e0 ~ .5
      ##
      pdadd.err <- 10
    })

    .errProcessExpression(quote({
      ktr ~ exp(tktr + eta.ktr)
      ka <- exp(tka + eta.ka)
      cl <- exp(tcl + eta.cl)
      v <- exp(tv + eta.v)
      emax = expit(temax+eta.emax)
      ec50 =  exp(tec50 + eta.ec50)
      kout = exp(tkout + eta.kout)
      e0 = exp(te0 + eta.e0)
      ##
      DCP = center/v
      tmp ~ exp(eta.tr)
      PD=1-emax*DCP/(ec50+DCP)
      ##
      effect(0) = e0
      kin ~ e0*kout
      ##
      d/dt(depot) = -ktr * depot
      d/dt(gut) =  ktr * depot -ka * gut
      d/dt(center) =  ka * gut - cl / v * center
      d/dt(effect) = kin*PD -kout*effect
      ##
      cp = center / v
      cp ~ prop(prop.err) + add(pkadd.err)
      effect ~ dchisq(pdadd.err) | pca
    }), lmat) -> mod

    expect_equal(paste(mod$predDf$distribution), c("norm", "chisq"))

    .errProcessExpression(quote({
      ktr ~ exp(tktr + eta.ktr)
      ka <- exp(tka + eta.ka)
      cl <- exp(tcl + eta.cl)
      v <- exp(tv + eta.v)
      emax = expit(temax+eta.emax)
      ec50 =  exp(tec50 + eta.ec50)
      kout = exp(tkout + eta.kout)
      e0 = exp(te0 + eta.e0)
      ##
      DCP = center/v
      tmp ~ exp(eta.tr)
      PD=1-emax*DCP/(ec50+DCP)
      ##
      effect(0) = e0
      kin ~ e0*kout
      ##
      d/dt(depot) = -ktr * depot
      d/dt(gut) =  ktr * depot -ka * gut
      d/dt(center) =  ka * gut - cl / v * center
      d/dt(effect) = kin*PD -kout*effect
      ##
      cp = center / v
      cp ~ prop(prop.err) + add(pkadd.err)
      effect ~ chisq(pdadd.err) | pca
    }), lmat) -> mod

    expect_equal(paste(mod$predDf$distribution), c("norm", "chisq"))

    .errProcessExpression(quote({
      ktr ~ exp(tktr + eta.ktr)
      ka <- exp(tka + eta.ka)
      cl <- exp(tcl + eta.cl)
      v <- exp(tv + eta.v)
      emax = expit(temax+eta.emax)
      ec50 =  exp(tec50 + eta.ec50)
      kout = exp(tkout + eta.kout)
      e0 = exp(te0 + eta.e0)
      ##
      DCP = center/v
      tmp ~ exp(eta.tr)
      PD=1-emax*DCP/(ec50+DCP)
      ##
      effect(0) = e0
      kin ~ e0*kout
      ##
      d/dt(depot) = -ktr * depot
      d/dt(gut) =  ktr * depot -ka * gut
      d/dt(center) =  ka * gut - cl / v * center
      d/dt(effect) = kin*PD -kout*effect
      ##
      cp = center / v
      cp ~ prop(prop.err) + add(pkadd.err)
      effect ~ dexp(pdadd.err) | pca
    }), lmat) -> mod

    expect_equal(paste(mod$predDf$distribution), c("norm", "dexp"))

    .errProcessExpression(quote({
      ktr ~ exp(tktr + eta.ktr)
      ka <- exp(tka + eta.ka)
      cl <- exp(tcl + eta.cl)
      v <- exp(tv + eta.v)
      emax = expit(temax+eta.emax)
      ec50 =  exp(tec50 + eta.ec50)
      kout = exp(tkout + eta.kout)
      e0 = exp(te0 + eta.e0)
      ##
      DCP = center/v
      tmp ~ exp(eta.tr)
      PD=1-emax*DCP/(ec50+DCP)
      ##
      effect(0) = e0
      kin ~ e0*kout
      ##
      d/dt(depot) = -ktr * depot
      d/dt(gut) =  ktr * depot -ka * gut
      d/dt(center) =  ka * gut - cl / v * center
      d/dt(effect) = kin*PD -kout*effect
      ##
      cp = center / v
      cp ~ df(prop.err, pkadd.err)
      effect ~ add(pdadd.err) | pca
    }), lmat) -> mod

    expect_equal(paste(mod$predDf$distribution), c("f", "norm"))

    .errProcessExpression(quote({
      ktr ~ exp(tktr + eta.ktr)
      ka <- exp(tka + eta.ka)
      cl <- exp(tcl + eta.cl)
      v <- exp(tv + eta.v)
      emax = expit(temax+eta.emax)
      ec50 =  exp(tec50 + eta.ec50)
      kout = exp(tkout + eta.kout)
      e0 = exp(te0 + eta.e0)
      ##
      DCP = center/v
      tmp ~ exp(eta.tr)
      PD=1-emax*DCP/(ec50+DCP)
      ##
      effect(0) = e0
      kin ~ e0*kout
      ##
      d/dt(depot) = -ktr * depot
      d/dt(gut) =  ktr * depot -ka * gut
      d/dt(center) =  ka * gut - cl / v * center
      d/dt(effect) = kin*PD -kout*effect
      ##
      cp = center / v
      cp ~ f(prop.err, pkadd.err)
      effect ~ add(pdadd.err) | pca
    }), lmat) -> mod

    expect_equal(paste(mod$predDf$distribution), c("f", "norm"))

    .errProcessExpression(quote({
      ktr ~ exp(tktr + eta.ktr)
      ka <- exp(tka + eta.ka)
      cl <- exp(tcl + eta.cl)
      v <- exp(tv + eta.v)
      emax = expit(temax+eta.emax)
      ec50 =  exp(tec50 + eta.ec50)
      kout = exp(tkout + eta.kout)
      e0 = exp(te0 + eta.e0)
      ##
      DCP = center/v
      tmp ~ exp(eta.tr)
      PD=1-emax*DCP/(ec50+DCP)
      ##
      effect(0) = e0
      kin ~ e0*kout
      ##
      d/dt(depot) = -ktr * depot
      d/dt(gut) =  ktr * depot -ka * gut
      d/dt(center) =  ka * gut - cl / v * center
      d/dt(effect) = kin*PD -kout*effect
      ##
      cp = center / v + pdadd.err
      cp ~ prop(prop.err) + add(pkadd.err)
      effect ~ pois(lambda)
    }), lmat) -> mod

    expect_equal(paste(mod$predDf$distribution), c("norm", "pois"))

    .errProcessExpression(quote({
      ktr ~ exp(tktr + eta.ktr)
      ka <- exp(tka + eta.ka)
      cl <- exp(tcl + eta.cl)
      v <- exp(tv + eta.v)
      emax = expit(temax+eta.emax)
      ec50 =  exp(tec50 + eta.ec50)
      kout = exp(tkout + eta.kout)
      e0 = exp(te0 + eta.e0)
      ##
      DCP = center/v
      tmp ~ exp(eta.tr)
      PD=1-emax*DCP/(ec50+DCP)
      ##
      effect(0) = e0
      kin ~ e0*kout
      ##
      d/dt(depot) = -ktr * depot
      d/dt(gut) =  ktr * depot -ka * gut
      d/dt(center) =  ka * gut - cl / v * center
      d/dt(effect) = kin*PD -kout*effect
      ##
      cp = center / v + pdadd.err
      cp ~ prop(prop.err) + add(pkadd.err)
      effect ~ dpois(lambda)
    }), lmat) -> mod

    expect_equal(paste(mod$predDf$distribution), c("norm", "pois"))

    .errProcessExpression(quote({
      ktr ~ exp(tktr + eta.ktr)
      ka <- exp(tka + eta.ka)
      cl <- exp(tcl + eta.cl)
      v <- exp(tv + eta.v)
      emax = expit(temax+eta.emax)
      ec50 =  exp(tec50 + eta.ec50)
      kout = exp(tkout + eta.kout)
      e0 = exp(te0 + eta.e0)
      ##
      DCP = center/v
      tmp ~ exp(eta.tr)
      PD=1-emax*DCP/(ec50+DCP)
      ##
      effect(0) = e0
      kin ~ e0*kout
      ##
      d/dt(depot) = -ktr * depot
      d/dt(gut) =  ktr * depot -ka * gut
      d/dt(center) =  ka * gut - cl / v * center
      d/dt(effect) = kin*PD -kout*effect
      ##
      cp = center / v + pdadd.err
      cp ~ prop(prop.err) + add(pkadd.err)
      effect ~ dbinom(pdadd.err)
    }), lmat) -> mod

    expect_equal(paste(mod$predDf$distribution), c("norm", "binom"))

    .errProcessExpression(quote({
      ktr ~ exp(tktr + eta.ktr)
      ka <- exp(tka + eta.ka)
      cl <- exp(tcl + eta.cl)
      v <- exp(tv + eta.v)
      emax = expit(temax+eta.emax)
      ec50 =  exp(tec50 + eta.ec50)
      kout = exp(tkout + eta.kout)
      e0 = exp(te0 + eta.e0)
      ##
      DCP = center/v
      tmp ~ exp(eta.tr)
      PD=1-emax*DCP/(ec50+DCP)
      ##
      effect(0) = e0
      kin ~ e0*kout
      ##
      d/dt(depot) = -ktr * depot
      d/dt(gut) =  ktr * depot -ka * gut
      d/dt(center) =  ka * gut - cl / v * center
      d/dt(effect) = kin*PD -kout*effect
      ##
      cp = center / v + pdadd.err
      cp ~ prop(prop.err) + add(pkadd.err)
      effect ~ binom(pdadd.err)
    }), lmat) -> mod

    expect_equal(paste(mod$predDf$distribution), c("norm", "binom"))

    .errProcessExpression(quote({
      ktr ~ exp(tktr + eta.ktr)
      ka <- exp(tka + eta.ka)
      cl <- exp(tcl + eta.cl)
      v <- exp(tv + eta.v)
      emax = expit(temax+eta.emax)
      ec50 =  exp(tec50 + eta.ec50)
      kout = exp(tkout + eta.kout)
      e0 = exp(te0 + eta.e0)
      ##
      DCP = center/v
      tmp ~ exp(eta.tr)
      PD=1-emax*DCP/(ec50+DCP)
      ##
      effect(0) = e0
      kin ~ e0*kout
      ##
      d/dt(depot) = -ktr * depot
      d/dt(gut) =  ktr * depot -ka * gut
      d/dt(center) =  ka * gut - cl / v * center
      d/dt(effect) = kin*PD -kout*effect
      ##
      cp = center / v
      cp ~ dbeta(prop.err, pkadd.err)
      effect ~ add(pdadd.err) | pca
    }), lmat) -> mod

    expect_equal(paste(mod$predDf$distribution), c("beta", "norm"))

    .errProcessExpression(quote({
      ktr ~ exp(tktr + eta.ktr)
      ka <- exp(tka + eta.ka)
      cl <- exp(tcl + eta.cl)
      v <- exp(tv + eta.v)
      emax = expit(temax+eta.emax)
      ec50 =  exp(tec50 + eta.ec50)
      kout = exp(tkout + eta.kout)
      e0 = exp(te0 + eta.e0)
      ##
      DCP = center/v
      tmp ~ exp(eta.tr)
      PD=1-emax*DCP/(ec50+DCP)
      ##
      effect(0) = e0
      kin ~ e0*kout
      ##
      d/dt(depot) = -ktr * depot
      d/dt(gut) =  ktr * depot -ka * gut
      d/dt(center) =  ka * gut - cl / v * center
      d/dt(effect) = kin*PD -kout*effect
      ##
      cp = center / v
      cp ~ beta(prop.err, pkadd.err)
      effect ~ add(pdadd.err) | pca
    }), lmat) -> mod

    expect_equal(paste(mod$predDf$distribution), c("beta", "norm"))

    .errProcessExpression(quote({
      ktr ~ exp(tktr + eta.ktr)
      ka <- exp(tka + eta.ka)
      cl <- exp(tcl + eta.cl)
      v <- exp(tv + eta.v)
      emax = expit(temax+eta.emax)
      ec50 =  exp(tec50 + eta.ec50)
      kout = exp(tkout + eta.kout)
      e0 = exp(te0 + eta.e0)
      ##
      DCP = center/v
      tmp ~ exp(eta.tr)
      PD=1-emax*DCP/(ec50+DCP)
      ##
      effect(0) = e0
      kin ~ e0*kout
      ##
      d/dt(depot) = -ktr * depot
      d/dt(gut) =  ktr * depot -ka * gut
      d/dt(center) =  ka * gut - cl / v * center
      d/dt(effect) = kin*PD -kout*effect
      ##
      cp = center / v
      cp ~ prop(prop.err) + add(pkadd.err)
      effect ~ geom(pdadd.err) | pca
    }), lmat) -> mod

    expect_equal(paste(mod$predDf$distribution), c("norm", "geom"))

    .errProcessExpression(quote({
      ktr ~ exp(tktr + eta.ktr)
      ka <- exp(tka + eta.ka)
      cl <- exp(tcl + eta.cl)
      v <- exp(tv + eta.v)
      emax = expit(temax+eta.emax)
      ec50 =  exp(tec50 + eta.ec50)
      kout = exp(tkout + eta.kout)
      e0 = exp(te0 + eta.e0)
      ##
      DCP = center/v
      tmp ~ exp(eta.tr)
      PD=1-emax*DCP/(ec50+DCP)
      ##
      effect(0) = e0
      kin ~ e0*kout
      ##
      d/dt(depot) = -ktr * depot
      d/dt(gut) =  ktr * depot -ka * gut
      d/dt(center) =  ka * gut - cl / v * center
      d/dt(effect) = kin*PD -kout*effect
      ##
      cp = center / v
      cp ~ prop(prop.err) + add(pkadd.err)
      effect ~ dgeom(pdadd.err) | pca
    }), lmat) -> mod

    expect_equal(paste(mod$predDf$distribution), c("norm", "geom"))

    ## .errProcessExpression(quote({
    ##   ktr ~ exp(tktr + eta.ktr)
    ##   ka <- exp(tka + eta.ka)
    ##   cl <- exp(tcl + eta.cl)
    ##   v <- exp(tv + eta.v)
    ##   emax = expit(temax+eta.emax)
    ##   ec50 =  exp(tec50 + eta.ec50)
    ##   kout = exp(tkout + eta.kout)
    ##   e0 = exp(te0 + eta.e0)
    ##   ##
    ##   DCP = center/v
    ##   tmp ~ exp(eta.tr)
    ##   PD=1-emax*DCP/(ec50+DCP)
    ##   ##
    ##   effect(0) = e0
    ##   kin ~ e0*kout
    ##   ##
    ##   d/dt(depot) = -ktr * depot
    ##   d/dt(gut) =  ktr * depot -ka * gut
    ##   d/dt(center) =  ka * gut - cl / v * center
    ##   d/dt(effect) = kin*PD -kout*effect
    ##   ##
    ##   cp = center / v
    ##   cp ~ hyper(prop.err, pkadd.err, pdadd.err)
    ##   effect ~ dpois(cp) | pca
    ## }), lmat) -> mod

    ## expect_equal(paste(mod$predDf$distribution), c("hyper", "pois"))

    ## "unif", #11

    .errProcessExpression(quote({
      ktr ~ exp(tktr + eta.ktr)
      ka <- exp(tka + eta.ka)
      cl <- exp(tcl + eta.cl)
      v <- exp(tv + eta.v)
      emax = expit(temax+eta.emax)
      ec50 =  exp(tec50 + eta.ec50)
      kout = exp(tkout + eta.kout)
      e0 = exp(te0 + eta.e0)
      ##
      DCP = center/v
      tmp ~ exp(eta.tr)
      PD=1-emax*DCP/(ec50+DCP)
      ##
      effect(0) = e0
      kin ~ e0*kout
      ##
      d/dt(depot) = -ktr * depot
      d/dt(gut) =  ktr * depot -ka * gut
      d/dt(center) =  ka * gut - cl / v * center
      d/dt(effect) = kin*PD -kout*effect
      ##
      cp = center / v
      cp ~ unif(prop.err, pkadd.err)
      effect ~ add(cp) | pca
    }), lmat) -> mod

    expect_equal(paste(mod$predDf$distribution), c("unif", "norm"))

    .errProcessExpression(quote({
      ktr ~ exp(tktr + eta.ktr)
      ka <- exp(tka + eta.ka)
      cl <- exp(tcl + eta.cl)
      v <- exp(tv + eta.v)
      emax = expit(temax+eta.emax)
      ec50 =  exp(tec50 + eta.ec50)
      kout = exp(tkout + eta.kout)
      e0 = exp(te0 + eta.e0)
      ##
      DCP = center/v
      tmp ~ exp(eta.tr)
      PD=1-emax*DCP/(ec50+DCP)
      ##
      effect(0) = e0
      kin ~ e0*kout
      ##
      d/dt(depot) = -ktr * depot
      d/dt(gut) =  ktr * depot -ka * gut
      d/dt(center) =  ka * gut - cl / v * center
      d/dt(effect) = kin*PD -kout*effect
      ##
      cp = center / v
      cp ~ dunif(prop.err, pkadd.err)
      effect ~ add(pdadd.err) | pca
    }), lmat) -> mod

    expect_equal(paste(mod$predDf$distribution), c("unif", "norm"))

    .errProcessExpression(quote({
      ktr ~ exp(tktr + eta.ktr)
      ka <- exp(tka + eta.ka)
      cl <- exp(tcl + eta.cl)
      v <- exp(tv + eta.v)
      emax = expit(temax+eta.emax)
      ec50 =  exp(tec50 + eta.ec50)
      kout = exp(tkout + eta.kout)
      e0 = exp(te0 + eta.e0)
      ##
      DCP = center/v
      tmp ~ exp(eta.tr)
      PD=1-emax*DCP/(ec50+DCP)
      ##
      effect(0) = e0
      kin ~ e0*kout
      ##
      d/dt(depot) = -ktr * depot
      d/dt(gut) =  ktr * depot -ka * gut
      d/dt(center) =  ka * gut - cl / v * center
      d/dt(effect) = kin*PD -kout*effect
      ##
      cp = center / v
      cp ~ weibull(prop.err, pkadd.err)
      effect ~ add(pdadd.err) | pca
    }), lmat) -> mod

    expect_equal(paste(mod$predDf$distribution), c("weibull", "norm"))

    .errProcessExpression(quote({
      ktr ~ exp(tktr + eta.ktr)
      ka <- exp(tka + eta.ka)
      cl <- exp(tcl + eta.cl)
      v <- exp(tv + eta.v)
      emax = expit(temax+eta.emax)
      ec50 =  exp(tec50 + eta.ec50)
      kout = exp(tkout + eta.kout)
      e0 = exp(te0 + eta.e0)
      ##
      DCP = center/v
      tmp ~ exp(eta.tr)
      PD=1-emax*DCP/(ec50+DCP)
      ##
      effect(0) = e0
      kin ~ e0*kout
      ##
      d/dt(depot) = -ktr * depot
      d/dt(gut) =  ktr * depot -ka * gut
      d/dt(center) =  ka * gut - cl / v * center
      d/dt(effect) = kin*PD -kout*effect
      ##
      cp = center / v
      cp ~ dweibull(prop.err, pkadd.err)
      effect ~ add(pdadd.err) | pca
    }), lmat) -> mod

    expect_equal(paste(mod$predDf$distribution), c("weibull", "norm"))

    .errProcessExpression(quote({
      ktr ~ exp(tktr + eta.ktr)
      ka <- exp(tka + eta.ka)
      cl <- exp(tcl + eta.cl)
      v <- exp(tv + eta.v)
      emax = expit(temax+eta.emax)
      ec50 =  exp(tec50 + eta.ec50)
      kout = exp(tkout + eta.kout)
      e0 = exp(te0 + eta.e0)
      ##
      DCP = center/v
      tmp ~ exp(eta.tr)
      PD=1-emax*DCP/(ec50+DCP)
      ##
      effect(0) = e0
      kin ~ e0*kout
      ##
      d/dt(depot) = -ktr * depot
      d/dt(gut) =  ktr * depot -ka * gut
      d/dt(center) =  ka * gut - cl / v * center
      d/dt(effect) = kin*PD -kout*effect
      ##
      cp = center / v
      cp ~ c(prop.err, pkadd.err)
      effect ~ add(pdadd.err) | pca
    }), lmat) -> mod

    expect_equal(paste(mod$predDf$distribution), c("ordinal", "norm"))

    .errProcessExpression(quote({
      ktr ~ exp(tktr + eta.ktr)
      ka <- exp(tka + eta.ka)
      cl <- exp(tcl + eta.cl)
      v <- exp(tv + eta.v)
      emax = expit(temax+eta.emax)
      ec50 =  exp(tec50 + eta.ec50)
      kout = exp(tkout + eta.kout)
      e0 = exp(te0 + eta.e0)
      ##
      DCP = center/v
      tmp ~ exp(eta.tr)
      PD=1-emax*DCP/(ec50+DCP)
      ##
      effect(0) = e0
      kin ~ e0*kout
      ##
      d/dt(depot) = -ktr * depot
      d/dt(gut) =  ktr * depot -ka * gut
      d/dt(center) =  ka * gut - cl / v * center
      d/dt(effect) = kin*PD -kout*effect
      ##
      cp = center / v
      cp ~ c(prop.err, pkadd.err)
      effect ~ add(pdadd.err) | pca
    }), lmat) -> mod

    expect_equal(paste(mod$predDf$distribution), c("ordinal", "norm"))

    .errProcessExpression(quote({
      ktr ~ exp(tktr + eta.ktr)
      ka <- exp(tka + eta.ka)
      cl <- exp(tcl + eta.cl)
      v <- exp(tv + eta.v)
      emax = expit(temax+eta.emax)
      ec50 =  exp(tec50 + eta.ec50)
      kout = exp(tkout + eta.kout)
      e0 = exp(te0 + eta.e0)
      ##
      DCP = center/v
      tmp ~ exp(eta.tr)
      PD=1-emax*DCP/(ec50+DCP)
      ##
      effect(0) = e0
      kin ~ e0*kout
      ##
      d/dt(depot) = -ktr * depot
      d/dt(gut) =  ktr * depot -ka * gut
      d/dt(center) =  ka * gut - cl / v * center
      d/dt(effect) = kin*PD -kout*effect
      ##
      cp = center / v
      cp ~ dt(prop.err, pkadd.err)
      effect ~ add(pdadd.err) | pca
    }), lmat) -> mod

    expect_equal(paste(mod$predDf$distribution), c("t", "norm"))

    .errProcessExpression(quote({
      ktr ~ exp(tktr + eta.ktr)
      ka <- exp(tka + eta.ka)
      cl <- exp(tcl + eta.cl)
      v <- exp(tv + eta.v)
      emax = expit(temax+eta.emax)
      ec50 =  exp(tec50 + eta.ec50)
      kout = exp(tkout + eta.kout)
      e0 = exp(te0 + eta.e0)
      ##
      DCP = center/v
      tmp ~ exp(eta.tr)
      PD=1-emax*DCP/(ec50+DCP)
      ##
      effect(0) = e0
      kin ~ e0*kout
      ##
      d/dt(depot) = -ktr * depot
      d/dt(gut) =  ktr * depot -ka * gut
      d/dt(center) =  ka * gut - cl / v * center
      d/dt(effect) = kin*PD -kout*effect
      ##
      cp = center / v
      cp ~ t(prop.err, pkadd.err)
      effect ~ add(pdadd.err) | pca
    }), lmat) -> mod

    expect_equal(paste(mod$predDf$distribution), c("t", "norm"))

    lmat2 <- lotri({
      tktr <- log(1)
      tka <- log(1)
      tcl <- log(0.1)
      tv <- log(10)
      ##
      eta.ktr ~ 1
      eta.ka ~ 1
      eta.cl ~ 2
      eta.v ~ 1
      prop.err <- 0.1
      pkadd.err <- 0.1
      ##
      temax <- logit(0.8)
      #temax <- 7.5
      tec50 <- log(0.5)
      tkout <- log(0.05)
      te0 <- log(100)
      ##
      eta.emax ~ .5
      eta.ec50  ~ .5
      eta.kout ~ .5
      eta.e0 ~ .5
      ##
      pdadd.err <- 10
      df <- c(1, 10)
    })

    .errProcessExpression(quote({
      ktr ~ exp(tktr + eta.ktr)
      ka <- exp(tka + eta.ka)
      cl <- exp(tcl + eta.cl)
      v <- exp(tv + eta.v)
      emax = expit(temax+eta.emax)
      ec50 =  exp(tec50 + eta.ec50)
      kout = exp(tkout + eta.kout)
      e0 = exp(te0 + eta.e0)
      ##
      DCP = center/v
      tmp ~ exp(eta.tr)
      PD=1-emax*DCP/(ec50+DCP)
      ##
      effect(0) = e0
      kin ~ e0*kout
      ##
      d/dt(depot) = -ktr * depot
      d/dt(gut) =  ktr * depot -ka * gut
      d/dt(center) =  ka * gut - cl / v * center
      d/dt(effect) = kin*PD -kout*effect
      ##
      cp = center / v
      cp ~ prop(prop.err) + add(pkadd.err) + dt(df)
      effect ~ add(pdadd.err) | pca
    }), lmat2) -> mod

    expect_equal(paste(mod$predDf$distribution), c("t", "norm"))

    .errProcessExpression(quote({
      ktr ~ exp(tktr + eta.ktr)
      ka <- exp(tka + eta.ka)
      cl <- exp(tcl + eta.cl)
      v <- exp(tv + eta.v)
      emax = expit(temax+eta.emax)
      ec50 =  exp(tec50 + eta.ec50)
      kout = exp(tkout + eta.kout)
      e0 = exp(te0 + eta.e0)
      ##
      DCP = center/v
      tmp ~ exp(eta.tr)
      PD=1-emax*DCP/(ec50+DCP)
      ##
      effect(0) = e0
      kin ~ e0*kout
      ##
      d/dt(depot) = -ktr * depot
      d/dt(gut) =  ktr * depot -ka * gut
      d/dt(center) =  ka * gut - cl / v * center
      d/dt(effect) = kin*PD -kout*effect
      ##
      cp = center / v
      cp ~ prop(prop.err) + add(pkadd.err) + dt(df)
      effect ~ add(pdadd.err) | pca
    }), lmat2) -> mod

    expect_equal(paste(mod$predDf$distribution), c("t", "norm"))

    .errProcessExpression(quote({
      ktr ~ exp(tktr + eta.ktr)
      ka <- exp(tka + eta.ka)
      cl <- exp(tcl + eta.cl)
      v <- exp(tv + eta.v)
      emax = expit(temax+eta.emax)
      ec50 =  exp(tec50 + eta.ec50)
      kout = exp(tkout + eta.kout)
      e0 = exp(te0 + eta.e0)
      ##
      DCP = center/v
      tmp ~ exp(eta.tr)
      PD=1-emax*DCP/(ec50+DCP)
      ##
      effect(0) = e0
      kin ~ e0*kout
      ##
      d/dt(depot) = -ktr * depot
      d/dt(gut) =  ktr * depot -ka * gut
      d/dt(center) =  ka * gut - cl / v * center
      d/dt(effect) = kin*PD -kout*effect
      ##
      cp = center / v
      ll(cp) ~ log(prop.err) + log(cp)
      effect ~ add(pdadd.err) | pca
    }), lmat2) -> mod

  })

  test_that(".isErrorExpression", {
    expect_true(.isErrorExpression(quote(-cp ~ .)))
    expect_false(.isErrorExpression(quote(lipre~add(add.err) + 3*x | matt)))
    expect_true(.isErrorExpression(quote(lipre~add(add.err) | matt)))
    expect_true(.isErrorExpression(quote(lipre~add(add.err) + prop(prop.sd) + boxCox(lambda)| matt)))
    expect_true(.isErrorExpression(quote(lipre~add(add.err) + prop(prop.sd) + boxCox(lambda))))
    expect_false(.isErrorExpression(quote(lipre <- add(add.err) + prop(prop.sd) + boxCox(lambda))))
    expect_false(.isErrorExpression(quote(lipre + 2 <- add(add.err) + prop(prop.sd) + boxCox(lambda))))
    expect_true(.isErrorExpression(quote(linCmt() ~ add(add.err) + prop(prop.err))))

  })

  test_that("symbol alone", {

    whoops <- function() {
      ini({
        paramAlone <- 1
        paramUsed <- 2
      })
      model({
        x <- paramUsed
        paramAlone
      })
    }

    expect_message(expect_error(rxode2(whoops)),
                  "the symbol 'paramAlone' cannot be by itself")

  })

  test_that("complex error condition", {

    f <- function() {
      ini({
        paramUsed <- 1
        add.sd <- 0.1
        add.sd2 <- 0.2
      })
      model({
        x <- paramUsed
        x1 <- x
        x2 <- x
        x1 ~ add(add.sd) | cmt(1)
        x2 ~ add(add.sd2) | cmt(2)
      })
    }

    expect_message(expect_error(rxode2(f)),
                   "the condition 'cmt\\(2\\)' must be a simple name")

  })


})
