rxTest({
  rxWithSeed(
    42,
    {
      dgs <- c("sqrt", "log", "identity")
      for (dg in dgs) {
        for (d in seq(1, rxSymInvCholN())) {
          test_that(sprintf("Omega Cholesky %sx%s, %s", d, d, dg), {
            ## Creating covariance matrix
            tmp <- matrix(rnorm(d^2), d, d)
            mcov <- tcrossprod(tmp, tmp)
            v <- suppressMessages(rxSymInvCholCreate(mcov, dg))
            expect_equal(v$ntheta, sum((lower.tri(mcov, TRUE)) * 1))
            expect_equal(length(v$xType), sum((lower.tri(mcov, TRUE)) * 1))
            expect_equal(v$omega, mcov, tolerance = 1e-4)
            expect_equal(v$omegaInv, solve(mcov), tolerance = 1e-4)
            expect_equal(v$chol.omegaInv, chol(solve(mcov)), tolerance = 1e-4)
            expect_equal(v$chol.omega, chol(mcov), tolerance = 1e-4)
            expect_equal(v$log.det.OMGAinv.5, 0.5 * log(det(solve(mcov))), tolerance = 1e-4)
            expect_equal(length(v$d.omegaInv), v$ntheta, tolerance = 1e-4)
            expect_equal(length(v$d.D.omegaInv), v$ntheta, tolerance = 1e-4)
            ## This is to make sure there is no run-time error in calculation
            expect_type(v$tr.28, "double")
            expect_type(v$omega.47, "list")
            if (d != 1) {
              expect_error(v$theta <- 3)
            } else {
              v$theta <- 3 # Should work
            }
          })
        }

        test_that("diagonal indicator give correct values", {
          tmp <- rxSymInvCholCreate(matrix(c(1, 0.9, 0, 0.9, 1, 0, 0, 0, 1), ncol = 3))
          expect_equal(tmp$theta.diag, c(TRUE, FALSE, TRUE, TRUE))
          tmp <- rxSymInvCholCreate(matrix(c(1, 0.9, 0.9, 1), ncol = 2))
          expect_equal(tmp$theta.diag, c(TRUE, FALSE, TRUE))
        })
      }
    }
  )
})
