tests/testthat/test-emmeans.R

# Tier 1: Unit tests for .bmmfit_resolve_par() using mock fixtures
# These test the parameter routing logic without requiring posterior samples

load_mock_mixture2p <- function() {
  path <- test_path("assets/mock_bmmfit_mixture2p.rds")
  skip_if_not(file.exists(path), "fixture not available (excluded by .Rbuildignore)")
  readRDS(path)
}

load_mock_m3 <- function() {
  path <- test_path("assets/mock_bmmfit_m3.rds")
  skip_if_not(file.exists(path), "fixture not available (excluded by .Rbuildignore)")
  readRDS(path)
}

load_sdm_fit <- function() {
  path <- test_path("assets/bmmfit_example1.rds")
  skip_if_not(file.exists(path), "SDM fixture not available (excluded by .Rbuildignore)")
  readRDS(path)
}

test_that(".bmmfit_resolve_par routes dpar to nlpar for mixture2p", {
  mock <- load_mock_mixture2p()
  result <- .bmmfit_resolve_par(mock, dpar = "kappa", nlpar = NULL)
  expect_null(result$dpar)
  expect_equal(result$nlpar, "kappa")
})

test_that(".bmmfit_resolve_par routes dpar to nlpar for mixture2p thetat", {
  mock <- load_mock_mixture2p()
  result <- .bmmfit_resolve_par(mock, dpar = "thetat", nlpar = NULL)
  expect_null(result$dpar)
  expect_equal(result$nlpar, "thetat")
})

test_that(".bmmfit_resolve_par routes dpar to nlpar for m3", {
  mock <- load_mock_m3()
  result <- .bmmfit_resolve_par(mock, dpar = "c", nlpar = NULL)
  expect_null(result$dpar)
  expect_equal(result$nlpar, "c")
})

test_that(".bmmfit_resolve_par leaves dpar unchanged for SDM", {
  fit <- load_sdm_fit()
  result <- .bmmfit_resolve_par(fit, dpar = "c", nlpar = NULL)
  expect_equal(result$dpar, "c")
  expect_null(result$nlpar)
})

test_that(".bmmfit_resolve_par leaves dpar unchanged for SDM kappa", {
  fit <- load_sdm_fit()
  result <- .bmmfit_resolve_par(fit, dpar = "kappa", nlpar = NULL)
  expect_equal(result$dpar, "kappa")
  expect_null(result$nlpar)
})

test_that(".bmmfit_resolve_par respects explicit nlpar argument", {
  mock <- load_mock_mixture2p()
  result <- .bmmfit_resolve_par(mock, dpar = NULL, nlpar = "kappa")
  expect_null(result$dpar)
  expect_equal(result$nlpar, "kappa")
})

test_that(".bmmfit_resolve_par does not reroute when both dpar and nlpar given", {
  mock <- load_mock_mixture2p()
  result <- .bmmfit_resolve_par(mock, dpar = "kappa", nlpar = "thetat")
  expect_equal(result$dpar, "kappa")
  expect_equal(result$nlpar, "thetat")
})

test_that(".bmmfit_resolve_par passes through when both are NULL", {
  mock <- load_mock_mixture2p()
  result <- .bmmfit_resolve_par(mock, dpar = NULL, nlpar = NULL)
  expect_null(result$dpar)
  expect_null(result$nlpar)
})

test_that(".bmmfit_resolve_par errors on invalid dpar name", {
  mock <- load_mock_mixture2p()
  expect_error(
    .bmmfit_resolve_par(mock, dpar = "not_a_par", nlpar = NULL),
    "not found in model"
  )
})


# Tier 2: Fixture-based integration tests (SDM fixture — has posterior samples)

test_that("emmeans() returns valid emmGrid for SDM dpar", {
  skip_if_not_installed("emmeans")
  fit <- load_sdm_fit()
  em <- emmeans::emmeans(fit, ~ set_size, dpar = "c")
  expect_s4_class(em, "emmGrid")
  expect_true(nrow(as.data.frame(em)) > 0)
})

test_that("pairs() produces valid contrast from emmGrid", {
  skip_if_not_installed("emmeans")
  fit <- load_sdm_fit()
  em <- emmeans::emmeans(fit, ~ set_size, dpar = "c")
  contrasts <- pairs(em)
  expect_s4_class(contrasts, "emmGrid")
  expect_true(nrow(as.data.frame(contrasts)) > 0)
})

Try the bmm package in your browser

Any scripts or data that you put into this service are public.

bmm documentation built on March 30, 2026, 5:08 p.m.